OO终章

OO终章

终究没有画上圆满的句号。。。

UML学习总结

第四单元是UML的学习。对于UML的认识,我仅在前两单元要求给出代码架构的时候给出了其对应的UML图,只知道自己画过,除此之外的了解就很少了。这单元的难点就在于官方代码的阅读,大量的代码阅读加长了我的OO作业时间,不会有人等读完代码还不知道要干嘛吧(滑稽)?

第一次作业

构架

这次作业要求完成的是一个类图解析器。在阅读了所有的代码之后才具体看指导书的我发现不用阅读所有的代码。但没事,这样方便理解生成数据。本次作业几乎不涉及算法,但在设计层面给了我们较大的选择自由性。你可以选择杂乱无章的一堆hashMap和hashSet结构,一类到底;也可以将各类功能好好规划,建立自己的树状结构,在初始化的过程中渐渐把类图搭建起来。我选择的是后者。这也为之后的作业带来了很大的好处。

从图中可以看出,我写了MyInterface、MyClass、MyOperation、MyUmlInteraction的几个结构。在初始化的时候主要建立MyInterface、MyClass、MyOperation的结构,为他们添加各种属性。完成之后,就可以进行各种查询了。

这样的层次机构有很大的优势,体现在查询操作的时候,不用反复查询(单线程真好),直接设定属性存储之前的查询结果就好,这样会节省很多时间,提升性能。

bug

这次作业在课下有一些bug,但通过和同心讨论和对拍都最终解决了。主要还是理解上的差异,导致本次作业的bug频出。

第二次作业

构架

第二次作业增加了顺序图和状态图。那么,我们的树层结构就会更加复杂,需要增加更多的类。但整体思路不变。加上第一次作业的教训,我先看了指导书,稍微瞄了瞄官方代码我就开始了自己的代码构建。一晚上完成,还算比较顺利。

在上次作业的基础上,我增加了MyCollaboration、MyStateMachine、MyRegion、MyState的结构。同时为了代码风格500行要求,我把检测类进行划分,分出了init的结构。

bug

经历了第一次作业痛苦的课下debug之后,大家这次在写之前就开始讨论对于某个方法的理解,一遍过中测的我们又开始慌张,于是通过制造一些样例的方式来测试程序。最后还是挺过了强测。

第三次作业

架构

这次的作业主要是错误检测。这次的指导书也太难读了吧(没有责怪助教的意思)。我写的时候非常的纠结,写完之后也是找朋友们反复讨论对某几个方法的理解。各种检查主要还是依据了图论的一些基本算法,有了第三单元的积淀,实现其实非常轻松(然后我就把bfs写烂了??)。经历了中测一遍过之后,我已经有点飘了,没认真检查程序就去复习概统和离散了。

可以看到这次的代码没有很多的增加的新结构,主要是在每类中增加了几个方法来方便我们的检查。然后完善一下代码结构,进行一下隔分(代码风格分!!)。

bug

震惊!在本该画圆满句号的日子,竟然有人ctle!我寻思,10s的CPU时间都不够我用的么?我还优化了我的算法,不应该啊。在跑了一下程序之后,我发现了程序卡死了。在我进行了一些输出之后,我发现了我的bug所在。在第三类方法对类和接口的重复名称检查时,对于接口的父亲名字的聚集我用到了bfs,但是我的入队和标记指令放错了位置,导致有的接口反复进入,形成循环。在3行调整之后,结束了bug修复。当事人表示就是非常的后悔。。。

OO理解进化论

最开始对于面向对象的理解,就是老师在课上反复强调和过程有所区别。第一单元的实现,我并没有太注意这些,把强测互测看的很重,对性能进行优化,只看结果,不看实现。现在回去看当时的代码,觉得还是有点写的太功利了,结构并不是很好。如果不超过类的行数限制,我一般不会去分类。这样就导致了代码比较冗杂、可读性较差。

在第二单元,我接触了多线程,开始把自己的程序想象成一个一个等待调度运行的对象。在实现的时候,也在无意中将无脑写方法,转化成完善对象的属性和方便对象的查询和调度。代码比之前写的好看了一些,也是在这一单元深刻体会到了OO课程的难度。

