OOUnit1总结分析
18231052 石锦川
第一次作业
第一次作业主要是完成简单多项式导函数的求解。
思路分析
本人将程序主要分为五部分,即输入,处理字符串,创建多项式,求导,输出。其中,输入、输出较为简单,主要难点在于处理字符串、创建多项式、求导。
为了完成处理字符串的工作,创建了StringProcessor类,用来化简字符串至最简模式,方便之后读取。
为了完成创建多项式的工作,创建了Polynomial类,对应的PolynomialProducer类,Term类,以及对应的TermProducer类。PolynomialProducer类负责接收处理过的多项式字符串,解析字符串,创建Polynomial的功能,在此之中,调用了TermProducer类,来创建Term,Polynomial类内部管理着一个元素类型为Term的ArrayLists容器。
为了完成求导的工作,Polynomial类与Term类中定义了求导的方法derivative(),Polynomial类中的求导方法调用了Term类中的求导方法。在求导时,只需调用Term类中的求导方法即可。
程序度量
结构分析
复杂度分析
可见其中PolynomialProducer类的复杂度较高,通过观察方法复杂度,可得Polynomial类中的changeTheFirst()方法的复杂度较高。
BUG分析
本次作业由于较为简单,没有发现BUG。
化简分析
本次作业较为简单,化简主要有同类项合并,符号化简,系数省略,x**2=x*x等点,在输入、输出中即可解决,无需单独判断。
可拓展性分析
由于这是第一次作业,本人几乎没有拓展性思维与意识,只想着解决当前问题,所以该次作业的拓展性很差。本程序既没有考虑到以后可能的拓展,也没有对关键方法进行抽象,这直接导致了 第二次作业的重构。
总结反思
本次作业较为简单,在实现与细节上大多数同学都可以做的很漂亮,但是在架构和可拓展性上就不尽人意了。本人认为第一次作业由于架构与拓展性太差,几乎没有什么可以拓展的空间,只是完成了一个简单的任务而已。但是本次作业仍然有值得坚持的地方,比如将问题分而治之,这样可以将问题拆分开,有针对性地对关键问题进行处理与调试,并且再完成了一部分内容后,对该部分进行测试,确保该部分功能的完整与正确。
第二次作业
第二次作业需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解。
思路分析
由于第一次作业的架构与可拓展性太差,第二次作业本人选择了重构,并且尝试使用包来管理程序。本次作业可以分为六部分输入,判断字符串格式以及处理字符串,创建多项式,求导,化简,格式化输出。输入、格式化输出较为简单,故难点集中在其他四部分。
为了判断字符串格式以及处理字符串,创建了StringJudge类与StringProcess类,同属于stringprocess包下。在StringJudge类构造了完整多项式的正则表达式,用来判断输入是否合格,如果字符串格式合格,则将字符串交给StringProcessor类进行处理。在StringProcessor类中,完成了符号替换,空字符串去除等工作。
为了完成创建多项式的任务,创建了Polynomial类,与之对应的PolynomialProducer类,创建了SinFactor类、CosFactor类、SinFactor类与Term类。Polynomial类管理着一个以Term为元素的ArrayLists,Term类中管理着一个SinFactor对象,一个CosFator对象,一个PowerFactor对象和一个代表系数的BigInteger对象。PolynomialProducer类通过解析完成预处理的多项式字符串,来创建Polynomial类。
为了完成求导,Polynomial类、SinFactor类、CosFactor类、SinFactor类与Term类中定义了求导的方法derivative(),通过层层调用来实现求导工作。
为了化简得到的多项式,本人创建了功能类SimplyFunc。该类通过遍历Polynomial类ArrayLists中的Term来判断是否可以化简并且选择化简方案,主要是关于三角函数的化简,这里可以采用的方法很多,不一一赘述。
最后,格式化输出通过重写每一个类中的toString()方法,并且层层调用实现,较为简单,但是需要注意系数,指数等细节。
程序度量
结构分析
复杂度分析
BUG分析
本次作业强测中出现BUG,是由于判断空字符的正则表达式错误地写为了[\s],但是应该写作[ \t]。本次作业互测中没有出现BUG。
化简分析
除了第一次作业出现的化简方式,这次增加了三角函数的化简,化简方式多种多样,我采用地三角函数三种等价形式都列出来,通过比较长度取得最短形式的化简方法,绝大多数都可以获得最短串。思路不再赘述。为了防止超时,我采取了次数熔断的方法。
可拓展性分析
本次作业虽然有在考虑拓展性,但是在做第三次作业时发现程序的架构以及拓展性仍然不是很好。
总结反思
本次作业总的来说还可以,只是在拓展性方面不是很令人满意。该次作业我发现了很多应该提升的地方,比如编程风格方面、方法访问权限的设置方面、代码的时间复杂度方面等等。
第三次作业
第三次作业需要完成的任务为包含简单幂函数和简单正余弦函数及其组合的导函数的求解。
思路分析
本次作业增加了嵌套,求导与读取的操作变得复杂了起来。本次作业可以分为六部分输入,判断字符串格式以及处理字符串,创建多项式,求导,格式化输出。输入、格式化输出较为简单,故难点集中在其他四部分。
为了判断字符串格式以及处理字符串,创建了StringProcess类。在StringProcessor类中,通过状态机的方法,将字符串以项、因子的结构拆分开来,返回一个二维容器。
为了完成创建多项式的任务,创建了Polynomial类,与之对应的PolynomialProducer类,创建了SinFactor类、CosFactor类、SinFactor类与Term类,除了PolynomialProducer类,其余类都是Factor接口的实习类。Polynomial类管理着一个以Term为元素的ArrayLists,Term类中管理着一个以Factor为元素的ArrayLists。PolynomialProducer类通过小正则表达式解析完成预处理的多项式字符串,来创建Polynomial类。
为了完成求导,Polynomial类、SinFactor类、CosFactor类、SinFactor类与Term类中定义了求导的方法derivative(),通过层层调用来实现求导工作,其中涉及到了链式求导与嵌套求导法则。
最后,格式化输出通过重写每一个类中的toString()方法,并且层层调用实现,较为简单,但是需要注意系数,指数等细节。
程序度量
结构分析
复杂度分析
BUG分析
本次作业主要出现了两个BUG。
BUG1:为了缩短字符串长度将x**2转换成x*x输出,但是如果多项式嵌套在三角函数中,这样的转换方式会导致表达式不合法。
BUG2:在嵌套的层数太多时,由于调用的方法太过复杂,程序计算时间会超时。
总结反思
通过此次作业,本人首先认识到了充分测试的重要性。随着程序的逐渐复杂,测试集也就变得复杂起来,为了得到健壮稳定的程序,充分的测试就显得尤为重要。其次就是解决问题的思路与程序的架构十分重要,如果没有完整的思路就写程序,很有可能造成后续无数的BUG,所以在写程序之前,必须要把架构设计与思路明确。最后就是优化的问题,在没有正确的解决问题之前就时时刻刻考量着优化方法显然是不明智的选择,应该是在保证程序功能正确性的基础之上,再去做一些在自己力所能及范围内的优化。