OO第一单元总结
一、程序结构
| 类 | DIT | NOC | RFC | LCOM | CBO | WMC |
|---|---|---|---|---|---|---|
| Main | 1 | 0 | ≈12 | 0 | 3 | 7 |
| Pre | 1 | 0 | ≈3 | 0 | 0 | 2 |
| Factor | 0 | 5 | 0 | 0 | 0 | 0 |
| Number | 1 | 0 | ≈5 | 1 | 1 | 0 |
| Var | 1 | 0 | ≈8 | 0 | 1 | 5 |
| Exp | 1 | 0 | ≈10 | 0 | 4 | 9 |
| Expr | 1 | 0 | ≈15 | 0 | 3 | 18 |
| Term | 1 | 0 | ≈20 | 0 | 5 | 20 |
| Parser | 1 | 0 | ≈25 | 0 | 7 | 30 |
| Poly | 1 | 0 | ≈10 | 0 | 3 | 5 |

优点:可拓展性强,方便添加结构逻辑等
缺点:部分逻辑混乱,有点地方互相引用没有缓存导致运行速度不快。同时对于优化的逻辑十分简单没有过多考虑。
二、架构设计体验
每次迭代均进行了重构,第一次采用AST树,通过抽象类来表示因子的方式来进行运算简化,第二次使用hashmap储存因子,第三次再次使用抽象类来储存因子,每次迭代的变化都比较大。但每次重构需要改动的都只有与因子相关的节点,对于文本解析器基本都没有改动。每次重构的出发点都是为了使运算逻辑或者存储逻辑更加简洁清晰,采用的运算方法都一样,改变的只有关于如何表示因子、项与表达式的方式。
三、自己程序的bug
第二次程序的BUG有两个,一是exp在部分情况下括号内的不是因子,即出现exp(expr)(应该是exp((expr))),原因为对exp内是否因子判断错误,采用正则表达式判断如果有(与)就分类为因子,忽视了exp(A)+exp(B)的情况;二选择因子没有短路判断,导致不必要的计算。一的解决方法为使用for循环遍历确认为因子,二添加跳过因子的方法并应用与解析选择因子的方法中。 第三次有一个BUG,就是关于exp多次嵌套的问题,错误原因是项的tostring方法中判断因子是否等于1时调用了一次化简方法但并未缓存,后面生成字符串时再次调用了化简方法导致TLE。
四、自己发现别人程序bug所采用的策略
1,排列组合所有嵌套情况如函数嵌套选择因子,选择因子嵌套函数,通过自己刻意制造多种可能导致错误输出的错误来发现BUG。2,采用评测机大规模生成随机测试数据。
五、自己进行的优化
为了确保输出的正确性,我只进行了正项提前的优化,在表达式的toString中通过正负对项进行分类随后先输出正再负。
六、大模型相关使用
我基本都使用了AI,我会先按照自己想法完成一次,然后让AI去DEBUG。大模型能基本完成要求,但会因为我自己完成的代码本身有缺陷而生成有缺陷的代码。互测房中大部分同学也是用了AI帮助的代码,因为都有AI注释。
七、心得体会
对我来说难度集中理解Parsre原理上,由于很久都没有编程过,所以生疏了许多,对AI依赖性较强,对于一些AI来DEBUG的地方没有细看,只是确认了其能完成任务,总觉得自己有些地方没有真正理解到或者学懂,故以为自己在今后的学习中应该逐步减少对AI的依赖,我认为可以用AI来DEBUG,但不应该让AI来“一键完成作业”这样会丧失学习的意义。
八、未来方向
第一次作业多一点提示与引导,帮助同学顺利过渡。