oo第一单元作业总结

 

OO第一单元作业总结

一、程序结构分析//我的IDEA过期了暂时使用不了画不了图请见谅

虽说后一次作业是对前一次作业的扩充,然而由于我不太熟悉面对对象编程的思想,程序的可扩充性极差,致使三次作业三种架构,异常愚蠢。

第一次作业

· 设计思路

受上机实验代码启发,用两个数——系数和指数来表示一项,用项组成的表来表示项之间的加法关系。通过对表达式符号的简化,得到了更符合一般形式的输入,但背离了题目中的构造思路,为第三次作业WF判断的崩溃埋下伏笔。

主类包管一切,从输入的处理到表达式的构造到求导一条龙大包干。表达式构造的逻辑是搜索下一个因子→因子系数相乘指数相加→检索到项之间的正负号时将总系数和指数构造成一项,并入表达式表。求导的逻辑是直接映射,对每一项系数乘指数,指数减一。输出的逻辑是每一项输出本身的字符串,表达式将项字符串之间用符号连接,再归总输出。

 

第二次作业

· 设计思路

新增了三角函数因子和表达式因子。受前一次作业影响,本次作业的完成思路可谓奇葩。数据结构上为了将第一次作业中的仅由两个数组成的一个幂函数项扩充为包括系数、sin、cos、幂函数的项,我大脑短路,居然把原先的项整成链表,再加上标识位来区分每一项是什么类型的。(事实上在原有基础上增添两个变量储存sin和cos的系数就够了, 而且标识位事实上没有起到任何作用,因为构造项的时候四种因子间有明确的顺序关系)。这样做加大了合并同类项的难度,还莫名其妙多出了许多容易出bug的点。这样清奇的数据架构使我现在回想起来仍感到无比愚蠢,不仅没有应用到面向对象编程的思想,甚至连基础的数据结构都一塌糊涂,代码上为了构造出一项,甚至要重复写四遍类似的代码。

为了处理表达式因子的输入,我把原先堆积在主类的输入处理逻辑独立出来成了一个ExpressionSearcher类,使得遇到表达式因子时可以简单递归处理。但此类仍然留下了第一次作业粗糙的设计,使得难以独立出具体的寻找因子方法,为WF崩溃埋下伏笔。由于数据结构没有留下表达式因子的位置,我采用多项式乘法把表达式因子和其它因子的乘积计算出来成为新的表达式,再简单把新表达式和原表达式合并。(且由于前文伏笔,我没有写合并同类项的方法)

由于表达式全被化为了简单的C*x**e1*sinx**e2*cos**e3形式,我采用类似第一次作业的简单的映射来完成求导(这估计也是我的架构下唯一的优点了,然而又导致了第三次作业的噩梦),一项求导得三项,再合并这三项入求导结果表达式(由于数据结构问题,这里写了大量重复的代码)。

第三次作业

· 设计思路

新增了三角函数括号内嵌套因子和格式检查。

在这一次作业我大改特改,总算让成品有了面对对象编程的感觉了。针对常数因子、sincos因子、幂函数因子、表达式因子我分别建立了类,并且为其设立了可导接口。其中三角函数嵌套因子我的实现方法比较别扭。由于没有独立出单纯的getFactor方法,我的操作是把括号内因子当作一个表达式,再把表达式括起来成为表达式因子。我为因子设立了下一因子指针,以模拟乘法的链。求导方法是链式求导,对一项求导的结果是该项的第一个因子的导因子乘以这一项的下一因子加上第一个因子乘以下一因子的导因子。求导过程中会有多项式出现,我直接把多项式括起来成为表达式因子。固然从逻辑上比较清楚,但性能上不忍直视。结果往往带有巨量的括号和大量无意义的项和因子。

格式检查上,由于前面作业打下的“基础”,我无力再重构,只好加入各种各样的判断语句来实现。具体上就是对输入预处理时我处理了连续的正负号和所有的空格符,所以我在格式处理前针对这两点写了判断;在表达式的解析时,我通过匹配的字符数是否等于输入的长度来判断是否每一个字符都是有意义的;在三角函数内的因子里,由于我异想天开的处理,致使我还要专门判断这个因子是否是合法因子。

这次作业让我体会到了面向对象编程的感觉,遗憾的是由于时间紧张,我没能在时限前完成提交,错失了一次机会。

复杂度分析

事实上第2、3次作业的复杂度都是随项内的因子数量指数型上升的。事实上理论复杂度也是指数型的,但我对于结果缺乏基本的优化,致使一些时候产生了天量的输出长度。

二、bug分析及找bug策略

第一次作业强测及互测均没有测出bug;第二次作业由于设计的失败,导致产生了难以发觉的符号错误问题,使得我强测几乎全过却在互测中被整得很惨。
根本找不到别人的bug,组除我佬。

三、经历总结及心得体会

前面的代码写得很屎,导致后面的代码堆在屎山上。在时间紧张的条件下,我没有余力完成进一步的优化,使后面两次作业积重难返。面对对象编程的思想非常有趣且必要,可惜前面两次的作业完全是缝合怪,“四不像”。良好的架构是一个发展的项目的必要条件,否则后面随时会崩溃。代码没能做到“高内聚低耦合”,(主要是在表达式分析部分);一个方法写上百行却没有拆分成功能更加明晰的小组件,使得有新的需求时又要造重复的轮子,可读性也大大降低。oo这门课我还得多学。

posted @ 2021-03-30 23:34  xxqwbjfy  阅读(45)  评论(0编辑  收藏  举报