OO第四单元总结及课程总结

OO第四单元总结及课程总结


18231169 黄思为


​ 不知不觉中,一个特殊的学期就这样过去了。OO课程也在第四单元的作业结束后即将落下帷幕。这篇总结博客便是我最后还要完成的任务。

1.本单元架构总结

​ 第一次作业我主要是实现在给定的接口,没有做特别地做架构设计,在此就不赘述。

​ 第二次作业时我便发现了我的架构设计存在很大的问题,又出现了“超级类”。所以在第二次作业时就将新增的功能做了“模块化处理”,并着手开始代码的重构,迎接第三次作业。

​ 第三次作业的类图如下:

类图

​ 我主要是将UmlElement根据自己的需要,创建了方便使用的类,并且将检查、查询的方法放置在了各个类中。如:MyUmlClass中有getAssociationListcheckForUml001等一系列对外提供的可调用的方法。myUmlGeneralInteraction类更像是一个中控类,对外提供各种方法,再由它去调用具体类的具体方法。由于还需要考虑查询重名的问题,我选择了一个MyDataBase类,储存所有的元素信息,并提供根据名字查询需要的元素的方法。

2.架构设计及OO方法理解的演进

​ 对于第一单元的作业,我犯了将输入/输出与优化混为一谈的错误。虽然看起来分出了很多类,但其实类之间互相调用,聚合度很高。那时候的我懵懵懂懂,荣老师说起把优化与输入分开来,我还觉得是多此一举:“那不就是相当于又输入了一次吗?”

​ 第二单元的电梯作业,我开始逐渐会去借鉴已有的设计模式。如生产者-消费者、观察者模式等等。虽然最后的架构也不是特别清晰好看,但我逐渐意识到了架构的重要性。在老师和同学一遍又一遍的强调中,我逐渐能够理解为什么要把输入和优化分开来。就如同我们不能让电梯接收请求并自己处理,需要有一个中间类来进行这个调度的过程。如果调度出现变化,我们才能更快地对其进行调整。

​ 第三单元,我对自己的架构设计很不满意。由于接触了新的领域——JML,我天真地以为只要按照JML规格去将代码实现出来即可。甚至一开始都没有考虑算法复杂度。后来也只不过是对算法进行了一些调整,而丢失了架构的设计。在研讨课上,我才明白,虽然这一单元我们关注规格,但架构设计同样重要。不能将给定结构实现就完事,这样的代码不具备可扩展性。

​ 这一单元,我吸取了第三单元的教训,没有只是单纯地实现接口(虽然在第一次作业仍是这样)。我明白了根据需求抽象出自己需要的类,类之间相互合作。就像荣老师说的,好像好几个程序员在一起完成一个任务。并且,这样做了以后,我发现作业的迭代就更加便捷,我不需要改动或只需要简单改动已实现的功能,便可以实现功能的扩展。

​ 虽然对架构设计和OO方法还谈不上理解有多深刻,但是我好像能够理解为什么要把输入和优化“分而治之”。我个人觉得这像是一种“模块化”。当完成了一个项目,我会惊喜地发现:“诶!上次实现的这个功能,把这个类取出来就能够复用了!”

3.对测试理解与实践的演进

​ 第一单元,我的测试便是手动构造一些数据进行测试。这样的方式效率低、覆盖面窄,没有起到很好的效果。

​ 第二单元作业,是多线程问题,更加难以调试。我学会VisualMachine,对出现死锁时的状态进行一定的分析。但是仍然没有一个有体系的测试方法。

​ 第三单元作业,我终于接触了早就有所耳闻的JUnit测试。在Junit中对写出的代码进行分块、分类的测试,让我的代码少掉很多的低级错误。由于还不是很熟悉,对Junit的使用也仅仅是停留在一些简单测试。但是在这个单元,我尝试写了一个对拍器。通过自动生成样例,并将多个同学的运行结果进行比对,也发现了不少错误。

​ 第四单元,由于类图难以自动生成。我主要将测试集中在具体方法,针对某一方法构造特殊数据对其进行测试。

​ 在四个单元的演进中,我在尝试新的测试手段,并做了一些自动化测试的小尝试。我从自己的作业经历来开,测试的时长基本是与最终分数成正相关的。比如在第三单元中,第一次作业由于掉以轻心,几乎没有测试,悲惨地在强测中获得了0分,而这本来是进行一点点测试,增加两行代码便可以解决的问题。也有在认真测试、对拍后,在强测中获得满分。所以,我觉得测试对于一个合格的程序员,是必不可省略的工作过程。毕竟,谁也没有把握一遍AC。也许会是大的设计问题,但更多的却是在小地方出错,出很“愚蠢”的错。充分的测试,有很大概率能够帮助我们避免这些让我们“后悔”的错误。

4.课程收获

​ 首先,四个单元的作业磨炼了我的意志品质。每单元的第三次作业,总是能让我在电脑前抓耳挠腮。但最终,我也没有遵从心里那个“算了不写了”的想法,而是努力地完成了每一次作业。也许设计不好,甚至很差,但起码我的每次作业都有效了。
​ 第二,显而易见的,我的代码量提升了,对Java语言的一些机制、特性了解地更加充分了。

​ 第三,我意识到了规格的重要性!在第三单元作业时,我曾吐槽过JML规格,觉得它繁琐,读懂它都需要很大的力气。但就是在那个单元结束后,我收到了来自同学的求助,是一个很简单的小任务,输入一些数据,弹出一些提示框等等。他发给我的作业,完全没有规格,我看得实在是云里雾里,根本不知道需要怎样的一个效果,那时候,我才怀念起规格的好,意识到有一个明确的规格是多重要。

5.改进建议

​ 对于JML工具链的使用或许可以出一个更加详细的教程。在百度上一搜全是往年的博客实在是太绝望了。

​ 适当地调整每单元三次作业的难度分布。毕竟三次作业的用时是一样的,但是有时第一次作业非常简单,一晚上就可以完成,第三次作业却及其繁琐。不过,我也明白这样是让同学们在第一次作业就更多地考虑架构方面。

​ 对于研讨课可以规定一些主题,这样可以在研讨课前更好地进行准备,也能更好地参与到研讨中。

6.线上学习体会

​ 这真是非常特殊的一个学期。也不知道在未来,会不会课程真的都变成线上了,而不是因为疫情。对于一门理论与实践相结合的课程,我认为线上与学校授课的差距不是特别大。因为我们不需要特定的仪器,一台性能尚可的电脑就够了。但显而易见的,线上的模式可能使与老师面对面交流的机会减少,也没有课堂的氛围。

​ 对于研讨课,我也不知道线下的效果如何,会不会因为线上讨论,有更多同学敢于发言了呢?

​ 最后,要特别感谢各位老师以及助教,在特殊的一个学期为我带来了一门如此精彩的课程。

posted @ 2020-06-19 11:42  WilliamHuang  阅读(127)  评论(0编辑  收藏