面向对象第一单元博客

李彦臻-24373418 2026-03-31 20:07:18

oo第一单元博客

基于度量分析程序结构

类图

img

数据统计

ExtensionFiles CountTotal Size (KB)Min Size (KB)Max Size (KB)Avg Size (KB)Total LinesMin LinesMax LinesAvg LinesCode Lines
java2253.480.1511.212.43163011279741400
Total Statistics:
Total2253.480.1511.212.4316301127974null

优点

大部分类的内聚度较高,以数据耦合为主

缺点

代码有重复,在实现双变量时没有抽象父类;Parser, FunctionProcessor和InputHandler的内聚度较低且耦合多类

架构设计体验

在第一次作业中需要完成含有常数因子、变量因子、表达式因子的多项式化简,将这三种因子统一在一个因子接口下。建立项类,其中储存因子,建立表达式类,其中储存项。实现lexer类,将输入的表达式分解为token,再实现parser类,将输入的token构建为含有表达式、项、因子三层的表达式树。实现Mono类Poly类,通过对每个因子实现toPoly方法将表达式树转化为Poly类对象,在转化过程中自然完成括号的展开,再通过Poly类中实现的mergePoly方法合并同类项,以及其中重写的toString方法将多项式转化为处理后的表达式字符串进行输出。

在第二次作业中新增指数函数、选择式因子和自定义函数。为处理自定义函数,实现了输入处理功能模块,用字符串替换的方式将表达式中的函数引用直接替换为展开后的函数。在Factor接口下实现了指数函数和选择式因子两个类并在lexer和parser中新增对应功能。对于选择式因子的条件判断功能,调用Poly类中的合并同类项功能实现,并且考虑到新增指数函数,对合并同类项的判断条件进行修改。

在第三次作业中新增递推函数、求导因子和变量y。由于递推函数序号最多到5,因此在输入处理功能模块直接进行递推函数序号从2到5的展开,将展开后的模板存储,按照和自定义函数同样的逻辑进行替换。新增求导因子在Factor接口下,对于构成表达式树的每个类都实现求导方法,形成递归调用,但是在我的设计总求导一次后返回Poly类型,因此需要再Mono类和Poly类中同样实现求导方法以支持高阶求导。由于变量y和变量x地位相同,因此实现对称的y变量因子类,在其他类中存储x变量因子相关属性的位置新增存储y变量因子的相关属性,并且对相应方法进行修改。

以上架构不能处理递推函数序号不限大小的情况,在研讨课上我意识到可以将函数也当作因子处理,在toPoly时再具体展开处理,通过HashMap存储已经展开过的递推函数以提升性能,这样的架构可以更方便地实现函数相关功能的扩展。

bug分析

第一单元作业完成得非常坎坷,三次作业分别因为不同的原因没进互测。
在第一次作业中我没有认真阅读指导书,系数类型全部使用int而非BigInteger导致几乎全部强测数据点都错误;
在第二次作业中我出现了版本管理的问题,导致在截止时只能提交一个中测bug还未全部修改完的残缺版本,第二次作业的bug具体有以下2个:

  1. 题意理解错误,题意要求答案为0时输出0,但我在看水群消息时断章取义以为答案为0时要输出空串,没有认真查阅指导书
  2. 还是沿用了第一次作业比较低效的在ArrayList结构下进行合并同类项的方法,在加入指数函数后出现大范围的MLE问题;
    在第三次作业中我出现了6个bug,分别是:
  3. 递推函数替换时没有整体加括号导致递推函数替换后运算顺序改变
  4. 指数函数求导时忘记处理^号后的指数
  5. 递推函数嵌套调用替换仅实现了一次替换,未实现递归替换至没有f{n}(x)为止
  6. negate方法改变了对象本身而不是新生成一个对象导致在后续引用原本的对象时正负出现问题
  7. mono的toString方法在没有考虑仅有负号和指数函数的情况导致输出-*exp()的形式
  8. 未使用map存储已经计算过的内容导致tle

以上bug可以分为以下几类

  1. 细节处理不够严谨,具体需要注意数据类型、输入输出格式处理
  2. 对输入和处理过程中的各种情况的枚举不够全面
  3. 性能太差

以后应当尽量使用节省时间和空间的思路和设计,尽量提前完成作业,在提交前花充分的时间枚举各种情况进行更完备的本地测试

优化分析

第一单元作业在遇到性能bug时采取了一下方式进行优化:

  1. 在合并同类项时使用HashMap存储多项式,避免使用ArrayList存储时需要遍历逐项比对是否可以合并
  2. 在处理指数函数因子时将已经处理后的指数表达式存起来,避免重复处理指数位置的表达式

大模型使用

第一单元作业中主要在以下两个地方使用了大模型:

  1. 遇到MLE和TLE问题后使用AI分析导致问题的最主要的方法,将原本的低效方法改写为高效的方法进行替换
  2. 在进行函数的字符串替换时使用大模型生成代码
    大模型的完成效果很好,只要对需要生成的代码的功能要求和约束限制描述到位并给出代码的上下文就没有bug,但是在第三次作业的递推函数替换时我自己没有想到函数替换后不加括号会导致计算顺序改变,没有在功能要求里和AI大模型明确说明,导致了bug

心得体会

希望在第二单元作业时能够在进行设计时就注意时间和空间开销,注意认真审题分析各种输入可能,对程序进行完本的本地测试,以后应当多参考oolens和学长学姐博客

未来方向

建议可以多出一些oolens公众号文章提供思路和参考

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

302

社区成员

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

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