第四單元總結及面向對象課程總結

(1)總結本單元兩次做業的架構設計

第一次做業

第一次做業設計Uml類圖的構建和查詢,單獨構建了ClassGraph類進行管理,因爲涉及類和接口的查詢和構建內容比較多,所以設計了ClassInfo和InterFaceInfo兩個類分別進行類和接口的管理,並做爲構建ClassGraph的組成部分。正則表達式

考慮到輸入的亂序性,好比AssociationEnd可能先於Association出現,設計了分批次處理數據,就是讀入UmlElement數組以後,掃描第一遍只處理一部分,另外一部分作記錄,留着做爲第二批處理,這樣寫程序的時候能夠減小對parentId對應的元素是否已構建的斷定,減小複雜度;算法

查詢的時候會調用ClassGraph的函數,判斷是否查詢條件有誤(不存在或者重名),以後找到相應的類,調用ClassInfo的內部函數。涉及接口查詢的時候,一樣先找到類對應的ClassInfo,ClassInfo裏面會記錄本身實現的接口的InterFaceInfo和本身的父類,InterFaceInfo內部會記錄本身的父接口們,彙總以後獲得結果。數組

第二次做業

第二次做業增長了狀態圖和順序圖,這兩個和類圖是獨立的,所以單獨構建了StateGraph和SeqGraph分別進行處理。因爲狀態圖定義在StateMachine畫布上,順序圖定義在Interaction畫布上,所以設計了StateMachineInfo和InteractionInfo類,StateGraph存儲狀態機對應的StateMachineInfo,Interaction同理。StateMachineInfo和InteractionInfo內部存儲在各自畫布上的狀態圖和時序圖,以及對圖中元素的查詢函數。數據結構

輸入一樣進行分批次處理;多線程

查詢時,類圖查詢同第一次做業,狀態圖和順序圖查詢相似類圖的結構,先進入xxxGraph判斷查詢條件,而後找到對應的xxxInfo進行查詢;架構

此外本次做業增長了Rule的檢查,第一個Rule遍歷全部類檢查便可;第二個須要在輸入處理的時候分別構建好Class和InterFace的繼承關係有向圖,查詢兩個圖裏是否有環,TarJan算法便可;第三個Rule遍歷類和接口查詢是否父類有問題、實現的接口有問題或者本身是否有問題;函數

第二次做業用到的類的關係圖示:學習

(2)總結本身在四個單元中架構設計及OO方法理解的演進

第一單元

初步接觸Java,學習Java語法,學會使用正則表達式,初步接觸容器的使用。一開始對面向對象沒有概念,三次做業的遞進讓我也開始用面向對象的方式思考代碼結構,解決問題;測試

架構方面,第一次做業僅用了一個文件一個類,用"x"和冪組成的字符串構建HashMap合併同類項,第二次引入三角函數以後延續第一次的思路,第三次引入嵌套以後重構了代碼,按照Factor、Term、Expression分層,初次使用了類的繼承;優化

第二單元

主要是多線程程序的編寫,在第一單元的基礎上,一開始就重視對架構的設計,且此次做業開始重視解耦的思想;

前兩次做業只有一個電梯,所以使用了一個調度器類和一個電梯類,將調度算法和電梯運行進行解耦;第三次做業有三個電梯,所以對調度器進行了層次化,有一個總調度器,協調三個子調度器,子調度器和電梯進行交互,總調度器給子調度器分配任務;

此次做業重視多線程所以涉及類的繼承和接口的部分很少;

第三單元

本次做業主要是對規格的理解,嘗試了更多數據結構(HashMap、HashSet、Queue),以及一些算法(BFS、單源最短路徑)。由於做業涉及各類圖結構的查詢,所以架構設計尤其重要。前兩次做業比較簡單,結構比較扁平,只包括MyPath和MyGraph兩個類。第三次做業涉及的查詢種類較多,MyRailwaySystem中的圖結構專門分離出來,由GraphRelated類管理,票價、換乘、擁擠程度三種查詢分別由三個類管理,這三個類由不少共同點,實際上能夠進一步優化成一個類管理三種不一樣的權重。第三單元對架構的設計技能相比前兩個單元提高了不少。

