一、基于度量分析程序结构
1.1 第一次作业
UML
类复杂度
方法复杂度
第一次作业只建了两个类,MainClass类和Poly类。
Poly类有num和index两个属性,分别是幂函数的系数和指数。
Treemap用指数做key存储Poly类。
Poly中没有专门的求导方法,在输出的时候求导。
大量的代码放在MainClass中,嗯这很不面向对象。
1.2 第二次作业
UML
类复杂度
方法复杂度
第二次作业依然使用Treemap存项,key是系数,value是b+c+d(所有项都化成了a*x**b*sin(x)**c*cos(x)**d的形式)。
Check类用大正则来检查格式,Poly类分离并储存项,Deriva类逐个求导,输出方法在主类里。
本来Merge类是想合并三角函数的,但是时间不够了也没有想到合适的方法,就只写了个函数输出把第一个正项第一个输出。
1.3 第三次作业
UML
类复杂度
方法复杂度
第三次作业相对来说比较面向对象,建了幂函数类、常数类、加减法类、乘法类、三角函数嵌套类,这些类都实现了求导接口。
逐个读入字符用表达式计算方法构建对应实例,读入结束后栈中只剩一个实例,再对其调用求导方法递归获得结果。
Check类独立判断格式是否正确,特殊符号替换表达式因子和三角函数内的因子后大正则判断整个表达式,同时递归判断表达式因子和三角函数内的因子是否符合格式。
由于时间不够且怕出其他问题,所以没有进行优化,性能分基本没有拿到。
二、bug分析
前两次作业强测和互测均未出现bug,第三次互测出现了一个TLE类型bug,可能是递归太深导致,修复bug时在计算前先去除了嵌套的括号。
三、互测样例构造
- 输出为0的数据。第一次测试中有一位同学在计算结果为0时没有输出。第三次测试时有一位同学常数与常数相乘时无输出,还有一位同学在括号内结果为0时输出空括号。
- 多层嵌套。采用多层嵌套会有TLE类型的bug。
- WF。采用一些复杂的嵌套式子等容易被错判为wrong format的表达式进行测试。
- 在最前面或括号前加上负号。有些人的程序没能处理这些符号。
- 随机构造常规表达式。
四、应用对象创建模式来重构
第一次作业不应该把太多代码放在MainClass里,应该创建专门的类分析项以及求导和输出。第二次作业应该创建一个输出类,不应该把所有项统一处理,需要分别构建三角函数类、幂函数类、常数类等,还可以使用工厂模式管理。第三次作业改动很大,但是也有不足,可以加入部分正则匹配项和运用工厂模式。
五、对比和心得体会
第一单元一直都在重构代码,花了很多时间,以后需要注意代码的复用性,尽量让之后的作业能使用之前的框架。
自己还是面向过程的思想,对处理对象之间的关系比较茫然,第三次作业之后才好了一点。
作业还是尽快开始比较好,不然即使有时间也完全没动力优化和测试了。