一、关于三次求导作业
前三次求导作业是一个由简至易的练手,以正则表达式的匹配为引子,引导我们思维由面相过程向面向对象转变。给未接触学习过JAVA的同学留有足够的时间建立面相对象的意识,又能够随着三次递进作业结合理论学习。
三次作业由简单的一元多项式求导到添加三角函数,再到无限嵌套,既能够使用上次作业部分思想,又能够将继承和接口结合进去,表达式到因子的拆分可以很好地表现对象和类的作用。
二、程序分析
(一)分析程序结构
(1)第一次作业
类图如下:
复杂度如下:
耦合度如下:
可见,第一次作业我的程序还是具有很严重的面相过程的问题,程序主要部分在main函数内,虽然使用了Pattern和Matcher,也抛弃了传统数组,理清了思路,但是对于两个方法的使用却并不好,重复造轮子严重。,
(2)第二次作业
类图如下:
复杂度如下:
耦合度如下:
第二次作业的主函数仍然冗长,我发现自己的思路存在很大的问题——我仍然仿照第一次作业,使用大正则,将整个表达式直接匹配大正则,而对于表达式拆分为项的过程却写在了main函数内,这相当于类只是一个摆设,并没有很好的使用一个类,而使用大正则匹配意味着使用Matcher方法仍然会重复造轮子,因此在看过别人的代码后,我开始在第三次作业中使用小正则分别匹配。
(3)第三次作业
类图如下:
复杂度如下:
耦合度如下:
第三次作业是递归求导,大正则匹配不再可行,我开始使用小正则递归拆分,在编程过程中我开始发现,除了递归性,其他和第二次并不太大区别。经过前两次的经验,我的类已经将方法整合的比较合理, 小正则的使用,使得我也不再重复造轮子,代码风格比较第一次有了很大改观。
(二)BUG分析
第一次作业因为比较简单,并没有太大问题,只是由于在项符号为负时多输出了一个负号。
第二次作业被幂指数范围困扰了一段时间,可见指导书需要仔细阅读,很多bug都出现在规定的细节处。
第三次作业又出现了第二次的问题,在第二次讨论课上听其他同学讲过后,我了解到要先对项进行预处理,将前面的正负号处理掉,否则交给项自己统一处 理不可能处理所有情况。
(三)互测策略
(1)在写完程序后,我会先对自己的程序进行测试,选用正常的测试样例保证正常,选用鲁棒性强的样例保证覆盖面全,互测时我会将这些样例测试别人,比如常数项为-0000,考虑边界情况,参照指导书要求,列出约束点,进行测试。
(2)当鲁棒测试样例无法发现更多BUG后,开始阅读他人代码,依照思路比较他人与自己的思路和考虑各种情况的差别,以此确定他人或自己的问题。
(四)重构说明
第二次作业由于我没有考虑到一个项可表示为三元式,并没有对一次作业重构,而第三次作业我艰难的实现了递归,还是采用了将表达式拆分为项,再拆分为因子的策略,却并不知接口该怎样应用其中,我的代码结构并适合接口,后来在问过别的同学后,我了解到需要在乘和加减两个类中采用接口。
三、总结
(1)三次作业我逐渐将面向过程的思想扭转了过来,能够将编码与理论课结合起来
(2)对于优化,我做的并不好,尤其第三次作业,嵌套层数过多时结果尤其冗杂,而且指导书要仔细阅读
(3)我在作业初期对整个程序结构的构思花的时间较少,往往有了思路就开工,却半途放弃方法,而且dbug时会出现一个改完,又影响其他匹配的情况