OO第一阶段总结
面向对象程序第一阶段总结
第一阶段的面向对象设计与构造的练习现在告一段落,这段时间三次编程作业给了我不小的压力,而我也逐步地从一开始的对面向对象、java语言一无所知的状况走到了如今,掌握了一定的面向对象编程技巧。尽管如此,我仍然认为自己对面向对象的思维没有完全理解到位,导致程序的设计在一些点上还是明显的生涩,希望自己通过不断的总结和接下来的练习能有所进步。
第一次作业
本次作业中,由于是第一次接触面向对象编程,程序还是体现了浓重的面向过程风格,整个程序只设置了主类和Poly多项式类,Poly类中定义了单个多项式的初始化、检查、多项式的加减方法,而主要的运转过程都被放在了main方法中,程序显得略为臃肿,可读性较差。在学习正则表达式以及相关方法之后我解决了输入检查这一比较棘手的问题。
这次作业体现出的核心问题就是初次面对鲁棒性检测时自身的不适应。在之前的编程学习中我习惯了程序接受标准输入完成运算以及输出这一友好的过程,而这次编程中我们要面对的是各种各样的非法输入、边界输入,这对程序的设计有了更进一步的要求。正则表达式替我将一大部分非法输入挡在了门外,但还有很多常识上的、现实考虑的错误需要我去顾及。在公测中我有一个测试点出现了错误,在运算结果中的系数出现了0。回顾之后发现我的程序对单个多项式中的0系数进行了检查、加减运算结果中的0系数进行了检查,但在输出阶段还是将从别处产生的系数为0的项进行了输出,这说明我的层层检查中仍然存在严重的漏洞。这一错误提醒我之后对结果的检查一定要全面考虑不漏过每一个可能出现的问题。
第二次作业
本次作业与第一次相比有了现实的形象的情景,因此各个类有了相对明确的现实意义,在设计方面比较直接。设计方面我出现的问题就是对调度器这一类拥有的属性和应该实现的功能没有一个准确的把握,最终在完成其他类的设计之后我只能把各个类实例化在主类之中然后一同接受整体的调度,其实主函数中还是或多或少有面向过程的味道。
请求队列类、请求类、电梯轿厢类的设计都相对顺利成章,而楼层类由于判断同质请求的要求设计过程比较曲折。最终为了适应电梯运行时间与规划时间不同步,相互跟进这一设计思想,楼层类中每一层楼的按键的设计脱离了现实,变成了存储这一按键点亮持续到的时间点。这一设计让程序中同质请求的判断变得简便。此次作业中我的公测和互测过程都未被报告bug。
第三次作业
此次作业是第二次作业的延伸,在设计结构上要求了接口的实现和实例化子类并重载父类方法等。我面临的困难主要出现在处理捎带要求上。
首先我改进了第二次作业的代码,将上次作业中遗留的调度器类不明确问题解决,独立出了调度器类,基本实现了各个类功能的分离,整个程序相对而言更加简明,为后续的子类 继承等设计奠定了基础。此时各个类已经相对平衡,没有再出现某个类过于臃肿或某个类过于简单这样的现象,接下来就考虑了捎带的问题。
对于捎带问题的处理我完全按照指导书上的主请求与可捎带请求这样的方式来完成,每次取主请求并扫描请求队列得到一个可捎带请求的集合。这里我要反思的一点就是本次作业由于助教解释过对public属性的要求放宽,我为了方便将请求队列中的请求设为了public方便取出和判断,在之后的设计中我还是要尽力避免这样的方式。
本次作业的公测全部通过,互测阶段出现了3个bug。一是对题目要求没有明确,输出的INVALID内容没有将括号去掉,需求没有实现完整是绝对不应该出现的错误;二是没有用try catch语句处理可能出现的异常;三是设计的缺陷:得到主请求未判断这一请求是不是同质请求,导致最终有可能一个同质请求成为了主请求,虽然这一请求之后会被判同质请求并忽略掉,但整体请求的调度已经偏离预期。第三个错误相对隐蔽,这也暴露出了我个人测试存在的问题,没有实现对自己程序的全面测试。
找bug策略
我寻找bug没有什么特别的策略,只是顺着错误分支树构造样例对对方程序依次进行测试,以及阅读对方的代码寻找对方设计上偏离要求的地方,这几次练习中我找到对方的bug也很少,之后我还需要提高自己这方面的能力,找到自己的思路去构造比较***钻的样例。
总结
总览这三次作业可以看作是三个台阶,每周我们都跨上了一个新的高度,这过程中的确我感到比较吃力,而且中间还有一些知识的真空。完成作业并不代表我已经掌握了这些知识和技能,之后的学习过程中我还需要继续实践,继续感悟面向对象的思想。