BUAA-OO第一单元总结

1.基于度量的程序结构分析

第一单元成功改写三份作业

第一次作业

架构分析

以上为第一次作业的类图,下面分别介绍各个类的设计意图:

1.MainClass类:”面向过程“的完美体现,首先使用枚举的方式将字符串预处理,可以简化后续的正则表达式以及代码判断,然后通过写正则表达式来解析输入的字符串,由表达式到项,再到因子逐层解析,保存在一个Map中。

2.Poly类:类如其名,该类用于存储表达式,并提供了诸如表达式加减,求导等操作。

3.Expression类和Term类:用于求导后表达式的输出与化简,Expression类是表达式层面的输出,Term类是项层面的输出,存在调用关系,将其分开设计的目的是简化代码长度,便于bug精准修复。

第一次作业过于纠结正则表达式的使用,再加上上个学期java大作业,故不自觉地抛弃了面向对象思想,转投了面向过程,事实证明,这样做的后果就只能是重构重构再重构,经常需要回想这个对象是干什么的,一不小心就改错了,输出类的的设定也略显多余,抛开这些,其实还是达到了耦合度低的要求,改动一个类的内容基本上不会对其他类造成影响。

复杂度分析

 

第二次作业

架构分析

以上为第二次作业的类图,接下来分别介绍各个类的设计意图:

1.MainClass类:主类,继承了第一次作业的处理方式,先通过一个toString方法处理输入的字符串,再处理字符串得到表达式对象,再完成输出。

2.Parse类:研讨课是好文明,在认真听了同学的经验分享后,收获了向下递归的好思想,比起直接写一个大的正则表达式,这样的方式明显更“面向对象”,Parse类里设置了表达式,项,因子多个层次,各司其职,互不干扰,最后返回一个表达式类的对象。

3.Tripart类:用于存储sin(x)^n*cos(x)^n这样的结构,将结构细分有利于求导操作。

4.Tripoly类:顾名思义,即三角函数表达式,用于存储仅有三角函数和常数组成的表达式。

5.Poly类:幂函数项与前一个类一起构成表达式类,求导是向下调用求导,缩短代码长度。

第二次作业完全抛弃了第一次作业的思想,全部重写,从类图里不难看出。

复杂度分析

 

第三次作业——回到正轨

2.程序bug分析

其实只要课下认真写了,一般不会出现太多bug,乍一看很多bug可能到都是同质的bug。

关于出现bug的方法的代码行数和圈复杂度,单看我的几次作业的bug是得不到”方法“越复杂,越容易出现bug的结论的,倒是复制粘贴很容易出现bug,需要特别注意

第一次作业

第一次作业在互测阶段出现了一个bug——对于表达式的求导出现问题,当有负指数输入时,会直接输出得到0的错误结果,调试时发现,出现bug归根结底是对于函数求导不同情况的疏忽,同时由于第一次使用treemap,对于其性质理解有偏差导致出现bug。

第二次作业

第二次作业可以称得上是bug"最多“的一次,为什么打引号呢?因为这13个bug都属于同质bug,本质是由于在写表达式的减法时,复制粘贴后没有更改变量名导致的,这次bug也让我意识到了中测确实很弱,这样的错误导致我虽然画了简,但强测只得到了很低的分数。

互测

第一次作业的时候由于本身比较简单,评测机的搭建也并不困难,后面几次等于放弃了,因为没有良好的py基础确实很难,什么操作都需要去问度娘,不如把时间花在别的地方。

3.重构经历总结

三次作业,实现了从C编程思想到java面向对象的转变。

三次作业的类图都已在第一点中展示了,第三次作业太难了,所有不能做了。第一次和第二次只能算是取巧的重构。第二次作业相较第一次修改了获取表达式的方法。

4.心得体会

本单元算是一个基础,类似于入门基调之类的存在,引导我们以一种面向对象的方式思考问题,下面说说我的几点体会:

1.作为留学生,首先很难理解问题。

2.在开始一个单元的第一次作业之前,最重要的不是如何正确地通过中测获得有效作业,而是构建一个可扩展的框架.

 

posted @ 2021-03-30 19:00  李智慧  阅读(48)  评论(0编辑  收藏  举报