1. 程式人生 > 其它 >OO2021 - 第四單元

OO2021 - 第四單元

2021面對物件設計與結構 - 第四單元

UML是統一建模語言的簡稱,是一種編制軟體藍圖的標準化語言。UML主要使用圖形符號來表示軟體專案的設計,為開發團隊提供標準通用的設計語言來開發和構建計算機應用。
本單元主要的目的就是實現一個UML分析器,能支援對UML類圖、UML順序圖和UML狀態圖的解析。

架構設計

在本單元裡,我基本上都是使用HashMap來儲存資料。一般上我都會以id為Key,以類為Value來儲存,但對於那些需要以name查詢的類,我便會建立多一個以name為Key,以idList為Value的HashMap來儲存,這樣也方便我檢查name是否有重複的。

第一次作業

因為本次作業只需要分析UML類圖,所以MyUmlInteraction類裡,只儲存了MyUmlClass和MyUmlInteraction。而其他的如方法和屬性則按它們之間的關係依次儲存到對應的類/接口裡。

第二次作業

本次作業不單需要分析UML類圖,還需要分析UML順序圖和UML狀態圖,所以在MyUmlGeneralInteraction裡,增添了儲存MyStateMachineMyUmlInteractionHashMap。至於其他的元素,依然是按它們之間的關係和層次,儲存到對應的元素裡。

第三次作業

本次作業並沒有在上次的作業的基礎上,新增其他需要分析的元素,只是增加了對模型的有效性檢查。所以在這次的作業中,我只在建構函式構建元素時,按照作業要求對元素進行檢查,看是否有非法的元素,若有則將它們另存起來,並在之後的CheckAllRules時輸出即可。因此相較於上次的作業,本次作業只新增了以下幾個容器:

private HashSet<AttributeClassInformation> r001 = new HashSet<>();
private HashSet<UmlClassOrInterface> r002 = new HashSet<>();
private HashSet<UmlClassOrInterface> r003 = new HashSet<>();
private HashSet<UmlClass> r004 = new HashSet<>();
private boolean r005 = false;
private boolean r006 = false;
private boolean r007 = false;
private boolean r008 = false;

架構設計和OO方法理解的演進

我認為在第一單元中,我對面向物件寫法還是太陌生了,導致我很多方法還是按照之前的面向過程的思維方式寫的。雖然在第一次作業中感覺差別不大,可是差別在之後的作業就慢慢顯現出來了。尤其是在第三次作業中,程式碼錯綜複雜,程式碼重複性和複雜性都挺高的,也沒實現到高內聚低耦合的標準。

結合了第一單元的經驗和教訓後,在第二單元動手寫程式碼之前,我都會先想好架構,再動手寫程式碼。第二單元主要實現的是多執行緒,個人認為除了剛接觸多執行緒時的迷茫,其實多執行緒實現並不複雜。因為只要明白了死鎖產生的原因,能有效地避開死鎖,其實多執行緒並沒有什麼大坑,而且還能實現執行緒間的互動。

第三單元主要的是通過閱讀官方給的JML實現類的介面。而對於本次單元的作業來說,其實最注重的不是介面的實現,而是介面實現的方式。因為只能要能讀懂JML,介面的實現其實是沒什麼難度的,可是若要完美通過本次單元,則必須對類介面的實現有較高的要求。

而第四單元主要的是實現一個UML分析器。因此完成本次單元的前提是必須會一些UML的相關知識,才能有效地構造出一個能支援解析UML圖地分析器。

測試理解與實踐的演進

在每次作業中,我的測試方法其實都大同小異:

  1. 構造針對性資料
    • 會針對每個方法構造出一個能測試功能和效能的資料。
  2. 構造邊界資料
  3. 對拍

課程收穫

個人認為這門課還是讓我學到了蠻多的,可是卻又很難具體地描述自己到底學了什麼,可能是程式碼整體框架的設計方式,可能是寫程式碼的思維方式,也可能是整體程式碼的可用性和靈活性提高了。反正每一單元都會讓我感覺受益良多,但卻又是從各個方面的,所以也很難具體地說在這門課裡我究竟收穫了什麼。

改進建議

  • 指導書

    尤其是在第四單元裡,個人認為可以再給更多的樣例,讓學生能更為直觀地看清楚每條指令的相關要求和限制。因為明白很多東西是非常難用文字表達,而且寫得太長,也可能會導致整體看上去非常繞,倒不如給多一點樣例,讓學生能根據樣例來自行理解每條指令的要求和限制。

  • 單元難度

    相較於第一和第二單元,第三單元的難度其實降低了很多。不單是類介面的實現已經由官方提供了,就連大多數的類介面的實現方式都是較於簡單、直接的。個人認為可以適當地增加更多難度較高的介面,以保持每一單元的整體難度。

  • 實驗課反饋

    個人認為可以在實驗課結束後,提供實驗課的參考答案,讓同學知道自己作答是否有誤。因為每次實驗課,同學們互相討論後,有些題目還是存在異議的,所以建議課後可以提供答案,也能讓做錯的同學發現自己的錯誤。

感想

OO這門課終於來到了尾聲,但卻又有一絲絲的不捨,該不會是每個星期都被虐,已虐出感情了吧。真的非常感謝這門課,讓我學到了很多,感覺每個星期都在作業堆裡過得非常充實,而且助教人也超好的,最可惜的是我還是不能回到學校上課,只能接受線上授課。