OO第一單元——表達式求導——總結

大二下的第一個月就要結束了,OO的第一單元也結束了,所以在這裏總結一下個人OO的第一單元的狀況。java

整體

第一單元有三次(不計寒假pre)做業,分別爲:多項式求導,帶有冪函數、三角函數的表達式求導 和 帶嵌套的表達式求導。 我三次做業的結構都不徹底同樣,其中第一次和後兩次徹底不同,第三次基本沿襲第二次。下面,我review一下我每次的結構。函數

結構

第一次

結構

first-art

第一次的結構比較簡單,基本就是使用HashMap記錄每一個次冪的係數,而後Poly求導時調用Term的求導方法便可。學習

耦合度

class OCavg WMC
InputFormatWrong 1.0 2.0
Poly 3.5 21.0
Term 2.3 23.0
TermAddPowDifferent 1.0 3.0
Total 49.0
Average 2.3333333333333335 12.25

第二次

second-art

第二次做業個人整體結構分爲了三層:測試

  • Expression
  • Term
  • Factor
    • PowFunc
    • TriFunc
    • Constant

其中,Factor是一個抽象類(如今想來,使用接口更好)優化

每一層,使用ArrayList記錄下一層的引用。ui

加法求導直接調用下一層便可。spa

乘法求導使用鏈式法則。設計

輸出部分,爲了拓展性,我使用專門的Outputer類進行的輸出,裏面使用了Quad和Triad兩個類進行優化,這兩個類重寫了equals,hashCode,comparaTo等方法,使用hashMap合併。orm

耦合度

class OCavg WMC
Expression 2.3076923076923075 30.0
Factor 1.0 3.0
InputFormatWrongException 1.0 2.0
Main 2.0 2.0
Number 1.1428571428571428 8.0
Outputer 7.25 29.0
PowFunc 1.5714285714285714 11.0
Quad 1.9166666666666667 23.0
Term 2.25 27.0
Triad 2.0 16.0
TriFunc 2.125 17.0
Total 168.0
Average 2.1818181818181817 14.0

此次做業我專門花了大量時間設計告終構所以總體耦合度相比第一次好看了許多。不是很好的時Outputer類,這裏有大量的優化代碼,優化代碼寫的不夠優美,所以我還須要更多練習。對象

第三次

結構

third-art

第三次做業基本繼承了我第二次的結構

個人整體結構分爲了三層:

  • Expression
  • Term
  • Factor
    • PowFunc
    • TriFunc
    • Constant
    • ExpFactor

其中,Factor是一個接口

每一層,使用ArrayList記錄下一層的引用。

TriFUnc有一個Term的引用

ExpFac有一個Exp的引用

綜上,個人結構基本符合文法

加法求導直接調用下一層便可。

乘法求導使用鏈式法則。

輸出部分,我重寫了toString方法

耦合度分析

