面向对象第一单元总结
Homework 1
度量分析程序结构
Method | CDENS | CLOC | IF_NEST | iv(G) | LOC | v(G) |
---|---|---|---|---|---|---|
Constant.Constant(String) | 0.00% | 0 | 0 | 1 | 3 | 1 |
Constant.Derivative() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Constant.getCoefficient() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Constant.getIndex() | 0.00% | 0 | 0 | 1 | 3 | 1 |
DataProcess.DataProcess(String) | 0.00% | 0 | 0 | 1 | 5 | 1 |
DataProcess.derivative() | 42.86% | 0 | 2 | 4 | 14 | 4 |
DataProcess.insert() | 17.65% | 0 | 1 | 4 | 21 | 4 |
DataProcess.print() | 28.57% | 0 | 4 | 7 | 32 | 7 |
DataProcess.zero(BigInteger) | 33.33% | 0 | 1 | 2 | 6 | 2 |
Function.sign(String) | 50.00% | 0 | 2 | 8 | 12 | 8 |
MainClass.main(String[]) | 10.00% | 0 | 1 | 2 | 13 | 3 |
Powerfunction.Derivative() | 16.67% | 0 | 1 | 2 | 10 | 2 |
Powerfunction.Powerfunction(String,String) | 30.00% | 0 | 1 | 2 | 16 | 4 |
Powerfunction.getCoefficient() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Powerfunction.getIndex() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Class | CBO | CLOC | CSOA | Level* | LOC | OPavg |
---|---|---|---|---|---|---|
Constant | 2 | 0 | 21 | 2 | 15 | 0.25 |
DataProcess | 4 | 0 | 20 | 3 | 83 | 0.4 |
Function | 3 | 0 | 16 | 1 | 17 | 0.25 |
MainClass | 1 | 0 | 13 | 4 | 15 | 1 |
Powerfunction | 2 | 0 | 22 | 2 | 36 | 0.5 |
应用对象创建模式
在本次作业中我的思维基本完全是面向过程,把不同阶段处理的函数写成了方法放在不同的类里,DataProcess类对数据进行处理,Function类是构造函数的对象,其中存储了多项式,并实现了求导方法和输出方法,最大的问题是完全没有扩展性,所以在第二次作业重构。
bug分析
第一次作业只有幂函数和常数,也不存在Wrong的判断,笔者用正则表达式对读入的数据进行处理,在公测和互测阶段没有出现bug。
互测分析
本单元第一次作业也是第一面临互测,因为第一次作业结构简单就只是提交了在自己测试时写的几组样例。
Homework 2
度量分析程序结构
Method | CDENS | CLOC | IF_NEST | iv(G) | LOC | v(G) |
---|---|---|---|---|---|---|
Item.Item(String) | 26.32% | 0 | 3 | 10 | 48 | 11 |
Item.getCheck() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Item.getConstant() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Item.getCos() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Item.getPower() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Item.getSin() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Key.Key(BigInteger,BigInteger,BigInteger) | 0.00% | 0 | 0 | 1 | 5 | 1 |
Key.create1() | 0.00% | 0 | 0 | 1 | 5 | 1 |
Key.equals(Object) | 40.00% | 0 | 2 | 4 | 18 | 7 |
Key.hashCode() | 0.00% | 0 | 0 | 1 | 3 | 1 |
Key.return1() | 0.00% | 0 | 0 | 1 | 5 | 1 |
Key.toString() | 28.57% | 0 | 1 | 4 | 30 | 7 |
Main.main(String[]) | 0.00% | 0 | 0 | 1 | 7 | 1 |
Poly.Poly(String) | 20.00% | 0 | 1 | 3 | 14 | 3 |
Poly.createitem() | 9.09% | 0 | 1 | 2 | 16 | 2 |
Poly.derivative() | 4.76% | 0 | 0 | 2 | 24 | 2 |
Poly.insert(Key,BigInteger) | 40.00% | 0 | 2 | 3 | 10 | 3 |
Poly.merge() | 41.67% | 0 | 2 | 6 | 21 | 6 |
Poly.print() | 39.13% | 0 | 4 | 10 | 38 | 10 |
Poly.process(String) | 20.00% | 0 | 1 | 2 | 8 | 3 |
Poly.symbol() | 28.57% | 0 | 2 | 3 | 12 | 3 |
Class | CBO | CLOC | CSOA | Level* | LOC | OPavg |
---|---|---|---|---|---|---|
Item | 2 | 0 | 23 | 2 | 70 | 0.17 |
Key | 1 | 0 | 21 | 1 | 71 | 0.67 |
Main | 1 | 0 | 13 | 4 | 9 | 1 |
Poly | 3 | 0 | 23 | 3 | 148 | 0.5 |
应用对象创建模式
本次作业吸取第一次作业教训,在结构上减轻了不同类之间的耦合度,数据处理方面沿用了第一次的大部分正则表达式进行读入处理,Poly类存放着多项式数据,Item类实现了每一项的创建,本次的作业为了稳妥笔者使用了四元结构,这样进行合并比较容易,也导致下一次作业里Item项大部分得重构。
bug分析
在化简方面笔者对$$cos(x)^2+sin(x)^2=1$$这种项做了初步化简,且也没有拆项进行化简,在公测和互测都没有出现bug。
互测分析
第二次作业熟悉了互测的流程,笔者对其中部分代码进行了阅读,不仅是寻找bug也顺便学习一下别人的架构,第二次同屋的两个人优化出现了一些问题,在特殊数据的上会出错,其他的bug没有找到。
Homework 3
度量分析程序结构
Method | CDENS | CLOC | IF_NEST | iv(G) | LOC | v(G) |
---|---|---|---|---|---|---|
Constant.Constant(String) | 0.00% | 0 | 0 | 1 | 3 | 1 |
Constant.derivative() | 0.00% | 0 | 0 | 1 | 4 | 1 |
Constant.toString() | 0.00% | 0 | 0 | 1 | 4 | 1 |
Expfactor.Expfactor(String) | 0.00% | 0 | 0 | 1 | 3 | 1 |
Expfactor.derivative() | 0.00% | 0 | 0 | 1 | 4 | 1 |
Expfactor.toString() | 0.00% | 0 | 0 | 1 | 4 | 1 |
Expression.Expression(String) | 32.26% | 0 | 1 | 23 | 41 | 23 |
Expression.derivative() | 37.50% | 0 | 1 | 4 | 14 | 5 |
Expression.toString() | 37.50% | 0 | 1 | 4 | 14 | 5 |
Factor.Factor() | 0.00% | 0 | 0 | 1 | 2 | 1 |
Factor.derivative() | 0.00% | 0 | 0 | 1 | 4 | 1 |
Factor.toString() | 0.00% | 0 | 0 | 1 | 4 | 1 |
Item.Item() | 0.00% | 0 | 0 | 1 | 2 | 1 |
Item.Item(String) | 31.82% | 0 | 1 | 8 | 26 | 8 |
Item.create(String) | 20.00% | 0 | 1 | 6 | 29 | 6 |
Item.derivative() | 33.33% | 0 | 2 | 9 | 43 | 12 |
Item.toString() | 33.33% | 0 | 1 | 7 | 23 | 9 |
Main.check(String) | 9.09% | 0 | 1 | 9 | 25 | 9 |
Main.main(String[]) | 11.11% | 0 | 1 | 2 | 13 | 2 |
Main.process(String) | 0.00% | 0 | 0 | 1 | 5 | 1 |
Power.Power(String) | 33.33% | 0 | 1 | 2 | 11 | 3 |
Power.derivative() | 33.33% | 0 | 1 | 3 | 13 | 4 |
Power.toString() | 40.00% | 0 | 1 | 2 | 9 | 3 |
Triangle.Triangle(String,String,boolean) | 25.00% | 0 | 1 | 2 | 13 | 3 |
Triangle.derivative() | 39.13% | 0 | 2 | 9 | 33 | 10 |
Triangle.toString() | 38.46% | 0 | 2 | 4 | 19 | 6 |
Class | CBO | CLOC | CSOA | Level* | LOC | OPavg |
---|---|---|---|---|---|---|
Constant | 2 | 0 | 20 | 3 | 14 | 0.33 |
Expfactor | 3 | 0 | 20 | 7 | 14 | 0.33 |
Expression | 4 | 0 | 17 | 7 | 72 | 0.33 |
Factor | 6 | 0 | 16 | 2 | 12 | 0 |
Item | 7 | 0 | 19 | 7 | 126 | 0.4 |
Main | 1 | 0 | 15 | 8 | 45 | 1 |
Power | 2 | 0 | 20 | 3 | 36 | 0.33 |
Triangle | 2 | 0 | 22 | 7 | 70 | 1 |
应用对象创建模式
本次类的结构我完全依照指导书的形式化结构设计,Expression为表达式,由项Item组成,Item由因子Factor组成,Factor类底下继承四个子类,分别是Constant(常数因子),Triangle(三角函数因子),Power(幂函数因子),Expfactor(表达式因子),求导则是设置了接口Derivative,表达式、项、因子都实现了Derivative方法进行求导,WrongFormat的判断是在Main类中check方法实现,判断完后就去掉所有的空白字符。
bug分析
第三次作业结构较为复杂,笔者不幸在公测和互测中都出现了bug,总共三个bug如下
- 在Item类的toString方法中有0项时忘记返回0了只是把0项去掉了
- 在Triangle类中的cos函数的求导方法,在指数为负数时会出现两个负号
- Item的构造函数有0项时没有读入,但是忘记在字符串中删去0项导致读入失败
三个bug的造成原因还是测试不够多,笔者过了中测就没有进行几次测试了,在后续单元中要吸取本次教训,尽量做到覆盖性测试,并对每个类进行单独的功能性测试。
互测分析
本次我提交了多组测试样例,主要针对多层括号嵌套出现TLE、三角函数多次嵌套复杂表达式且指数包含正负等几种情况进行hack,成功hack同屋的人10次,也被hack了两次到同一个bug。
心得体会
本单元逐步进化的求导作业让我由浅入深对java的面向对象思想中的层次化设计有了更深的理解,尤其是在一步步提高自己结构设计的扩展性中慢慢改变面向过程的思想,也在其中学会了简单工厂模式、抽象工厂模式等实用的设计方法,笔者在本单元存在的问题如下
- 测试工作做的不够到位,三次作业都没有做到覆盖性测试导致出现一些写法的小bug
- 前两次的设计完全没有考虑迭代的问题,每次新的作业都只能使用前一部分很有限的结构且需要修改
- 在不同类中数据和操作的耦合度非常高,完全无法分离,也是造成迭代困难的问题之一
- 总是边写边设计,在写好常常需要修改,也会存在很多问题
总之,本单元的三次迭代作业让我收获颇丰,在后续的几个单元学习中,希望能改善上述存在的问题,对面向对象思想了解的更加深入,提高自己的工程开发能力。