這是我第一次接觸j**a和物件導向思想,最一開始,我建立了簡單的類和物件的概念,多虧了第一次作業難度和複雜度較低,我才沒有崩掉hhh。第一次作業我只分了三個類,乙個main,乙個多項式,還有項。項通過加號連線起來形成多項式。由於求導規則簡單,我將求導放在了項類裡,成為乙個方法。對於表示式格式的分析判斷,根據自己項和多項式的關係,除了個別必要的判斷,我將大多數的判斷都分在了項的匹配中。這樣做是最簡單的想法,但是擴充套件性較差,以至於我在做第二次作業時進行了重構。
第二次作業和第一次相比,增加了因子的種類,因此,如果利用第一次作業的架構,可能不太好實現,而且考慮到第三次作業的可擴充套件性,我將求導法則和頂層的一些格式判斷分離了出來,並且建立了一條鏈式的類的構造:函式因子->項->表示式。即因子用乘號連線起來形成項,項則由加號連線起來形成表示式。基於這樣的鏈式構造,我的求導法則也利用了鏈式遞迴的方法,即多項式的求導的返回值是對項的求導的和,項的求導返回的是通過乘法法則連線起來的函式因子的求導結果。對於格式的判斷,我沿用了第一次作業的方法。
得益於第二次作業的思考,我的第三次作業基本沿用了第二次作業的架構。相比於第二次作業,我只是更改了格式判斷的方法以及增加了因子的種類。但是可以看到,複雜度特別高,這直接導致了兩個點超時。
綜合來看,通過本單元的學習,我初步了解了物件導向的思維,更重要的是,我對**的可擴充套件性有了新的認識。對於物件導向思想,最大的收穫是「everything is an object.」,學習到了如何分類的方法,但是還有許許多多不足,就️以本次作業為例,求導法則和格式判斷可以改進為靜態方法,表示式,項,因子可以形成繼承關係,而因子可以改成乙個抽象類,把具體的五類因子分別寫成類等等,基於這些想法,我現在正在進行重構和改進**。對於**的可擴充套件性,我認為應該更注重一般性普通性的想法,而不能因為想到滿足某一次作業取巧方法而竊喜。每次寫**前應該進行充分地思考一般性和可擴充套件性。
對於找bug這一點,確實值得我反思。每次互測被找出來的bug不是一些很邊界的資料,反而是一些很常規的資料。這些bug其實通過覆蓋性測試可以很容易找出來。前兩次的bug主要是格式錯誤考慮不全導致。對於第三次作業,陷入了超時的坑,導致兩個強測點沒過,這一點應該是我**架構的問題,如果用到繼承方法,我的許多方法都能夠得到化簡,這個是知識儲備不足和物件導向思維的鍋(太菜了)。
三次作業我用到的都是單例模式,這是我在沒有學會熟練使用其他的物件導向的特性的情況下不得已選擇的模式,而就我要重構的第三次作業的想法而言,設計模式利用的則是工廠模式。
OO第一單元總結
由以上類圖,大體分析本次作業程式設計思路如下 2 根據資料度量分析程式結構 那麼根據以上引數含義,分析本次作業 發現,有三個方法的這三個複雜度較高,分別是ploynomial.getpoly readterm.getnum readterm.getterm 所以可以知道本次程式分別在讀入操作和獲得表...
OO第一單元總結
第一單元的作業為多項式求導,在迭代作業中學習了 物件特性 oo構造機制和層次化設計,在bug互測環節也學習到很多巧妙的設計。設計了三個類 term derivative和reportexit,分別處理項 求導和報錯退出,如今回頭看有很多設計不合理的地方,例如在term構造方法中直接解析表示式並設定成...
OO第一單元總結
三次作業,寫了三份架構完全不同的 確實體會到了架構的重要性。在構思程式解決當前問題的同時,還要考慮未來應對更多更複雜的需求,如何構建才能便於未來增添新的需求和模式。在這幾周的學習實踐中,我明白了通過介面和繼承關係,使得程式設計具有層次,能夠將不同但相似的類統一起來,使得主程式能夠對乙個統一的介面進行...