OO第一单元作业总结

第一单元作业总结

  第一单元作业是整个面向对象课程的开始,万事开头难,这一单元的作业,尤其是第三次作业,让我绞尽脑汁都没有办法拿到强测的满分。但是总的来说,它让我在这一学期的学习中对于这门课有了初步的认识,三次作业的逐渐提升也让我慢慢积累经验和自信。

程序分析

  第一次作业较为简单,主要是让我们逐步熟悉和建立起面向对象的思维。显然,虽然经过了Pre的预习,但是我的思维仍然很大程度的体现了面向过程这一特点。通过分析第一次代码的类图和代码复杂度可以看出,在第一次作业的代码中,我创建的类较为简单,而且有很深的面向过程的思维层次。

  

 

 

   而到了第二次作业,我的思维慢慢开始转变,有了面向对象的思维。但是这次作业我并没有将sin和cos与x分开,我是将它们合并为同一个类进行操作。所以polyM类方法较多。这也是本次作业的一大缺陷。Preprocess类代表对表达式的预处理,同样,由于本次作业没有嵌套,我依然使用的是大正则对其进行鲁棒性检验。同样,本次化简是通过遍历存储基本类(PolyS),来进行合并同类项,并且设置了Derive类求导和GetOutput来实现输出。但是仔细分析,这样的类别的建立方法还是基于面向过程的,并没有实质性的改变,只是将面向过程中各个步骤的方法划分到了类中。

 

    

 

  可是到了第三次作业,事情就变得没有那么简单了。由于出现了叠代,大正则检验鲁邦性这种方法就失效了。其次,我们就必须用递归的思想解决问题。第三,由于出现的类别很多,很难用一种统一的表达形式将所有的可能性表达,所以这个时候就需要细致的分类。所以我按照图中分为了sin、cos、幂函数、表达式这几类,他们同意实现“因子”接口。每一类都有自己的toString和derive方法。这很好的把第二次作业中Getoutput类的方法结合在了每一个不同的类中,提高了代码的耦合度。而对于本题目所运用的递归,我采用的是二叉树,所以在递归层次上会很大,递归时间花费较多。

 

   

 

 

 分析出现的bug

  在第一次作业中,由于表达式结构较为简单,强测互测中我都没有bug。在第二次作业中,由于和第一次使用的预处理表达式符号的方式不同,处理像+++1这样的数据时出现问题,错将正确的表达式判断为错误的表达式,导致强测有一个点出错,并且互测当中出现了同样的bug。在第一次作业中我用的循环处理的字符串,在第二次作业中,我直接使用的String类中的replaceAll,看似简单,但漏了以上所说的这种情况。

  而在第三次作业中,bug类型就多了起来。首先,由于我程序设计上的缺陷,导致如((((((((((x))))))))))和(x*(x*(x*(x*(x*(x*(x*(x*(x*(x)))))))))))这样重复叠代的式子出现超时的情况,这样的bug在互测中出现了很多。其次,由于第三次作业每一个类都需要写derive和toString方法,这和第二次作业我的写法有很大不同。第二次我将一个多项式直接看做a*x**b*sin(x)**c*cos(x)**d,所以求导和最后输出较为简单,但是第三次作业由于涉及到叠代调用自己的方法进行递归求导和输出,我在自测过程中发现了许多问题。比如cos(x)**n求导时考虑不周,求导错误等情况。虽然及时改正了好几处bug,但是在强测过程中仍然有一处toString将"-("误写成了"(-",而我自己在判断符号输出的时候按照字符串的第一个字符是否为"-"来判断,这样就导致有很多项在应该读"-"的时候没有读"-"。这样一个bug让我在互测和强测过程中扣了很多分。

  在第一次作业中,我通过超大数构造的表达式测出了一位同学的bug。在第三次作业中,我保存了自己在自测过程中容易出错的数据。比如在每个可能的位置都插入空白项,构造迭代层侧多的样例,构造不容易被发现的样例(比如+++1)。

  在自测过程中,有很多时候为了追求速度,编写一些较为简单,容易出现巧合的样例,这样就会让自己的bug被简单的样例隐藏起来,应该构造较为复杂的样例,以便定位bug的所在位置。

重构重构再重构

  在第一部分代码分析当中,我便大致分析了一下从第一次作业到第三次作业我自己的思路。自己的思维模式可以在这三次作业中很明显的展现:从第一次的面向过程、逐渐到第三次面向对象的思维。这样思维的转变也让我每一次作业都会重构。而真正到了第三次作业,即使任务量大,情况较为复杂,但是采用分类、抽象的思维方法让我自己感觉思路更加清晰。

 

posted @ 2020-03-19 17:42  力理利丽黎  阅读(143)  评论(0编辑  收藏  举报