第一次作业
整体构思
- 由于面向对象思维的缺乏,第一次作业的整个架构非常不行,还手动暴力实现了类似C语言的链表……
- 整体思路就是判断空串以及空格相关的非法格式后,使用单项的正则表达式对整个表达式进行格式合法判断,简化符号并构造系数和指数的链表,然后对链表进行求导。
量化分析
Method ev(G) iv(G) v(G) Main.Pnode.Pnode() 1 1 1 Main.Pnode.Pnode(BigInteger,BigInteger) 1 1 1 Main.Pnode.getCoef() 1 1 1 Main.Pnode.getExp() 1 1 1 Main.Pnode.setCoef(BigInteger) 1 1 1 Main.Pnode.setExp(BigInteger) 1 1 1 Main.PolyList.PolyList() 1 1 1 Main.PolyList.add(BigInteger,BigInteger) 3 3 4 Main.PolyList.deri(PolyList) 1 3 3 Main.PolyList.printAns() 1 7 7 Main.Polynomial.Judge() 1 1 1 Main.Polynomial.Polynomial(String) 1 6 6 Main.Polynomial.dealSign(String) 1 1 1 Main.Polynomial.findCoef(String) 4 5 6 Main.Polynomial.findExp(String) 2 6 6 Main.Polynomial.getAns(PolyList) 2 2 2 Main.Polynomial.getList() 1 1 1 Main.main(String[]) 1 2 2 Class OCavg WMC Main 2 2 Main.Pnode 1 6 Main.PolyList 3.75 15 Main.Polynomial 3.29 23 Module v(G)avg v(G)tot W1 2.56 46 Project v(G)avg v(G)tot project 2.56 46 可以看出,使用无脑for循环寻找系数和指数的函数设计得不是太好。
bug分析
- 被找到的bug问题主要在于考虑不够周全,但是我觉得很正常,面对问题能思考的完美无缺的都是大神,收获的教训就是要多与同学交流,全面综合考量。
- \t默认替换问题
- +++在符号简化后默认正确
- 集中在格式合法性判断
- 找同学的bug
- 策略:测试自己错过的数据,以及简单的覆盖性测试
- 第一次计算较简单,主要问题集中在WF的判断上
- 被找到的bug问题主要在于考虑不够周全,但是我觉得很正常,面对问题能思考的完美无缺的都是大神,收获的教训就是要多与同学交流,全面综合考量。
第二次作业
- 整体分析
- 这次向同学请教了面向对象如何构建相应的框架,学习了这次作业的层次框架,努力的构建了一个还算有些结构的代码。
- 整体构造层次是多项式<-->单项式<-->因子,由上至下逐步构建
- 计算架构是由下至上逐步求导,因子求导得到单项式,单项式求导得到多项式,多项式求导得到多项式的和
- 另外,在试图化简时,遭遇了谜之深拷贝问题,让我放弃了化简。
- 量化分析
Method | ev(G) | iv(G) | v(G) |
---|---|---|---|
Factor.ComCos.facDerivation() | 1 | 1 | 1 |
Factor.ComCos.type() | 1 | 1 | 1 |
Factor.ComSin.facDerivation() | 1 | 1 | 1 |
Factor.ComSin.type() | 1 | 1 | 1 |
Factor.ComX.facDerivation() | 1 | 1 | 1 |
Factor.ComX.type() | 1 | 1 | 1 |
Factor.Common.Common() | 1 | 1 | 1 |
Factor.Common.facDerivation() | 1 | 1 | 1 |
Factor.Common.getExp() | 1 | 1 | 1 |
Factor.Common.setExp(BigInteger) | 1 | 1 | 1 |
Factor.Common.type() | 1 | 1 | 1 |
Main.dealSign(String) | 1 | 2 | 2 |
Main.judgeLegal() | 1 | 2 | 3 |
Main.main(String[]) | 1 | 5 | 5 |
Main.proEnd() | 1 | 1 | 1 |
Mono.MoDerivation() | 1 | 5 | 5 |
Mono.Mono() | 1 | 1 | 1 |
Mono.Mono(String) | 1 | 5 | 5 |
Mono.addList(Common) | 1 | 3 | 3 |
Mono.findExp(String) | 1 | 4 | 5 |
Mono.getCoef() | 1 | 1 | 1 |
Mono.getMono() | 1 | 1 | 1 |
Mono.setCoef(BigInteger) | 1 | 1 | 1 |
Mono.setMono(ArrayList) | 1 | 1 | 1 |
Poly.Poly() | 1 | 1 | 1 |
Poly.Poly(String) | 1 | 2 | 2 |
Poly.addMono(Mono) | 1 | 1 | 1 |
Poly.getPoly() | 1 | 1 | 1 |
Poly.printAns() | 2 | 11 | 11 |
PolyDe.PolyDe(Poly) | 1 | 1 | 1 |
PolyDe.merge(Poly,Poly) | 1 | 2 | 2 |
PolyDe.wholeDerivation() | 1 | 2 | 2 |
Class | OCavg | WMC | |
Factor | n/a | 0 | |
Factor.ComCos | 1 | 2 | |
Factor.ComSin | 1 | 2 | |
Factor.ComX | 1 | 2 | |
Factor.Common | 1 | 5 | |
Main | 2.25 | 9 | |
Mono | 2.56 | 23 | |
Poly | 3 | 15 | |
PolyDe | 1.67 | 5 | |
Module | v(G)avg | v(G)tot | |
nework | 2.06 | 66 | |
Project | v(G)avg | v(G)tot | |
project | 2.06 | 66 |
可以注意到,主要的复杂度源于核心类mono,主要的构建以及求导函数都在该类中。另外输出答案的函数由于设计问题也导致了复杂度较高。
- bug分析
- 被找到的bug主要集中在格式判断问题,对于判断\t相关的代码位置设置出错,逻辑顺序没有想清楚。
- 找到同学的bug:测试自己出错的地方。并阅读同学代码后简单捋一下思路和逻辑,针对可能存疑的地方测试相关数据。
- cos与sin组合求导问题
- 格式问题
第三次作业
- 整体问题:诚实的说,第三次作业由于各种各样的原因没有完整的完成,对于整个架构的不理解以及钻牛角尖心态炸裂造成了构建的失败,有点丢人。但是我觉得失败其实不是很严重的问题,只是一个让我强烈反思学习心态以及学习方法的警钟。只要OO还没有结束,我就一直有努力的余地(讲得好鸡汤)。总之,之后的作业不能像这次一样的轻易放弃(……),一定要挣扎到最后一步(。
总结
- 内容总结:第一单元的目的在于让我们熟悉OO的设计构造,了解设计模式以及各种抽象概念的实际使用。ps:我觉得设计模式这个概念应该更早的在课程中引入。
- 反思:对OO的抽象性以及架构理解不深,导致了一系列的问题,需要在后续学习中多向同学助教取经,多学习多练习。
- 对代码重构的一点思考:增加代码的封装性和复用度,降低代码的耦合性,并且对架构进行更好的梳理。
- 对设计模式的学习:目前在学习工厂模式,工厂模式在第二三次作业都有所帮助。设计模式需要不断的练习,希望能在后续的课程中应用更多的设计模式。
- 其它的小tips