BUAA_OO_2025第一单元总结

温昊潭-23371135 2025-03-23 17:50:35

度量分析

从类复杂度的角度来看,复杂度较高的有MakeString,MainClass,NormalFunc,Poly,Lexer,FuncExpr这些类。

  • MakeString类:对输入的字符串进行函数的替换,去掉自定义函数和递归函数。这个类编写时,对自定义函数的处理和递归函数的处理是分开的,没有有效提取共性方法。另外函数处理部分包含不少分支情况,出现了重复代码过多。

  • MainClass类:功能分离做的不够,把自定义函数的分支处理,递归函数的读取都放在了MainClass类。

  • NormalFunc类:自定义函数类。由于自定义函数的定义可能含有自定义函数的调用,我在读取后进行了调用函数的替换,这部分与MakeString类有功能重合。

  • Poly:多项式类。多项式的求导,加减合并,相乘,最后结果的输出,这些功能都写在了Poly类。

  • Lexer:词法分析类。在词法分析读到符号的时候进行了过多的预处理,主要是对'+'和'-'进行了处理,造成了冗余。

类图

 

架构设计经验

三次作业实现的功能分别为:读入含有整数和变量x的表达式实现加减乘指数运算、加入三角函数和自定义递归函数、加入自定义普通函数和求导运算。代码的实现过程如下:

  1. 设计的类:MainClass、Token、Lexer、Parser、Expr、Term、Factor接口、Num、Var、SubExpr、SubTerm、Mono、Poly。Lexer类进行词法解析把输入字符串解析为tokens,Parser类通过递归下降的方法语法分析,创建出从表达式到因子的各种对象,然后把这些对象全部toPoly,并以多项式类Poly的形式进行运算和输出。

  2. 添加的类:FuncExpr、MakeString、TrigoFunc。由于作业规定递归的深度不超过5,所以我先把f{0-5}计算并储存在FuncExpr对象中,然后通过MakeString类调用FuncExpr对输入中的递归函数进行替换,再把结果给Lexer,TrigoFunc类是三角函数类,另外相对于第一次作业修改了Mono的结构和Poly运算和输出的算法。

  3. 添加的类:DeFunction、NormalFunc。分别用来处理求导和自定义普通函数。

自己程序中出过的bug

本人代码能力不强,程序出现过十数个bug,这里仅仅选取三个比较问题比较隐晦、出现频率较多的说一说:

  1. 字符串替换:有两个易错点,一个是双变量情况不能先后替换两个变量,必须要保证同时替换,比如通过StringBuilder类。第二是替换后的"("")"在替换变量和替换函数时都保证要在最外层加上左右括号,否则会导致后续计算的优先级被改变。

  2. 函数重写:在具体了解函数重写的后果之前,我重写了equals方法,以供contains方法使用,结果是意料之外的replaceAll方法的作用被改变,所以函数重写要慎用。

  3. 浅克隆:这个问题是所有bug中最隐蔽,难以追溯,难以根除的。其实所有自定义类在被add之前都应该是clone一份,然后add克隆对象(除非就是想add本体),但是如果自定义类存在嵌套(比如TrigoFunc类里有Poly属性),那一定要在clone方法里面嵌套clone方法,防止两个对象共用一个属性。

测试策略

比较好的测试策略有编写测评机和单元测试。本人由于疲于应付代码编写任务并没有做这两个准备,测试时仅仅从情况的覆盖角度和复杂度考虑类编写测试样例,通常会在函数嵌套、括号嵌套、指数运算、加减运算这些角度考虑。

心得体会

第一单元的成绩不算理想,我在代码优化和课下代码测试这两方面还有不小的问题,在以后单元任务中还要注意面向对象方面的考虑,在降低类之间的耦合度,提高课拓展性,类的设计方面还有很大进步空间。

...全文
23 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

275

社区成员

发帖
与我相关
我的任务
社区描述
2025年北航面向对象设计与构造
学习 高校
社区管理员
  • Alkaid_Zhong
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