一、关于三次求导作业

  前三次求导作业是一个由简至易的练手,难度上适中而又很好的切合理论课。给未接触学习过JAVA的同学留有足够的时间建立面相对象的意识,又能够随着三次递进作业结合理论学习。

  三次作业由简单的一元多项式求导到添加三角函数,再到无限嵌套,既能够使用上次作业部分思想,又能够将继承和接口结合进去。

二、程序分析

(一)分析程序结构

  (1)第一次作业

    类图如下:

    

    复杂度如下:

    

    耦合度如下:

    

 

      可见,第一次作业我的程序还是具有很严重的面相过程的问题,程序主要部分在main函数内,虽然参照学长的代码,使用了Pattern和Matcher,理清了思路,但是

    对于两个方法的使用却并不好,重复造轮子严重。

 

  (2)第二次作业

     类图如下:

     

    复杂度如下:

     

    耦合度如下:

     

      第二次作业的主函数仍然冗长,我发现自己的思路存在很大的问题——我仍然仿照第一次作业,使用大正则,将整个表达式直接匹配大正则,而对于表达式拆分

    为项的过程却写在了main函数内,这相当于类只是一个摆设,并没有很好的使用一个类,而使用大正则匹配意味着使用Matcher方法仍然会重复造轮子,因此在看过

    别人的代码后,我开始在第三次作业中使用小正则分别匹配。

  (3)第三次作业

    类图如下:

    

    复杂度如下:

    

      耦合度如下:

     

        第三次作业是递归求导,大正则匹配不再可行,我开始使用小正则递归拆分,在编程过程中我开始发现,除了递归性,其他和第二次并不太大区别。经过前两

    次的经验,我的类已经将方法整合的比较合理, 小正则的使用,使得我也不再重复造轮子,代码风格比较第一次有了很大改观。

  (二)BUG分析

      第一次作业因为比较简单,并没有太大问题,只是由于在项符号为负时多输出了一个负号。

      第二次作业并没有考虑输入为空的情况,我意识到程序调试的鲁棒性,而两个项之间可能存在三个加减号,我并没有处理好,因此中测有一个点没有过。

      第三次作业又出现了第二次的问题,在第二次讨论课上听其他同学讲过后,我了解到要先对项进行预处理,将前面的正负号处理掉,否则交给项自己统一处理

    不可能处理所有情况。

  (三)互测策略

      (1)在写完程序后,我会先对自己的程序进行测试,选用正常的测试样例保证正常,选用鲁棒性强的样例保证覆盖面全,互测时我会将这些样例测试别人,比

        如常数项为-0000,考虑边界情况,参照指导书要求,列出约束点,进行测试。

      (2)当鲁棒测试样例无法发现更多BUG后,开始阅读他人代码,依照思路比较他人与自己的思路和考虑各种情况的差别,以此确定他人或自己的问题。

  (四)重构说明

       第二次作业由于我没有考虑到一个项可表示为三元式,并没有对一次作业重构,而第三次作业我艰难的实现了递归,还是采用了将表达式拆分为项,再拆分

     为因子的策略,却并不知接口该怎样应用其中,我的代码结构并适合接口,后来在问过别的同学后,我了解到需要在乘和加减两个类中采用接口。

三、总结

   (1)三次作业我逐渐将面向过程的思想扭转了过来,能够将编码与理论课结合起来

   (2)对于优化,我做的并不好,尤其第三次作业,嵌套层数过多时结果尤其冗杂

   (3)我在作业初期对整个程序结构的构思花的时间较少,往往有了思路就开工,却半途放弃方法

版权声明:本文为wdd00原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wdd00/p/10610830.html