301
社区成员
发帖
与我相关
我的任务
分享
在我的最终作业中,我将整体表达式化简任务拆分为四个子任务,分别为:
a*x^k*exp(Expr) )| 类名 | 方法数 | 代码总行数 | OCavg | OCmax | WMC |
|---|---|---|---|---|---|
| Base | 8 | 83 | 2.5 | 11 | 20 |
| CF | 3 | 31 | 2 | 4 | 6 |
| CFfactory | 1 | 13 | 2 | 2 | 2 |
| CFtrue | 6 | 38 | 1.17 | 2 | 7 |
| Compute | 3 | 55 | 4 | 8 | 12 |
| Exp | 3 | 25 | 1 | 1 | 3 |
| Expr | 5 | 24 | 1 | 1 | 5 |
| Factor | 1 | 6 | 1.5 | 2 | 6 |
| Formula | 1 | 5 | 1 | 1 | 1 |
| Fx | 2 | 15 | 1 | 1 | 2 |
| Lexer | 4 | 32 | 2 | 4 | 8 |
| Main | 1 | 20 | 2 | 2 | 2 |
| Num | 3 | 18 | 1 | 1 | 3 |
| Operation | 8 | 176 | 5.43 | 13 | 38 |
| Output | 2 | 55 | 4.5 | 6 | 9 |
| Parser | 8 | 148 | 3.88 | 8 | 31 |
| Polynomial | 14 | 163 | 3.14 | 12 | 44 |
| Term | 3 | 13 | 1 | 1 | 3 |
| Variable | 2 | 15 | 1 | 1 | 2 |
在复杂度方面,大部分类的表现都能在良好的范围内,但承担了计算、分析等的主类的方法平均循环复杂度、类的总循环复杂度较高,如Operation、Output、Parser、Polynomial、Compute等。主要原因可能有以下几点:
在第一次作业中,我并没有仔细拆分任务,而是将向下递归建树与计算融为一体,在向下递归到底部时,进行计算,边计算边返回。同时我未将Expr、Term、Factor拆分,而是统一为Polynomial类。整体框架如下图所示。

在加入自定义函数与exp后,原本的将解析与计算混在一起的框架不能够满足复杂解析计算的要求,因此我选择了重构。重构后的框架图与最终作业一致(第三次作业只增加了几个方法)
相比较重构前,重构后的框架对任务拆分的更加明确,在不同任务之间耦合度很低,能够分任务修bug,且可拓展性得到了极大的提高。
重构让我的代码架构更加清晰,但由于我将任务拆开,需要二次递归(第一次递归建树,第二次递归计算)。重构是考虑方面主要为如何将任务拆分清晰,个人认为,任务拆分清晰是代码具有良好拓展性的基础。
在第二次作业重构后,重构完的框架可以几乎完全匹配第三次作业的要求,因此我选择在第二次作业的基础上进行迭代。
主要思路如下:


而在查询了大量资料与询问助教后,我找到了问题的根源——我在复写方法toString时修改了该变量,而在调试过程中,每调试一步,都会运行一次toString。因此我的变量在调试过程中一直在被修改。
但由于在重构完成并添加完第二次作业要求后,我的代码规模已经较为庞大,我在尝试不在toString中修改变量的过程中,程序不断出错,我最终放弃了复写toString方法,而采用了toStr
在本单元作业中,我一共发现了如下几个bug点:
exp((-2*x)) 输出为 exp(-2*x) 或者将 exp((-x)) 输出为 exp(-x)exp((-2*x)) 输出为 exp(x)^-2 个人认为,在发现别人bug方面,更多的依赖于自己代码曾出现过的bug,以及自动测评机的测试。
我在hw2时,自身的代码在未给数据点的测试点出错,在思考问题期间,发现了自己代码存在上述两个问题并成功修改,并用这两个易错点hack了两位同学;而在hw3期间,则是借助同学所搭建的测评机,发现了另一位同学未考虑表达式因子这一错误。
在本单元的作业中,虽然侥幸在公测与互测中未被发现bug,但我的代码整体仍较为臃肿,复杂度较高,类之间的耦合度也较高,虽然可拓展,但拓展后代码会越来越臃肿,复杂度会不断增加。因此如果进行优化,则需要对每个较为臃肿的任务进行重构,如优化输出任务等。
同时在输出方面,个人认为应该重写输出方法,在输出方法中拒绝更改变量,使用命令-查询分离原则,杜绝各种莫名的“闹鬼”事件。
OO的第一单元正式落下帷幕,整体来说,个人认为即使是课改之后的OO,难度依旧不低,一次作业的代码量能够与数据结构的期末大作业相比(甚至更大),但这也确实极大的提升了个人能力。而在本单元中收获最大的可能便是hw3讨论区中同学所分享的命令-查询分离原则,这一原则能够极大的解决我的代码中的大部分bug,向我展示了真正的面向对象。同时,给我留下深刻影响的还有紧张刺激的互测,额,就真的很刺激,可能一段时间没看,房间里大家的成功率都高的可怕。希望自己未来能够落实命令-查询分离原则,杜绝各种奇怪bug与“闹鬼”现象。