面向对象第一单元总结
程序结构分析
第一次作业
要求
- 简单多项式导函数的求解。
- 本次作业不需要进行输入合法性的检验。
思路
- 预处理:将输入中的空白字符删去。
- 数据的存储:
Term
类,有两个BigInteger
类型的属性coef
和index
,分别表示指数和系数。 - 采用正则多项式捕获组的方式来处理数据。
类图
复杂度分析
第二次作业
要求
- 包含简单幂函数和简单正余弦函数的导函数的求解。
- 本次作业需进行除空白字符外的输入合法性检验。
思路
- 预处理:检测是否为空串,检测字符串中是否含有字符
^
,将空白字符删去。由于之后的判断中*
跟**
不易区分,故将**
替换为^
。 - 数据的存储:
Expression
类:存储表达式,有一个Term
类的数组terms
.Term
类:存储项,有一个Factor
类的数组factors
。Factor
类:抽象类,存储因子,被Const
类,PowFunc
类,SinsFunc
类,CosFunc
类继承。
- 数据处理:采用了递归下降的方式。
类图
复杂度分析
第三次作业
要求
- 包含简单幂函数和简单正余弦函数的导函数及其组合的求解。
- 需进行所有的输入合法性的检验。
思路
- 预处理:将
**
改为^
。 - 数据的存储:在第二次作业的基础上添加了
ExprFactor
类,继承于Factor
类,有一个Expression
类的属性。 - 数据处理:才用了递归下降的方式。
类图
复杂度分析
bug分析
自己程序的bug
第一次和第二次作业在强测和互测中未检测出bug。
第三次作业在强测中检测出4个bug,在互测中被hack成功5次。出现的bug包括以下几种:
- 在新添加的输入合法性检测中
WRONG FORMAT!
写成了WRONG FORMAT
。 - 表达式因子类嵌套过多导致爆栈。
- 三角函数内为常数因子处理错误。
分析bug策略
主要是使用了自己测试时使用的测试用例进行测试,有效性较低。并未结合被测代码的结构来设计测试用例。
总结与体会
本单元的三次作业为多项式求导,着重于正则表达式的分析和培养我们面向对象的思想。在本单元的三次作业中,我感觉最难和花费时间最长的部分为第二次作业递归下降的设计与构造,由于这一部分的逻辑较为复杂而且需要重构的代码也比较多,因此花费了很多的时间。但是设计成功之后的可扩展性比较好,因此第三次作业的设计难度就大大降低了。总体来说,经过这一单元的学习和实践,我培养了基本的面向对象的思维方式,并且了解了正则表达式、工厂模式、类的继承与多态等基础的知识,并且掌握了一些常用工具的使用,也为之后的学习打下了良好的基础。