第一次作業我將umlelement進行分類,新建乙個封裝類uml,用介面和類進行例項化;新建乙個operation類例項化operation元素。在myumlinteraction的初始化,先找到所有的類和介面例項化uml。然後找到所有的方法,例項化operation類,並且將類根據parentid找到對應是什麼介面(類)的方法,同理屬性也是這樣,將改屬性放進對應的類裡面。類介面之間的關聯,就在封裝的類裡面實現乙個新增關聯的方法,同理操作類之間的繼承以及類的實現,這樣就可以把整個元素的結構建立起來,方便後續的操作。
尋找類的個數,在例項化類的時候就可以進行累加。找到類實現的方法,可以根據類的名字找到例項化的類,而我們之前已經將所有的方法放進去了,這樣就可以直接找出跟要求相關的方法的數目。類的屬性的數目,關聯個數,關聯的類,方法的可見性都可以直接get得到。得到頂層類、得到實現類繼承類都可以通過bfs實現。
第一次作業主要是需要理解uml的整個結構,以及課程組提供的**的理解。這樣整個架構建立起來,需要什麼結果接很簡單了。
這次強測中碰到乙個bug就是,bfs的時候標記元素記錯了,應該是在push的時候標記,而不是pop的時候標記,不然就很容易出現死迴圈。謹記教訓!!!
第二次作業其實就是要實現六個方法。但是要先理解課程組給的**的思路,就是給乙個大類,封裝所有實現的過程。
順序圖就是每個元素都有乙個生命線,生命線之間有訊息的互動。狀態圖就是狀態的轉移,通過轉移元素,得到各個狀態轉移的條件以及目的狀態。整個架構依然是遵循第一次作業的架構,將需要的元素放在特定的陣列或者字典裡面,方便我們檢查之間的關係。因為方法較少,所以只要需要什麼遍歷找就可以了。
這次強測我還是出現了乙個bug,因為我沒有考慮到畫布可能什麼都沒有的情況。還是注意hashmap取元素一定要檢查有沒有這個鍵值!!!
第三次作業是對於相關uml的一些檢查。這次作業的難點我覺得在於理解指導書想要表達的意思,還有找到是整個檢查是怎麼實現的。我先是在runner中找到這個方法是什麼時候進行實現的,發現是在所有的元素都輸入才進行檢查,這樣其實整個方法跟之前幾次實現就沒有什麼差別了。按照第一次作業建構的思路,找到需要檢查的相關的類。
這次作業最為困難的莫過於找環,一開始我想了很多種方法,但是覺得還是很困難,因為我一直想要把找到一條路的元素都記下來,後來我發現實現的困吶係數太大了。我就乙個類乙個類找,如果乙個類根據爸爸們路徑走著走著回到自己那就是成環了。這個每個類都進行一遍就很完備了。
這次作業因為跟同學討論了全部的細節互相交流驗證做法,所以整體上論證了實現的正確性,強測就沒有出現bug了。
第一單元因為初次認識物件導向,每個作業都重新建構,十分的痛苦。因為沒有考慮到方程的可拓展性,第一次作業直接解析表示式分析求導。第二次作業理解了一下,分了x冪指數類,cos、sin類,然後整了乙個工廠,物件導向的感覺就來了。但是第三次作業復合函式還是當場去世,因為復合的複雜度,我將工廠直接搬到了表示式類裡面的乙個方法,然後遞迴實現,就是乙個類巢狀實現乙個類,還是很繞。但是不得不說通過物件導向巢狀的做確實降低了理解上的複雜度,至少看起來很直觀。第三次作業也可以面向資料結構來寫,就是二叉樹做法,但是理解上還需要一定時間。通過第三次作業我更好的理解了物件導向的妙處。
第二次作業是我就不怎麼重構了。第二次作業主要是要理解好多執行緒,然後理解怎麼處理多個執行緒之間的關係。我用生產消費者模式實現了三次作業。在緩衝區實現資料的互動,以及根據資料的狀態進行執行緒的控制。而電梯和客戶主要是就是電梯功能和客戶功能的主要體現。單電梯就比較簡單,客戶來,客戶上下電梯,電梯上下行開門,都在緩衝區實現。優化look演算法接客就行了。多電梯就直接平分,多造電梯就完事了,整體架構不變。電梯可變就將消費者類的生成也放在緩衝區裡面。整體架構也是不變,電梯編號就行了。第二次作業學習了多執行緒的物件導向做法,學習了生產消費者模式,收穫甚多,尤其是執行緒的理解學習!
第三次作業就是關於jml的,需要根據jml的語言進行方法的實現。因為jml的限制,所以三次作業的架構幾乎沒有顛覆性的變化。第三次作業難點在於雙連通的實現,還有求點的可達性。理解上不是很難,但是因為測試時間山的限制,導致第三次作業常常要為了演算法快慢絞盡腦汁。這單元我收穫最多的應該是陣列的淺拷貝的利用,tarjan的使用,還有怎麼有效聰明的滾雪球,圖論知識的應用。而物件導向導致沒有什麼收穫,就是學會了jml規範語言規範方法。
第四次作業架構上也沒有重構,因為作業上感覺聯絡不大。第四次作業我覺得重點在於理解uml各個元素之間的關係,所以架構就是初始化例項化類的時候把元素之間的關係整理好,在對應的方法進行相關查詢報錯得到結果就可以了,我感覺物件導向面向的就是各個不同的類之間關係的查詢,這一單元就體現的很明顯,而且操作的物件就是uml。
第一單元測試我就單純看**,和同學討論易錯的點,手工捏造資料。所以第一單元我debug就相當的慢,找錯也不是很會找,理解同學的**又是相當的困難。
第二單元我自我測試依舊是**驗證,就是**順一遍,碰到bug因為多執行緒的原因很不好整,特別是不明白的情況下。我借助了乙個profile的軟體,看執行緒的執行,檢查執行緒的狀態。還有就是找同學,跟同學講一遍自己整個架構的思路,跟同學討論**在那些細節上或者理解上存在bug,感覺討論**在多執行緒中至關重要。第二次作業我出現阻塞就是樣例檢查不出來,但是和同學討論一下子就找出我對於釋放鎖阻塞理解的偏差。互測我主要是針對阻塞等待cpu輪詢,自己構造資料。很少出現執行緒衝突導致的bug。
第三單元,我找同學要測試樣例,跑資料找bug,感覺這樣的效果比起**驗證效果還好,因此我也學習了同學提供給我生成測試資料的py指令碼,學習了同學構造資料的思路。這樣我hack就根據我自己測試常碰到的一些bug,進行hack。還有就是超時互測。
第四單元,**debug我是在寫完**後,將課程組提供的資料跑完之後,隨機生成樣例檢查。要是碰到一些細節問題就和同學討論,互相驗證**的正確性。因為第四單元感覺**不是很好生成,很難單純的檢查。
四個單元以來,我收穫最大的就是對於物件導向的理解。從面向過程,到能夠利用各種容器、工廠、設計模式等實現一些看似十分複雜的實現。我還學習了多執行緒、資料結構中圖的操作。更重要的是,我學會了自我測試,四個單元我課下測試的手段十分的多元化,**驗證、隨機資料生成、指令碼自動化測試、同學溝通討論等等。還有在討論課上學習同學的架構思路,慢慢的擴充自己對於物件導向的理解,互測中學習同學的**,在自己下一次作業中對於一些處理不好僥倖通過的進行優化,慢慢的拿出乙份滿足的**,還有部落格梳理三周以來的收穫,形成自己的課程筆記。總的來說,這門課我收穫了很多!
1、第四單元第三次作業給幾個樣例輸出,不然感覺很多細節很容易出現誤區。
2、有些實驗感覺難度太大了,兩個小時有時候根本寫不完,因為理解**需要很長的時間,還有很多的要求,建議**量少一點,不然真的根本完成不了。
3、第一單元的第二次作業跟第三次作業難度跨度太大了,感覺很難從第二次作業理解到第三次作業,提前建構好。要不稍微在指導書給個建議,提示一下下乙個作業寫什麼,提前構思好。感覺第三次作業真的四天知道怎麼寫還要完全正確太難了。
OO第四單元總結
從這四個單元來看,除了第三單元對於架構的感受不深,兩外三個單元對架構的要求是比較高的。雖然這三個單元內容主題完全不同,但設計架構的目標是一樣的,就是盡可能地把現實中的邏輯細緻地還原表達出來。所以oo是什麼?j同學在一次研討課上表示oo在他看來就是將資料和方法集中起來封裝,我認為這個表述沒有觸及到oo...
OO第四單元總結
這個單元寫 的時候在面向過程的方便和物件導向的清晰架構中反覆橫跳,導致最後寫出來的東西亂七八糟。第一次作業 第一次作業只涉及到了uml的類圖。定義了myclass myinte ce myoperation三個類,儲存attribute等資訊。我的想法是將一條條資訊即乙個個umlelement分類存...
OO第四單元總結
使用乙個類idtree來記錄各個元素之間的父子關係,類myumlinteraction用來實現其餘所有功能。三次作業下來需要實現二十多個方法,類myumlinteraction寫了1000行,架構非常混亂,沒有章法。說白了,這次作業和第三單元一樣,還是圖論,出現了種種問題,暴露出了自己資料結構基礎的...