2021面向对象第一单元总结
1.基于度量分析程序结构
第一次作业

第一次作业比较简单,也因为刚接触面向对象思维,程序总体还是比较偏向面向过程,处理思路主要是用正则表达式匹配输入来分解出因子,进行求导后再进行合并。在处理过程中将因子用向量表示系数和指数,这样比较方便化简。

从上表中可以看出工作量主要集中在多项式分解和化简输出上。
第二次作业

由于第二次作业增加了三角函数和嵌套组合,单纯的使用正则表达式已经很难完成任务,较好的方法是采用递归下降分析法。由于时间较紧,我没有采用这种方法,而是根据指导书的提示构造因子类和运算类将他们构造成树,来进行求导,这种方法比较简单快速,但缺点也很明显,就是扩展性很差,无法处理WF的情况。为了提高求导的性能,我还是采用与第一次作业相同的方法,用向量来表示因子,方便最后进行化简。

从上图可以看出用于分解表达式的Poly类结构过于复杂,同时加法减法乘法的求导复杂度也在逐步上升。对于较复杂的结构没有设计更好的求导方法。
第三次作业

这次作业较为复杂,在第二次作业的基础上有增加了复合函数,同时还要求能够识别出有格式错误的输入表达式。这就导致只能再次重构。第三次作业我采用了递归下降分析法来解析多项式。 其中Lexer和Parse类用来进行词法分析和语法分析,建立format类来对多项式进行格式检测,format类的检测并不能检测出所有的格式错误,主要的格式检错是在语法分析部分完成的,它只是在一定程度上减轻语法分析的工作量。在语法分析部分通过递归下降语法分析识别出多项式中的表达式,项,因子等,再根据因子和运算法则建立节点类,节点类自实现求导运算,将表达式解析成树,最终实现求导。

从上图可以看出词法分析类由于功能较为单一但实现较为繁琐导致方法复杂度较高,而语法分析类由于功能较多,在分析多项式的同时还要进行建树使得代码行数过高。同时由于各个类之间耦合度较高,导致难以进行简单的化简,使得单独建立化简类的操作过于复杂,使得在第三次作业中,我基本没有进行过多的化简设计。
2.分析bug
由于每次作业都完成的比较仓促,使得,每次提交都会有一堆bug,即使中测过了也会在强测被heck的很惨,但在debug时就发现其实大多数bug还是因为自己没有认真分析设计要求,忽略了某些条件,最常见的就是在表达式因子前存在负号的问题,因为我是节点类自己实现求导,使得求完导后再处理负号变得非常复杂,也算是给自己的一个教训,在写代码之前一定要先进行充分的思考和设计。
3.找bug的策略
主要是根据文法尽可能去构造较完善的样例,也可以通过对函数多次求导来构造复杂样例,不够后者随机性较高。
4.重构经历总结
由于每次都是赶着时间完成的,所以几乎都是想到一种方法就去实现,设计和构思的时间较短,导致程序的可扩展性极差,几乎每次都要重构QAQ。所以在第二单元一定要在写代码之前进行设计和构思,不能只想着完成这一次作业,还要结合之后的几次作业,设计好程序的可扩展性和鲁棒性,杜绝重构。
5.心得体会
总的来说,这三次作业给我的帮助是非常大的,逐步提升的难度也使的我能够跟得上进度,同时第一单元的作业也让我暴露出了很多的问题,希望在下一单元的作业中能够解决这些问题。加油!

浙公网安备 33010602011771号