面向对象程序设计第一单元作业总结

面向对象程序设计第一单元作业总结

第一单元的作业是对于表达式的展开,这是我们从面向过程到面向对象的编程方式的过渡。从这一单元的作业中,我也是第一次了解到了层次化迭代的开发思路,逐渐了解了怎么设计自己的代码使得代码更加易于迭代和debug,学习到了怎么用git和其它工具维护我自己的工程。同时,在第一次作业中我也犯下了很多因为设计思路不熟悉的错误。

第一次作业

第一次作业是我写的最艰难的一次,因为对于表达式的解析本来就不熟悉,再加上对于面向对象的开发思路并不明确。后来通过借用training-advance架构,连续两个晚上才勉强在ddl之前写完了作业。第一次作业整体并不难,大部分同学强测也都是满分。我写的程序虽然满足了评测的要求,但是并不符合课程对于我们程序设计思路的要求。

整体架构

 

复杂度分析

 

其中,MainClass类承担的处理任务过重,这显然是我们不想要的。

这样设计的优缺点

我认为我第一次作业的整体设计并不能称得上是面向对象程序设计,应该算是用Java代替了C语言进行程序开发,在我的MainClass类中,对于读入的字符串进行了化简处理,这一步的化简虽然复杂,但是我将其写在了MainClass类中,并没有设计单独的类去解决化简这一过程。这样造成了程序的复杂度提高,也并不能很好的确定bug在类中的具体位置。

此外,对于类的化简,我将表达式简单的储存在了一个静态数组中,虽然能满足第一次作业的要求,但是他的可迭代性几乎为0,因此在第二次作业中,我将第一次的思路整体的推翻重来。不过也造成了我第二次作业的正确性出了很大的问题。因此在我们的课程中,工程的迭代性是一个很重要的开发点。迭代不仅能让我们的开发更加便捷,也能在很大程度上减少我们可能产生的bug。对于我们第一单元的面向对象开发,静态数组以及其它静态数据结构是很不适合的。不仅不利于迭代,同时也让代码的可读性变得很差。

第二次作业

整体架构

 

其中,TermKey和TriKey两个类是自己设定的用于比较哈希值的类。

复杂度分析

 

在这一次作业中,不同类的处理任务有些许改善,但是由于部分字符串处理过程保留在了MainClass类中,MainClass类复杂度仍然比较高。

这样设计的优缺点

从第二次作业开始,我才熟悉了面向对象的编程思想。我对第一次作业不成熟的代码进行了几乎全篇的重构。

首先是对于不同的因子的类的建立,在第一次作业的基础上,增加了储存三角函数的Trigonometric类。

此外,我重构了第一次作业使用的数组数据结构,改为使用哈希表储存相关的内容。其中,增加了TriKey与TermKey两个类,用作储存的哈希值,这里我认为重构比较成功的地方就是用自定义的哈希值去储存我的三角函数类以及最后的多项式。这样的架构使得我并不需要特别的类去化简所得的多项式,只需要在加入新的三角函数或者多项式时,先检测哈希表中有没有已经加入的相同元素,如果有,只需要让他们的值相加,不需要加入新的哈希值。

同时,化简方法我也进行了重构,第一次作业时,我只是简单的将多项式相乘,括号相乘的结果通过静态数组传递给下一个多项式类,但是加入了三角函数后,这样的方式显然不能满足我们的需求。于是,我将多项式中可能出现的括号相乘的情况,通过一个新建的多项式类,传递到原来的多项式中。这样便能够递归的实现多项式化简。我认为这样的构造可能会出现程序运行时间过长,内存占用比较大的情况。但是好处是这样能够实现任意层数的多项式化简,经过多次的测试并没有出现因为下降层数过多而错误的情况。在hack的过程中发现有同学的代码会出现这样的情况。

第三次作业

整体架构

 

复杂度分析

 

相比于前两次作业,这一次不同的类复杂度比较平均。MainClass类的问题也得到了改善。

这样设计的优缺点

因为第二次作业的架构比较适合我们重构,所以从第二次到第三次的迭代,我只需要改动三角函数的内容:从原来的因子改为多项式即可。

此外,通过二三次作业的开发,我认为字符串替换虽然不符合我们课程的期望,但是如果考虑周全,仍然是一种比较可行的方式。其中比较容易出错的地方有:自定义函数要先替换x,否则容易出现替换y,z之后,再替换x而出错的情况。此外,sum函数如果想要减少错误的发生,应该尽可能的在我们替换的结果上增加括号。主要有:累加时不同的多项式之间的括号,替换i时在i的两边增加括号。后者最容易在负数的偶数次幂的时候出现bug。我也因这一个bug被hack了5次。同时,sum函数的替换还有可能因为sin因子中的i而产生bug。字符串替代的方式容易看漏的点比较多,但是如果思考全面,我认为处理自定义函数仍然非常有效。

这一次作业中,sum函数的处理是比较容易hack的点,类似sum(i,-1,1,(i)**2)的情况,如果采用字符串替换的处理思路,就很容易出bug。此外,三角函数嵌套深度也是hack的重点。

总结

从第一次到第二次作业架构的改变,我逐渐改变了以前的编程习惯,开始向面向对象编程的思想转变,也了解了面向对象处理问题时区别于面向过程的优点。,在代码的复杂度上可以看出,从第一次作业到第三次作业,类的复杂度也趋向平均,不再有某一个类承担承担过多的处理任务,同时,架构也逐渐明确,每个类的功能分配逐渐合理。不过和其它大佬的代码相比仍有很大差距。

 

 

 

 

 

 

 

 

posted @ 2022-03-26 00:50  Avaleph  阅读(71)  评论(1)    收藏  举报