BUAA_OO_第一次作业总结

一、程序结构分析

1.1 类图

第一次作业

第二次作业

第三次作业

从三次作业的类图演变可以看出,这三次作业中,我的类设计逐渐变得像样了。从第一次作业面向过程的一个主类到底,到第二次作业将各类因子和输入划分成类,再到第三次作业在老师及上课ppt的提醒下,构建出了树型的类结构,这一演变让我感受到了设计的重要性。略有遗憾的是,三次作业中未用到任何设计模式,在以后的学习里,应尽可能学习这一方面的知识。

1.2 复杂度分析

第二次作业

第三次作业

可以看到,第三次作业的平均复杂度下降了不少。这还是因为第三次作业采用了层次化设计,构建出了比较好的结构,才将复杂度降低了。由此看来,思考出一个比较好的代码组织结构,可以让任务更有效率的完成。

二、个人BUG分析

由于个人实力不够,写代码时总是考虑不全总体的情况(一个字:菜),三次作业都掉到了C组。在此列举一下每次作业出现强测互测和个人先行测出的BUG。

第一次作业

第一次作业比较简单,出现的BUG也大部分是格式错误。例如\f算作非法空白字符要输出WF之类。个人的BUG也出现在\f和忘记判断表达式后空格合法两方面。

第二次作业

第二次作业里,我的问题出在了输入预处理上。我的做法是将每项切割,保证每一项前只有一个符号。这就需要“++”替换成“+”,"+-"替换成“-”等操作。然而我的考虑不够周全,替换的顺序不正确,导致替换之后还是有多余的符号,使得切割出现异常。这启示我完成某项功能以后一定要先行测试。倘如当时将替换符号功能测试完备,后面就不会出错。

第三次作业

第三次作业算是很有挑战的一次作业,然而个人的BUG还是出现在比较低级的地方。强测挂掉的点都是因为一个判断的flag没有在判断后置0,导致输出错误。另外一个BUG出现在判断指数小于10000的地方。此处bug我在本地已经测试出并修改好了,然而提交时由于修改的一版增添了失败的优化导致未过中测,自己就忘记了在之前的一版里修改这个BUG。因此,每次的commit注释一定要写上修改的BUG,以防自己忘记。

三、互测策略

在互测里,个人由于上述的BUG,几乎每次都成为了大礼包,被人疯狂hack六七次,虽然一次合并修复就可以解决,但是看着数字不断上涨还是心惊肉跳。在hack别人时,这三次我都采用了个人自造数据盲狙加仔细分析一人代码定点爆破的办法。

在第一次作业里,我提交的数据大部分都是格式问题,例如空串、/f等问题,大部分同屋人均中招了。我大致看了每个人的代码架构,选中了一个一main到底的同学。发现了他代码里出现了输出缺失问题,hack成功。第二次作业里,我采用了同样的策略,然而由于此次作业若不优化,几乎不会出现问题,我的个人测试用例没有抓出一个BUG,看的同学也没有发现有什么问题。查看结果的时候才发现只有我和另一个同学被hack。第三次作业里,由于取消了WF数据,我的重点放在了一些边界测试上,例如十层括号嵌套,二十个单项相加相乘等等,成效显著。然而之后再随机组合数据时反倒测不出bug来,还是说明自己对作业理解不够深入。

在整个单元的测试里,由于时间和能力不足,我没能写出一个能用的对拍器来,导致无法自动测试每个人的数据,随意性很大。在研讨课上,同学也介绍了对拍器的写法,希望在下个单元的测试里,我能写出一版成功的对拍器,完成自动化测试。

四、设计思路及反思

三次作业里,我的设计思路完成了很大的转变。第一次作业里,我的思路还是面向过程的,例如一个主类到底,输入字符串,进行切割提取项,都在一个类里完成。

第二次作业里,由于考虑到代码的可扩展性,我将三种基本因子提取出来单独成类,也将输入单独作为一个类,让整个结构清晰了一点。然而,这次作业里没有用到继承和多态等等特性,有种为了构建对象而构建的感觉。

做第三次作业时,我开始时并不清楚如何安排层层嵌套的因子、项、表达式,仅思考就用了一天的时间,之后在老师的提醒下,重新看了ppt上的提示,将上次作业的基本因子保留到了这次,新增了三种组合规则,并将求导作为接口,在所有因子和组合规则里实现。由此就构建出了完整的树形结构,真正动手写也不过一天时间就完成了。然而此次设计也存在缺陷,我的加法和乘法规则均设计成了两项组合,这在加法时影响不大,然而在乘法时却导致了求导时原来n^2的复杂度变成了2^n,使得运行速度极慢,且会增添许多不必要的括号。在之后的重构里,我均设计成了多项组合,保证了运行速度。

五、心得与体会

在这一单元的学习里,我初步了解了面向对象的基本知识。领略了多态这个特性的神奇,初步利用了继承、多态。我也体会到了这门课程的挑战性,几乎每次作业,我都是从开始布置任务写到ddl的前几小时,而且讨论区的大佬提出的优化方案也是层出不穷,感觉永远有任务没有完成。另外。讨论区的同学提供了很多优秀的思路,例如第三次的递归下降分析,我就是从讨论区中一步步学习完成的。发放的优秀同学代码也很有效果,让人产生“原来代码还可以这样写”的感觉。希望在之后的学习里,我能学习并运用设计模式,在讨论区里吸收经验,完成更好的作业任务。

猜你喜欢

转载自www.cnblogs.com/codearning/p/10603523.html