在第三单元,最开始我以为非常的简单,因为看上去我们不用立足全局,只需要实现局部的代码即可,这有点像OS的代码补全了。但是,具体写的时候,我才发现,其实我们在实现上,想要达到强测和互测的时间要求,还是需要对代码进行精心设计的。因为,性能的优化是全局的,不能局部看几个方法那么简单。这单元教了我们OO学习更加细致的设计,只有将每一个方法细节去优化实现才能达到最终全局的优化结果,更深刻地体会到了OO和工程之间的联系。

在第四单元,加深了我们对于OO结构层次的理解。对象以及其属性、方法、操作、生命线等都成为了我们的要去丰满的对象,这给我们呈现最直观的OO层次。在构建代码的树形结构的同时,我们其实也在理解Java的各层次之间的关系,对OO有了更深入的了解。

测式演进

第一单元的测试,我就是无脑生成数据,然后利用python检验,什么模块测试,覆盖性测试都没有,就是使用较大量的数据硬钢。虽然性能和正确性都还行,但是这样还是很低效的测试,在跑了大量的数据之后证明了自己的程序有了一定的正确性。

第二单元测试好艰难。。我们每个人的输出都不一样,没办法对拍。我在不知道什么是正确的输出之后,只能通过一些条件限制知道什么是错误的。因为实在不知道怎么测试,就是根据楼层的停靠时间,人是否送达目的地,开关门时间和顺序,最后电梯上还有没有人等等来排除一些程序上的错误。最终还是目力抗下了所有。

第三单元,我接触到了JUnit。这个可以进行模块化测试。我不需要对所有的方法进行测试,只需要对我想测试的方法进行即可。测试从全局转向了局部。我们在写的时候对于JML给出的描述,在理解的基础上可以对测试样例分成不同的分支,书写测试,然后写完一个方法测试一个方法,更加高效地锁定bug。当然对拍也还是很必要的,JML是我读的,全覆盖测试是我写的,那怎么能保证全覆盖了呢?可以通过和他人的交流以及逛讨论区去减少自己少考虑情况的可能。

经历了前三个单元的学习,我知道了好的测试应该将随机测试和针对性测试结合起来。第四单元,我们可以自己写一些随机数据的生成来对所有个方法进行随机测试,同时,根据每个方法,生成一些有针对性的数据,进行针对性测试。比如检测部分,随机生成很可能规避一些错误。还是需要自己画一些uml图进行针对性测试。

课程收获

本课程的学习,让我收获很多(不吹不黑)。

首先,最直观的,写码变快了,写码多了。在OO的训练下,已经从最开始的2-3天写完作业到后期的1晚上写出来初稿,培养了我们写千行代码的能力。

其次,会设计自己的程序了。在见到指导书之时,脑海中开始构思设计框架了,而不是最开始只想每个方法应该怎么去实现。此外,还学会了面向对象的思想,并运用到程序设计中。

最后,学习了一些测试上的知识。最开始完全不会写评测的自己,现在也学会了一些写评测的方法,渐渐拥有自己的评测姬。

改进建议

说实话,我觉得OO课程体验效果真的很棒。没啥改进建议,希望继续提供这么好的体验效果吧。对,如果可以,可以在实验课后安排一下实验讲解,方便大家更好地掌握实验内容。

线上OO感想

OO是我感觉在家学的最高效的课程了。其他课程可能会稍有松懈。但OO一周一次的代码作业让我们不配松懈,时刻处于紧张状态。或许,在校上OO也会是在不同的场所肝代码吧。但遗憾的是一学期了都没见到我们的OO老师和助教们,仅在一次问卷中见到了几位老师不是很清晰的照片,建议在最后一次课的时候放上照片。

另外,实名感谢一些帮助我的小伙伴们(真的多亏各位神仙相助),感谢孙亦琦和我每周相约周二晚写码,一起爆肝。感谢陈天异、黄家威、吴陶然、黄思为分享测试数据,感谢汪昊霖和我探讨研究优化方法,感谢李嘉淳、胡雪瑜、任杰瑞和我讨论可能出现的bug,帮助我互测和强测提高正确性(以上叙述顺序纯属随机)。天呐,有这么多神仙相助,我也太太太幸运了!!

最后,感谢课程组的用心,感谢老师的耐心教导和陪伴,多亏诸老师每节课的随机提问,让我每节OO课都看的非常认真,真心祝OO越来越好!

完结,撒花!

原文地址:https://www.cnblogs.com/Beata-fry/p/13164421.html