OO第一单元博客作业

OO第一单元博客作业

三次作业实现的核心思路都差不多,当然实现的细节差异很大,而且后一次作业都比前一次作业更面向对象一些。

可惜的是,第三次作业并没有完成。

第一次作业:

实现思路是首先使用正则表达式从头到尾匹配输入,判断输入是否正确。接着把输入按项分解,放进arraylist中。然后把arraylist里的项依次求导。求导后合并同类项。最后把化简输出。
由于第一次作业只写了2个类,完全没有体现面向对象的特性,所以就不放UML图了。

bug:

自己在程序中加入了判断输入格式是否正确的代码,但是由于我的正则表达式不够精简,很多冗余的捕获组,结果强测有一点发生了StackOverflowError。
互测没有测出bug。

耦合度:

类总代码规模:

第二次作业:

第二次作业增加了sin(x),cos(x)因子和乘积项。
第二次作业在第一次作业的基础进行了重构。第二次作业和第一次作业最明显的差别是分离出了很多功能不相关的类以及创建了Term,SinTerm,CosTerm 三个类存放x,sin(x),cos(x)三种因子,使用了一些面向对象的继承和多态特性。此外,为了方便合并同类项,此次作业使用的存储结构是hashmap,并且在作业中实现了计算key的函数。在对输出进行化简方面,写了利用sin(x)** 2+cos(x)** 2 = 1 公式进行化简的函数。
在求导乘积项时,使用了如下求导公式。

\[\frac{d}{dx}\left [ \prod_{i=1}^{k}f_{i}\left ( x \right ) \right ] = \sum_{i=1}^{k}\Big ( \big( \frac{d}{dx} f_{i}\left(x \right )\big)\prod_{j\neq i}f_{j}\left(x \right ) \Big ) \]

不足的是,程序的耦合度还是比较高,并且程序并没有使用接口类和特定的设计模式,所以还是较难扩展。

bug:

强测出了2个bug。互测出了5个bug。这7个bug实际上属于2个同质bug。
第一个bug是没有考虑到输入数据中幂函数的指数绝对值为10000的情况。第二个bug是合并sin(x)** 2和cos(x)** 2时忘了讨论系数为负数的情况。

耦合度:

有四个类的耦合度蛮高的,设计还需改善。

类总代码规模:

UML类图:

第三次作业:

没有做出第三次作业。

在第二次作业的基础上进行了重构。程序使用了抽象类和接口类。对项的存储使用了自建的表达式树类。

在解析输入然后把项分离并放入表达式树这一步出了许多bug。这是因为解析输入的程序设计得不好,所以对许多输入会出现错误的解析,从而建成错误的表达式树。

由于没做出来,所以就不放类分析图了。

测试方法:

测试自己和别人的bug都使用了两种方法生成测试数据。

第一种是自己手动生成一些边界数据。

第二种是参考了讨论区同学的分享,使用python的xeger包生成测试数据。

在测试输出是否正确方面,使用的方法同样来自于讨论区同学的分享,即使用自己的java程序和python的sympy包同时对输入求导。然后把两个程序的求导结果使用sympy代入值进行计算。最后对比两个值是否相同。

心得体会

我觉得在短短4个星期内,OO课程对我的提升还是很大的。然后第三次作业没做出来打击也是蛮大的,下个单元继续努力吧。
从技的方面来说,在pre作业开始我就逐渐熟悉了对封装、继承和多态以及正则表达式的应用。还有就是对深复制与浅复制有了了解,也在程序里应用了。此外还学会了如何使用bigInteger类,string类,stringBuilder类,容器类等等。
从术的方面来说,主要是如何让面向对象思想体现在程序里,我觉得我还有很长的路要走。我对接口类、抽象类和设计模式等的应用都还很生疏,常常不是很确定什么时候应该应用什么设计方法。
我觉得两次实验的选题都蛮好的,都是我刚发现我不会啥实验就考啥(应该是因为我太菜了),让我及时恶补了重写cloneable接口和应用工厂类和接口类的知识。

posted @ 2020-03-21 12:03  samuel234  阅读(141)  评论(0编辑  收藏  举报