北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由於UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存儲所有孩子的引用。考慮到性能問題,我採用了緩存機制,一次查詢後儘可能緩存已經遍歷過的信息,以減少遍歷次數。 本單元我 ...
北航OO(2020)第四單元博客作業暨課程總結博客
目錄
本單元作業的架構設計
在本單元中,由於UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存儲所有孩子的引用。考慮到性能問題,我採用了緩存機制,一次查詢後儘可能緩存已經遍歷過的信息,以減少遍歷次數。
本單元我對架構沒有做出修改,只是進行了增量開發。因此,下麵展示本單元第三次作業的UML類圖併進行分析:
在本單元作業中,我採用Main類作為主控類,MyUmlGeneralInteraction類實現相應的介面,並將UML元素分派給三種圖類進行構造,同時調用三種圖類中的相應方法進行查詢和驗證。ClassModelDiagiam、CollaborationDiagram和StateChartDiagram三個類分別對應類圖、順序圖和狀態圖,它們管理相應的Elements並處理查詢和驗證操作。
架構設計及OO方法理解的演進
在四個單元的作業中,我的架構設計從最初的按照數據簡單拆分類,並將相應的方法封裝到類中,演進到現在的結合數據特點、類之間的關聯關係以及一些OO原則和設計模式進行類的構建,並由此設計出類中的屬性和方法。
通過一學期OO課程的學習,我對面向對象的理解從簡單拆分類演進到各種設計模式和設計原則,並看到了OO帶來的好處:模塊化、層次化、可擴展性和隱藏實現細節等。在作業開發的過程中,我從最開始的直接編碼,逐漸演進成現在的先進行架構設計,確定每個類中的屬性和方法,以及類之間如何進行交互。這樣,在最後只需要對方法進行填充即可。這也體現了一些設計和實現分開的思想。
四個單元中測試理解與實踐的演進
測試是我在本學期中比較薄弱的環節。在前兩個單元中,我主要依靠人工構造一些數據對程式進行測試。雖然人工構造可以覆蓋一些極端的邊界情況,但仍不及自動化的對拍測試高效全面。這導致我在第一單元第三次作業中出現了Wrong Format判斷錯誤的情況。而且對於多線程程式來說,人工構造數據併進行驗證的效率更為低下。
在第三單元中,我主要依靠JUnit進行單元測試,並與他人程式進行對拍。由於JUnit可以查看覆蓋率數據,並可以方便地進行回歸測試,在開發階段的測試還是比較方便的。對拍測試通過大量數據的生成來達到覆蓋測試的目的,實際效果也十分不錯,幫助我發現了一些bug。在這兩種測試手段的幫助下,我無傷通關了本單元的測試。
在第四單元中,由於需要畫圖,我的測試手段又回歸了人工構造數據。果不其然,在最後一次作業中再次出現了迴圈繼承判斷錯誤的情況。由此可見,一定程度上的自動化測試還是十分必要的。
課程收穫
通過OO課程的學習,我瞭解了面向對象的基本原則和一些設計模式,掌握了Java中小型程式設計,入門了多線程程式設計以及規格化和模型化設計。
在第一單元中,我接觸了層次化設計的思想以及抽象、封裝、繼承和多態等基本OO特性,併在三次作業的訓練中,逐步使得自己的程式有了一些OO的特點。
在第二單元中,我接觸了多線程程式的設計,並學習了線程同步的一些方法和經典的生產者-消費者設計模式。通過三次電梯作業的訓練,我初步掌握了多線程程式的同步方法。
在第三單元中,我接觸了規格化程式設計,並瞭解了JML這種建模語言。雖然在如今的互聯網軟體開發中,如此嚴格的形式化規格表述並不常見,但形式化的規格方便進行嚴格的正確性驗證,可以應用在高可靠性領域。
在第四單元中,我接觸了模型化設計,並瞭解了UML這種建模語言。通過作業訓練和實驗訓練,我從結構層次和應用兩方面認識了UML。
通過12次代碼作業的訓練,我的Java代碼量達到了數千行。在這個過程中,我也逐步上手了Java中小型程式設計的一些基本方法。
關於課程的一些建議
- 建議控制課程時長,儘量不要在臨近考期時佈置大量任務;
- 建議互換第二單元與第三單元的順序,在平衡難度的同時可以與OS課程進行更好的銜接(這樣可以在OS介紹完進程同步後再開始接觸多線程程式設計,降低同學們的上手難度);
- 建議UML部分將討論區的文件結構介紹整合成參考手冊下發給大家,可以降低大家第一次作業的上手難度。
OO線上學習體會
OO課程受線上教學帶來的影響較小,僅僅是理論課部分不再能進行現場交互了。這一點通過課堂討論和課後問卷得到了一定程度上的彌補。但是我認為一些課堂討論題難度較大,不適合在課後立刻進行討論,因此一定程度上影響了討論的效果。