BUAAOO-第一单元总结

BUAAOO第一单元总结

一.程序结构分析

1.第一次作业

  

  第一次作业是简单的对幂函数求导,由于这是第一次做作业,完全不知道什么是面向对象的思想,完全是以面向过程的方式来完成本次作业的,只有主类,表达式类和项类。

  上图是本次作业的复杂度和代码行数,可以看到主类不管是复杂度还是代码行数都是最多的,因为在这次作业中,我把所有对输入的处理全部放在了主类当中,表达式类和项类的主要方法只有求导和toString(),一开始去空格,消除多个加减号,还用了个大正则来拆出各个因子全部都在主类中,导致其复杂度过高。本次代码最大的缺点就是主类包含了太多的功能,应该将这些功能独立成一个或多个其他类来执行。

2.第二次作业

  

  第二次作业的难度和第一次作业完全不是一个级别的,第二次作业新增加了sin,cos两个三角函数因子,并且增加了表达式因子,虽然这次作业难度极大,但是却让我感觉自己有了一点点的面向对象的思想,对于每个因子,建立了对应的因子类,它们通过继承同一个Factor类来进行管理,这次作业我的类层次分明,一个表达式类,以一个容器包含了多个项类,每个项类又用容器包含多个因子类,如果因子为表达式因子则重复上述结构,但是这次作业我没有建立常数类,我将常数类放在了项类中当作系数,这让我的程序多了一些对于不含任何因子的项的特判。

 

  这一次我将第一次作业中主类的拆解表达式部分独立出来,形成了Parsestr类,在这个类中完成了对表达式的拆解,由于这次不只是幂函数,我无法通过正则表达式直接提取出各个因子,又由于表达式因子的出现,不能像第一次作业一样直接分割+-号来得到各个项,我采用了两个指针扫描表达式的方法来分解项和表达式,但是这就在for循环中使用多个if语句,导致了分解项和表达式的复杂度较高,这个类中creatFactor方法由于要判断是哪种因子,并且由于这次没有合法性检测,我直接将表达式因子放在了if语句中的else语句块中,并对表达式因子进行部分优化,导致它判断循环多重嵌套。而在项类中,由于我做了部分项的优化,在equal函数中用了多个循环和判断,让它的复杂度暴涨。

3.第三次作业

(类继承图)

(类制造图)

  第三次作业我的结构和第二次作业几乎没有任何区别,唯一的区别是我加入了常数类,并且在三角函数因子中增加了一个因子类的属性,作为它括号内的因子,三角函数中可以放入因子,不再只能是x,由于我第二次作业对三角函数因子求导有很大的瑕疵,导致需要重写各个类的求导函数,虽然麻烦但是是很简单的修改,在前两次作业中,我都直接去空格消除多余+-号,所以合法性判断是这次作业我最大的难点。

  第三次作业我基本上放弃了优化,所以在第二次作业中那几个复杂度超高的方法都消失了,但是这次作业的合法性判断我是通过很多个特判来做到的,我直接在主类中特判了不能出现空格的地方和+-号的合法性,在无数个特判后终于做到像前两次作业中一样,直接消去空格和多余+-号,这些特判也让主类复杂度极高,而在分解表达式的类中,我也用各个因子的特判来验证合法性,所以这次代码复杂度都在合法性验证的特判上了。

二.BUG分析

1.第一次作业

  第一次作业由于较为简单,所以我通过了所有的强测数据并且没有被别人hack到。

  在hack别人的时候,我尝试使用了最简单的数据如-0,x**2、重复多次的数据如x+x+...+x+x,和指数较大的数据如x**999999999999999。

2.第二次作业

  第二次作业难度相比于第一次作业确实有了一个质的提升,但是我没有做过多的优化,所以最后也是顺利过了强测。

  这次多了表达式因子,我认为这是难点所在,所以测试时大都围绕着表达式因子,我尝试用多个括号嵌套的表达式因子来尝试他人的程序,因为我自己对表达式因子进行了简单的优化,例如((((x))))我会消去外层的多个括号,一开始我是直接判断首位和末位是不是(),在中测的时候,这样的优化是可以通过的,但是后来我发现((x)*(x))这样的表达式满足了左右都是括号,但是只可以消去最外层的括号,修改这个bug我多加了个特判,这也是我第二次作业中制造因子函数的复杂度所在,因为自己犯了这个错,所以我在测试别人时都尝试过类似数据,不过好像没人和我犯同样的错误。

  除了表达式因子,这次作业可以有不同因子之间的乘法运算,我自己一开始忘记了乘法求导公式,写了一堆奇怪的代码,后来突然醒悟才改过来,不然错的不知道为啥错。测试时用x**2*sin(x)**3*cos(x)**4这样的项相加减的表达式去检测bug。

