第一次作业总结
这是我第一次接触Java和面向对象思想,最一开始,我建立了简单的类和对象的概念,多亏了第一次作业难度和复杂度较低,我才没有崩掉hhh。 第一次作业我只分了三个类,一个main,一个多项式,还有项。项通过加号连接起来形成多项式。由于求导规则简单,我将求导放在了项类里,成为一个方法。 对于表达式格式的分析判断,根据自己项和多项式的关系,除了个别必要的判断,我将大多数的判断都分在了项的匹配中。 这样做是最简单的想法,但是扩展性较差,以至于我在做第二次作业时进行了重构。
第二次作业总结
第二次作业和第一次相比,增加了因子的种类,因此,如果利用第一次作业的架构,可能不太好实现,而且考虑到第三次作业的可扩展性,我将求导法则和顶层的一些格式判断分离了出来,并且创建了一条链式的类的构造:函数因子->项->表达式。即因子用乘号连接起来形成项,项则由加号连接起来形成表达式。 基于这样的链式构造,我的求导法则也利用了链式递归的方法,即多项式的求导的返回值是对项的求导的和,项的求导返回的是通过乘法法则连接起来的函数因子的求导结果。 对于格式的判断,我沿用了第一次作业的方法。
第三次作业总结
得益于第二次作业的思考,我的第三次作业基本沿用了第二次作业的架构。相比于第二次作业,我只是更改了格式判断的方法以及增加了因子的种类。但是可以看到,复杂度特别高,这直接导致了两个点超时。
综合总结
收获
综合来看,通过本单元的学习,我初步了解了面向对象的思维,更重要的是,我对代码的可扩展性有了新的认识。 对于面向对象思想,最大的收获是“Everything is an object.”,学习到了如何分类的方法,但是还有许许多多不足,就️以本次作业为例,求导法则和格式判断可以改进为静态方法,表达式,项,因子可以形成继承关系,而因子可以改成一个抽象类,把具体的五类因子分别写成类等等,基于这些想法,我现在正在进行重构和改进代码。 对于代码的可扩展性,我认为应该更注重一般性普通性的想法,而不能因为想到满足某一次作业取巧方法而窃喜。每次写代码前应该进行充分地思考一般性和可扩展性。
bug
对于找bug这一点,确实值得我反思。每次互测被找出来的bug不是一些很边界的数据,反而是一些很常规的数据。这些bug其实通过覆盖性测试可以很容易找出来。前两次的bug主要是格式错误考虑不全导致。 对于第三次作业,陷入了超时的坑,导致两个强测点没过,这一点应该是我代码架构的问题,如果用到继承方法,我的许多方法都能够得到化简,这个是知识储备不足和面向对象思维的锅(太菜了)。
Applying Creational Pattern