前言
面向对象第一单元作业,主要内容是表达式求导。主要考察程序的鲁棒性和面向对象的继承和接口的使用方法,随着作业难度逐渐增加,程序的编写逐渐变成一个难题。下面会从各次作业的度量、公测和互测bug、测试策略和其他知识进行总结。
第一次作业
类图
结构分析:
第一次作业由于只有一个exp类,导致多项式的识别和求导等操作没有分离。可以看出部分程序的耦合程度高,函数还比较复杂。
互测
在互测中我被发现了两个bug,一个是负的指数会产生0项,另一个是格式判断时忽略了形如x x这样的Wrong Formal,导致扣分。第一个原因是在处理多项式时,第二个bug是正则表达式有问题(大正则真的容易出bug)。
第二次作业
类图
结构分析:
互测
这次互测我被发现了一个bug,是在连乘项中存在负整数时会忽略符号,这是在表达式分析时进行了一些改动,而提取因子时忘记修改回来导致的。个人感觉在写代码的时候思路不清晰,才会导致这样的bug。
第三次作业
因为第三次作业存在bug,还没有通过测试,这里就不放类图和代码分析了。
总体上第三次作业需要在第二次作业的基础上进行大范围的重构,以实现对嵌套项的递归求导,这也是我没有想到一个比较好的解决方法的地方。作业的另一个难点是表达式正确性的判断,需要使用递归下降分析,逐步分析各个因子的正确性。
测试策略
我的测试策略主要是先阅读代码,再构造各种具有特点的数据进行测试,同时将可能出bug的数据点加入数据集中,测试其他人的程序。在测试中感觉到这种测试策略比较笨重,也在研讨课上学习了对拍器的写法,希望以后能改进测试策略。
Applying Creational Pattern
面向对象中有很多设计模式,在后面的课程中会发挥极大的作用。
比如工厂模式(Factory Pattern),是常用的实例化对象模式,用工厂方法代替new操作。因为工厂模式就相当于创建实例对象的new,我们经常要根据类生成实例对象。这样做可能多一些工作,但会给整个系统带来更大的可扩展性和尽量少的修改量。本次作业我们只需定义一个创建对象的接口,然后可以使用工厂模式来创建表达式、项、因子,再进一步实现求导的功能。
因为前两次作业没有建立特别好的继承和接口关系,首先应该实现一个inputhandle类,独立解决输入问题,还有各种因子应该继承自同一个抽象类,并实现一个求导的接口。这也让我明白设计模式的重要性,在开始编写程序之前应该仔细思考。同时第二单元也开始学习设计模式的内容,希望能通过以后的学习了解更多的编程方法,完成接下来的任务。