OO第一单元作业总结
前言
第一单元的作业,我做得并不好,或者说是很烂。但是总结还是必要的,发现问题才能有所改进。总结一下自己完成第一单元作业时的错误,算是痛定思痛,给自己敲个警钟吧。
1程序结构分析
1.1数据度量分析
通过DesigniteJava对代码进行分析,可以发现,虽然我使用了很多类,也进行了一定程度的抽象(例如使用Factor接口),对数据进行抽象统一的管理。但是,其中的Parser类与Factory类的代码行数远超过其他类。主要原因是这两个类是主要用于字符串解析的。同时,也可以看到,这两个类的内聚程度不高,我自己书写代码时也意识到这两个类之间的耦合程度太高。特别是Factory类,本是想尝试使用工厂模式,但是却背离了工厂模式的初衷,在该类中对字符串进行了一些分析。在今后的作业中我要努力避免这种质量低的代码出现。
1.2UML类图分析
从UML类图也可以看出,Parser和Factory类过于臃肿,业务逻辑不清晰。并且,应当考虑将Sin与Cos类再进行抽象出一个三角函数类。
2BUG分析
2.1第一次作业
第一次作业中,由于测试不到位,在for-each循环中使用remove,导致容器元素改变,造成RE。
2.2第二次作业
第二次作业中,符号解析出现了错误,导致大片WA。
2.3第二次作业
第三次作业的问题较多,主要集中于项前以及‘(’前符号的分析以及对嵌套内的WF分析。还有递归时出现了死循环现象。
2.4BUG总结
可以说,第一单元的作业,我的测试是十分不到位的,覆盖性很差,本来很容易找到的BUG却没有发现,白白失分。而第三次作业的BUG,我认为主要原因是由于代码设计上出现了很大问题,逻辑本就有些混乱,再加上完成后测试的时间已经不多,导致了出现诸多问题。在接下来的学习中,我认为我还需要提升的一个很重要的方面是测试用例的书写,以及测试方式的学习,不能全部依赖评测机。
3互测hack策略
在BUG分析中已经提到,我的测试做得很不好。在hack阶段,自然也就缺乏针对性。在1、2次作业时,由于代码量还较小,我会阅读同学的代码,以找到针对性的错误进行hack。然而在第三次作业,代码量较大,逻辑也比较混乱,我在互测阶段基本上只是使用了自己简单测试时出错的几个样例。
我认为自测与互测是相辅相成的,正如老师所说,知道在哪里出错才能找到错。所以,在今后的学习中,我希望自己能够将测试的水平与方法逐步提升。测试的问题也是我认为自己在第一单元学习中最大的问题。
4代码重构
我认为在核心数据方面,我的处理基本是没有什么问题的(除了还需要进一步优化输出)。
最大的问题出在解析输入上,如果对代码进行重构,我认为我会尝试使用同学们提到的自动机+小正则的方法解析输入。同时将Parser与Factory类的功能进行分离。我考虑创建几个专门解析某种字符串的类,如:用于解析三角函数、用于解析幂函数的类,解析完成后将参数传入工厂类进行对象的创建。
5对比与心得体会
研讨课上,听了几位同学的分享,自己私下也去请教了其它同学。我觉得自己的代码主要是在解析输入时,没有把功能区域划分清楚。同时,对工厂模式的使用也不得精髓。老师的讲解也让我对重构代码有了新的想法。比如,化简并不一定在求导、解析输入的过程中进行。而是应该把输入、储存、化简三部分独立开来。这一次作业确实给了我很大的打击。在下一单元的作业中,我应该更加注重测试样例的构造,以及动手写代码前,要把思路捋清楚。所谓“磨刀不误砍柴工”,大抵如此。