OO第一单元——表达式求导——总结

大二下的第一个月就要结束了,OO的第一单元也结束了,因此在这里总结一下我的OO的第一单元的情况。

总体

第一单元有三次(不计寒假pre)作业,分别为:多项式求导,带有幂函数、三角函数的表达式求导 和 带嵌套的表达式求导。
我三次作业的结构都不完全一样,其中第一次和后两次完全不一样,第三次基本沿袭第二次。下面,我review一下我每次的结构。

结构

第一次

结构

first-art

第一次的结构比较简单,基本就是使用HashMap记录每个次幂的系数,然后Poly求导时调用Term的求导方法即可。

耦合度
classOCavgWMC
InputFormatWrong1.02.0
Poly3.521.0
Term2.323.0
TermAddPowDifferent1.03.0
Total49.0
Average2.333333333333333512.25

第二次

second-art

第二次作业我的总体结构分为了三层:

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

其中,Factor是一个抽象类(现在想来,使用接口更好)

每一层,使用ArrayList记录下一层的引用。

加法求导直接调用下一层即可。

乘法求导使用链式法则。

输出部分,为了拓展性,我使用专门的Outputer类进行的输出,里面使用了Quad和Triad两个类进行优化,这两个类重写了equals,hashCode,comparaTo等方法,使用hashMap合并。

耦合度
classOCavgWMC
Expression2.307692307692307530.0
Factor1.03.0
InputFormatWrongException1.02.0
Main2.02.0
Number1.14285714285714288.0
Outputer7.2529.0
PowFunc1.571428571428571411.0
Quad1.916666666666666723.0
Term2.2527.0
Triad2.016.0
TriFunc2.12517.0
Total168.0
Average2.181818181818181714.0

这次作业我专门花了大量时间设计了结构因此整体耦合度相比第一次好看了许多。不是很好的时Outputer类,这里有大量的优化代码,优化代码写的不够优美,因此我还需要更多练习。

第三次

结构

third-art

第三次作业基本继承了我第二次的结构

我的总体结构分为了三层:

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

其中,Factor是一个接口

每一层,使用ArrayList记录下一层的引用。

TriFUnc有一个Term的引用

ExpFac有一个Exp的引用

综上,我的结构基本符合文法

加法求导直接调用下一层即可。

乘法求导使用链式法则。

输出部分,我重写了toString方法

