oo第一单元总结
1.程序分析
1.1作业一
1.1.1类图
第一次作业对oo面向对象的思维理解不深,主类之外只创建了一个Poly类,用来存放每一项简单多项式的系数,以及完成简单多项式的求导;存储使用Arraylist,方便最后进行排序实现优化。匹配表达式使用的是正则,但这样的做法可拓展性极低,重构在所难免。
1.1.2复杂度分析
其中MainClass.main以及Poly.toString方法复杂度较高,本质原因还是没有实现面向对象,导致main方法十分冗杂。
1.1.3bug分析
第一次作业没有在强测以及互测中出现bug,第一次作业相对简单,需要考虑的情况也少,也使得程序没有出现bug
但在互测中也未发现其他人的bug,测试的方向主要为一些省略的特殊情况,如+1等
1.2作业二
1.2.1类图
可以看到,第二次作业的类图与第一次作业大同小异,仅在Poly类中增加了两个属性,这两个属性用于表示项中新添加的sin(x),cos(x)的指数。第二次作业的思路与第一次作业思路较为接近,都是将每一项中各种因子的特征(系数和指数)提取出来从而进行求导,是将一个项作为一个基本单位来实现求导的。这种思路在这种情况下有优势,可以大大简化表达式的分析以及求导过程,但是在面对第三次作业中出现的嵌套时毫无办法,必须重构。
1.2.2复杂度分析
这次作业程序的复杂度不高,但依旧没有体现面向对象的思想
1.2.3bug分析
第二次作业只是在第一次作业的基础上添加了三角函数因子,以及增加了wf的判断,整体变化并不大,因此在强侧中也没有出现bug,唯一的小失误是没有认真看清指导书上对于幂函数指数绝对值读取过程中不能超过10000的规定,在判断wf时先将项中所有幂函数的指数合并之后才进行判断,导致互测被hack
互测阶段采取测试边界值,比如指数的限制等;还有第一次自己程序的bug,未处理-x,-sin(x),-cos(x)的负号,但未能在本屋发现bug
1.3第三次作业
1.3.1类图
可以看到第三次作业进行了大的重构,而重构的思路基本来源于指导书中的提示,将每一种因子都看作一个类,而这些因子都继承自一个共同父类,创建对象采用了工厂模式,方便进行表达式的解析以及后续表达式的求导。由于出现嵌套的情况,程序的整体思路为递归分析,先对表达式进行递归分析,拆分成最小的因子,再对因子进行正则匹配,求导也采用的是递归式求导
1.3.2复杂度分析
本次程序的复杂度基本集中在对表达式的拆分上,表达式因子类、项类以及三角函数类的构造方法复杂度高,原因是没有太优的算法进行嵌套因子的提取。本人的方法是遍历表达式,匹配括号,将所有第一层括号内的式子另外存储,在分析完第一层表达式之后,再对二层进行递归分析。由于中间涉及到多层条件判断以及循环,导致圈复杂度较高。
1.3.3bug分析
由于本次作业完全重构,且前两次作业本人并未能get到面向对象的含义,导致此次重构花费了大量的思考时间,实际开始编程已经是ddl之前不久;同时此次作业对于wf的判断情况增多,处理不当就很容易考虑不周全,这也导致本次作业的bug很多。由于强测bug过多,未能达到互测的标准,因此此次没有互测。后续发现的bug有:1.关于空白的wf判断少考虑了一种情况.2.在表达式因子提取中每新的一个表达式因子提取完之后没有将中间变量清零,导致每一个表达式因子都是之前表达式因子与正确表达式因子的拼接。3.在输出的时候表达式因子的括号未输出。4.最后求导完之后画蛇添足,删去了结果中所有的**1以及*1(脑袋迷到不考虑**12等情况)
总之此次作业虽然在结构上取得了成效,但是由于思考时间过长,导致最后没有时间认真测试程序,仅仅依赖中测的反馈来debug,导致此次bug层出不穷。在之后单元的作业中,一定要抓紧时间,能动手就先动手,万事开头难;对程序的测试也要更加仔细。
2.对比和心得体会
首先是对于面向对象的理解不深,前两次作业都是面向过程的思想,导致第三次作业重构困难;其次是对Java内的许多容器等了解不深,基本就是Arraylist一路走过来的;还有第二三次作业的优化问题,尤其是第三次作业,完全没有考虑优化。不过这一单元的学习也让我收获了许多。设计时要多想想如何能进行扩展;指导书很重要,一定要仔细阅读;写代码的注释也是十分重要的,可以帮助自己整理思路;善用工具,多分析分析自己的程序,看看哪里还可以进行改善。