1. 程式人生 > 其它 >第四單元 & OO課程總結

第四單元 & OO課程總結

第四單元 & OO課程總結

目錄

第四單元架構

總體來說除了要比較深刻理解UML的結構之外(直接閱讀原始碼很重要),主要需要注意的就是各種解析或檢查時的dfs、bfs了,整體程式碼架構感覺比JML還簡單

第一次作業

解析UML類圖,由於物件建立有父子依賴關係,因此需要先解析上層才能解析下層。

採用3次遍歷,分別解析:

  • Class,Interface,AssociationEnd
  • Association,Attribute,Operation,Generalization,InterfaceRealization
  • Parameter

其中對AssociationEnd,Class,Interface,Operation單獨建類,並將Class,Interface用介面封裝

儲存均使用HashMap,key適時選用name/id

UML類圖

第二次作業

增加時序圖、狀態圖的解析。

採用5次便遍歷,分別解析:

  • Class,Interface,AssociationEnd,Interaction,StateMachine,
  • Association,Attribute,Operation,Generalization,InterfaceRealization,Lifeline,Region
  • Parameter,Message,State
  • Transition
  • Event

新增單獨建類Interaction,Lifeline,Region,State,StateMachine,Transition

UML類圖

第三次作業

新增UML有效性檢查,架構不變,只在主解析器增加檢查方法,並下放到類進行檢查。

需要注意一些小坑如除了id完全相同的Generalization

面向物件架構設計的演進

從刻意追求OO,到自然內化OO

單就架構來說,我其實在整個課程中都沒有經歷過重構,但架構設計確實也佔掉了每次作業最多的時間。

  • 第一單元表示式解析是面向物件初體驗+java入門,邊實現功能邊學習語法。比較意外的是效果還不錯,當時沒有使用常見的遞迴下降演算法(不想重構),而是根據自然的表示式結構進行層次劃分,並直接運用大正進行解析,面向物件的感覺很足。雖然第二次作業由於正則表示式不熟悉、測試不到位強測翻了車,但每次的增量開發屬實很能讓人感受到OO的魅力。
  • 第二單元多執行緒電梯是難度最大的一單元,多執行緒+設計模式,在第一次作業時就通過讀部落格瞭解到最終的設計目標,並做好預留。作業開放性很大,兩級排程器的設計讓執行緒安全和增量開發都變的很容易。在這個單元,抽象、架構設計的能力都得到了很大的鍛鍊,而且架構設計也是簡潔、全面測試的基礎。
  • 第三單元JML的程式碼架構不需要自行設計(雖然也有個別方法需要自行設計輔助方法和屬性),我認為是OO感覺最少的一單元,但對JML確實有了比較深的理解。雖然JML可能本身的用處有限,但對於單元測試+面向規格開發的抽象思想,確實也對工程開發中的需求與表達的理解有很大的幫助。
  • 第四單元UML並不像看起來那麼簡單,雖然有往屆部落格的幫助,但對於整個解析器的抽象尤其是多層遍歷、單獨建類這些操作還是很考驗OO思想以及抽象能力的。而且對於UML語言本身的理解也是對整個java語言架構的深刻了解,對理解OO本質很有幫助。

關於測試

相對於架構設計的精心構思,同樣很重要甚至對程式碼質量有決定性影響的測試我做的就沒有那麼好,我才用過的測試方法基本有以下幾種(其中黑盒測試部分都可結合JUnit):

  • 黑盒測試
    • python編寫測評機,按照自己的理解生成資料,主要測試基礎功能(看上去很酷但其實意義不大)
    • 手動生成邊緣資料:如表示式解析的多層括號,多執行緒的密集輸入、開始結束,JML的大規模資料等
    • 對拍(主要為JML、UML使用)
  • 靜態測試
    • 降低複雜度(雖然不是直接找bug,但這個過程中可能會發現設計缺陷,也便於測試)
    • 確定每個分支都能跑通(每個boolean)
    • 多執行緒去鎖

改進意見

  • 實驗課相比作業體驗並沒那麼好,希望有講解或者簡單的答案
  • 互測動力沒那麼強,只是為了加分的話,如果沒有自己的測評機很難有精力讀那麼多人的程式碼
  • JML確實可以減少次數,或者放到最後一單元,因為UML還是值得認真的3次作業的,但現在會和考期衝突(6系都在考期前兩週考試),但JML相對來說收穫並沒有那麼大。
  • 或許可以將JML、UML融合,比如UML第一次作業自己設計,後兩次作業通過JML規格給出要求,而不是像現在兩單元都用演算法來充內容

總體感受

收穫頗豐:OO思想+測試能力+java語言

之前對面向過程沒有任何概念,整個課程教會了也讓我明白了OO思想,這種根據功能職責劃分物件的程式碼組織結構的高效性、重要性。通過練習,也掌握了面對一個有規模的實際問題,從抽象到架構設計再到具體實現的全過程,是程式碼能力的進階。

這其實是我第一次系統、認真地對測試進行思考,也明白了為什麼程式碼測試會成為單獨的課程和職業。一學期下來,對基本的測試方法的學習也反過來提升了程式碼的設計能力,增加了對程式碼需求的理解。

總體看來,本學期java語法反而是最次要的技能了,因為基於C語言,在組織結構上不產生大的改變,過去的幾個月我只需要用到什麼現場去查(正則,堆疊、佇列容器,::等)效果都很好,這也給了我在學習中應用更多語言的信心。

還有其他邊緣但蠻重要的技能:markdown,部落格,python指令碼...

體驗良好:精品課程名副其實

課程制度、內容安排、作業設計、課程環境(網站用起來是所有課裡面手感最好的哈哈哈哈)都很棒的一門課,每週寫oo心情都很愉悅,雖然強測裂開時候也會難受很久,但回首過去還是很感謝這門課給我全方位的能力提升!

確實是一門很用心的課,從老師到助教到同學們,大家共同營造出一個很好很好的學習環境,從部落格的傳承到研討課的分享(記得有次因為比賽拖到週日晚上才完成,弱測有個bug過不去,許多同學紛紛伸出援手,最後極限通關),真的很為能在6系成長感到自豪!

希望OO越來越好!