這是OO課程的第四個單元,也是最後一個單元。這個單元只有兩次做業,相比前三個單元少一次做業。並且從內容上講這個單元的做業目的以瞭解UML爲主,因此相對前三個單元比較簡單。java
第一次做業的目的是實現一個UML類圖解析器,這個解析器須要接受由UML圖生成的類圖信息並根據要求返回相應的結果,是以瞭解UML類圖爲目的的做業。算法
因爲UML解析器的輸入是按照starUML中存儲類圖信息的方法來存儲的,因此此次做業的目的實際上是瞭解類圖的存儲方法,即starUML所採用的樹狀存儲。在瞭解每個元素在類圖中的存儲方式後整個作也能夠說是至關於完成了一半,因此瞭解UNL存儲架構和創建本身程序的UNL信息存儲架構是本次做業很是重要的一環。我瞭解UML存儲方式的方法很是的簡單,就是在starUML中畫一個圖,再用寫字板的方式打開,而後結合搜索功能瞭解其存儲結構。以後的本身程序的架構我基本按照UML的存儲方式,即構建了ClassNode類用於存儲attribute之類的信息,而對於還有下屬元素的operation和association則也建立一個Node類用於存儲。有一點不同的是我將Class和Interface用同一個類ClassNode來存儲,由於我看這兩個元素所儲存的元素差很少,這也爲我以後的做業形成了不少麻煩。小程序
解決了架構問題,接下來的就是算法的問題。因爲要求的方法中有不少須要遍歷繼承樹和關聯樹的,考慮到是統計個數,所以我對於遍歷的要求多采用BFS算法進行遍歷,再用HashSet來進行結果的存儲從而排除重複。而對於AssociationEnd的處理,我將reference是這個類的associationEnd存在這個類下面,而全部association做爲一個數組存在每一個ClassNode下面,這樣查詢關聯時就是根據associationEnd找到association再根據AssociationNode的信息找到對端信息。設計模式
我此次的架構基本按照UML圖的存儲結構進行設計,這樣有一個優勢就是穩,至少架構不會崩,沒有重構的風險。而在細節設計上我採用了以空間換時間的設計,一個類儘量多的存儲他須要的信息,就像association的信息我每一個類都存了一份。數組
此次做業的目的是在上次做業的基礎上拓展解析器,使得可以支持對UML順序圖和UML狀態圖的解析,並可以支持幾個基本規則的驗證。是一次以瞭解UML狀態圖和順序圖爲目的的做業。多線程
此次做業的架構設計依舊和上次同樣是參考UML自己的存儲方法設計的,即將順序圖InteractionNode和狀態圖RegionNode以和ClassNode一個級別的類存儲,而StateNode則用於存儲狀態的信息和它所能直接到達的狀態的id隊列用於進行遍歷。因爲考慮到考期的問題,此次做業要求的順序圖和狀態圖要實現的方法並不深刻,甚至說這兩個圖中許多的元素在此次做業中並無用到。相對的,此次做業的難點主要集中在那三個模型有效性檢驗方法上,對於循環繼承檢驗因爲是以搜索爲目的因此我採用的是DFS算法,而以遍歷爲目的重複繼承我才用BFS。從圖的角度講,循環繼承檢驗是遍歷圖上每個點,若是這個點有到本身的的路徑則他在循環中,重複繼承則是若是一個點有兩條路徑通向一個點則是重複繼承。架構
此次的思路依舊和上次做業差很少,狀態圖因爲region和statemachine在功能上有所重複因此合成了一個類,另外一方面因爲有很所元素此次做業並無用到因此在類的設計上也作了相應的簡化,忽略了那些用不到的類。因爲以前將類和接口存在了一塊兒因此此次構建圖的時候必須用一個type屬性將二者區別開。框架
這是OO學習的第一個單元,這個單元我能夠說是徹底沒有架構設計,每一次做業都在重構。也是這個單元的做業讓我認識到了框架延展性的重要性,重構的緣由基本都是由於無法再上次做業的基礎上實現新一次做業的要求。另外因爲這是面向對象的第一個單元,也是瞭解面向對象理念的第一個單元,因此雖然每一次做業都在重構,可是寫出來的代碼仍是逐漸從面向過程轉變爲面向對象的。學習
總而言之,第一單元在架構上的收穫是:一、面向對象的思惟 二、框架延展性的重要性。 三、很差好作架構設計真的很容易寫出屎山測試
OO第二單元的主題是多線程,也是四個單元中難度較高的一個單元,而這個單元的做業我完成的比較輕鬆,其緣由很大一部分是由於我架構作的好。這個單元的第一次做業因爲要求比較簡單因此我基本上是沒作什麼架構的,而第二次做業因爲初露多線程的鋒芒而且助教明確暗示下次做業會有多部電梯,因此我在寫代碼前仔細思考了框架的延展性以適應第三次做業。第二次做業設計出的框架很大程度上參考了老師在課上提出的那些設計模式。第二次做業完成後的第三次做業我幾乎沒花什麼力氣就完成了,能夠說第二次作的架構十分的有用,也讓我意識到了一個好的架構能爲我省下多少力氣。
總而言之,這個單元在架構上的收穫就是:一、設計模式的學習的重要性 二、一個好的架構設計真的頗有用 三、功能解耦的重要性
第三單元的主題是JML(算法),雖然在上個單元中因爲架構我嚐到了很多甜頭,但在這個單元的設計中我依然吃了癟。由於我覺得這個單元是學習JML因此每次做業的聯繫不會很緊密,事實證實我錯了,不只每次做業的聯繫很緊密還和JML沒什麼關係。這個單元的做業讓我認識到了架構不只僅要延展性好,還要適於搭載各類算法,或者說設計時計劃在架構中實現的算法。臨時改算法的結構極可能就是重構,而我則因爲一開始選用的算法會超時而重構了一次,並且因爲重構的時間緊迫因此又寫出了屎山。
總而言之,第三單元的收穫是:一、算法是架構的一部分,要在設計時就選擇好 二、架構要利於算法的實現
第四單元的主題是UML,這個單元的架構其實沒什麼好說的,由於我基本從頭至尾都是按照starUML中的結構設計的。另外一方面,這個單元因爲要實現的方法很是的多,因此能夠說是我方法解耦設計的最認真也是最好的一個單元,設計的架構十分清晰
這個單元的收穫是:一、學習好的架構對設計架構也很重要 二、功能解耦可使架構清晰
一、第一個單元的測試一開始由於代碼量比較小因此都是以讀源碼找bug爲主,爲本身程序測試的方法也是隨便想幾個數據進行測試。後來第三次做業的時候代碼量劇增,因此採用了自動生成數據的方法進行測試。
二、第二單元開始工程的體量就不是在能讀的範圍內了,並且通過第一單元的做業我也意識到了規模測試的重要性,所以第二單元的做業以自動生成數據測試爲主,而且能夠調整參數進行壓力測試。因爲結果正確性很難保證,所以正確性檢驗採用和別人對拍的方式來驗證,從而將其用於檢查本身的程序和查別人的bug
三、第三單元的測試和第二單元沒有太大的區別,惟一的區別就是測試變成以對拍爲主了
四、第四單元沒有測試,因爲烤漆的緣由也沒有自測
OO課程雖然難,但整體上的收穫仍是不少的。第一單元的主題是求導,是一個讓咱們入門java和麪向對象的一個單元。不得不說這個單元最後一次做業難度真的很高,感受開學這段時間是一學期中最忙的時間,不過學到的東西也是最多的。從第一次做業的一星期入門java,到第三次做業一星期入門面向對象,第一單元的做業爲以後的學習打下了很好的基礎,對面向對象初步的理解和對架構重要性的認識都是在這個單元造成的。第二單元是多線程電梯,是將第一單元所學的東西付諸實現的一個單元,這個單元帶來的更多的是經驗上的收穫,在這個單元我第一次作出了一個很成功的架構(彷佛是惟一一次)。同時,這個單元學習的許多設計模式也使我受益不淺,也讓我認識到了一個好的架構每每是多種設計模式相結合的。第三單元是JML,是咱們第一次接觸規格設計語言,在這個單元中我學習到了規格設計和編寫代碼,設計架構之間的關係,也讓我認識到了算法是全部語言的基礎。第四單元的UML是建模語言,讓我學習到了如何經過圖形來表達架構設計。
感受一個學期的課程下來,收穫最大的是對架構的理解,換句話說,是對大規格程序的理解。在學習OO以前,咱們一直接觸的都是一些500行之內的小程序,可使用面向過程的思路很好的解決,而OO課中咱們接觸的,每每在三次連貫的做業後能夠達到千行級別,代碼規模不能同日而語。一樣,編寫這樣規模的代碼,轉換思路是很重要的,而OO課爲咱們提供的面向對象,架構設計,功能解耦的思路是對我大有脾益的,能夠說OO課提高了我對工程級程序的認識。
一、JML單元感受和算法的關係更大,做業設計上能夠下降難度提高與JML的聯繫
二、UML單元既然臨近期末仍是下降做業體量,多些看圖說話或畫圖的做業比較好
三、但願減小互測房間大小,人太多雖然能夠引導同窗自動測試,但也會讓人不想去測這麼多人