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
裡,增添了儲存MyStateMachine
和MyUmlInteraction
的HashMap
。至於其他的元素,依然是按它們之間的關係和層次,儲存到對應的元素裡。
第三次作業
本次作業並沒有在上次的作業的基礎上,新增其他需要分析的元素,只是增加了對模型的有效性檢查。所以在這次的作業中,我只在建構函式構建元素時,按照作業要求對元素進行檢查,看是否有非法的元素,若有則將它們另存起來,並在之後的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圖地分析器。
測試理解與實踐的演進
在每次作業中,我的測試方法其實都大同小異:
- 構造針對性資料
- 會針對每個方法構造出一個能測試功能和效能的資料。
- 構造邊界資料
- 對拍
課程收穫
個人認為這門課還是讓我學到了蠻多的,可是卻又很難具體地描述自己到底學了什麼,可能是程式碼整體框架的設計方式,可能是寫程式碼的思維方式,也可能是整體程式碼的可用性和靈活性提高了。反正每一單元都會讓我感覺受益良多,但卻又是從各個方面的,所以也很難具體地說在這門課裡我究竟收穫了什麼。
改進建議
-
指導書
尤其是在第四單元裡,個人認為可以再給更多的樣例,讓學生能更為直觀地看清楚每條指令的相關要求和限制。因為明白很多東西是非常難用文字表達,而且寫得太長,也可能會導致整體看上去非常繞,倒不如給多一點樣例,讓學生能根據樣例來自行理解每條指令的要求和限制。
-
單元難度
相較於第一和第二單元,第三單元的難度其實降低了很多。不單是類介面的實現已經由官方提供了,就連大多數的類介面的實現方式都是較於簡單、直接的。個人認為可以適當地增加更多難度較高的介面,以保持每一單元的整體難度。
-
實驗課反饋
個人認為可以在實驗課結束後,提供實驗課的參考答案,讓同學知道自己作答是否有誤。因為每次實驗課,同學們互相討論後,有些題目還是存在異議的,所以建議課後可以提供答案,也能讓做錯的同學發現自己的錯誤。
感想
OO這門課終於來到了尾聲,但卻又有一絲絲的不捨,該不會是每個星期都被虐,已虐出感情了吧。真的非常感謝這門課,讓我學到了很多,感覺每個星期都在作業堆裡過得非常充實,而且助教人也超好的,最可惜的是我還是不能回到學校上課,只能接受線上授課。