1.程序结构
三次作业的类图如上图所示。
2.程序中存在的BUG:
第一次作业的主要BUG出现在大整数的处理上面,当时对数据规模并没有一个比较具体的概念,就简单的使用了long而不是biginteger来储存幂函数的系数和指数。还有部分BUG出现在正则表达式爆栈上。
第二次作业的主要BUG出现在对于前导+是作为运算符还是作为正负号的判断上面。按照更新后的解释,++++++是不合法的。同时第一次作业中缺少hasnextline()的错误带到了第二次作业中
第三次作业的主要BUG集中在构建表达式语法树过程中。直接的原因是底层的设计出现了比较大的问题,忽略了对接口和继承的使用。导致层次结构过于复杂,多次调用后难以调试。
3.互测BUG部分:
我自己hack的很少。在第一次研讨课上有同学提出了面向测试的设计思路,这对于我第二次作业的进行是一个启发。每完成一个类或者一个方法时都会尝试对其进行测试,来反思自己的思路是否正确。构建测试点的方法也主要是基于自己在思考指导书的规格要求时发现的一些容易被忽略的点来进行构造。
4.Applying Creational Pattern
相比之下,第二次作业我直接把第一次作业的结果推倒重来。主要原因在于相较于第一次作业中使用的正则表达式,递归向下的分析法由于其逐字符判断的优点使得对输入流的分析相当具体,哪一部分被识别为了什么内容我都能看的十分清楚。但是存在的问题在于,在第二次作业中,我依然是用四个数字(常数系数,幂函数指数,sin指数,cos指数)来作为一个项的基本组成成分,这就导致了第二次作业求导的思路不能在第三次作业上进行复用。事实上我在第二次作业中尝试过使用和第三次的设计相同的思路来进行语法树的构造,但是当时因为比较复杂就放弃了这个思路。这一部分缺少的思考也让我在第三次的设计中吃了亏。