OO第一單元總結

2022-07-15 15:39:14 字數 2159 閱讀 5081

第一單元的作業為多項式求導,在迭代作業中學習了:物件特性、oo構造機制和層次化設計,在bug互測環節也學習到很多巧妙的設計。

設計了三個類:term、derivative和reportexit,分別處理項、求導和報錯退出,如今回頭看有很多設計不合理的地方,例如在term構造方法中直接解析表示式並設定成員變數。

類圖:

**度量:

由於在main方法中也對輸入表示式進行了正則解析,term類構造方法也對表示式進行了解析,導致iv(g)和v(g)值過大。由於對於方法過長粗暴refactor也導致結構有點混亂。

bug集中在非法字元的判斷,由於每次繼續處理直接str.trim(),導致非法字元被過濾掉。

hack到的bug也集中在非法字元上。

第二次作業已經有了有點層次化的結構,建立了5個類:factor,main,poly,reportexit,term,分別處理因子、表示式、項,有了第一次作業的經驗,結構稍微好了些。

類圖:

**度量:

可以看出仍有些方法複雜度較高,各類之間的耦合度比較正常,在poly,term和factor自頂向下分析字串,並返回處理後的字串,統一有個process函式,term.process複雜度較高是因為在這個方法裡面迴圈讀取當個因子直到下乙個字元不是*。

同時在poly的構造方法中也是因為直接處理表示式導致複雜度過高,因子的求導方法derivative方法複雜度過高是因為將幾種因子的求導囊括在了一塊。

採用這種層次化設計思路比較清晰,但是對於優化很不友好。算是有得有失。

對於第三次作業構思了很久,因為出現了遞迴和巢狀的情況,嘗試建立表示式二叉樹來對節點進行運算,後來發現遞迴下降處理也能實現相應的效果,沿用了第二次作業的整體架構,對幾種因子增加了三個介面:parser,derivation和printstring

分別負責表示式解析,求導和列印的功能。整體思路依舊以因子為最小的識別單位,以*和±判斷出項和表示式,parser如果解析出相應的因子,項或者表示式即返回處理後的表示式,反之返回原表示式。

類圖:

**度量:

層次化設計使得類間耦合度比較正常,依舊有幾個方法的複雜度稍高,主要是表示式解析器和求導方法。

層次化設計思路清晰,但是優化難度大,直接放棄結果合併優化。

bug發現3處bug,對於表示式列印自身沒有考慮每個項的符號;三角函式巢狀時多列印出了指數;表示式非正常結束沒有判退出導致crash。

由於沒有多餘時間,僅hack了別人1個bug,巢狀情況沒有考慮全。

分為  建立型模式(creational pattern) - 工廠模式(factorymethod) 

此三次作業均採用建立型模式(creational pattern),在第三次作業中採用了介面,用相應物件例項化:

calculate factor1 = new const();

calculate factor2 = new powertrigfun();

calculate factor3 = new expr();

calculate factor4 = new nest();

對於解析器parser返回型別的設定不合理,常用返回應該是乙個類。同時也體會到了介面的便捷性和對歸一化處理重要作用。優化對於乙個程式執行而言也至關重要。乙個很好的前期構思往往起到事半功倍的效果。

OO第一單元總結

由以上類圖,大體分析本次作業程式設計思路如下 2 根據資料度量分析程式結構 那麼根據以上引數含義,分析本次作業 發現,有三個方法的這三個複雜度較高,分別是ploynomial.getpoly readterm.getnum readterm.getterm 所以可以知道本次程式分別在讀入操作和獲得表...

OO第一單元總結

三次作業,寫了三份架構完全不同的 確實體會到了架構的重要性。在構思程式解決當前問題的同時,還要考慮未來應對更多更複雜的需求,如何構建才能便於未來增添新的需求和模式。在這幾周的學習實踐中,我明白了通過介面和繼承關係,使得程式設計具有層次,能夠將不同但相似的類統一起來,使得主程式能夠對乙個統一的介面進行...

OO第一單元總結

這是我第一次接觸j a和物件導向思想,最一開始,我建立了簡單的類和物件的概念,多虧了第一次作業難度和複雜度較低,我才沒有崩掉hhh。第一次作業我只分了三個類,乙個main,乙個多項式,還有項。項通過加號連線起來形成多項式。由於求導規則簡單,我將求導放在了項類裡,成為乙個方法。對於表示式格式的分析判斷...