method ev(G) iv(G) v(G)
Builder.build(String) 3.0 2.0 4.0
Builder.readExp(String,ArrayList) 4.0 4.0 7.0
Builder.readFactor(String,ArrayList) 9.0 7.0 10.0
Builder.readTerm(String,ArrayList,BigInteger) 4.0 6.0 7.0
Builder.triMatch(String,ArrayList,Matcher,int) 4.0 2.0 4.0
Constant.calcDerivative() 1.0 1.0 1.0
Constant.Constant() 1.0 1.0 1.0
Constant.Constant(BigInteger) 1.0 1.0 1.0
Constant.Constant(String) 1.0 1.0 1.0
Constant.getValue() 1.0 1.0 1.0
Constant.toString() 2.0 1.0 2.0
ExpFac.calcDerivative() 1.0 1.0 1.0
ExpFac.ExpFac(Expression) 1.0 1.0 1.0
ExpFac.getExp() 1.0 1.0 1.0
ExpFac.isIn(String) 5.0 4.0 8.0
ExpFac.toString() 3.0 2.0 4.0
Expression.add(Expression) 1.0 1.0 1.0
Expression.add(Term) 1.0 1.0 1.0
Expression.addTerm(Term) 1.0 1.0 1.0
Expression.calcDerivative() 1.0 2.0 2.0
Expression.Expression() 1.0 1.0 1.0
Expression.Expression(ArrayList) 1.0 2.0 2.0
Expression.Expression(Term) 1.0 1.0 1.0
Expression.merged() 1.0 1.0 1.0
Expression.multiply(Expression) 1.0 1.0 1.0
Expression.multiply(Term) 1.0 1.0 1.0
Expression.toString() 1.0 5.0 7.0
InputFormatWrongException.getSituation() 1.0 1.0 1.0
InputFormatWrongException.InputFormatWrongException(String) 1.0 1.0 1.0
Main.main(String[]) 2.0 3.0 4.0
PowFunc.calcDerivative() 1.0 1.0 1.0
PowFunc.getPow() 1.0 1.0 1.0
PowFunc.PowFunc() 1.0 1.0 1.0
PowFunc.PowFunc(BigInteger) 1.0 1.0 1.0
PowFunc.toString() 3.0 3.0 3.0
Quad.compareTo(Quad) 3.0 3.0 3.0
Quad.equals(Object) 6.0 2.0 6.0
Quad.getArr() 1.0 1.0 1.0
Quad.getFirst() 1.0 1.0 1.0
Quad.getForth() 1.0 1.0 1.0
Quad.getSecond() 1.0 1.0 1.0
Quad.getThird() 1.0 1.0 1.0
Quad.hashCode() 1.0 2.0 2.0
Quad.merge(Quad) 1.0 2.0 2.0
Quad.Quad(BigInteger,BigInteger,BigInteger,BigInteger) 1.0 1.0 1.0
Quad.Quad(BigInteger,Triad) 1.0 1.0 1.0
Quad.Quad(BigInteger[]) 2.0 1.0 3.0
Term.addFactor(Factor) 1.0 1.0 1.0
Term.calcDerivative() 1.0 2.0 2.0
Term.multiply(Factor) 1.0 1.0 1.0
Term.multiply(Term) 1.0 1.0 1.0
Term.Term() 1.0 1.0 1.0
Term.Term(ArrayList) 1.0 2.0 2.0
Term.Term(Factor) 1.0 1.0 1.0
Term.toString() 1.0 3.0 5.0
Triad.equals(Object) 6.0 2.0 6.0
Triad.getArr() 1.0 1.0 1.0
Triad.getFisrt() 1.0 1.0 1.0
Triad.getSecond() 1.0 1.0 1.0
Triad.getThird() 1.0 1.0 1.0
Triad.hashCode() 1.0 2.0 2.0
Triad.Triad(BigInteger,BigInteger,BigInteger) 1.0 1.0 1.0
Triad.Triad(BigInteger[]) 2.0 1.0 3.0
TriFunc.calcDerivative() 1.0 2.0 2.0
TriFunc.getPow() 1.0 1.0 1.0
TriFunc.getType() 1.0 1.0 1.0
TriFunc.getVal() 1.0 1.0 1.0
TriFunc.toString() 3.0 3.0 5.0
TriFunc.TriFunc(int,Factor,BigInteger) 1.0 1.0 1.0
Total 114.0 113.0 150.0
Average 1.6521739130434783 1.6376811594202898 2.1739130434782608
class OCavg WMC
Builder 6.4 32.0
Constant 1.1666666666666667 7.0
ExpFac 2.8 14.0
Expression 1.6363636363636365 18.0
InputFormatWrongException 1.0 2.0
Main 2.0 2.0
PowFunc 1.4 7.0
Term 1.75 14.0
TriFunc 1.8333333333333333 11.0
Total 146.0
Average 2.1159420289855073 12.166666666666666

能夠看出,個人builder寫的不是很盡人意,不過因爲這是讀入部分,內部耦合度的確會很高。綜合來看,此次的狀況比上次好了許多,我也的確感受本身的結構優美了、「面向對象」了不少

BUG

我沒有在公測和互測中被發現BUG

從中我大概總結以下:

  1. 設計結構時讓結構優美
  2. 寫代碼時認真思考
  3. 寫代碼時符合標準,代碼風格須要優美
  4. 寫完後測試全部樣例
  5. 認真手動構造極限的樣例
  6. 使用自動化測試測試本身的代碼(跑一天以上)
  7. ……

同時,我也看了其餘同窗的代碼,發現了一些印象深入的代碼,大概以下

  1. 優化寫錯
    • 我的認爲,若是結構設計的夠好,優化部分也是能夠寫起來很簡單的。好比若是寫足了表達式的乘、加等方法,在優化的時候調用就好,切忌面向過程地優化
  2. 讀入寫錯
    • 讀入是一個十分值得測試的部分,交做業前在進行測試的時候,必定要作到充分的,全面的測試。

關於建立模式

建立模式看起來十分深奧,在我簡單的理解起來,大概是一個在選擇建立一個父類的多個子類的時候,讓子類的選擇交給一個的一個方法。這樣,能夠下降代碼的耦合度。

就是說,個人一個類的判斷,只負責判斷一層。

此次,我在對象建立的時候,我專門實現了一個builder類,builder類內有三個方法,分別識別Exp,Term,Factor。如今看起來,我能夠把這三個方法拆開,分別識別一個類,這樣下降耦合度。

感想

第一個月剛剛過去,表達式求值也是我寫的第一個系統的java的工程。可能目前我對面向對象和java的理解還不夠深刻,但我相信在不斷的OO課程的學習和練習中,對這方面的理解會愈來愈深刻。

感謝爲這門課程付出的老師和助教們。

相關文章
相關標籤/搜索