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