做業1,我在頂層採用了HashMap將類(接口)與其對應的內容進行一一映射存儲,進而將查詢操做向下分配給ClassDetails。在對類內方法的參數的存儲上,我採起了類似的方法,即便用OperationDetails類存儲,並將對方法參數類型的查詢分配到該類內部。這是一系列能夠用HashMap層層向下找的過程。python
我還設計了一個單例類AllElements,這個類用來存儲全部的id與UmlElement的映射關係,這使得程序從任何一個地方均可以根據id獲得對應的UmlElement。此外爲了方便,我還設計了一個單例類AllMaps,方便在ClassDetails類內部進行DFS操做時能夠根據UmlClass或UmlInterface取得對應的Details。git
做業2中,因爲是對做業1進行擴展,即添加了新類型的Uml圖,所以我將不一樣類型的圖放到三個不一樣的package中,分別對三個圖進行處理。當調用到對應圖的方法時,由MyUmlGeneralInteraction類對下層的三個Interaction類方法進行調用。算法
這裏沿用做業1的設計。編程
這裏是對於順序圖的處理部分。設計模式
這裏是對狀態圖的處理部分。安全
做業3則是在做業2的基礎上添加對錯誤數據的檢查,總體架構沒有什麼大的變更。關於錯誤數據的檢查,也是層層分配到下一級的類中進行處理,直到分配到與該錯誤數據密切相關的層級進行真正的處理,並再逐層返回。因爲總體架構與做業2一致,就不放UML類圖了。多線程
期末時間緊張,就不本身畫UML圖了,但願老師理解_(°:з」∠)_架構
在上這門課以前,我對OO的理解就是封裝、繼承、多態。那個時候我覺得,這一門課程就是會把封裝、繼承、多態的具體實現方式講清楚。如今來看,我那個時候對OO的理解仍是TOO YOUNG TOO SIMPLE。OO不只僅是封裝、繼承、多態,還有架構設計、編程方法的相關內容。編程語言
第一單元是層次化設計,其實就已經把封裝、繼承、多態的核心內容講清楚了。三次求導做業中,我主要思考的是我須要設置什麼樣的一個類,這個類是對什麼事物的抽象。如何合適地設計一個能夠實現要求所需功能的類,這即是我第一單元對架構設計的理解。此外,這個時候我接觸到了TDD——Test-Driven Development。在開發代碼功能以前,先將單元測試用例寫好,這有助於在編程過程當中對總體性的把握,能夠避免在編程過程當中的不少疏漏。但這個時候我還不太會用JUnit進行單元測試,所以沒有付諸實踐。不過,這是我所理解的OO編程方法的一部分。工具
第二單元是線程安全設計,這個單元是對多線程編程進行了一個初步的介紹。三次電梯做業中,我主要思考的是生產者-消費者模式的應用,進而拓展到對設計模式的應用。如何在本身的設計中合理的應用不一樣的設計模式,簡化本身的代碼,這是我第二單元對架構設計的理解。
第三單元是規格化設計,這個單元引入了規格的概念。這個單元中,結合OS課程的「抽象與權衡」的思想,我較爲深入的理解了抽象的思想。而規格,就是將編程過程當中的行爲抽象出來,將行爲從具體的代碼實現分離出來的一個表示方式。雖然JML不是很好用,可是將行爲與代碼實現分離的思想很符合面向對象的設計方法。我能夠肯定某個模塊的行爲,可是其具體實現卻能夠隨意替換,只要能夠實現該行爲,我能夠採用不一樣的容器、不一樣的算法、乃至不一樣的子架構,這對於我以後的編程具備十分積極的影響。
第四單元是模型化設計,即用UML來表示架構設計。UML圖很直觀,能夠表示的場景也不少,果然不愧被稱爲「統一建模語言」。經過UML語言,即可以將架構設計與代碼實現完全地分離開來,我能夠不用考慮使用Java仍是C++,可是我卻能夠把個人程序架構設計出來,這就是UML的奇妙之處。此時我對於架構的理解就再也不依賴於某一種編程語言,架構設計就是一個獨立於編程語言的過程。
以上即是我對架構設計與OO方法理解的演進。
測試是保證程序正確性的必要手段。沒有人能夠保證本身在寫程序的時候歷來不會寫出bug,而測試即是消滅這些bug的重要方法。
第一單元,我看到有不少同窗使用python和cmd搭建數據生成與自動對拍腳本,因而我也嘗試搭建了一個。雖然數據是隨機生成的,但說實話效果還真不錯,個人第二次做業就在提交前一個多小時被發現了一個「敲錯了一個字符」致使的bug,並且還幫助我在互測中收穫了一些成果。這裏的自動對拍腳本優勢是能夠自行進行測試,省去了人工測試的成本。缺點1是數據徹底是隨機生成的,沒有針對性,須要補充人工構造的特殊樣例,此外還有缺點2是搭建須要消耗較多精力,若是有新的項目,甚至於對老項目進行迭代,都須要對評測腳本進行修改,評測腳本的可移植性極差。
第二單元,因爲是多線程,須要依照時間進行輸入,我使用python的subprocess模塊進行數據的處理與定時輸入。這個單元我沒有進行數據自動生成的工做。多線程bug的出現是偶然性居多,一樣的測試數據運行不一樣次,結果可能都不同,所以生成隨機數據的意義就不是很大了。這一單元我主要採用手動構造測試數據,並使用python幫助我進行特定時間點的輸入,所以在測試上是比較樸素的。
第三單元,我接觸到了JUnit。JUnit與規格的搭配簡直是絕配,我根據每一個方法的規格,對這些方法的行爲進行了大量的測試,效果很是好。從第一次做業的JUnit樣例能夠一直沿用到第三次做業,所以當我爲了改善性能而對程序代碼進行大批量修改時,就能夠在修改完畢後再運行一次單元測試,這樣即可以知道有沒有改出問題來。第三單元我徹底沒有經過輸入輸出進行對拍測試,而徹底將測試轉移到對方法行爲的檢驗上,感受效果很好,用起來很舒服。
第四單元,因爲臨近期末,時間較爲緊張,個人測試作的比較少。本單元的測試主要仍是依賴於我對於極端狀況輸入數據的構造上,對與JUnit的使用不是不少。因爲我比較仔細地構造了較多狀況的樣例,最後的強測結果還算能夠。
我的感受,OO是本學期線上課程中所受影響最小的一門課了。不須要現場上機(OS課設每週上機考試取消了),不須要期末考試(OS理論課期末考試線上開卷了),只須要按時完成每週的任務,實驗課按時進行實驗就行了。
對於我來講,我以爲線上的OO雖然少了許多和同窗面對面的機會,卻可使我更加獨立地思考如何去作每一次的做業、如何設計架構,對於OO的學習反而是更有幫助的。
此外在最後一次實驗課上,我家裏停電了,這應該算做我在線上OO受到的最大影響了吧。電力因素的不穩定,可能會對線上課程形成很大的影響。雖然機率很低,咋就剛好讓我給碰上了呢?【無奈】
最後,感謝老師和助教這一學期的辛勤付出,正是由於大家的付出,才讓咱們的線上課程得以開展下去。也感謝一直在和我探討問題的同窗,正是在交流的過程當中我解決了不少個bug,也正是在交流的過程當中咱們可以共同進步。
看上去OO課程已經結束了,但其實關於OO的一切纔剛剛開始。加油吧!