结对成员:201521123063 林羽晴(右) 201521123065 洪亚文(左)
结对照片:
1.改进现有代码
- 分析网络14部分现有程序代码
- 原题目要求
- 重构
- clone项目,在开发环境中运行该应用程序,修改完毕最后上传至码云,并在博客中给出链接
https://gitee.com/jmulyq/CreateFormula.git - 检查大部分主要类之间的关系,画出类图
- 浏览所有代码考虑代码质量和测试覆盖率
-
代码质量:
1、代码错误:
代码中设计接收得数的类型为string,但是第二图却只是简单的将答案强制转换为int型进行比较,因此当输入的得数为小数时产生错误机制
代码中的num个数并没有更新
2、代码设计不合理
产生随机式子只限制于产生一个符号和两个数值,并且符号的两边要么全是int型(int_formulate),要么全是分数型(fra_formulate) -
测试覆盖率:
重构后的覆盖率
-
- 确定当前设计的一个弱点,通过重构,确保在这个地方已有测试覆盖并保证重构没有改变已有的功能
- 好的测试是重构的根本。检查已有代码的测试,看测试用例是否足够覆盖原代码,如果不足,请添加测试用例
对乘法进行测试用例的增加,当两边为分数和小数时。 - 降低代码重复量,找出代码逻辑泥球
这边的函数过于复杂,应该统一输出格式而不用考虑所有符号出现的情况进行输出,造成代码冗余繁杂 - 当前程序是否支持多个操作符运算,如果不支持,请在源代码基础上进行改进,算法参考:https://www.cnblogs.com/dragondove/p/6445850.html
- 好的测试是重构的根本。检查已有代码的测试,看测试用例是否足够覆盖原代码,如果不足,请添加测试用例
- 修改代码后,检查代码覆盖,看单元测试是否需要修改?测试用例是否需要增加?
- clone项目,在开发环境中运行该应用程序,修改完毕最后上传至码云,并在博客中给出链接
2.功能改进与扩展
增加一个运算符,程序应该有怎样的改变?不得不扔掉全部重写么,还是可以只改部分模块?基于模块化设计的思想,考虑在现有程序中做什么样的修改,才能让程序更好地实现新的需求
- 增加括号运算符
增加括号和方根运算符不需要全部重写,只需要在随机产生运算式(CreateFormula())和优先级比较(compare())还有计算功能(Calculate())上面进行修改即可
判断优先级函数中遇到左括号即判为最高优先级的,直接入栈,当前符号为右括号时,进行括号内的计算(calculate()),方根运算符仅次于括号,优于加减乘除 - 【附加题】增加方根运算符
- 回归测试
- 在开发新功能前
- 确认修改的功能正确之后。
由于增加新功能之后是在原来代码基础上新增模块并未对原来代码的正确率产生影响,只是增加新的比较类型 - 效能分析
关键模块消耗最大的函数,是否存在改进?
从关键模块来看,随机式子的产生并不会造成额外的消耗,我觉得内存上消耗最大的是对式子的提取,如图上所示提取中开辟了多个数组或栈,并且由于限制条件对栈进行了重定义,时间上消耗最大的是优先级的比较,是通过将所有的可能进行枚举异或比较,进行改进的话可以对符号进行等级的分类再进行比较。
- 在开发新功能前
小结感受
- 结对编程真的能带来1+1>2的效果,不管是从时间上还是质量上来看,两个人结对编程,需要两个人对整体项目的进行一个了解然后根据每个人擅长的地方进行分工合作,每个人的编程风格,不然很容易造成最后代码的衔接不齐。其实我感觉两个人结对编程比一个人要难得多,虽然可以分工合作,但是很多细节上的东西需要不断的磨合适应。