任務:實現一個UML類圖解析器。java
類圖:算法
SortUmlElement類:對傳入的UMLElement按type提取相關信息,並存儲在hashmap中;設計模式
MyUmlInteraction類:實現接口的方法,主要經過在hashmap之間尋找相關信息;安全
例如:數據結構
/*
implemention:key存UmlClass的id,value存該類實現的接口的id
interGeneralize:key存UmlInterface的id,value存該接口繼承的接口的id
*/
private Map<String, ArrayList<String>> implemention;
private Map<String, ArrayList<String>> interGeneralize;
對於指令「類實現的所有接口」,在類的繼承鏈上進行dfs搜索便可。多線程
任務:在第一次做業基礎上,擴展解析器,使得可以支持對UML順序圖和UML狀態圖的解析,並可以支持幾個基本規則的驗證。架構
類圖:併發
ClassModelInteraction:和第一次做業相同,用於類圖的解析;工具
CollaborationInteraction:用於順序圖的解析;性能
StateChartInteraction:用於狀態圖的解析;
StandardPreCheck:用於規則檢查;
MyUmlGeneralInteraction:在該類中實例化上述四個類,相關方法調用相應類中的相應方法;
代碼總體架構和上次做業基本相同,也是把相關信息存在hashmap中。
須要注意的問題:
1.對hashmap調用get方法以前要確保contains(key)爲true,不然可能拋出exception。
2.UmlElement的name可能爲null,須要特別處理,否則也會exception。
第一單元:第一次接觸java,也是第一次接觸OO思想,致使寫出的代碼解耦程度不高,特別是這單元的第三次做業,因爲多項式求導中涉及到了嵌套求導,基本就靠遞歸莽出來的,幾乎沒有體現OO思想,因此代碼的架構也不合理,可拓展性可維護性不強,三次做業每次都得重構。因爲沒有構造較好的抽象層次,後兩次的做業中優化的部分也沒有寫好,因此也是沒有拿到多少性能分。
第二單元:這單元是多線程,入門比較難,特別是對併發安全的控制很複雜,也很容易出錯。三次做業調度算法不一樣,可是總體架構基本沒有變化,都採用了單例模式,即實例化一個調度器對象,使其做爲臨界資源,同時與輸入處理線程和電梯運行線程關聯。在大的架構上基本符合面向對象的思想,作到了各個對象只管本身的事情,可是在一些小的細節上還能夠進行解耦分離。這個單元學到了SOLID設計原則,能夠用這個原則來檢查本身代碼是否符合OO思想。
第三單元:這單元是JML規格的學習。每次做業都有CPU時間的限制,爲了適應性能,我採用合適的數據結構,並對數據抽象和分層:在圖數據結構和圖模型之間創建層次;在數據之間創建映射關係,而不僅是簡單的關聯關係;逐層構造,頂層實現規定的接口和相應的規格。代碼的性能和結構設計有了很緊密的聯繫,若是沒有一個好的架構,那麼性能也將很低。
第四單元:這單元是UML的學習。在兩次做業中我採用的是在一個類中hashmap硬莽,數據層次沒有分好。若是能對數據模型進一步抽象處理,進一步層次化管理,應該會有很大的架構設計方面的改善。
第一單元:一開始不知道有什麼有效的測試方法,靠本身手動構造一些邊緣數據,而後手動debug,後來經過討論區的學習知道了能夠寫對拍器程序來自動生成隨機數據並自動測試,這給我多項式求導的第三次做業中的互測帶來了很大的便利。
第二單元:多線程的測試真的很讓人頭疼,輸出不肯定,並且調試debug也很不方便,並且還有不少隱藏、難復現的bug。尤爲是多部電梯那次,若是沒有對拍器,即便有測試數據可是僅靠肉眼觀察輸出的正確性是很困難的(各線程的輸出相互交錯),此次做業沒有充分測試致使強測翻車了,這讓我意識到測試是代碼工程中的一個極其重要的環節。
第三單元:學到了不少測試方法,經過JUnit對每一個方法進行正確性測試,嘗試了使用JMLUnitNG來自動生成測試數據並自動測試。但在這單元第三次做業中沒有測試邊緣數據(數據比較大的Integer),致使強測由於一個equals和「==」的區別翻車。
第四單元:自動生成一個UML圖太困難了,因此我選擇在starUML中畫圖,利用課程組下發的官方jar包來解析,從而生成測試數據。對結果的檢驗很簡單,對照我畫的UML圖檢查就好了。可是UML涉及到不少細節的知識點,因此須要大量的測試才能覆蓋到,我由於沒有考慮到順序圖中Message的target不是lifeLine這種狀況而在強測中掛了一個點。
學習了java的基本語法,瞭解了其做爲一種面向對象的程序設計語言的優點。
學習了OO思想,明白了其與以前學習的面向過程之間的區別,對工程設計的架構和模式有了很深的理解。
接觸了一些新的測試方法和測試工具。
學習了多線程、編寫了多線程程序、知道了如何去保證線程安全。
學習了JML,能根據規格讀懂代碼、編寫代碼,根據代碼編寫規格。
學習了UML的三種圖:類圖、順序圖、狀態圖,以及三者之間的聯繫和統一性,掌握了各模型元素之間的層次關係。