1. 程式人生 > 其它 >面向物件課程總結

面向物件課程總結

面向物件課程總結

1. 第四單元作業的架構設計

1.1 UML元素的結構

本單元作業需要實現一個UML解析器,支援對UML類圖、UML順序圖和UML狀態圖的解析,並實現有效性檢查。

UML是按照樹型結構來組織的,因此我們的解析器也按照樹形結構來儲存UML的資訊。具體而言,三種UML圖的樹形架構如下:

在類圖中,類/介面是基本的組成單元。每一個類或者介面有五個屬性:屬性,操作,關聯的類/介面,繼承的類/介面,實現的介面。

狀態圖中,MyState是基本的組成單位,每一個狀態裡面記錄了它可到達的狀態及其對應的轉換和事件。

順序圖中,生命線和訊息是並聯的組成單位,統一儲存在MyInteraction中。

1.2 功能實現

因為本次作業的查詢大多要通過名字來完成,因此各種UML元素都使用Hashmap來儲存,可以達到快速匹配的目的。

值得一提的是,為了實現檢查迴圈繼承,多重繼承的功能,這一些方法在呼叫的時候使用了了in-out引數。呼叫者會為其傳遞一個集合,被呼叫者往這個集合裡面加入它所繼承的元素,而不是通過返回值來傳遞。

public boolean checkRepeatExtend(HashSet<MyInterface> extendInterfaces) {
        for (MyInterface myInterface : superInterfaces) {
            if (extendInterfaces.contains(myInterface)) {
                return true;
            } else {
                extendInterfaces.add(myInterface);
                boolean temp = myInterface.checkRepeatExtend(extendInterfaces);
                if (temp == true) {
                    return true;
                }
            }
        }
        return false;
    }

這個理念反映了面向物件設計中“never pass by value”思想。

2. 總結自己在四個單元中架構設計及OO方法理解的演進

2.1 第一單元--語法、封裝與多型

對我而言,第一單元的收穫有兩個,其一是掌握了java語言的編寫,其二是初步建立了面向物件的思想。第一次作業的架構很簡單,上機時候也給了一個相似的模板,直接往上套就完事了。第二次作業的難度則有一個質的提升,需要考慮括號帶來的運算順序問題。我認為這次作業的難點並不在於面向物件思想本身,反而對程式設計能力的要求更高一點。當然了,面向物件思想可以輔助我們設計出更好的結構,以便於進一步擴充套件。

我最終的設計架構是一棵表示式樹,可以對每個結點進行遞迴的求導。完成了第一單元的作業後,我對於面向物件方法的理解主要體現在封裝與多型上。運算子或者數字都可以統一作為一個結點,對他們進行求導時候不必瞭解它內部是如何完成的,方便了呼叫者的使用。學習資料結構過程中大量使用的if-else型別判斷,終於可以節省掉了。

2.2 第二單元--多執行緒

第二單元的任務是電梯排程,涉及到多執行緒併發的處理。經歷了第一單元從面向過程到面向物件的轉變,我利用工廠模式,繼承多型等思想,在三次作業中很好地實現了迭代開發,後兩次作業都僅需要稍加改動,進行一些功能的擴充,就可以高效率地完成任務。

我在設計時候開啟了三類執行緒:輸入執行緒,排程器執行緒和電梯執行緒。輸入執行緒將請求送給排程器執行緒,排程器執行緒再將請求分發給各個電梯。這是一個多級的生產者-消費者模型。

第二單元給我帶來最大的收益是生產者-消費者模式的熟練掌握。我一開始並不是很瞭解多執行緒的原則,臨界區設定的特別大,導致scan演算法退化成了fcfs演算法。後來直到第三次作業真正搞明白了生產者-消費者模式的原理,很好的完成了任務。

2.3 第三單元--JML

第三單元幾乎不需要自己去架構,官方包已經把架構給設好了,填充方法就可以了。

第三單元的收穫是對JML的理解。與自然語言相比,JML語言可以更明確的表達我們的意圖,這在軟體開發過程中是非常有必要的。

2.4 第四單元--UML

第四單元的架構如上文所示,設計了一個樹型的結構。與Jml不同,這次沒有給出具體的描述,因此首先需要的是理解Uml三種圖的展示形式,從而自主的對各個元素的內容提取,在實現對應方法的時候使用。這可以說是一次綜合性的架構測試,是對面向物件設計思想的一個最終檢驗。

3. 總結自己在四個單元中測試理解與實踐的演進

OO作業的測試無非是手動構造資料測試與自動生成隨機資料兩種模式。我第一單元使用了隨機模式,後三單元都是手動構造,這裡沒有什麼好深入分析的,和麵向過程語言的測試沒有什麼不同。讓我有一個演進式理解的是Junit這個工具的使用。

第三四單元,課程組推薦了我們使用JUnit進行單元測試。我本來以為它可以智慧地 根據JML來自動測試,沒想到需要自己構造測試樣例並設定答案。我當時很不理解這種測試方法,感覺純粹是多此一舉。後來查閱資料才明白Junit的意義。在一些大型的程式,例如淘寶中,可能有上萬個方法,執行的成本要遠高於單元測試的成本。並且在現代的軟體開發中,開發和測試往往需要並行工作,即如下圖所示:

JUnit其實在某種程度上體現了封裝的思想。我們自己寫程式除錯時候可以隨意改動程式碼,加一點輸出來debug。但是實際軟體開發中,測試人員是沒有這個許可權的。他們只能模組化工作,最終進行一個整合。

當然,對於我們自己寫作業而言,JUnit在這幾單元作業中似乎確實沒什麼用。。。

4. 課程收穫

java是我目前收穫最大的一門核心專業課了(雖然可能分數是最低的qwq)。主要收穫有以下幾個:

  • java語法與容器的使用
  • 正則表示式、多執行緒、JML、UML的使用
  • 面向物件思想:封裝、繼承、重寫、多型、過載。。。。
  • 程式碼風格的改進
  • 設計模式:工廠模式,生產者-消費者模式等等
  • 被hack爆了之後的平常心

5. 立足於自己的體會給課程提三個具體改進建議

  • 實驗課最好能在課後公佈成績。填空的還好,程式設計這塊真的挺虛的,不知道自己寫的對不對。
  • 第四單元的描述最好能夠清楚詳細一點,一開始的版本有很多歧義。
  • 強測時候一個bug可能被hack多次,希望在bug修復階段能夠進行合併。因為一個bug被幹到20多,挺搞心態的。