面向对象第一单元总结

黄勇鑫-22230616 学生 2024-03-22 00:39:24

目录

  • 面向对象第一单元总结
  • HW1
  • 方法复杂度
  • 类复杂度
  • UML类图
  • 架构分析
  • 性能优化
  • HW2
  • 方法复杂度
  • 类复杂度
  • UML图
  • 架构分析
  • Bug分析
  • 性能优化
  • HW3
  • 方法复杂度
  • 类复杂度
  • UML图
  • 架构分析
  • Bug分析
  • 性能优化
  • 心得体会

面向对象第一单元总结


HW1

方法复杂度

img

类复杂度

img

UML类图

img

架构分析

  • 首先是词法提取器Lexer的构建。Lexer的作用就是能够反馈当前的语法单元并不断更新到下一个最小语法单元,从而便于Parser进行表达式的解析。在Lexer提取的过程中,最关键的就是处理正负号还是加减号的问题。如果是加减号可以直接赋给curToken;如果是正负号可以分别成1*(-1)*来进行处理。

  • 接下来就是Parser的构建。Parser对表达式的解析采用递归下降法按层次进行解析。解析完后应该得到一个表达式,表达式里有项数组,项里有因子数组,已经存好了相关的因子。其中,Number类和Letter以及Expr类都连接到Factor接口上进行处理。

  • 采用后缀表达式进行计算:利用training中的toString代码进行输出。转化为后缀表达式之后只需要对后缀表达式进行读入,如果读到运算符便对前两个操作数进行运算。这样下来思路比较清晰,操作也相对方便。

  • 建立多项式
    建立Polyminal类,并在该类中构建两个多项式之间运算的加减乘以及乘方的方法,从而在生成后缀表达式之后对后缀表达式进行操作。

性能优化

本次作业未进行性能优化,原因在于在计算的过程中没有事先判断第一项是否为负。现在想想其实难度也不是很大。

HW2

方法复杂度

img

类复杂度

img

UML图

img

架构分析

  • 本次作业增加了自定义函数。对于自定义函数的处理我并没有在解析过程中进行处理,而是将自定义函数的处理放在与去除空格同等的地位。即将自定义函数处理放在输入之后,将自定义函数全部拆开,形成带有许多括号的表达式,再进行解析。由此新增了func类。

  • 同时,由于加入了指数函数,所以还需要将其放入一个层次之中。由于在第一次作业中,我没有按照课程组的定义将例如x^2作为变量因子,而是将x^2作为了一个新的层次,分别将x2作为底层的变量因子。所以在第二次作业中,我将exp视为一种运算,也放入了新的层次进行解析。

  • 其他的架构设计和第一次作业没有很大差别

Bug分析

  • 本次作业强测时出现了一个Bug,那就是没有详细考虑单项式中x的指数问题。在原先的代码中,我将x的指数设置为了int类,但是却在强测时产生了bug,原因是应该将x的指数设置为BigInteger类型,否则在测试的时候可能会出现x的指数溢出的情况。这需要在阅读指导书的时候进行更加细致的考虑,这是以后需要注意的。

  • 同时还值得一提的是,在书写自定义函数预处理的过程中原先也出现了一些bug。我的方法是先数出表达式中f,g或者h的个数,记为number,然后对表达式进行遍历number次,每次只处理一个函数的形参实参。但是在这个过程中我却忽略了一个问题:那就是我没有及时更新number的值,因为一个函数拆分之后fgh的个数并不一定会减少,反而有可能会增加。这个问题在后续和同学讨论过程中才被发现。

性能优化

本次作业没有进行性能优化

HW3

方法复杂度

img

类复杂度

img

UML图

img

架构分析

  • 本次作业的架构改动是最小的,与第二次作业相比基本上没有什么改变。即使自定义函数的定义中能够出现函数,第二次作业的处理方式也完全能够解决。唯一需要加入的处理就是处理求导方式。显然,求导可以作为一种运算。又由于dx的括号中放置的是表达式因子,所以几乎可以将dx放到和表达式因子同等的层次接到Factor接口中进行处理。同时只需要简单改写一下toString方法并且在多项式类中多写一个求导的方法即可。由此新增了Der类并且连接到Factor接口。

Bug分析

本次作业强测没有出现bug。

性能优化

本次作业没有选择进行优化。

心得体会

  • 完成第一单第元的作业后,一个强烈的感受就是在OO作业的完成过程中架构的设计十分重要。一个好的架构对后续的迭代和设计十分有帮助,能够最大化地减少代码的重构量。

  • 第二个感受是对面向对象的用途有了一定的了解。面向对象的封装特性使得每一个类只需要提供对外联系的连接口,而使用类的时候不需要考虑类内部实现的细节。这种模式和面向过程的的确确有很大的差别。我们同样需要足够好地考虑代码设计的细节,但同时我们更需要足够好地考虑我们应该如何实现类的划分,如何设计我们的架构。这是面向对象的难点,但也是面向对象的魅力所在。在接下来的单元作业中,也需要更加注意到这一点。

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

301

社区成员

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

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