面向对象第四单元及课程总结

面向对象第四单元及课程总结

第四单元作业架构分析

本单元需要解析UML模型,主要依托树作为核心数据结构来表示UML各种类型的图,并在这个结构的基础上进行相应的查询操作。由于从输入接口中得到的UML元素是不可继承的,因此在utils.node子包下,运用适配器模式的思想创建了若干个官方包中UML元素的节点适配器类用于树结构的组织。在构建的过程中,利用构造类ClassModelConstructor以UML元素的id作为索引,从下至上逐层寻找元素的父节点完成构建。

第二次作业在第一次作业的基础上,增多了两种类型的图。由于在本单元作业的要求中,不同类型图之间是松耦合的,因此直接针对状态图和交互图建立相应的StateMachineConstructor和InteractionConstructor完成相应图的构建,另外直接在交互接口类中依托代表不同图的另外两类树,完成相应的查询函数。

第三次作业增加了UML图的有效性检查,具体来说通过两种方式实现:一部分直接在图结构建立的过程中进行记录;另一部分在所有图结构建立好后进行额外的查询。

三次作业迭代较为成功,系统进行了合理的扩充,没有进行重构。这里仅给出第三次作业的类图以示程序结构:

四个单元中架构的演进及OO方法理解的演进

第一单元:第一单元的主要任务是表达式求导。通过这个单元,了解并且掌握了对象,方法,属性,接口等面向对象的概念,并且基本上熟悉了面向对象编程的模式。在第一单元,特别是第一次作业中,我在编程中基本上没有为后续作业做迭代的准备,因此,虽然针对每次作业来说,程序的架构都比较清晰,但是从整个单元来看,每次作业都进行了重构,在不同的作业中只有比较有限的代码做到了充分的复用,没有给程序的扩展留下足够的空间。在架构方面,系统以与实际表达式中层次结构一一对应的元素对象为核心,完成表达式各层级元素的表示和求导功能,此外还创建了对应的元素解析器,用于对接输入,对各层级元素进行解析和生成。此外,还通过异常机制完成format error的判断,从而保持了主要业务逻辑和架构的清晰。

第二单元:第二单元围绕多线程电梯来进行。一方面,这个单元的各次作业迭代性比较强,往往系统中新的功能都是建立在原有的功能上的,而不是像第一单元许多新的功能和原有功能实质上在系统结构中是并列的关系;另一方面,我也吸取了第一单元由于没有考虑后续迭代而每次都进行重构的教训,在这一单元中,自己在程序可拓展性上比第一单元有较大的进步,大部分的代码都实现了服用。另外一方面,在这个单元中,第一次接触到了较为复杂的的多线程编程,完成了系统中不同角色之间的协调控制。

第三单元:第三单元中,主要工作是实现JML规格。这一个单元中,由于基本上要实现的功能都和一个方法对应,而方法已经给出了规格,因此在程序架构方面,并没有太多特别的地方。在这一单元中,对程序的效率有一定的要求,因此在许多地方引入了冗余数据以空间换时间。

第四单元:第四单元围绕的是UML解析。在此单元中,主要通过包装器和树结构来组织各类UMLElement,同时,也采用了冗余数据来提高程序效率。

四个单元测试理解与实践的演进

在本学期的OO课程中,除了面向对象的编程方法,我觉得收获最大的方面就是在测试上了。

从自己开始接触编程以来,自己一直都没有很重视测试这个环节,潜意识里,往往觉得看到了一两个简单的样例实现以后编程的工作就完成了,又或者是过度依赖课程系统的评测服务。然而随着自己以后慢慢走向工作和研究,测试将必然越来越依靠自己,而因自己测试的态度和能力不足而造成的代价也必然远不止会是在某次作业的分数不太高这样简单的事情上。而通过OO课程,我觉得自己在测试方面无论是意识还是能力上都有所提升。

在第一单元中,通过研讨课和讨论区中大家的分享,我学习到了搭建自己评测机的基本流程和方法,并尝试利用python和shell进行实践。

第二单元中的多线程电梯系统中,自己还没有找到很好的多线程自动评测方法,只采用了构造特殊数据的方法,并通过构建测试类完成了数据向系统中的定时输入完成测试。

第三单元从完成难度上来其实相较于前两个单元并不高,但却是完成的最不好的一个单元,原因就在于对测试的疏忽。由于这个单元的架构比较简单,难度也不大,自己对作业的质量有所放松,因此在中测服务不严格的情况下,程序在提交的时候都存在者严重的bug,并造成了强测结果极差。但在这个单元中,对Junit单元测试开始了解并应用,最后也挽救了最后一次作业。

第四单元也是通过自己手动构建测试样例进行,但是在这个过程中有某些地方在编程及构建测试样例的时候没有考虑到。

总的来说,通过OO课程,自己的测试意识有了比较大的提高,但是在能力方面,还需要通过今后的学习和训练继续加强。

课程总结

我从面向对象这门课中确实收获了许多。除了面向对象的编程方法和Java语言以外,我还学习到许多宏观的编程思想,比如层次化和模块化设计、抽象与具化、生产者和消费者模式等编程模式等;此外,checkstyle、JML、UML等内容让我对规范化的程序设计开始有了了解;另外,上面也已经提到了自己在测试方面也是有比较大的收获。

三个建议

  1. 建议增多在实验方面的反馈。如果实验后老师进行重点讲解,或者在实验后公开实验的答案以供参考,我们也许会从实验中有更多收获

  2. 希望可以统一分享研讨课同学们所用的视频,这样不仅可以方便聆听的同学课后继续学习相关内容,还避免了分享的范围局限于某个小班,从而增加了研讨课分享的价值

  3. 对于多项式的任务,希望可以以辅助阅读资料等形式介绍更多与解析输入相关的内容

线上学习体会

对于OO,这个学期线上学习的体验还是很好的。在理论课上,录播视频的教学方式让自己的学习更加灵活和有针对性,对于一些较难理解的内容,可以反复观看相关的视频片段来进行更加充分的理解和吸收;在研讨课上,腾讯会议让我也有了很好的参与感,了解和学习到了很多其他同学的思想和技巧;对于实验课和课下作业,课程平台也提供了很好的使用体验,特别是在讨论区中,大家的分享对我的学习有很大的帮助。

OO课程给了我很好的学习体验,更是的的确确给我带了满满当当的收获。衷心地感谢老师和助教们的付出,也感谢自己所付出的努力。

原文地址:https://www.cnblogs.com/eleony/p/13166527.html