耦合度分析
methodev(G)iv(G)v(G)
Builder.build(String)3.02.04.0
Builder.readExp(String,ArrayList)4.04.07.0
Builder.readFactor(String,ArrayList)9.07.010.0
Builder.readTerm(String,ArrayList,BigInteger)4.06.07.0
Builder.triMatch(String,ArrayList,Matcher,int)4.02.04.0
Constant.calcDerivative()1.01.01.0
Constant.Constant()1.01.01.0
Constant.Constant(BigInteger)1.01.01.0
Constant.Constant(String)1.01.01.0
Constant.getValue()1.01.01.0
Constant.toString()2.01.02.0
ExpFac.calcDerivative()1.01.01.0
ExpFac.ExpFac(Expression)1.01.01.0
ExpFac.getExp()1.01.01.0
ExpFac.isIn(String)5.04.08.0
ExpFac.toString()3.02.04.0
Expression.add(Expression)1.01.01.0
Expression.add(Term)1.01.01.0
Expression.addTerm(Term)1.01.01.0
Expression.calcDerivative()1.02.02.0
Expression.Expression()1.01.01.0
Expression.Expression(ArrayList)1.02.02.0
Expression.Expression(Term)1.01.01.0
Expression.merged()1.01.01.0
Expression.multiply(Expression)1.01.01.0
Expression.multiply(Term)1.01.01.0
Expression.toString()1.05.07.0
InputFormatWrongException.getSituation()1.01.01.0
InputFormatWrongException.InputFormatWrongException(String)1.01.01.0
Main.main(String[])2.03.04.0
PowFunc.calcDerivative()1.01.01.0
PowFunc.getPow()1.01.01.0
PowFunc.PowFunc()1.01.01.0
PowFunc.PowFunc(BigInteger)1.01.01.0
PowFunc.toString()3.03.03.0
Quad.compareTo(Quad)3.03.03.0
Quad.equals(Object)6.02.06.0
Quad.getArr()1.01.01.0
Quad.getFirst()1.01.01.0
Quad.getForth()1.01.01.0
Quad.getSecond()1.01.01.0
Quad.getThird()1.01.01.0
Quad.hashCode()1.02.02.0
Quad.merge(Quad)1.02.02.0
Quad.Quad(BigInteger,BigInteger,BigInteger,BigInteger)1.01.01.0
Quad.Quad(BigInteger,Triad)1.01.01.0
Quad.Quad(BigInteger[])2.01.03.0
Term.addFactor(Factor)1.01.01.0
Term.calcDerivative()1.02.02.0
Term.multiply(Factor)1.01.01.0
Term.multiply(Term)1.01.01.0
Term.Term()1.01.01.0
Term.Term(ArrayList)1.02.02.0
Term.Term(Factor)1.01.01.0
Term.toString()1.03.05.0
Triad.equals(Object)6.02.06.0
Triad.getArr()1.01.01.0
Triad.getFisrt()1.01.01.0
Triad.getSecond()1.01.01.0
Triad.getThird()1.01.01.0
Triad.hashCode()1.02.02.0
Triad.Triad(BigInteger,BigInteger,BigInteger)1.01.01.0
Triad.Triad(BigInteger[])2.01.03.0
TriFunc.calcDerivative()1.02.02.0
TriFunc.getPow()1.01.01.0
TriFunc.getType()1.01.01.0
TriFunc.getVal()1.01.01.0
TriFunc.toString()3.03.05.0
TriFunc.TriFunc(int,Factor,BigInteger)1.01.01.0
Total114.0113.0150.0
Average1.65217391304347831.63768115942028982.1739130434782608
classOCavgWMC
Builder6.432.0
Constant1.16666666666666677.0
ExpFac2.814.0
Expression1.636363636363636518.0
InputFormatWrongException1.02.0
Main2.02.0
PowFunc1.47.0
Term1.7514.0
TriFunc1.833333333333333311.0
Total146.0
Average2.115942028985507312.166666666666666

可以看出,我的builder写的不是很尽人意,不过由于这是读入部分,内部耦合度的确会很高。综合来看,这次的情况比上次好了许多,我也的确感觉自己的结构优美了、“面向对象”了很多

BUG

我没有在公测和互测中被发现BUG

从中我大概总结如下:

  1. 设计结构时让结构优美
  2. 写代码时认真思考
  3. 写代码时符合标准,代码风格需要优美
  4. 写完后测试所有样例
  5. 认真手动构造极限的样例
  6. 使用自动化测试测试自己的代码(跑一天以上)
  7. ……

同时,我也看了其他同学的代码,发现了一些印象深刻的代码,大概如下

  1. 优化写错
    • 个人认为,如果结构设计的够好,优化部分也是可以写起来很简单的。比如如果写足了表达式的乘、加等方法,在优化的时候调用就好,切忌面向过程地优化
  2. 读入写错
    • 读入是一个十分值得测试的部分,交作业前在进行测试的时候,一定要做到充分的,全面的测试。

关于创建模式

创建模式看起来十分深奥,在我简单的理解起来,大概是一个在选择创建一个父类的多个子类的时候,让子类的选择交给一个的一个方法。这样,可以降低代码的耦合度。

就是说,我的一个类的判断,只负责判断一层。

这次,我在对象创建的时候,我专门实现了一个builder类,builder类内有三个方法,分别识别Exp,Term,Factor。现在看起来,我可以把这三个方法拆开,分别识别一个类,这样降低耦合度。

感想

第一个月刚刚过去,表达式求值也是我写的第一个系统的java的工程。可能目前我对面向对象和java的理解还不够深入,但我相信在不断的OO课程的学习和练习中,对这方面的理解会越来越深入。

感谢为这门课程付出的老师和助教们。

转载于:https://www.cnblogs.com/login256/p/10596507.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值