OO第一单元总结

OO 第一单元总结

设计分析

第一次作业

总体架构

MainClass类读入字符串。Handle类负责处理字符串。Calculate 类负责字符串化简并求导。Output类负责输出。对于表达式我的处理方法是现将表达式的项与项之间分隔开。然后对于每个项将其中的因子和因子分隔开,对每个因子单独求导。然后根据求导规则得出每个项的导数。最后将每个项的导数加起来就是表达式的导数。

类的分析

度量分析

下表是每一个方法对应的度量分析。

下表是对每一个类的度量分析。

从图中可以看出,calculate和output的复杂度很高。因为calculate和output中都使用了循环语句并且使用了很多if…else结构进行判断,并且calculate中同时承担了合并同类项和求导两个任务,导致方法过于臃肿了。

类图分析

MainClass类:负责读入字符串。

Handle类:对字符串进行简单处理,如删除空白项,合并多个正负号等。将表达式分割为多个因子。

Item类:存储因子中包含的常数项和幂函数系数。

Calculate类:对因子中的同类项进行合并。对合并完后的项求导。

Output类:负责输出结果。

优缺点分析

优点:

结构简单,逻辑清晰,便于理解。

缺点:

仅仅考虑了第一次作业的情况,缺乏可扩展性,不利于迭代。

BUG分析

第一次难度不高,所以没有出现强测bug和被hack的bug。

HACK策略

这次作业没有hack到任何人,准确的说来整个屋子就没有人被hack。主要测了测较大的数据,-x**1之类的比较特殊的数据,当然什么也没有发生。

第二次作业

总体架构

MainClass类负责读入和输出字符串。Handle类负责简单处理字符串。Plus类负责将表达式中的项分离出来,如果带括号就去掉括号再次用Plus类处理,否则传递给Multiply类。Multiply类负责将项中的因子分离出来,如果是表达式因子就去掉括号再次用Plus类处理,否则传递给Derivative类,Derivative类负责对表达式求导。

和第一次作业的区别在于第二次作业中出现了三角函数sin(x)和cos(x),并且可以出现表达式因子,也就是说会出现括号一层层嵌套的问题。在这里我的处理方法是根据递归的思想,如果处理因子时遇到表达式因子,就将括号内的表达式传到Plus类里,得到表达式因子的导数。其中要注意的是分离项时注意判断该项是否是表达式因子的一部分。判断表达式因子时要注意括号是否是三角函数的一部分。

类的分析

度量分析

下表是每一个方法对应的度量分析。

下表是对每一个类的度量分析。

从图中可以看出,除了MainClass类以外其他类的复杂度都很高。Multiply类,Plus类,Derivative类中包含的功能太多,耦合度太高。Plus类和Multiply类中循环结构太多。Derivative类中if…else结构太多。

类图分析

MainClass类:负责字符串的读入和输出。

HandleS类:负责对字符串进行简单的处理,并删除输出的字符串中多余的括号。

Plus类:负责提取出字符串中的因子。

Multiply类:负责提取出因子中的项。

Derivative类:负责对表达式进行求导。

优缺点分析

优点:

思路清晰,便于理解。

缺点:

1、该方法在遇到表达式因子嵌套层数太多的情况时运行时间很长。

2、程序复杂度太高。

3、基本没有进行输出优化。

BUG分析

中测过了但是强测有十多个点没过。绝大部分都是由一个bug引起的。这个bug明明很严重却避开了所有中测点。这个bug是我在对因子的求导时,当所有的情况都不满足时返回的应该是“”而不是“null”。当时因为想着应该不会有这种情况就没有太在意。但是可能是因为我的实现方法是通过spilt切割出一个个因子,导致有可能出现切割出了一个项是“”的情况。

这个bug原本我是修改过的,但是修改后我没有进行git push进行保存。后来我想要进行优化但反而改的更差了,我就版本回溯到了没有修bug之前的那个版本。结果我没有发现这个版本的bug是没有修的,就直接交了。希望大家能引以为戒,修完bug一定要记得保存。

