final,buaa_oo conclusion

UML系列做業設計架構

第13次做業

本單元的第一次做業中,涉及到了類圖的解析。在着手作這單元做業的時候,須要將每一種 UmlElement 再封裝,並在解析時,用 helper 單例來進行查詢處理(能夠附帶記憶化查詢)。
這裏能夠再細緻地說明一下,實際上,在本次做業中,我只再封裝如下幾類:web

UmlClass  
UmlInterface
UmlOperation

對於其餘的元素,僅提取必要信息 id 並將其加入到相應再封裝類的數據結構中,供後續統計使用。
另外一方面,因爲 Class 和 Interface 的行爲很接近,因而我將 Interface設置爲Class的繼承類。因爲Class爲單繼承,所以須要在子類中改變相應邏輯, 將 Interface的 繼承類型改變爲「多繼承」。算法

//接口繼承「類」,由於 接口對於op和attr的邏輯與 class 幾乎相同
public class ExtInter extends ExtEle {
    private ArrayList<String> interFathers;
    ...
}

第14次做業

第二次做業中新增了狀態圖順序圖的查詢,所以,將helper拆分爲三個,並將對應的查詢指令分配給對應的 helper 。
須要注意的是,對於三個查詢規則,他們屬於 類圖helper 的負責範疇,應交給類圖helper處理。編程

循環繼承後繼State的邏輯:
判斷時,從一個狀態(類、接口)出發,查找他們的後繼(father),並將全部當次已遍歷過的結點序列做爲參數傳入。若是當前結點已經在序列中,說明已經出現「迴環」,此時搜索結束,返回。這保證了不會產生死循環。設計模式

檢查重複繼承(類) //接口檢查時邏輯相似
public boolean rotate(String id, ArrayList<String> idList) {
        if (getId().equals(id)) {
            return true;
        } else if (idList != null && idList.contains(getId())) {
            return false;
        }
        ArrayList<String> tmp = new ArrayList<>();
        if (idList != null) {
            tmp.addAll(idList);
        }
        tmp.add(getId());
        if (fatherFlag) {
            return father.rotate(id, tmp);
        }
        return false;
    }

類圖:數組

單元架構設計

表達式求導

第一單元的表達式,第一次接觸Java 和麪向對象的模式。將factor/term 封裝成類,重載相應的求導函數,最終實現了程序。數據結構

在這個過程當中:多線程

  • 很好地區分開了抽象元素的封裝成類
  • 有必定的可擴展性
  • 第三次做業因爲元素過多,重構時「縫縫補補」,在優化處理上「作崩了」
  • 對於面向對象模式的使用尚未

多線程電梯

本系列做業中儘量地下降各個線程所在類之間的耦合(事實上這麼作也更方便編程,減小了線程間共享對象),對於泛型和接口的使用(雖然接口最後沒用上),簡化了不一樣類型共享隊列重複編碼。每次增量開發也更加順手,總的來看,相比第一單元有了很大進步。架構

本系列做業中重視設計模式和可擴展性,所以沒有重構的狀況發生,都是「增量式開發」。用了單例模式、生產者消費者、兩階段終止模式,進一步增強了接口和集成的訓練。函數

地圖系統

第三單元系列做業開始,從「數據」和「處理」兩個方向出發,分別按照 「設計數據結構」 和 「查詢實現類helper」 互相促進設計。寫代碼時先實現查詢接口,後根據查詢的數據需求實現解析輸入。
相似於電梯實現,將路徑查詢算法獨立封裝,並實現了算法的複用。
注意到時間複雜度的要求,經歷了從 靜態數組-> 優雅的「hashmap"-> 結點再映射的靜態數組 的架構變化,避免了複雜度超時。學習

UML解析系統

第四單元則是對第三單元的「經驗」的充分使用:將全部的查詢分配給對應的helper,將全部的數據封裝成合適的數據結構方便helper調用。(很好很清晰)
從這一點看,第四單元的做業其實和第三單元很相似。

測試風格演進

  • 第一單元開始就使用了Junit實現增量開發時的自動化測試。並對After和BeforeALL等用法有了必定的瞭解。
  • 第二單元,因爲模擬了實時輸入,所以使用了討論區提供的魔改包,編寫數據生成器,生成隨機數據模擬輸入。
  • 第三單元,迴歸使用Junit,實現白盒測試和黑盒測試。對於新增的需求添加Junit測試內容,對於程序總體,編寫隨機數據生成器,將數據提供給輸入並記錄輸出。
  • 第四單元,「自動測試」不是很方便,迴歸傳統,本身編寫特殊mdj文件並添加查詢內容,經過黑盒測試檢查。

針對壓力測試,因爲第一單元做業中強測的BUG, 從第二單元起,對每一次做業的測試都用Jprofiler監測CPU時間,在後面很好地避免了相應的問題。

本課程收穫

做爲一頭大三的鹹魚,本學期的OO課,更多的是對本身進入大學來學得的計算機知識的「應用」。面對每一個單元不一樣的做業,在學習新的面向對象思想的同時,實際上相應地複習了學過的知識。

  • 學習了一些測試的方法,黑盒白盒測試,對於之前學過的web開發(rails),理解了其設計的理念。

  • 學習了一些面向對象模式,將其與C++結合起來。

  • 對多線程有了更深的理解,回顧了OS課程。

  • 將一些算法運用到「實際」中,學着去寫算法的變式。

  • 將一些思考到的東西應用到本身作OS助教的實際中

課程建議

  • 實現最後一次做業時,感受指導書說明不是很詳細,對於細則說明缺失不少,給人一種強烈的"出題人摸了"的感受。相應的,對於測試樣例的設計方向,應當在理論課上提供得更明確一些。

  • 理論課的課上重點有時不是很明確,聽完一節課有時不知道重點所在,與做業聯繫不是很緊(前兩單元)

  • 上機難度變化略大,前幾回上機難度過大。


都結束了!
壓力馬斯內! 2019.6.19 16231213 By:DorMouse

相關文章
相關標籤/搜索