一、基于度量来分析自己的程序结构

1、第一次作业

思路:设计了三个类分别完成项的分离、项的求导、项的打印三个功能。

类图:

 metrics复杂度分析:

statistic分析:

分析:代码一共200行左右,可以看出部分方法代码复杂度很高且圈复杂度和模块设计复杂度都非常高(分离算法),这说明程序分支多,质量低,模块间耦合度高,模块难以隔离维护。这主要是因为把分离相关集中于一个类同时没有分离好不同的方法,造成一个方法代码行数过长。

 

2、第二次作业

思路:与第一次不同的是由于加入了各个因子之间的相乘,使项变得更为复杂,但依旧脱离不了四个参数的固定形式,因此直接用四个参数表达每个项,与之前不同的是在表达式正误检测以及表达式分离进行了改进,原因在于完全应用一次的正则表达式匹配不能完美的达成检测与分离两方面,因此将正误的检测分为了项内因子的检测与表达式内项的检测,避免了一次检测所产生的正则表达式字符串过长。

类图:

metrics复杂度分析:

statistic分析:

分析:第二次作业的时候才开始注意风格检测,然而在代码都写完后再修改风格实在是太痛苦了。第二次作业最大的问题还是在于没有把不同的类分在各自的顶层文件,造成了一个文件500多行的惨状,经过第一次作业的教训后对于一些重用的方法将他们独立了起来,但是收效甚微,还是对面向对象的思想不够透彻,造成了其中分离函数、打印函数以及求导函数依然存在着极大的问题,不过也有关于后期对于bug的修改导致几乎每发现一个bug就增加一个if else的惨状,还是在于前期没有考虑周全,具体的解读将在下面的bug分析。

 

3、第三次作业

思路:与前两次作业不同,难度有了提升,首先是对于表达式结构的分析,在出现了表达式因子后就意味着需要改进以前的结构,经过极为菜鸡的思考后,以及看完讨论区大佬的思路后用了表达式树,但是感觉自己的树结构有些不合理,(arraylist大法)导致我用一个数组表示一个项包含多少个表达式因子(普通的表达式因子、sin()、cos())并在其中表示各个表达式因子的指数和类别,而对于每一个表达式因子又有一个数组表示这个因子中含有多少项。这个结构让我在后面实现表达式的求导费了劲。

类图:

metrics复杂度分析:

statistic分析:

思考:完成这次作业后发现了两个主要的问题

1)对于Poly类(树中的每一个节点)中由于进行了封装,导致创造了很多的访问方法,其中大多数访问方法是包含可复用部分,造成该现象的原因主要在于前期没有规划好其访问方法,导致后面一边写求导类一边回头添加访问方法,造成多个方法中代码的复用。

2)对于求导和打印函数由于采用了递归以及对于接口的不熟悉,导致将多个求导方法复用,以及创建了极多的if else分支导致debug困难,造成该问题的原因在于对于接口和多态的不熟悉,因此求导方法及打印方法复杂度极高。

 

二. 分析自己程序的bug

1、第一次作业

主要在于问题思考的不全面,对于多种极端情况没有考虑到。

例如:空文件 、 正则表达式爆栈 、+++1的问题

在自测中发现一些由于正则表达式产生的错误将一个项当成两个项然后输出“WRONG FORMAT!”

2、第二次作业

在第二次作业中发现的bug主要集中于对于0的处理,由于经过第一次作业的惨痛教训对于所有参数都采用了BigInteger之后

导致在部分对于0的处理出现了问题,在中强测的bug检测后由于修改了0带来的一系列问题,结果愉快的产生了新的bug

还有问题是在于对于表达式正误检测产生的问题,对于一些因子的组合没有考虑到,导致部分检测出错。

3、第三次作业

在第三次作业中很多bug是出现在求导和打印函数的庞大递归以及其中的众多的if else分支中,在debug过程中由于递归为复杂

极大的加深了debug的难度,其中由于多个函数和因子产生的复用问题造成了其发生,对于接口了解有限,导致只能用一整个

递归来实现算法。

综上:很多的bug都是由于开始写代码前没有对这次作业进行仔细的分析以及对于可能产生bug的点进行思考,归根究底还是前

期思考工作过少,正如某位同学在研讨课上所说的,应该写写出测试集,这不光是对之后的测试有利,在你写代码的途中也可以

避开很多坑点。除此之外类图也可以和测试集相辅相成,依照类图写程序往往比靠着脑子里那些思路写好很多,这一点在第三次

作业中体现的尤其明显,往往写着写着思路一岔开,就不知道写到哪了,而在开始写代码前对你将要完成的程序有一个结构上的

框架和细节上的坑点支撑也会降低方法的复杂度,避免后期debug造成的众多if else语句是程序变得更加复杂。

 

三. 分析自己发现别人程序bug所采用的策略

爆栈:从第一次作业的贪心匹配到第三次作业的括号嵌套

特殊字符:空文件、不可见字符

空格:各种的地方究竟能不能加空格

符号:最多能有多少个符号+++1其中又能有多少个空格

在优化过程中的循环问题

 

四、Applying Creational Pattern

我的三次作业对面向对象的思想都体现得不明显,代码扩展性差,无法复用。而且完全没有考虑过三角函数部分的优化,只是简单计算,导致性能低。

而且几乎每次作业都进行了一次重构,给每次作业添加了极大的工作量,应该在完成作业后思考下一次作业能否服用代码和一些方法。

关于代码重构,首先是想实现求导接口,就像助教在作业指导书上所给出的提示那样(虽然没怎么具体理解)将各种因子建立类,实现求导接口。

然后再考虑将求导接口与项和表达式建立联系,然而现在对于接口的运用还很表面,没有完全立即其含义,还需要再想想,在学习过后,我会发一篇关于

接口的学习笔记,解决这个问题。:)