OO第一单元的总结

  第一单元总共有三次作业,难度逐渐递增,第一次作业只是简单的幂函数和常数的组合,第二次作业加入了简单的三角函数的规则,第三次作业加入了嵌套的规则。

一. 第一次作业

  之前虽然接触过java,但是对类的理解还是非常肤浅,没有进行过大量的编程实践。在第一次作业实现的过程中,还是残留了很多c语言风格,只有一个PolyDiff类,所有变量以及方法都是在这个类里面,几乎就没有面向对象编程的痕迹,完全是一个面向过程的编程。由于上个学期刚学习过编译,所以在表达式打判断上直接就想到了状态机,在数据的存储上时使用了HashMap,数据类型由于考虑到大数据,所以使用了BIgInteger类,最后还做了一些合并优化。由于使用了状态机,所以在风格的检测这一关还是废了一番功夫,将状态机的各个状态实现一个方法,并将相同的功能的代码段实现为一个方法去减少行数。下面是整个程序的类图以及oo度量。

 

 由上图可以看出,整个程序只有一个类,并且有些方法的耦合度很高,导致整个程序的难以维护。

 在强测的时候,并没有发现错误。但是由于在设计的时候采用了状态机去处理表达式,所以在程序的扩展性很低,在之后加入新的功能的时候就需要重新去写表达式的处理,过多的状态会使得风格检测不容易满足,所以之后的作业中都使用了正则表达式去做表达式的输入正确性处理。

二. 第二次作业

  相比于第一次作业,第二次作业增加了三角函数在规则中,增加了难度。在这次作业中有两个类,一个是PolyDiff,用于表达式的处理、求导以及输出;另一个是SinCosX类,管理数据存储。在输入表达式的正误判断上,使用了正则表达式进行判断,确实非常实用。在处理表达式的时候也没有使用状态机,而是在一个循环中使用if语句将需要的数据拿出来存储到SinCosX类中。虽然说这次作业中有两个类,但是整体来说还是面向过程的一种编程思维。具体的类图和OO度量如下。

  

  由上图可以看到,某些方法的非结构化程度有点高,不便于维护。尤其是printPoly这一方法的非结构化程度、耦合度以及复杂程度都比较高,是非常不利于维护、扩展的。

  这一次作业在强测过程中依然是没有出现测试的错误,但是由于程序的风格依然不是面向对象的风格,所以程序在扩展性上有明显的不足。

三. 第三次作业

  第三次作业是增加了嵌套规则,并在指导书中显示的写出了整个表达式分为因子、项和表达式三个选项。在看到这个的时候,由于编译课设中也有这些选项,所以打算模仿编译课设的思想去做此次作业。在讨论区中,看到其他大佬的想法之后,果断放弃了之前的想法。按照课上所讲的类继承和接口的方法,实现了一个比较规范的面向对象的程序。将表达式、项、因子作为类,表达式由若干项组成,项由若干因子组成,因子又作为一个父类去实现sin、cos、幂函数、常数以及表达式因子的子类。并用接口在每个类中实现求导和输出函数以及错误输出。由于这次程序比较复杂,难度较高,所以在设计的时候便没有考虑任何优化措施。类图和oo度量如下图所示:

  由于方法比较繁多,所以用两张图来表示oo度量。在CosFactor、SinFactor、Term等的构造函数中使用了很多的if语句,这应该是造成方法的耦合度和复杂度比较高的原因。

  这次程序在强测中出现了一个错误,没有考虑到程序以*、+、-结尾的情况,即以运算符结尾的情况。这种情况应该是在程序一开始的PolyDiff.checkSpace()方法中加上这一判断条件即可。

  在第一单元的三次作业中,我逐渐了解到了面向对象编程的具体含义,并且在第三次作业中第一次使用了类的继承和接口的使用,确实可以使得程序的编写思路更加的清晰。在写程序之前先将整个过程的类以及方法想明白,在具体实现的过程中便会省不少时间。

猜你喜欢

转载自www.cnblogs.com/lzd1998/p/10609380.html
今日推荐