第四單元

本次做業主要是對UML圖的理解,搞清楚不一樣UmlElement的意義、相互依賴關係以後並非很難。因爲查詢的簡化,類圖、狀態圖、順序圖這三個模塊互相不影響,所以用三個類分別進行管理(ClassGraph, StateGraph, SeqGraph),類圖因爲既要考慮類也要考慮接口,所以ClassGraph使用ClassInfo和InterFaceInfo兩個類分別進行類和接口的管理。這個單元進一步鍛鍊了架構設計能力,因爲做業內容是對UML圖的解析,所以對面向對象的要素:類、接口、繼承、接口實現,以及狀態圖、順序圖、關聯關係等有了更加深刻的理解。

(3)總結本身在四個單元中測試理解與實踐的演進

第一單元主要是對錶達式進行處理,構造方法比較簡單,不過要想實現測試樣例的充分覆蓋仍是有困難的,當時是樣例測試和程序邏輯驗證結合進行檢查,可是當程序複雜度比較高的時候(好比第三次做業)就很難準確地進行邏輯驗證;

第二單元多線程程序因爲構造輸入、按照時間順序給定輸入比較困難,所以正確性驗證主要是經過代碼邏輯檢查,死鎖檢查,這時候架構的設計很重要,若是架構設計好,邏輯檢查會省很多力;

第三單元引入了Junit協助測試,能夠很好的驗證程序的正確性;

第四單元主要是經過手動構建UML圖樣例進行測試,經過構建一些特殊狀況、極端狀況進行測試,同時也有程序邏輯檢查;

(4)總結本身的課程收穫

【1】對Java語言的學習,包括基本語法,多線程程序編寫,容器的使用等;

【2】面向對象思想,使用面嚮對象語言寫程序實現需求,使用面嚮對象語言的特點(類、繼承、接口)優化架構,提高代碼質量;

【3】代碼能力,工程能力,一學期下來積累了必定的代碼量,de了很多bug,掌握了一些設計測試樣例的方法;

【4】可以更加樂觀的面對生活;

(5)立足於本身的體會給課程提三個具體改進建議

【1】建議公開全部中測樣例,或者容許中測只有一個(或者少許)錯誤狀況下參增強測,畢竟強測佔很大一部分紅績。最後一次做業由於中測沒有公開的樣例差點沒有進入強測,由於一個小細節過不了中測的某一個測試點,沒法參增強測分數損失會很大,並且不必定中測的的bug會影響強測全部測試點的拿分,所以我的感受目前的分數設置不太合理;

【2】建議做業發佈時間更加準時一些,以及若是做業要延期,建議採用僅僅延後提交ddl的方式,而不是同時將發佈時間也推遲,由於每一個人有空寫做業的時間都不同,留更多的時間出來可讓咱們安排更靈活;

【3】建議指導書、庫的發佈前多修訂幾回,或者至少細節部分發布前要統一,不然一邊寫做業一邊改需求會比較麻煩,寫做業的時候還須要踩不少能夠避免的坑;

以上建議僅僅是理想的目標做爲參考,畢竟老師和助教平時也很忙。實際上課程組已經作的很好了,本學期上這門課的體驗極佳,每一個單元、每次做業都設計的很精妙,環環相扣,層層遞進,一套流程下來,收穫頗豐。感謝爲這門課付出的老師和助教們,比起寫做業的咱們,留做業的大家更辛苦;感謝討論區分享本身經驗的大佬們,大家摸着石頭過河,我摸着大家過河。

最後祝OO這門課越辦越好!

相關文章
相關標籤/搜索