面向對象課程總結

面向對象課程總結

1、單元4架構設計

做業1

做業1,我在頂層採用了HashMap將類(接口)與其對應的內容進行一一映射存儲,進而將查詢操做向下分配給ClassDetails。在對類內方法的參數的存儲上,我採起了類似的方法,即便用OperationDetails類存儲,並將對方法參數類型的查詢分配到該類內部。這是一系列能夠用HashMap層層向下找的過程。python

我還設計了一個單例類AllElements,這個類用來存儲全部的id與UmlElement的映射關係,這使得程序從任何一個地方均可以根據id獲得對應的UmlElement。此外爲了方便,我還設計了一個單例類AllMaps,方便在ClassDetails類內部進行DFS操做時能夠根據UmlClass或UmlInterface取得對應的Details。git

做業2

做業2中,因爲是對做業1進行擴展,即添加了新類型的Uml圖,所以我將不一樣類型的圖放到三個不一樣的package中,分別對三個圖進行處理。當調用到對應圖的方法時,由MyUmlGeneralInteraction類對下層的三個Interaction類方法進行調用。算法

這裏沿用做業1的設計。編程

這裏是對於順序圖的處理部分。設計模式

這裏是對狀態圖的處理部分。安全

做業3

做業3則是在做業2的基礎上添加對錯誤數據的檢查,總體架構沒有什麼大的變更。關於錯誤數據的檢查,也是層層分配到下一級的類中進行處理,直到分配到與該錯誤數據密切相關的層級進行真正的處理,並再逐層返回。因爲總體架構與做業2一致,就不放UML類圖了。多線程

期末時間緊張,就不本身畫UML圖了,但願老師理解_(°:з」∠)_架構

2、架構設計與OO方法理解的演進

在上這門課以前,我對OO的理解就是封裝、繼承、多態。那個時候我覺得,這一門課程就是會把封裝、繼承、多態的具體實現方式講清楚。如今來看,我那個時候對OO的理解仍是TOO YOUNG TOO SIMPLE。OO不只僅是封裝、繼承、多態,還有架構設計、編程方法的相關內容。編程語言

第一單元是層次化設計,其實就已經把封裝、繼承、多態的核心內容講清楚了。三次求導做業中,我主要思考的是我須要設置什麼樣的一個類,這個類是對什麼事物的抽象。如何合適地設計一個能夠實現要求所需功能的類,這即是我第一單元對架構設計的理解。此外,這個時候我接觸到了TDD——Test-Driven Development。在開發代碼功能以前,先將單元測試用例寫好,這有助於在編程過程當中對總體性的把握,能夠避免在編程過程當中的不少疏漏。但這個時候我還不太會用JUnit進行單元測試,所以沒有付諸實踐。不過,這是我所理解的OO編程方法的一部分。工具

第二單元是線程安全設計,這個單元是對多線程編程進行了一個初步的介紹。三次電梯做業中,我主要思考的是生產者-消費者模式的應用,進而拓展到對設計模式的應用。如何在本身的設計中合理的應用不一樣的設計模式,簡化本身的代碼,這是我第二單元對架構設計的理解。

第三單元是規格化設計,這個單元引入了規格的概念。這個單元中,結合OS課程的「抽象與權衡」的思想,我較爲深入的理解了抽象的思想。而規格,就是將編程過程當中的行爲抽象出來,將行爲從具體的代碼實現分離出來的一個表示方式。雖然JML不是很好用,可是將行爲與代碼實現分離的思想很符合面向對象的設計方法。我能夠肯定某個模塊的行爲,可是其具體實現卻能夠隨意替換,只要能夠實現該行爲,我能夠採用不一樣的容器、不一樣的算法、乃至不一樣的子架構,這對於我以後的編程具備十分積極的影響。

第四單元是模型化設計,即用UML來表示架構設計。UML圖很直觀,能夠表示的場景也不少,果然不愧被稱爲「統一建模語言」。經過UML語言,即可以將架構設計與代碼實現完全地分離開來,我能夠不用考慮使用Java仍是C++,可是我卻能夠把個人程序架構設計出來,這就是UML的奇妙之處。此時我對於架構的理解就再也不依賴於某一種編程語言,架構設計就是一個獨立於編程語言的過程。

以上即是我對架構設計與OO方法理解的演進。

3、對測試的理解與實踐的演進

測試是保證程序正確性的必要手段。沒有人能夠保證本身在寫程序的時候歷來不會寫出bug,而測試即是消滅這些bug的重要方法。

