OO第一单元作业总结

OO第一单元作业总结

综述

这一单元的作业,我主要是采用预解析模式进行编程的。主要因为在第一周的时候,还没有完成对pre中的正则表达式部分。这使得我在面对第一次作业时毫无头
绪。而之后也没有大范围的重构,所以预解析模式一直用到了最后。用这种方法和一般方法的最大差别不仅在于输入的复杂度上,还在于对式子中的函数,需要设计的程序完全不用进行考虑,使得开发的难度大大的降低了。甚至于第二次作业与第三次作业之间,基本没有进行迭代。所以在这里我就把这两次作业放在一起进行介绍了。这次的总结将会对这几次作业分别进行代码分析,最后会写一些我个人的心得体会。

第一次作业

总体架构

第一次作业的任务主要是对式子进行展开。使用预解析模式之后,每次会给出一个标签和相应的操作。因此,在main函数中建立了一个数组去存储每一步产生的多项式。这样在后面的式子调用之前的式子的时候就可以根据id直接使用。而对应的一些列操作的实现方法如下:
加减:加一个式子,就是把一个式子的因子copy到另一个中。减法即把系数取负数之后加入。
乘法:乘法按照系数相乘,指数相加的方法新建一个因子,再将因子加入。
指数:循环相乘。
最后,对数组中的最后一个多项式进行化简之后输出。化简的方法就是进行遍历,寻找指数相同的因子进行合并。

uml图

这几次作业中我都只是用了三各类,这样做是出于我主观的想法,因为一开始我的想法就是建立main之后建立多项式类以及因子类。至于如何进行输入分析以及如何进行运算操作的实现,我都把他们放在了主类中。对于这样做的不好,我会在下一模块进行分析,这里主要是提供uml图的展示。
从uml图中可以看出,我的代码主要是通过main类进行输入的解析,之后不断地在items之中添加新的多项式,最后调用多项式类中定义的合并函数进行输出。

方法复杂度分析

这里给出用工具生成的表格,分析程序的复杂度。



可以看出,代码的主要复杂度来源与MainClass的复杂程度。这其实也是显而易见的,因为MainClass中实现了太多的功能,使得代码冗长。
针对这种情况,我可以想出的一些方法如下:
1.将MainClass的部分功能,包括输入处理等进行分解,新建类,帮助MainClass分担工作。
2.利用HashMap代替原来的数组,减少时间复杂度。

BUGS and DEBUGS

第一次作业的bug主要集中在输出上。当多项式中没有内容,即为“0”时,没有进行特殊的处理,导致输出空串的情况,这个加一下if-else判断就解决了。

第二,三次作业

总体框架

与第一次作业相比,第二,三次作业的主要不同就在于出现了三角函数,三角函数之中也会出现多项式。对于这种嵌套定义的式子,我的处理方法是给Factor因子类加上一个Item型的数组,同时给Item类加入新的变量Trigflag,去标注这个多项式是否为三角函数的内容,如果是,那么是那种三角函数。这样,就实现了递归定义。同时修改了相乘的算法,在系数相乘,指数相加的同时,将一个的Item数组加入到另一个中,实现了附带三角函数的乘法。

uml图


关于uml图,并没有新建类,只是对多项式类和因子类进行了一些修改,所以和第一次作业的差别不大。

方法复杂度分析

第二三次的统计图如下:


对与MainClass,还是之前的老问题。但是对于Factor类和Item类,其复杂度也有增加。这当然是因为新加了内容。但是本人在debug的过程中也发现了这种写法的一些问题。即太过抽象,debug运行时没有办法直观地看出每个多项式的内容,导致bug修复十分困难。

BUGS and DEBUGS

第二三次作业有着共性的bug,但是这个bug直到第三次的强侧才被我发现,因为之前的式子嵌套层数比较少,难以发现存在的bug。
bug的主要原因,是我在处理三角函数嵌套时发生的。对于预解析模式,给出“sin”或“cos”之后会接一个“fn”,我的做法是直接将“fn”的Trigflag修改之后加入新的多项式。这样做的风险在于如果后面的新多项式又调用“fn”并且将其Trigflag改为其他值,会使之前的多项式一起被修改,出现bug。至于修复方法,就是将调用的多项式进行复制之后再加入就可以了。

心得体会

关于寒假pre的重要性:其实这三次作业对我来说任务量最大的是第一次作业,因为使用了预解析模式,使得这三次之间并没有特别多的迭代。(甚至第三次在输出的时候多打个括号就过了。。)。但是我觉得还是比较遗憾的,感觉和其他同学比起来差了很多的训练。这主要是因为准备不足。接到第一次作业的时候甚至不会使用(没听说过)正则表达式,导致正常的方法对我来说举步维艰。也感谢助教大大给了预解析,给我这种菜菜子一些活路。希望今后能多家训练,尽快赶上。
关于代码设计方面:这三次代码下来,给我最大体会的是如何对复杂的代码进行化简。方法无外乎是将大的方法分为小的方法进行实现等。而我也想到了一些行之有效的其他方法进行化简。对于这次的作业,输入的解析和多项式的操作之间其实高度相关,所以应该把解析和操作进行一些融合,而不是反复调用,以减少代码的复杂度。还有一点,是关于debug时内容的可视化。前文之中也有提到,我实现递归调用的方法,虽然便于进行运算,但是调试起来实在是太过困难,所以应该为了方便调试,进行一些可视化处理,包括定义新的字符串类表示类的一些特征,以便帮助调试等。

posted @ 2022-03-23 19:36  杨晓20373877  阅读(55)  评论(1编辑  收藏  举报