OO第四单元UML总结&学期总结

1 本单元三次作业架构分析

本单元作业的核心在于理解UML类图、UML状态图和UML顺序图中各个元素的含义以及不同元素之间的从属关系,对于本单元所涉及的UML元素关系,我梳理如下:

可以明显地看出,UML图中的元素是以树结构组织的,那么在编程过程中,也要建立树形结构组织数据,方便查找。

出于时间的关系,我并没有建立结点类,而是直接在类图、状态图和顺序图的接口实现类中,分别在构造部分筛选出此图中的元素,并存储到不同的数组中,再存储到Map中,Map的键值即为父亲的id。这样在实现时,可以逐层向下或向上寻找,比较方便。缺点就是面向对象的思想少了点,最好还是将每种元素打包成结点类,在其中设置数组字段存储信息,结构更为清晰。不过在开始编写前,简单分析了一下课程组给出的数据量和复杂度,认为本次作业的重点在于理解UML图,于是选择了更为简单的实现。

前两次作业都是元素信息的查询,总体难度不大,重点在于弄清楚每个元素它的parent_id是什么元素,它又能是什么元素的parent,查找的依据是什么(先找名字,再对id),只要能总结出如上的思维导图,这一部分也不太容易出错。对于类的查重,我设置了一个布尔变量,在第一次找到对应名字的类后置true,然后继续找,再次找到则抛出异常。

第三次作业难度有所提升,主要是对于需求的理解比较困难,需要多思考不同的情况。对于继承部分的相关检查,我都使用了bfs,在R002中对每个类或接口bfs看能否到达自己;在R003中,对于每个类或接口,设置一个HashSet记录它继承的全部类或接口的id,如果有重复就记录,最后抛出异常;在R004中,同样设置HashSet记录每个类实现的接口,先找直接实现的,再bfs找间接实现的。对于其他检查,只要认真读题理解意思,都较为简单。

第三次作业的类图如下:

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

2.1 第一单元

在第一单元时,我的编程还停留在C语言时那种面向过程的编程方式,常常一Main到底,导致架构臃肿,解题思路很不清晰,这也导致了在第一单元的第二次作业到第三次作业时进行了OO的唯一一次重构,也是最令人痛苦的一次作业。重构之后,我理清楚了每个类代表什么对象,它们各自实现什么功能,它们之间的关系是什么,并且用到了例如工厂模式的设计模型,使得整个架构非常清晰,令人赏心悦目,且这种清晰的架构也帮助我在强测中取得了不错的成绩。

2.2 第二单元

本单元的多线程又是一个全新的领域,虽然经过第一单元的练习,已经将参与交互的对象和各自的功能捋清楚了,但是二者之间的通讯和调度的时序问题有时候比较让人困惑。好在经过两次实验课中学习的生产者-消费者模型,Master-Worker模型加快了我对多线程程序对象之间协作的理解。

2.3 第三单元

从第三单元开始,课程的重点从设计对象转移到了对象之间的关系上。第三单元中各个对象的大部分内容已经由课程组给出,我们需要结合新学的JML规格,以及数据结构课里学习的各种图论算法完成查询功能。本单元我学到的最重要的内容,就是如何根据需求组织数据结构,寻找到好的容器,设计出好的算法,才能顺利完成本单元的作业。

2.4 第四单元

最后一单元学习了UML图,本单元作业的大部分代码仍然由课程组给出,实现的灵活度是很大的。最主要的任务就是理解UML图中元素的含义和关系,结合面向对象的思想,建立不同的结点类构成树结构,逐层查找。并且与第三单元类似,在作业中都有涉及一定的图论算法,需要我们有牢固的基础。

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

测试代码的能力是我在上学期计组课设中培养的,主要原因在于强测的数据点不再像大一C语言一样,是可以任意供我们尝试的,如果不做充足的测试,很容易最终出错。对于本学期的OO课程,我也实现了测试从无到有的转变。

在第一单元中,我仅使用了一些常规样例和边缘样例,对我的程序进行检测,导致测试的覆盖能力较弱,很容易出现意想不到的bug,在第三次作业中我就出现了强测也没有测出来的bug。

第二单元中,我仍然没有编写自动测试程序和脚本进行黑盒测试,只有白盒测试,然后使用JProfiler测试线程安全,所幸对多线程的理解比较到位,没出现问题。

第三单元中,我借助JUnit4编写了覆盖性较为广泛的白盒测试,并使用对拍器与其他同学的程序对拍进行找错。在第四单元中,我也采取类似的方法。

比较可惜的是我一直没有自己动手实现数据生成的工作,而是直接使用其他现成的数据点,我想在以后的课程中,可以花更大的功夫对自己的代码编写自动评测脚本,实现黑盒测试。

4 课程收获

经历了这学期的OO学习,我的代码能力进步了一大截。拿到一个新的问题,学会了使用面向对象的方法分析它,抽离出各个对象,明确各自的功能以及如何分工协作,明确架构的层次关系,这使得我的代码架构有章可循,不再像以前写的那样乱七八糟。当我们今后真正面对极其复杂的大工程时,OO这门课上学到的各种设计思想都能帮助我们更好的完成任务。

同时,OO在理论课教导我们面向对象的设计思想的同时,又在作业中穿插不同的新内容。比如多线程编程、JML规格语言、UML图,让我们了解了更多的编程方法、学会了使用更多的工具链,扩展了我们的能力范围。并且在完成作业的同时,也培养了我们自己动手查询资料,学习相关工具链的使用,学习编写测试的能力,今后可能没有人会去教我们一个东西如何做,这种自学能力非常重要。此外,在第三单元和第四单元中,又结合面向对象编程的特点,考察了很多图论的算法,巩固了我们的逻辑思维基本功。

总之,OO学习结束后,终于有底气说自己会编程了。

5 三个具体改进建议

①实验课能给出测试点的反馈以及实验的成绩。

②研讨课的质量可以得到更好的保证,减少一些过于基础的、与课程内容重复的展示出现,让听者学到更多东西。

③理论课有时将简单的问题变复杂了,不便于理解。在介绍理论时,可以与例子结合的更紧密一些,理解起来更直观。

6 线上学习体会

OO的线上学习和在校学习感觉并不会有很大的区别,所以今年的特殊情况并没有影响OO课程的进行,我本人的状态也调整的不错。此外,线上学习可以反复观看录播,并且有稳定的课件供应,学习起来更为自主灵活。再加上课程组非常负责,会把问题交待清楚,作业和实验的体验都不错。总之,OO体验非常好,感谢老师和助教们在背后的辛勤付出,希望OO越来越好!

原文地址:https://www.cnblogs.com/dawncat/p/13132116.html