HACK策略

中测过了没进互测惨惨惨……只好说说我在找自己的bug时的方法。因为不会写自动评测机,只好自己乱试。主要尝试了+(表达式),(表达式)*(表达式),(((((表达式)))))之类的情况吧。

第三次作业

总体架构

MainClass类负责读入字符串,判断输入是否合法,并输出。Handle类负责简单处理字符串。Plus类负责将表达式中的项分离出来,如果带括号就去掉括号再次用Plus类处理,否则传递给Multiply类。Multiply类负责将项中的因子分离出来,如果是表达式因子就去掉括号再次用Plus类处理,否则传递给Derivative类,Derivative类负责对表达式求导。

和第二次作业的区别在于这次作业需要判断输入是否合法,并且新增了三角函数中可以嵌套因子的规则。所以我在第二次作业的基础上,在Mainclass类里增加了判断是否合法的方法。在Derivative类里增加了新的求导规则。

度量分析

下表是每一个方法对应的度量分析。

下表是对每一个类的度量分析。

从图中可以看出,所有类的复杂度都很高。Multiply类,Plus类,Derivative类中包含的功能太多,耦合度太高。Plus类和Multiply类中循环结构太多。Derivative类中if…else结构太多。MainClass类中为了判断是否输入合法用了很多if…else结构和循环进行判断。

类图分析

MainClass类:负责字符串的读入,判断输入是否合法并输出。

HandleS类:负责对字符串进行简单的处理,并删除输出的字符串中多余的括号。

Plus类:负责提取出字符串中的因子。

Multiply类:负责提取出因子中的项。

Derivative类:负责对表达式进行求导。

优缺点分析

优点:

思路清晰,便于理解。

缺点:

1、该方法在遇到表达式因子嵌套层数太多的情况时运行时间很长。

2、程序复杂度太高。

3、判断表达式是否合法时只能通过反复用if…else判断是否满足非法条件,很容易出现有某种情况没有排除的现象。

4、基本没有进行输出优化。

BUG分析

这次的成绩也依然很惨淡。中测的data3找了两天都没有找到到底是哪里出了问题。最后强测结果出来只有第一个点没过。这个点是三角函数的括号中是带符号整数,并且符号和数字间出现空格时我的程序没有判断出非法。我在判断是否非法时是通过将所有可能非法的情况列举出来进行判断的,所以非常容易漏掉一些我没有注意到的点。

我认为我中测data3可能是求导后的输出格式有问题,但是至今未发现到底是什么问题,应该是因为我用的方法才可能出现的问题,但我找不出来……

HACK策略

中测没过惨惨惨……依然是我找自己bug时的方法。类似sin((-x)*(-x)),(+-(-+(表达式)))之类的比较奇怪的情况,都比较容易出错。

重构经历

第一次作业到第二次作业

因为第一次作业时完全不知道后面的作业会在这次作业的基础上改动,所以我写代码时完全没有留出修改的空间。完全是根据第一次作业的需求写的,没有什么扩展的余地。导致我第二次作业的时候虽然思路没有什么大的变化,但是还是基本相当于重写了一次。

第二次作业到第三次作业

第二次作业有了上次的经历,所以写代码时有注意保证可扩展性。所以关于三角函数中包含因子的情况只稍微修改了一下对因子求导的方法,让它可以将因子返回到Plus类进行求导。除此之外主要的修改在于判断是否非法。这是我的程序完全没有的,所以相当于新添加了一个模块。

心得体会

第一次作业到第二次作业的难度跨度很大。第二次作业时我又没能迅速掌握递归下降法到底是个什么东西。最后我还是用自己第一次作业时的思路磕磕绊绊的写完了。这几次作业下来让我对于如何安排整个程序的架构有了一丝丝感觉(虽然我现在的代码结构还是很臃肿)。这次第二次作业和第三次作业基本等同于放弃了优化,希望以后的作业中能够在完成的基础上实现一定的优化吧。

 

posted @ 2021-03-29 11:16  anglerfish00  阅读(45)  评论(0)    收藏  举报