OO第四單元+課程總結
本單元架構設計
第四單元任務旨在實現一個UML類圖、狀態圖、順序圖的分析器。MyUmlGeneralInteraction
作為入口,其中分別建立了一個類圖分析器MyClassMedelInteraction
、一個狀態圖分析器MyUmlStateChartInteraction
、一個順序圖分析器MyUmlCollaborationInteraction
。總體架構如下:
-
MyUmlClassModelInteraction
-
Class(Base)
-
UmlAttribute
-
Operation
-
UmlParameter
-
-
Association
-
UmlAssociationEnd
-
-
-
Interface(Base)
-
UmlAttribute
-
Operation
-
UmlParameter
-
-
-
UmlGeneralization
-
UmlInterfaceRealization
-
-
MyUmlCollaborationInteraction
-
Interaction
-
UmlMessage
-
UmlLifeline
-
-
UmlAttribute
-
-
MyUmlStateChartInteraction
-
StateMachine
-
UmlRegion
-
UmlPseudostate
-
UmlFinalState
-
State
-
UmlState
-
subsequentStates
-
-
Transition
-
UmlEvent
-
UmlTransition
-
-
-
首先第一次作業在類圖分析器中通過三次掃描,第一遍將UML_CLASS
、UML_INTERFACE
、UML_ASSOCIATION
;第二遍將UML_OPERATION
、UML_ATTRIBUTE
、UML_ASSOCIATION_END
;第三遍將UML_PARAMETER
、UML_INTERFACE_REALIZATION
、UML_GENERALIZATION
型別元素放入其對應容器。
Base
類擁有Class
和Interface
類的公共部分:屬性、方法、繼承的介面。Class
在其基礎上增設了父類superClass
和關聯關係對端Associations
。Operation
類除了umlOperation
本身外,設定了引數parameters
。只需要通過三次掃描,將各類引數放置在自己應處的位置處,就完成了對類圖的結構化儲存。
MyUmlStateChartInteraction
類似地通過三次掃描,層次化地存放了7種相關型別的element。一個StateMachine只擁有一個UmlRegion,在region中,分別存在一個初始狀態、一些中間狀態、很多狀態轉移和一個終止狀態。有特殊之處就是要分開存放1.初始狀態為起點的轉移 2.State之間的普通轉移 3.終止狀態為終點的轉移,以便後續查詢使用。
MyUmlCollaborationInteraction
通過兩次掃描,建立好UML_INTERACTION
、UML_LIFELINE
、UML_MESSAGE
、UML_ATTRIBUTE
之間的層次關係。這一模組功能點最為簡單,只要通過第一次上機時提供的樣例,理解了幾類元素之間的層次關係(誰是誰的parent),就很好實現。
架構完成後,三次功能點的實現基本都是用一些簡單的圖演算法完成,其中BFS使用頻次最高,在遍歷圖之前,每一步都要對應丟擲不合法的的Exception,這裡一般使用單獨一個讀取結點的方法實現。
架構設計及OO方法理解的演進
第一單元多項式求導:
前兩次作業按照ppt中作業提示,按照形式化定義分別實現項和多項式類,結構簡單;最後一次作業按照指導書建議進行了一次重構,構建了一個表示式樹,以Operator
作為樹節點組織整個表示式。
第二單元多執行緒電梯:
本單元主要學習並運用了生產者消費者設計模式,這也是繼工廠模式之後學習的第二個設計方法。本單元最重要的是學習應用了執行緒安全的保障:保證所有可能存在的多個執行緒共享訪問的地方都加了鎖;保證只在必要的地方加鎖,儘量縮小鎖的範圍。
第三單元JML:
這一單元基本不需要考慮架構的設計,是在設計好的架構骨架上新增血肉,但在MyNetwork
中的sendMessage
方法編寫過程中,還是很好地將多個不同類之間的關係清晰地梳理了出來。對於官方給出的Runner
類資料讀取、處理方式的閱讀也促進了下一單元幾個分析器類的編寫。
第四單元UML:
最後一單元綜合地考察了對抽象、繼承的理解,因為沒有整體架構的提示也不是程式碼填充,在編寫之前需要把整體架構畫出來,在編寫中遇到小問題還要增加、調整原本設計類的屬性,比如Base
類就是開始設計時沒有的,但因為在處理OPERATION
類的元素時其既可能屬於類也可能屬於介面,因此又抽象出了這一個抽象類,讓Class
和Interface
來繼承。
測試理解與實踐的演進
第一單元使用了自動化生成測試資料利用隨機數生成1000個合法表示式,再利用java輸出與sympy得到的求導結果相比較確認目標是否存在bug;第二單元主要手動設計極端條件如捎帶超載測試點考察人數上限、TLE的測試點考察電梯效能;第三單元同樣側重考察效能,極端資料會讓複雜度不夠低的演算法TLE。整體除錯+單個方法的除錯是我主要修復bug的辦法。
課程收穫
從時間佔比來看,這門課幾乎是一門實驗課,每週課下寫程式碼+測試+debug的時間絕不少於計組實驗,當然通過四個單元的大量練習,也讓我收穫了不少。從java的基本語法學起,常用容器、好用的物件類,到幾種經典的設計模式,到執行緒之間的安全保障,再到將抽象、繼承、多型的設計思想貫徹到每一次設計中,以類的方式組織程式碼,以物件的形式封裝資料,將每個功能需求發配到最合適的類中實現;當然配合使用的工具也都更加熟練,git的穿越、Typora的各種小技巧等等。
改進建議
1.八次上機實驗下來,觀感是幾次上機難度實在差異過大,有簡單的最快可以半小時提交,有困難的最後都因為commit的CD,未及時提交到最後還在寫、修改的answer導致沒有在規定時間內提交。希望對於困難的上機,比如可以先做預告,如:(1)在訓練單元中先行簡單練習 (2)在週三理論課最後增加上機內容預告(類似於講解作業預告) (3)上機前一天提前開放程式碼庫讓同學們熟悉上機整體程式碼架構。
2.第一單元、第二單元在第一次作業指導書中就提前預告後兩次大概需要完成的功能,這樣可以減少推翻重構的概率,從第一次就開始整體思考架構的設計。
3.每單元結束後可以發一篇負責本單元的自述,內容可以包括但不限於:(1)三次弱、中、強測測試點的構造思路、每個測試點的打擊目標 (2)助教設計的優秀程式碼架構及開源原始碼 (3)本單元題目背後真正的考察點(可以讓同學們逐一比對自己是否掌握)
結語