OO學期總結

OO第四單元博客做業算法

 

本單元架構設計編程

第一次做業安全

第一次做業架構設計比較直接,用一個專門的類存放UML類圖,使用 Hashmap 以 UMLCLass 的id爲存放每一個類下面的屬性,操做,關聯,繼承關係,接口實現等,對接口之間的繼承關係也專門設置一個 Hashmap 存放。這麼作的好處是直觀,存取方便,但須要注意的是每次對 Hashmap 進行 get() 操做時,須要線判斷是否 contains(),若是不判斷直接讀取到沒有存進Hashmap裏的 key 會拋出異常。多線程

本次做業的指令除了求類實現的全部接口以外都比較簡單,而因爲接口支持多繼承關係,在搜索類實現的接口時應該相似對圖遍歷同樣進行bfs搜索,這樣能保證求得的接口不重不漏。其他的指令只需在對應的 Hashmap 中找到對應存放的 value 便可。架構

第二次做業編程語言

第二次做業的順序圖和狀態圖的處理與第一次做業相似,對每一個順序圖與狀態圖創建相應的 Hashmap 存放相應的數據,存取操做都與第一次做業沒有太多差異。因爲本次做業對數據進行了很大程度的簡化,在考慮狀態轉移時不用考慮多種特殊狀況,只需對最基本的狀態轉移作處理便可。對後繼狀態的搜索一樣採起了bfs搜索,可以保證能到達的後續狀態不重不漏。函數

本次做業對循環繼承和重複繼承的規則檢查有些棘手,一開始我本打算順着繼承關係和接口實現關係的 Hashmap 一層一層往上找,但擔憂這麼作的時間複雜度過於高昂,最後將繼承關係與接口實現關係轉換成了相似於圖的鄰接矩陣,經過求本身與本身之間是否存在通路來判斷是否存在循環繼承,求兩點之間的路徑數是否大於1來判斷是否存在重複繼承,當UML輸入完成以後開始建圖,再對每一個類和接口依次進行判斷便可。單元測試

 

四個單元架構設計及OO方法理解的演進學習

再次回顧本身前幾個單元的做業,其實能夠看出許多差異。第一單元開始時剛開始接觸面向對象,不少地方其實並無體現出面向對象的思惟方式,更多的是對求導的過程進行建模,甚至存在一個類中一個函數寫到底的狀況,而沒有對錶達式和求導規則創建管理層次與抽象層次。固然,在第三次做業中, 因爲其複雜性,若是不對錶達式創建層次關係將會無從下手,所以我開始嘗試對因子、項和表達式進行建模處理,經過繼承與接口實現來對不一樣類型的因子、項和表達式進行管理和抽象,使其可以完成歸一化處理。測試

從這之後我也逐漸開始找到面向對象的思惟方法的入口,在設計程序以前開始思考各個部分之間的關係層次,嘗試經過封裝、繼承、多態的方式創建並管理對象之間的層次。

第二單元多線程的設計,要求咱們在面向對象的基礎上保證線程之間的安全。對輸入請求、調度器、電梯,要分別設置線程進行交互,同時保證處理輸入類、調度器類與電梯類設計分離,各司其職,對多線程之間的共享對象的操做也應保證準確而很少餘,防止出現線程安全問題。本單元第一次做業我就提早考慮到了以後可能增長的需求,將輸入處理、調度器、電梯分別進行處理,以後的兩次做業也就是增長了對調度算法的調整與多部電梯交互之間的調整,在架構設計方面還算比較滿意。

本單元還有比較重要的收穫是對高內聚低耦合的理解,高內聚針對的是對象自身,即管理好對象本身的數據,作好本身的事,低耦合針對的是對象對外界的狀態和行爲,儘可能減小對其餘對象的依賴,這樣出錯時不會致使牽一髮而動全身。在多線程的程序設計中,保證高內聚低耦合,能夠最大程度地下降線程之間交互出錯的可能性,這也意味着咱們應該按照面向對象的思惟合理對各個對象進行建模,合理對對象之間的關係層次進行抽象。

三四單元的架構設計比較類似,這兩個單元主要訓練的是咱們對JML規格和UML圖的理解,因爲指導書給的指示比較清晰,在設計架構方面並無多大困難,對不一樣的模型和數據進行層次化管理,創建數據之間的映射關係便可。這兩個單元同時對時間複雜度也提出了要求,所以在存取操做和算法實現時要多留心,防止超時。雖然難度沒有前兩個單元大,可是不仔細處理仍會出現錯誤,第三單元第三次做業對換乘、票價、不滿意度的計算對於算法方面也是一大挑戰。

最後幾回做業能夠說是對前面做業的整合,當咱們再次拿到指導書的時候,第一時間思考的不是給定功能該如何實現,而是應該設計什麼類來實現給定功能,類與類之間存在什麼層次關係來協助咱們完成給定功能,這一學期的OO課就算是沒有白上。

 