3.第三次作业

  第三次作业在我的一堆特判下也是顺利通过全部测试。

  这次在验证自己bug时,我着重验证自己的合法性判断,通过构造各个情况下常数因子符号和数字分离的样例来验证自己的合法性特判,如 + +-  0,x **  +  3等数据,这次在找到自己的bug是一个简单的特判,三角函数中,sin关键字中不能含空格,我通过正则表达式来匹配是否出现这种情况,我用 s\\s+in 和 si\\s+n 来判断是否出现这种不合法情况,但是忘记了还可能是 s   i   n 这种情况出现,产生了bug,但是这bug改起来倒是很轻松,正则表达式中多一种情况就改了过来。

  在hack别人时,因为不能输入不合法数据,所以我构造含多个空格,括号,+-号的合法数据,尝试别人的合法性判断是否正确。

三.找BUG策略

  我找别人出现的bug基本上是按照自己编写代码时犯的错来构造测试数据的,不会去阅读别人代码去针对性hack,我觉得要看懂别人的代码结构实在是太难了,所以每次都只会hack别人1到2次。

四.重构经历总结

  这三次作业,我在第二次作业时重构了代码,由于第一次作业难度较低,用大正则表达式等方法轻易可以解决,我的代码的可拓展性极差,第二次作业题目公布后我就知道自己一定要重构了,对比两次作业的类图就会发现,第一次作业只有寥寥3个类,类之间的关系也并不清晰,而第二次作业层次功能都很分明,主类作为入口,只进行去空格等简单优化,将字符串传入Parsestr类中分解表达式,一个表达式包含多个项,一个项中包含多个因子,各个因子共同继承一个Factor父类方便管理,各个类之间分工明确。

五.心得体会

  面向对象课程使用的是Java语言,我之前没有学习过这门语言,寒假时布置了pre作业,我才开始学习这门语言,这一单元的作用难度是递增的,其实就算是最简单的第一次作业,我一开始也完全不会做,怎么用正则表达式把表达式的各个因子提取出来,我是在不断查资料,不断思考中最后才勉强写出了那个正则表达式,而第二次作业,我本以为只会增加三角函数,但是除了三角函数外还增加了表达式因子,我对于表达式因子真是毫无办法,只能看往年博客,问同学,得到了递归下降的解法,但我其实根本不知道什么是递归下降,最后在我不断查询资料下终于写完了这次作业,这第二次作业,我感觉自己层次结构很清晰,虽然后来看别人的代码,发现大都有符号类,我觉得那应该才是真正面向对象的思想打出来的程序吧,但就算是这样,我也觉得自己这次作业有了面向对象的思想,觉得自己有了收获。然后第三次作业来了,合法性判断让我的程序毫无办法,就算重构我也毫无思路,最后我只能用一堆特判去堆出一个程序,虽然我可以通过第三次作业,但我知道自己的代码可拓展性有多差,如果还有第四次作业,我应该完全做不出来吧,本来第二次作业给我带来的一点点信心,在合法性判断面前直接消失,我的架构应该没有自己想象中的那么好,我估计也没有明白到底什么是面向对象的思想,这三次作业做完感觉自己好像前进后又退了回去,又好像一直是原地踏步,乐观的想,没准我变强了只是自己没感觉。

  上面是我对面向对象思想的体会,这三次作业在其他方面倒是给我带来不少东西,首先加强了我的抗压能力,每周一次代码作业,还要和别人互相hack,确实让人压力巨大,其次这单元下来,我打代码的能力得到了提升,递归构造表达式因子,我以前估计完全不行,所以本单元对我还是大有帮助的,对于面向对象思想只能之后再好好努力了。

posted @ 2021-03-28 15:37  zty1469  阅读(64)  评论(1)    收藏  举报