OO第一单元总结

作业分析

第一次作业

第一次功能要求比较简单,输入的模式也比较好分析,因此一开始我直接针对整个表达式写了一个正则表达式,企图一次性判断出输入的格式正确性。

可之后意识到了这么做的局限性:由于正则表达式默认 贪婪+回溯 的特性,一个上百字符的正则表达式在处理较长的输入时很容易出现爆栈的情况。

因此我将表达式分成了项,针对项构造表达式。完成了对输入的判断后,剩下的处理便显而易见了,我写的是时候按照的是C语言的结构体思路,不是那么 OO,略有不足。需要注意的是如何

减少输出长度,这次我少考虑了系数为-1省略系数这种情况, 导致没拿满分。

第二次作业

第二次作业仅仅是增加了两种三角函数。

求导并不困难,我采用的是三元组的形式,建立一个项的类,包括系数、幂函数的幂、正弦函数的幂,以及余弦函数的幂。

这样做虽然直观易于实现,但导致可扩展性不强,直接造成第三次作业很大一部分要重新开始。

第二次作业的优化我做的并不好,写的时候出现了写出函数忘记调用这种低级错误,丢了挺多分。我求得的导数最后是存放在 ArrayList 中而不是 HashMap 中,也是这次作业需要改进的

一个方面。

 

第三次作业

在这次作业的过程中我遇到了许多麻烦。

首先是对递归的理解不够清晰,在判断括号层数的时候出了问题,导致对 WRONG FORMAT 的判断不够全面;其次是没有仔细做设计,虽然最后也实现了继承和接口,但是并不完善,而且错

误颇多,编码时间更是直线上升。

经过这次血的教训,也清楚地认识到了设计的重要性,没有好的、清晰的设计,再多的编码时间也都是效率奇低。

这次作业,我首先针对因子建立类,即幂函数,正弦函数,余弦函数,其均继承求导接口,均实现了基础函数的求导方法;再是针对表达式、项以及因子建立类,继承求导规则接口,表达式

的求导是对每一项的导函数相加;项的求导,是对每一个因子求导,并将其导数与项中其他因子相乘,将每次得到的结果相加;而因子的求导涉及到了链式求导,需要先判断括号层数,再递

归一层层求导,最后相乘。

这次作业我的设计只是做到了最基本,还有很多可以优化的地方没有时间完成,对接口的使用也是浅尝辄止,接下来还需要通过更多的实践体会抽象类与接口的特性。

Bug分析

第一次作业

有1个Bug,是因为考虑问题不全面,在处理输入的时候,有特殊字符没有考虑到,导致没有能判断出错误输出。这个Bug跟我采用的方法不够完善和考虑欠妥有关,若是可以采用更好的方法

则会避免这种情况的再次出现。

第二次作业

优化过程中出现了1个Bug,在明明写好了类方法的情况下忘记调用,导致程序前后不一致。由于通过了中测加上自己的懒惰,没有构造更多的输入来判断优化的正确性,实属罪有应得。

第三次作业

强测的过程中出现了Bug,出错在对嵌套因子的求导,对括号的处理出了问题。少数几层括号还应付得过来,括号层数继续增多就会出现错误。这个Bug的出现一方面是由于我对递归的理解还

不够到位,也有一方面也是因为前期浪费了太多时间,导致最后时间紧迫,没能完全测试就进行提交。之后的设计要更加清晰完善,做好功能性覆盖测试,避免因为时间不够无法调适完全的

情况。

互测

针对互测,我采用的是手动构造数据的方法,因此找出的bug不算多。主要的思路还是针对指导书给出的各种特殊情况制作 WRONG FORMAT 的输入。但这种思路在第三次作业中被禁止,因此

转而进行多层表达式因子的嵌套的构造。此外,在前两次作业中,由于代码量还不算多, 仔细阅读了几位同学的代码,也找出了一些由于方法不当/不够仔细而出现的bug。在之后的互测中会

学习自动化构造测试数据,在互测中更高效。

收获与感想

这三次作业是一个难度逐渐上升的过程,前两次作业都能轻松完成的情况下,对第三次作业没有引起足够重视,导致差点出了差错,值得警醒。

收获最大的地方除了在自己设计、编写程序之外,在互测过程中阅读其他同学优秀的代码同样启发颇多,我认为这也是互测价值最大的地方。

这三次作业也是我对 JAVA 语言认识一步步加深的路程,从第一次作业熟悉构造器、类方法的使用,到第二次开始接触到抽象类,再到第三次(不完全)实现继承和接口,对 JAVA 进一步熟

悉的同时也开始慢慢摸清面向对象思想的方向。接下来的作业中还会继续用到多态,并且加入多线程等更复杂的因素,希望还能保持好心态,每一次作业认真设计,认真编码。

posted @ 2019-03-24 22:44  daytona  阅读(126)  评论(2编辑  收藏  举报