四個單元測試理解與實踐的演進

OO的課程設置讓人深入體會到了測試的重要性,這是這門課一個成功的地方。經過中測並不表明你的程序有多好,只能說程序實現了最基本的功能,程序的魯棒性、複雜度、對邊界數據的處理在中測中沒有任何體現,都須要咱們本身構造測試數據甚至自動化生成測試集來幫助咱們檢驗程序設計。

第一單元的測試主要集中於對錯誤格式的判斷上,雖然說重心有些放錯了地方,在第三次做業的互測中中也及時改了過來,卻也讓咱們對邊界數據和特殊狀況的處理更加劇視,認識到了測試完備性和全面性的重要性。

第二單元的測試主要集中於對程序魯棒性的測試,在多線程之下程序可否正確運行,線程之間的共享對象是否不出差錯,線程之間是否沒有出現死鎖,等等,都是咱們須要考慮的點,也都應該構造足夠多的極限數據去進行壓力測試。多線程的錯誤有時候很難復現,本該出錯的數據可能運氣好跑對了,所以對每組數據也應該進行屢次測試,保證測試的覆蓋性。

第三單元的測試主要針對時間複雜度,咱們須要構造數據量極大的測試數據,而且保證程序可以在給定時間以內成功跑出結果。第三單元和第四單元的測試均可以經過單元測試的方式來完成,這也是提供給咱們官方包的好處,咱們只需專一於功能實現的正確性便可。這兩個單元坦白說我測試得並不充分,有些指令看着很簡單,自覺得不用測試,但其實在數據量極大的狀況下仍是有錯誤。

四個單元的測試側重點各有不一樣,從邊界數據,到魯棒性,到複雜度,到單元測試,每一個環節都重要,缺一不可,有任何一個方面沒有照顧到,測試就不是充分的,程序也不能保證是正確的。手動構造也好,自動化生成也好,測試數據的最終目的就是幫助咱們找到程序中可能的漏洞,在測試得不夠完備以前,咱們都應該把咱們的程序當成錯誤的來處理,程序設計應該有懷疑一切的思想準備。測試一樣可以幫助咱們在設計的時候提早從用戶的角度思考,提升咱們的設計思惟以及防錯意識,這是OO教給個人很重要的一點。

 

課程收穫

最直觀的收穫天然是學會了一門編程語言,並在做業與實戰中不斷完善對該Java的理解與對用法的精進。數次做業也體會到了爲何Java是世界上使用範圍最廣的語言之一,其包含的各類容器和庫,構造器,回收,封裝,繼承,多態等機制,都給這門語言帶來了其獨有的魅力。

更重要的收穫天然在於對面向對象思想的理解與運用,這也是這門課的主題,從最初的面向過程式的思考轉變到面向對象式的思考,不只僅是一句「一切皆對象「就可解決,還須要無數次在架構設計中的斟酌和完成程序後的反思,不斷尋找類與類之間的層次關係,思考如何對層次關係進行管理和抽象,知足高內聚低耦合以及SOLID規則,提高程序的穩定性和正確性。通過這學期的訓練,在面向對象的設計方面有了長足進步,對於每一個類之間的功能分配和層次管理,以及提取抽象對象之間的共性也愈來愈有心得。

同時,對於測試及其重要性也有了更深入的認識,一方面是確實吃過測試不充分的虧,一方面是在從中測到強測到互測的過程當中逐漸理解了各類測試的意義,開始將測試思惟帶到設計時考慮,程序的質量也獲得了提高。從開始的手動構造測試樣例到自動化生成測試數據再到使用JUnit進行單元測試,對程序的測試手段也在一步步完善,使測試得以更全面,覆蓋面更廣。

還有一些諸如如何寫出具備良好風格的代碼,如何高效閱讀他人代碼等的收穫,比較微小,但對未來的程序編寫也必定會有所幫助。

 

體會與建議

  1. 單元之間的難度設置有些不合理,後兩個單元明顯簡單于前兩個單元,在對Java語言還不夠熟悉的狀況下直接作第一單元的做業難度比較大,特別是第三次做業,身邊不少同窗都反映這是這學期最難的一次做業,放在第三週就讓咱們作未免有些強人所難。

  2. 上機內容常常是上午纔講過的內容,沒有時間消化,上機現場學習效果不必定是最好的。

  3. 是否能設置幾回專門爲了理解面向對象概念而設置的做業?我是從第三次做業纔開始逐漸找到面向對象的思惟方式,但仍然有些許只知其一;不知其二。我的認爲前幾回做業的功能實現要求過於複雜,爲了實現功能不是每一個同窗都有精力先去研究面向對象思考的好處,更多的是以本身熟悉的方式完成功能就算完成任務,致使重點不在咱們對面向對象相關概念的理解。

相關文章
相關標籤/搜索