oo第一单元总结

第一次作业

(1)程序结构分析

类图:

复杂度分析:

设计思路:表达式输入后先用大正则进行格式判断,然后由Expression类的方法进行格式处理。处理后的字符串被送入Polynomial类,通过构造方法转化为一个element类的array list。每一个element对象有指数和系数两个属性。最后由Polynomial类的方法调用element的相关方法进行求导与合并运算。

结论:在第一次作业中,我尽可能的将功能通过方法实现,并把不同类型的方法分类,Expression只针对表达式进行处理(这个类的设计个人认为比较成功,它成功存活至第三次作业并持续散发光和热),Polynomial类存储了所以element对象,并拥有表达式级的运算操作,element类保存每个项的具体信息,并存放项级的运算操作。整体看来架构还算不错,复杂度也并不高。但很明显,Polynomial类和element类都只针对了简单情况,扩展性并不能得到保障。

(2)程序bug:

一、由500个+x引起的爆栈

​ 原因:大正则的回溯机制导致的爆栈。

​ 解决:重构输入格式检测机制,先寻找基础的空格错误,去空格后分段提取字符串,运用多个小正则实现。

二、形如x-x,当同类项合并后结果为0时出错

​ 原因:合并同类项的机制为若指数相同,将第二个项的系数加在第一个上,但输出时对于系数为0的情况判断不详细,导致输出格式错误。

​ 解决:考虑系数为0的情况。

(3)互测感悟

互测时我主要采取了读代码的方式,在其中一位同学的代码中发现他对系数的判断出现了纰漏,于是构造相关数据进行尝试。另一种方法为普遍性错误尝试,例如全空格作为输入时,有两位同学程序发生崩溃。

第二次作业

(1)程序结构分析

类图:

复杂度分析:

设计思路:表达式输入后先寻找空白符引起的格式错误,若没有则去掉空白符,随后寻找运算符导致的格式错误。随后对表达式进行预处理,将省略的+1全部还原。如+x变为+1*x^+1。在Polynomial类中通过小正则表达式提取每一项,并将其实例化为element对象。由于每一项都可化为
aXbsin(x)ccos(x)^d

的形式,所以每一个element类中有四个属性,通过这四个属性即可反应一个项的具体值。此外,每一个element类拥有一个array list属性,用于保存乘法关系在求导时产生的子项。最后在toString中将属性转化为字符串即可。

结论:第二次作业中调整了输入检测,并初步采用了预处理的思想,简化了表达式处理时的复杂度。而格式检查以及预处理函数置入Expression类中,并在作业一的基础上对element类重新编辑,实现了作业一思想及框架的继承,整体代码布局较为合理。但不足的地方在于,代码的扩展性至此已基本消失,只有Expression类可以继续使用,下一次作业面对更复杂的情况势必需要重构代码。

(2)程序bug:

一、由于空白符错误检测不完整导致的错误。如++ + x并未检测成功。

​ 原因:空白符检验并为穷举所有情况。

​ 解决:填补缺口即可。

二、具体数据为0* sin(x) 0,说实话,看到这组数据的第一眼笔者十分诧异,这样明显的错误怎么会没能检测成功呢,当debug时,笔者发现了原因,并真心佩服发现这个bug的同学。

​ 原因:按理想情况下,这个格式错误并不会在空格检测阶段被检测,而是会被去空格后作为不符合格式的项被检测,但是数据构造者利用了笔者的预处理机制,这个数据被预处理成0* sin(x) ^10,转换成为了一个合理的数据并参与运算。

​ 解决:在空格检测阶段将此类数据视为错误格式。

(3)互测感悟

很遗憾这次并没有成功发现他人的bug。

第三次作业

(1)程序结构分析

类图:

复杂度分析:

设计思路:表达式输入后先寻找空白符引起的格式错误,若没有则去掉空白符,随后寻找运算符导致的格式错误。本次同样采取预处理的思想,不过预处理操作较为简单,主要是调整运算符,便于后面的运算。表达式将作为一个大字符串被送入Polynomial类中的“分配方法”,该方法将检测字符串的顶层结构(线性,乘法项,嵌套项,简单项),并建立新的对象并return对应字符串。整体处理为一个字符串处理流程,在提取至简单项之前,表达式一直会被看作字符串。例如线性关系时,会生成一个linear对象,该对象将字符串以“+”分离,将分离出的所有字符串保存并重新送入Polynomial类的分配方法,实现递归处理的思想。

结论:本次作业基本属于重构代码,笔者此时对应继承和接口基本属于迷茫阶段,实在不敢托大,于是采用了较为稳妥但牺牲结构的方法。最终结构虽然清晰,但设计并不优秀,虽然实现了功能分类,但其实等同于C语言中的函数,各对象的属性设计不够完美。本次作业笔者重点投入在互测阶段阅读他人的设计,提升自己的面向对象思维能力。

(2)程序bug:

一、由于多层嵌套引起的CPU超时。

​ 原因:由于递归过多导致。

​ 解决:暂未想好。

二、表达式前跟“-”时会直接报错

​ 原因:属于设计疏忽。

​ 解决:检测负号即可。

(3)互测感悟

在意识到多层嵌套后使用多层嵌套成功hack,还有阅读代码得到的一个嵌套格式处理错误。

Applying Creational Pattern

在三次面向对象设计中,我每一次都在尽力合理规划类的属性构建,以及处理表达式的整体思路。经过三次训练,我认为面向对象构造最重要的是,每一个类的属性都应该清晰的反应他的所有特征,类之间的关系也应该有清晰的体现。例如第一次与第二次作业中将项作为一个类是很自然的思想,在第三次作业中将函数关系和基础项分别作为类也是比较合理的。

posted @ 2019-03-25 22:05  薛靖宣  阅读(158)  评论(0编辑  收藏  举报