大二下的第一個月就要結束了,OO的第一單元也結束了,所以在這裏總結一下個人OO的第一單元的狀況。java
第一單元有三次(不計寒假pre)做業,分別爲:多項式求導,帶有冪函數、三角函數的表達式求導 和 帶嵌套的表達式求導。 我三次做業的結構都不徹底同樣,其中第一次和後兩次徹底不同,第三次基本沿襲第二次。下面,我review一下我每次的結構。函數
第一次的結構比較簡單,基本就是使用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 |
第二次做業個人整體結構分爲了三層:測試
其中,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類,這裏有大量的優化代碼,優化代碼寫的不夠優美,所以我還須要更多練習。對象
第三次做業基本繼承了我第二次的結構
個人整體結構分爲了三層:
其中,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
從中我大概總結以下:
同時,我也看了其餘同窗的代碼,發現了一些印象深入的代碼,大概以下
建立模式看起來十分深奧,在我簡單的理解起來,大概是一個在選擇建立一個父類的多個子類的時候,讓子類的選擇交給一個的一個方法。這樣,能夠下降代碼的耦合度。
就是說,個人一個類的判斷,只負責判斷一層。
此次,我在對象建立的時候,我專門實現了一個builder類,builder類內有三個方法,分別識別Exp,Term,Factor。如今看起來,我能夠把這三個方法拆開,分別識別一個類,這樣下降耦合度。
第一個月剛剛過去,表達式求值也是我寫的第一個系統的java的工程。可能目前我對面向對象和java的理解還不夠深刻,但我相信在不斷的OO課程的學習和練習中,對這方面的理解會愈來愈深刻。
感謝爲這門課程付出的老師和助教們。