第一单元总结

目录

作业要求简述

整体思路

UML图

化简

Bug分析

度量分析

架构设计体验

写在最后

 

作业要求简述

本单元共有三次作业,第一次作业要求实现的功能是完成单变量多项式的括号展开,第二次作业增加了三角函数、自定义函数和求和函数,第三次作业增加了表达式多层嵌套的功能。

 

整体思路

读入表达式 --> 对表达式进行预处理 --> 解析表达式 --> 化简表达式 --> 输出化简表达式

UML图

 

 

 UML图中列出了所有的类和重要的属性及方法,Mainclass类中读入自定义函数和待化简的表达式,之后PreDeal类对读入的内容进行预处理,dealSum将表达式中的sum函数展开为求和的形式,dealFunciton将表达式中调用的自定义函数代入具体参数,dealPlus将表达式中多余的加减号处理掉。Parse和Lexer对预处理过的表达式进行解析。程序采用的解析方法是递归下降,因子(Factor)相乘得到项(Term),项相加减得到表达式(Expr)。

化简

第一次作业中,不存在三角函数,只包含变量x和常数,所以Variable类中只含coefficient(系数)和power(指数)两个属性。相乘的操作是将系数相乘,指数相加;相加的操作是指数不变,系数相加(两个操作数指数相同的情况下);经过运算得到含有Variable的容器后,再合并同类项:将指数相同的Variable的系数加在一起,合并为单个Variable,最后再输出化简后的表达式。二三次作业新增了三角函数,(由于懒),我并没有新增类来表示三角函数,而是在Variable类中新增了String类型的trian属性,trian属性用来储存三角函数。在进行运算时,变量x和常数的运算保持不变,如遇新的三角函数相乘,便将新的三角函数用字符串相加的方式加入到trian中。运算完成进行化简时,再进行遍历,比较字符串,进行合并。这样做,思路很简单,实际操作起来也并不复杂,但缺点是运行速度较慢,化简的效果不是很好(这种化简方式属于是反面典型)。

Bug分析

三次作业中出现的bug很多,大多是由细节处理不到位和考虑不周全所导致的。在第一次作业的预处理环节,我在处理多余的加减号时,忘记了把指数的正号吞掉。在第三次作业中,少考虑了sum函数求和下限比求和上限大的情况,在处理自定义函数实参时,考虑得也有纰漏。这些bug只需几行便能更改,但就是由于缺少了细节,导致程序正确性缺失。写完作业后,我自己也没有做充足的测试,没有及时发现和更正。

度量分析 

作业一 类复杂度

 

作业二 类复杂度

作业三 类复杂度

 

 上图依次为作业一、二、三的类复杂度,作业二三的预处理环节变得较为复杂,在Mainclass类中多次调用了PreDeal中的方法,使得Mainclass类复杂度迅速增加。Parser类中多是递归的方法,有些偏面向过程,复杂度也比较高。我将化简的函数放在了Expr类中,由于化简方式不优,该类复杂度也比较高。二三次作业在进行迭代时,没有新增类处理新增的功能,而是在原类上增添代码,这也提高了类的复杂度。

作业一 方法复杂度

 

作业二 方法复杂度

作业三 方法复杂度

 

上图分别为作业一二三的方法复杂度(仅列举了重要的方法),从作业一到作业二,复杂度变化较大,由作业二到作业三,复杂度变化不明显。但在作业一二三中,均存在复杂度过高的方法,说明该方法还可拆分为多个子方法,可降低耦合度,方便后续的调试工作,也会提升代码的阅读体验。

 

架构设计体验

我的三次作业是逐次迭代形成的,中间并没有重构过。第一次作业的代码参考了training中官方提供的答案,架构基本是答案的高仿版,甚至很多函数名都没有更改。第二次作业较第一次作业新增了求和函数、自定义函数和三角函数,代码改动主要在预处理环节和计算化简环节。经过预处理,程序将输入的多项式转化为类似于第一次作业输入的多项式;在解析环节并未做许多改动;计算和化简环节也只是增加了有关三角函数的功能。第三次作业较第二次作业的改动更少,因为第二次作业已经支持了部分嵌套的功能,轮子在之前已经造好了,只需将三角函数的嵌套略加处理即可。总体来讲,第一次作业投入的精力和时间最多,二三次作业投入的精力和时间依次递减,相对较少。后续迭代并没有做过多的更改,这样虽然减少了部分工作量,但也带来了诸多的问题 : 类复杂度上升,代码运行速度较慢,优化效果不佳。在后续学习中,应当加以注意,不要畏惧改动和重构,争取实现性能的最优。

写在最后

这三次作业让我深刻体会到了架构的重要性,由于一开始参考的答案代码架构合理,这三次作业才能缝缝补补,逐次迭代。不足之处是在具体编写代码时,层次化的设计并没有充分地体现,许多关系和结构还是十分混乱,代码之间的耦合度还是比较高,在调试时花费了不少的时间;面向对象的编程思想也没有充分地体现在代码之中,类之间的关系处理得并不是很恰当。

第一单元的学习已经告以段落,在这四周的时间里,我入门了Java这门编程语言,掌握了一些语法和用法,接触到了面向对象的编程,也学习了递归下降这一解析方法。除了收获许多具体实际的知识,这四周的时间里,我也受到了许多的挫折教育。在今后的学习过程中,希望自己可以及时总结,及时反思,吸取经验和教训,不断提升自己的能力。

posted @ 2022-03-25 16:45  Natt1e  阅读(91)  评论(1编辑  收藏  举报