oo第一單元總結

(1)    基於度量來分析本身的程序結構正則表達式

 

方法和類的複雜度分析圖片中ev(G),iv(G),v(G),OCavg,WMC含義以下:算法

ev(G)即Essentail Complexity,用來表示一個方法的結構化程度,範圍在[1,v(G)]之間,值越大則程序的結構越「病態」,其計算過程和圖的「縮點」有關。數組

iv(G)即Design Complexity,用來表示一個方法和他所調用的其餘方法的緊密程度,範圍也在[1,v(G)]之間,值越大聯繫越緊密。優化

v(G)即循環複雜度,能夠理解爲窮盡程序流程每一條路徑所須要的試驗次數。spa

OCavg表明類的方法的平均循環複雜度。設計

WMC表明類的總循環複雜度。orm

 

第一次做業對象

類圖blog

 

方法以及類的複雜度遞歸

 

思路分析:第一次做業中使用了四個類。Main類負責輸入表達式正確性的判斷,首先是利用正則匹配,直接對錶達式進行判斷,後來發現出現爆棧的問題,出現爆棧的緣由是由於正則的貪婪特性,以後便改成用替換的方法,先將首項替換爲空字符串,再將其餘項替換爲空字符串,最後和空字符串比較,二者比較結果爲真則輸入正確;Pushtoarr類將表達式分離爲項,經過ArrayList保存,再將項中係數和指數經過動態數組保存,最後進行求導並保存結果;Remove類主要是去除數的前導0,但互測時才發現這一步多餘,將字符串轉換爲BigInteger類型不須要去除前導0;Jianhua類主要是將求導後的表達式簡化,合併同類項,對指數爲0,1,係數爲0,1,-1的項進行優化處理。

優勢:學到了正則表達式的用法,使用了四個類,雖說還未擺脫掉c語言代碼風格,但經過此次做業瞭解並應用了對象與類。

缺點:正則表達式過長,出現bug後難以定位。類中許多方法都使用了許多if else語句,致使代碼量較多。

 

第二次做業

類圖

 

 

方法以及類的複雜度

 

思路分析:第二次做業使用了五個類,Main類進行輸入,輸出;Judgeregex類利用正則判斷表達式的正確性,改進了第一次的正則寫法,寫出因子的正則,而後合併爲項的正則,判斷正確性則是與第一次做業同樣;Cutterm類經過split將項與項分離;Splitfactor類將項分割成係數,x的指數,sinx的指數,cosx的指數。Derivative類進行求導,合併和優化。

優勢:將項化爲了x,sinx,cosx,便於之後的求導,合併,優化,對於類中的屬性,只能經過get()的方法讀取,封裝得較好。

缺點:未能用到同窗課上介紹到的try-catch,不熟悉其用法,Derivative類中進行了求導優化化簡,方法太多,代碼量較多。

 

第三次做業

類圖

 

方法以及類的複雜度

 

思路分析:這次做業寫出的程序與第一次和第二次做業有了較大的區別,表達式正確性的判斷並非提早處理,而是邊建樹邊判斷,運用到了五個類,Main類進行輸入輸出,Wrongformat類進行預處理,提早處理一些顯而易見的錯誤,以及將空白字符給去掉,便於之後的數據處理,Expression類屬性爲ArrayList,儲存Term對象,Term類屬性爲ArrayList,儲存Factor對象,Factor屬性爲me和ArrayList,屬性me區分數,x,sin,cos,表達式因子,ArrayList存儲可能存在的嵌套因子(Factor對象)或者表達式(Expression對象)。將樹創建後,進行求導。

優勢:學會了用try-catch機制,應用遞歸建樹。

缺點:未能進行合併優化,未能用到接口。

 

(2)本身程序的bug

第二次做業:互測時發現了一個bug,未能仔細閱讀題目,忽略了項與項之間能夠存在三個正負號的問題,

第三次做業:強測時,輸入x*+x未能輸出相應結果,預處理時忽略了這一狀況。

            互測時,輸入sin(-7)未能得出正確結果,在程序中將-+也當成了因子,因此會程序錯誤。

 

(3)發現別人程序bug所採用的策略

第一次經過爆棧,空格超時,以及閱讀他人正則表達式時發現了一些bug。

第二次經過閱讀正則表達式(例如缺乏\t)以及表達式輸出找到了bug。

第三次主要是經過設計正確的輸入來找bug。

 

(4)Applying Creational Pattern

第三次做業創建了樹的概念,若增長其餘數學符號tan等,能夠在原有代碼上增長少許代碼便可將樹創建起來,但第三次做業未能實現一個求導的接口,未能描述類之間的共性行爲,而且在求導時,因子與因子之間只考慮了乘法,若是增長其餘的運算法則,則難以擴展,所以應該實現一個求導的接口,加強程序的可擴展性。

相關文章
相關標籤/搜索