OO第四單元總結

1、第四單元架構設計

第三次做業是在前兩次做業的基礎上迭代而成,中間沒有動及筋骨的修改,因此這裏只介紹第三次做業的架構。java

  整體的架構思路是爲不一樣類型的UmlElement創建不一樣的「MyElement」,以便對數據進行存儲、管理和查詢。如爲每一個UmlClass實例化一個MyClass對象,並在MyClass中建立MyAttribute、MyOperation等容器,用來管理該UmlClass所擁有的UmlAttribute和UmlOperation。而MyOperation中又有MyParameter的容器,用以管理該UmlOperation下的UMLParameter。諸如此類,最終造成至上而下的體系,位於最頂層的是MyUmlGeneralInteraction,用來管理MyClass、MyInterface、MyAssociation、MyStateMachine和MyInteraction。git

  在這種體系下,構造方法的思路就是不斷遍歷UmlElement,對當前的UmlElement尋找其parent,找到以後就是parent的任務了。而parent要作的也很少,只須要爲該UmlElement構造對應的「MyElement」,並加入本身的管理容器中便可。只不過考慮到層次有高低之分,必需要先構造頂層後再構造底層,因此要進行屢次遍歷。以UmlStateMachine爲例,要先構建MyStateMachine,再構建MyRegion,而後是MyState(對應UmlState、UmlFinalState、UmlPseudoState),最後纔是MyTransition。只不過最後考慮到代碼風格問題,構造方法太長,因而就新建了MyUmlGeneralInteractionInit類用於MyUmlGeneralInteraction類的初始化。算法

  在體系構造完成後,以後的規則檢查和信息查詢只須要將任務層層分解到各級便可。以checkForUml005方法爲例,即類圖元素名字不能爲空:在MyUmlGeneralInteraction中只需對每一個MyClass和MyInterface遍歷檢查,而MyClass和MyInterface在對自身的name檢查後再遍歷檢查其所擁有的MyAttribute和MyOperation,以此類推。通過層層調用,任何一層出現名字爲空就經過上級反饋,直到反饋到MyUmlGeneralInteraction中,從而完成對005的檢查。安全

2、架構設計演進

第一單元

  作第一單元的做業時就是爲了知足要求而考慮,沒有考慮後續的迭代。第一次做業到第二次做業的過渡還好,花了點時間加一些功能還勉勉強強完成。但第二次做業到第三次做業就沒辦法了,由於求導規則新增了複合函數求導,須要用樹結構,因而不得不重構。但說實話,重構後的架構仍是不怎麼滴,全靠構造測試數據找bug,而後修修補補最終纔像個樣子。通過了第一單元,我親身體會到一個優秀架構的優越性。微信

第二單元

  第二單元進入多線程,這對我徹底是一個全新的領域,最初巴不得將全部方法都加上synchronized關鍵字,對於各類玄學bug也是先試試加上synchronized。我的感受這個單元的做業的架構相比較上個單元有了很大的進步,但仍是遇到了一些問題。一個是線程安全,有時會出現線程沒法結束的狀況。還有就是在第三次做業中加入了換乘電梯的需求,最後我經過增長一個全局控制器來解決這個問題,不過不至於重構,也算一個小的架構問題吧。多線程

第三單元

  在架構設計這方面,相比前兩個單元,第三單元突然一變。有了課程組給的JML,就不須要再考慮總體的架構設計,而是將注意力更多地集中在單個的類中,如何管理類中的數據,如何提升方法的效率。在看懂JML以後,難點就在個別方法了,可能會用到bfs算法、堆優化Dijkstra算法、Tarjan算法、並查集等,感受沒什麼好說的。架構

第四單元

  到了第四單元,我我的對本身的架構設計仍是挺滿意的,至少沒有重構,第一次做業到第二次做業只須要增長新的類來知足新的需求,第二次做業到第三次做業用已有的類中的數據也能知足規則檢查的需求。雖然感受很大程度上是由於難度沒有一二兩個單元高,但仍是感謝課程組把UML放在最後,讓咱們感覺到了不用重構的快感。函數

3、測試實踐演進

  測試方面就說來慚愧了,我一直都是手動構造測試數據,沒有那種全覆蓋性的測試,多是由於寫完代碼後對本身的架構比較自信吧(雖然事實證實架構也不怎麼滴)。以前也嘗試過自動生成測試數據,搭建評測機,但對我這個菜雞好像有點難(好吧,我認可很大部分緣由是我本身太懶了),最後都放棄了。學習

4、課程收穫

  學這門課以前,我對「面向對象」並無什麼概念。以前雖然選修過《java程序設計基礎》,但也只是瞭解一丟丟java的語法而已,對根本get不到「面向對象」這種程序設計思想的含義。而這學期的OO課程讓我初步窺探到「面向對象」的優越之處。我的體會深入的一點就是讓每一個類管理本身的數據,只對外提供相關方法,這讓程序的層次化設計變得容易的多。測試

  此外,這門課也告訴我「動手以前先動腦」的重要性。在着手實現以前好好構思一下程序的架構,考慮一下後續可能新增的需求,比上來就開始寫代碼要事半功倍倍倍倍。相信在之後,程序設計的常態應該是構思所花的時間比敲代碼的時間多。

  固然還有一些附屬品,如git之類的,hhh。

5、建議

  • 在第三單元的第一次做業中強測炸裂,緣由是課程組在後來更新了一次JML,由於以前的JML的addRelation方法的前置條件存在衝突,而我又沒有及時更新JML,因而就在不應拋出異常的時候拋出了異常。但願課程組在對指導書、官方代碼有修改時能有效地通知到每位同窗,尤爲是第三單元的這種有一點錯誤就會跌落深淵的做業,必要時能夠採用問卷、微信羣接龍等騷操做。
  • 實驗的難度真的很想吐槽,有的時候可貴一匹,兩個小時都不夠,而有的時候不到一個小時就差很少解決,但願實驗難度能均衡一點。
  • 說實話,感受線上的課程跟做業沒太強的聯繫,多是我沒有get到課程組的良苦用心。。。

6、線上學習體會

  我的感受線上學習跟線下沒啥區別(除了能夠1.5倍速,以及看完一遍還能夠看回放)。

  固然,看不到老師和助教大大帥氣的側臉仍是會有點遺憾。

相關文章
相關標籤/搜索