OO第一单元总结
Part1 第一次作业的框架与实现
类图
第一次作业我用了两个类进行实现,MainClass
类和Polys
类,通过分析,发现第一次作业最后去括号所得始终都可以用多项式进行统一表示,所以我就只用了一个Polys
类来管理整个表达式,它其中的HashMap<Integer,BigInteger>
用来存储多项式中,x的系数和指数。主要控制部分由MainClass
类来实现。
类的复杂度分析
OCavg
= Average operation complexity(平均操作复杂度)
OCmax
= Maximum operation complexity(最大操作复杂度)
WMC
= Weighted method complexity(加权方法复杂度)
由于本次作业我只用了两个类来实现,导致了单个类的复杂度特别高,尤其是MainClass主类,在其中运用了多次if-else
导致了复杂度很高。
方法的复杂度分析
CogC
:cognitive complexity 认知复杂度,表征代码可读性
ev(G)
:Essential cyclomatic complexity 基本圈复杂度
iv(G)
:Design complexity 设计复杂度
v(G)
:cyclonmatic complexity 圈复杂度
可以看到,MainClass类中的main方法的复杂度极高,这主要是因为其中大量的if-else语句,并且我将整个流程的主控部分都放到了这一个方法里导致。
Part2 第二次作业的分析
类图
此次作业我在上一次作业的基础上进行了改进,多增加了三个类。对于这次作业,我仍然采用了第一次作业的多项式的思维,只不过这次每一个式子不仅仅是多项式的形式,还加入了三角函数,所以需要多建几个类进行嵌套存储。我把每一项分成了系数*x的幂次方*三角函数(Poly)的幂次方
类的复杂度分析
可以看到在我大体的思想没有改变,也没进行重构的情况下类的复杂度依然主要集中于MainClass类和Polys类中。
方法的复杂度分析
可以看到方法的复杂度也主要集中于MainClass的main方法和Polys的Polys构造方法和toString方法,这样的设计是不好的,应该将这三个方法进行拆解,分成多个方法。
Part3 第三次作业的分析
类图
此次作业因为三角函数内部允许嵌套因子,所以我在第二次类的基础上去掉了原来的Poly类,而使Tri类内可以存在Polys类的方法。
类的复杂度分析
方法的复杂度分析
Part4 Bug分析
第一次作业:
我自己强测和互测均没有出现bug,但是由于化简没有优化好,性能分很低。在互测中我hack成功了6次。通过分析互测房中其他同学的bug可知问题主要出现在他们在化简时采用的是字符串替换的方法,而不是按照数学逻辑,这也给了我启示,优化不能通过简单的字符串替换来进行。
第二次作业
同样我自己在强测和互测中均没有出现bug,但是由于没有合理的运用三角函数倍角公式等进行表达式长度的化简依然导致性能分很低。在这次互测中我hack成功了1次。
第三次作业
这次由于我做了优化,但是在合并同类型的优化过程中出现了小失误,导致强测错了一个点,虽然侥幸互测并没有找出bug,但这也让我损失惨重,这给了我启示,做了优化后一定要进行充分的测试。
Part5 总结反思
由于我本人的假期生活太过放纵,忽略了对JAVA的学习,预习部分的作业也放到了开学再开始做,导致基础知识极其欠缺。虽然这三次作业都顺利完成,但是所用的模式并没有很好的运用面向对象编程思想,尤其是第一次作业的结构,根本就是面向过程编程。OO的第一单元给了我很大的教训,尤其是在写第一次作业时,我什么基础语法都不会,可谓是寸步难行。这次教训让我明白了假期不能完全就是放松,也要拿出一些时间学习,应该认真完成老师们和助教们呕心沥血留下的预习任务,虽然我在开学后补完了pre的内容,但是这也已经是第三周了,已经浪费了pre的意义,我在此深深的忏悔。经过这一单元的学习,我也深刻懂得了架构的重要性,一个良好的架构会让人心旷神怡,在debug过程中也会事半功倍,而像我写的这个框架想debug就会特别难受。
总之,第一单元的学习已经结束,给了我很大的教训,不过幸好我现在对基础知识已经掌握了。悟已往之不谏,知来者之可追!我要吸取教训,在之后的OO学习中充分运用面向对象编程的思想,设计出良好架构。