第一單元,我看到有不少同窗使用python和cmd搭建數據生成與自動對拍腳本,因而我也嘗試搭建了一個。雖然數據是隨機生成的,但說實話效果還真不錯,個人第二次做業就在提交前一個多小時被發現了一個「敲錯了一個字符」致使的bug,並且還幫助我在互測中收穫了一些成果。這裏的自動對拍腳本優勢是能夠自行進行測試,省去了人工測試的成本。缺點1是數據徹底是隨機生成的,沒有針對性,須要補充人工構造的特殊樣例,此外還有缺點2是搭建須要消耗較多精力,若是有新的項目,甚至於對老項目進行迭代,都須要對評測腳本進行修改,評測腳本的可移植性極差。

第二單元,因爲是多線程,須要依照時間進行輸入,我使用python的subprocess模塊進行數據的處理與定時輸入。這個單元我沒有進行數據自動生成的工做。多線程bug的出現是偶然性居多,一樣的測試數據運行不一樣次,結果可能都不同,所以生成隨機數據的意義就不是很大了。這一單元我主要採用手動構造測試數據,並使用python幫助我進行特定時間點的輸入,所以在測試上是比較樸素的。

第三單元,我接觸到了JUnit。JUnit與規格的搭配簡直是絕配,我根據每一個方法的規格,對這些方法的行爲進行了大量的測試,效果很是好。從第一次做業的JUnit樣例能夠一直沿用到第三次做業,所以當我爲了改善性能而對程序代碼進行大批量修改時,就能夠在修改完畢後再運行一次單元測試,這樣即可以知道有沒有改出問題來。第三單元我徹底沒有經過輸入輸出進行對拍測試,而徹底將測試轉移到對方法行爲的檢驗上,感受效果很好,用起來很舒服。

第四單元,因爲臨近期末,時間較爲緊張,個人測試作的比較少。本單元的測試主要仍是依賴於我對於極端狀況輸入數據的構造上,對與JUnit的使用不是不少。因爲我比較仔細地構造了較多狀況的樣例,最後的強測結果還算能夠。

4、課程收穫

  • 簡單理解了面向對象的哲學思想(並不算深入理解,還需在往後的學習中繼續感悟)。
  • 大體熟悉了Java語言的使用。
  • 瞭解了git、Typora(MarkDown)、StarUML等一系列工具鏈的使用。
  • 規範了本身的代碼風格。

5、一點建議

  • 但願上機實驗能夠有一些結果反饋。一樣也但願每次上機實驗的內容能再完善一些,儘可能把一些使人疑惑與迷惑的內容都講清楚。//(我知道上機實驗是助教們根據教學過程當中的需求,在開始實驗前不久才肯定下來的內容。這樣的好處是題目的靈活性較強,能夠隨時根據教學狀況進行調整。可是感受有些時候實驗題的嚴謹性還有一些值得商榷的地方。所以我想的是,是否能夠將一些嚴謹性較佳的實驗固定下來,在每一年延續下去,使得部分實驗在經歷了不斷地迭代以後,成爲OO課程每一年的「精選實驗」。)
  • JML單元最後的難度所有集中到了算法上來,對JML的學習反而是弱化了,因此感受JML單元的內容能夠再調整一下,減小一點關於算法的考察。//(光是Tarjan算法我就研究了一天半,結果最後仍是出了點小錯誤,哭)
  • 我不是很瞭解最後的總評成績是如何計算的,不過感受能夠在總評成績計算的時候能夠考慮「去掉一個強測最低分」,由於感受OO這麼屢次做業,即使是很是優秀的同窗,也不免會出現「翻車」的狀況。一次偶然的失誤不該當對最後的總評成績形成重大的影響,所以感受去掉一個強測最低分是合理的。//(最高分就不要去掉了哈哈哈)

6、線上OO體會

我的感受,OO是本學期線上課程中所受影響最小的一門課了。不須要現場上機(OS課設每週上機考試取消了),不須要期末考試(OS理論課期末考試線上開卷了),只須要按時完成每週的任務,實驗課按時進行實驗就行了。

對於我來講,我以爲線上的OO雖然少了許多和同窗面對面的機會,卻可使我更加獨立地思考如何去作每一次的做業、如何設計架構,對於OO的學習反而是更有幫助的。

此外在最後一次實驗課上,我家裏停電了,這應該算做我在線上OO受到的最大影響了吧。電力因素的不穩定,可能會對線上課程形成很大的影響。雖然機率很低,咋就剛好讓我給碰上了呢?【無奈】

最後,感謝老師和助教這一學期的辛勤付出,正是由於大家的付出,才讓咱們的線上課程得以開展下去。也感謝一直在和我探討問題的同窗,正是在交流的過程當中我解決了不少個bug,也正是在交流的過程當中咱們可以共同進步。

看上去OO課程已經結束了,但其實關於OO的一切纔剛剛開始。加油吧!

相關文章
相關標籤/搜索