OO第一单元总结

第一次作业


  • 整体构思

    • 由于面向对象思维的缺乏,第一次作业的整个架构非常不行,还手动暴力实现了类似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的判断上

第二次作业


  • 整体分析
    • 这次向同学请教了面向对象如何构建相应的框架,学习了这次作业的层次框架,努力的构建了一个还算有些结构的代码。
    • 整体构造层次是多项式<-->单项式<-->因子,由上至下逐步构建
    • 计算架构是由下至上逐步求导,因子求导得到单项式,单项式求导得到多项式,多项式求导得到多项式的和
    • 另外,在试图化简时,遭遇了谜之深拷贝问题,让我放弃了化简。
  • 量化分析
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
posted @ 2019-03-27 10:25  pampamda  阅读(233)  评论(0编辑  收藏  举报