BUAA_OO_2022_Unit1

2022OO第一单元总结

整体总结

OO第一单元三次作业,核心任务是进行表达式括号展开并化简,需求迭代如下:

  • 只含有加减乘幂次运算的含括号多项式
  • 引入自定义函数与求和函数,引入sin、cos
  • 升级sin、cos中内容的范围,允许内部因子的多样化

在本单元作业中,我采用的是预解析读入的模式。有些遗憾,不过也算是对面向对象这一概念有了一定的了解。

架构分析

  • 类图

  • 设计分析

    预解析模式下,无需再进行解析的工作。采用建立二叉树的思路,而后采取由叶节点由下而上递归运算的方式,计算出根节点的式子,也就是最终的结果。每一条输入的信息都用来生成一个节点TreeNode;每一个节点主要属性为三个,一个是存储当前运算结果的data,另外两个则是左右节点。

    如何存储data是本题中的重要核心。在第一次作业中,由于没有sin、cos,常数项也可以看作x的零次方乘上一个系数,因此我选择了使用arraylist这一结构来定义data,用key、value分别表示幂次与对应的系数;但从第二次作业开始,这样的方法就行不通了,因此改用hashmap定义data,额外设置了一个poly类,作为多项式中由加减号连接的每一个因子,以poly作为map中key的类型。

    poly中需要存储x ^ i、sin(……)^ i、cos(……)^ i,后两者我选择分别使用了一个hashmap<String,BigInteger>来存储信息,在运算过程中,当处理sin、cos运算时,只要将之前的data用toString方法返回一个字符串,作为map的key即可。

  • 优点

    结构比较简洁,修改难度比较低。存储数据的方式可扩展性好。

  • 缺点

    封装性较差,存在大量功能集结于一个类的问题,导致优化较麻烦

度量分析

  • 类的度量分析

    大量代码集中于TreeNode类中,导致该类复杂度大。

  • 方法的度量分析

    calculate方法中处理了所有运算符号情况下的运算,代码量大且复杂,耦合度比较高。

bug总结

第三次作业中出现了bug,原因是生成二叉树节点时没有考虑输入的vars 没有任何操作符号的情况,如”f1 0“。通过特判即可解决。

在未来的编码中,肯定会有诸多如此类没考虑周全导致的bug,如何在测试程序时”打开脑洞“,尝试一些微小非常规的情况,是值得我学习反思的。

互测策略

前两次作业中未发现他人bug;第三次作业互测中,针对个别同学使用integer而非BigInteger的问题,hack成功了3次。通过尝试hack,对于边界数据更敏感。

心得体会

通过这一单元的学习,我从一个java新手从零开始做起,开始了解面向对象编程的思想。第一次与第二次作业的工作量比较大,一周时间进行思考、构建、完善作业,提升了我的代码能力与工程能力。同时迭代中重构的经历也让我深刻领会到有好的可复用性与可扩展性有多么重要。同时,在本单元中我选择了预解析模式,而没有选择挑战更高的难度,现在想想有些遗憾。

最后,面向对象的世界太广阔了,我现在仅仅是踏入其中。前路漫漫,且歌且行。

posted @ 2022-03-26 10:18  yeger118  阅读(25)  评论(0编辑  收藏  举报