面向对象 第四单元总结

面向对象 第四单元总结

本单元作业的架构设计

通过认真阅读助教给的第四单元手册,我们不难得到UML类图、顺序图和状态图各自的组成元素和整体结构。因此,我们既然要对这三种图进行分析,那么我们分别建立起这三种图的元素及其结构关系即可。

首先是类图,类图中主要有三种元素,分别是Class、Interface和Operation,我分别设置了MyClass、MyInterface和MyOperation与之对应。此外,MyClass和MyInterface都实现了ClassInterface这个接口,它规定了类和接口共有的一些方法,便于后续对于类和接口的混合引用。

其次是顺序图,顺序图的整体结构相对简单,我只重新实现了MyInteraction和MyLifeLine。其中,MyInteraction中存储着对应的MyLifeLine,而MyLifeLine中存储着UmlMessage。

最后是状态图,MyStateMachine中存储了MyReign,MyReign中存储了MyState对应所有的状态节点,MyState中又存储了从该状态出发的所有状态转移MyTransition和邻接状态节点。

在完成各图元素的实现后,需要对输入的数据进行层次化的解析,反映在代码中即为多次顺序遍历。我设计的解析方式如下:

  • 类图:首先解析Class、Interface,再解析Generalization、InterfaceRealization、Operation、Attribute,最后解析Parameter
  • 顺序图:首先解析Interaction,再解析Lifeline,最后解析Message
  • 状态图:首先解析StateMachine,再解析Reign,然后解析State,接着解析Transition,最后解析event

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

第一单元

第一单元是我们第一次正式接触到面向对象的思维方法,所以这个单元我做的异常艰难,每次都要花大量的时间去构思作业的架构,然后在实现的过程中再不断推翻重来。不过,也正是这个单元让我真正开始领会到了如何使用面向对象的方法来解决复杂的问题——通过将复杂的表达式逐层剥开,分解成一个个元素,再使用递归下降的方法不断进行解析处理。同时,在这个单元我也意识到一个良好架构的重要性,不论是对于debug还是迭代增量开发,都能节约不少的时间。与之相反,一个偷工减料的架构注定会让你在之后的开发中付出应有的代价。

第二单元

第二单元就是号称地狱难度的“电梯单元”,果然名不副实。在这个单元中我们主要学习了多线程的思想以及多种不同的设计模式。首先,我们应当在诸多设计模式中选择最适合题目要求的一种,而我最终选择了生产者-消费者模型来解决本次的电梯问题。接下来多线程中的最难理解也是最难实现的部分——线程同步与互斥。在一次次难度不断提升的电梯作业当中,我们必须在完成题目给定要求的同时保证线程的安全。其中,我们既可以设置合适尺度的临界区并通过上锁来保证线程安全;也可以直接使用java中已有的线程安全数据结构。而又因为是多线程并发的情况,导致了代码的debug难度指数级上升。所以,这个单元消耗了我大量的时间精力,但同样也让我真正了解并一定程度上掌握了多线程代码的编写方法。

第三单元

在经历电梯月之后的第三单元显得容易了不少,其主要内容是对JML规格化语言的理解。本单元的作业已经给了我们整体的架构,因此我们只需要阅读JML语言并进行“完形填空”即可。但是在这个过程中,通过课程组的精心设置,我复习了之前学过的诸多数据结构与算法实现,比如并查集、最小生成树、最短路算法等等。在这个单元最需要注意的点一个是对于时间复杂度的计算与优化,另一个是JML语言描述中一些边界情况、特殊情况的考虑。

第四单元

第四单元和第三单元类似,UML图也给了我们很明确的结构,我们要做的就是重新建立起UML图中各的元素及其结构关系,从而实现对UML图的解析。而在经过前三个单元的磨炼之后,我已经能熟练的运用面向对象的思路,对UML图中各元素分别作为类来实现,并设置合适的抽象接口。

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

第一单元

在第一单元之初,我还没有掌握如何进行“自动化测试”,因此只是自己手动构造一些数据来进行边界测试。但是这样测试的结果就是覆盖性太差,往往会有一些意想不到的情况没有考虑到。但是在后续作业中,我和同学一同完成了自动化测试程序的编写,这个单元的测评其实相对容易,只需要随机生成数据之后使用sympy库进行比较即可。

第二单元

有了第一单元的经验,在魔鬼的电梯月我同样采用了手写测评机的方式来进行测试。因为本单元是多线程编程,导致代码的运行结果不可被复现,没有办法与同学进行对拍。因此,只能自己根据评判规则写出一个评测程序来进行测试,同时需要对死锁等问题进行检测。这样带来的问题就是如果对于规则考虑不全,就有可能检测不出一些隐蔽的bug。

第三、四单元

第三、四单元的评测机相对好写一点,同样也是自动生成数据后与同学代码进行对拍即可。但是,要注意评测机并不能检测出代码时间复杂度方面的bug,因此在这方面还需要自己多进行分析检查。

课程收获

一学期下来,我认为oo这门课程给我带来最大的收获不仅仅在于编程能力上,更重要的是让我学会了如何像一名真正的程序员一样来编写代码。面向对象编程这一高屋建瓴的概念下面包含着诸如代码风格、设计模式、规格化测试等等元素,而oo课程组做到了将它们融合到了几次精华的作业当中。虽然完成每一次作业的过程都是从痛苦开始,但是在完成作业的过程当中带给我的提升是巨大的。从指导书的阅读理解,到程序的架构设计;从代码的细节编写,到程序的压力测试;从课后的bug修复,再到最后的单元总结,每一个单元都是一趟完整的旅程。而在这个过程中,少不了与同学助教的交流讨论,也让我从中汲取到了更多的知识。

最后,我想感谢课程组老师们和助教们对于这门课程的付出,让它不再是一门平平无奇的专业课,而真正给我们带来了思想上的颠覆。

课程改进建议

  1. 首先,虽然课程组已经设置了预习作业来帮助同学们更快的入门,但是我感觉前两个单元的难度设计对于相当一部分同学来说还是有些过高。在我看到第一单元的作业时,往往会陷入沉思,完全不知道应该从何写起。因此,我认为是否可以在第一单元的课程中或者指导书中给同学们一些更明确的提示,在第二单元前多加入一些关于多线程的预习材料,来帮助本课程的难度过渡的更加平滑。

  2. 我认为在作业的具体规则描述上可以更加明确一些,以避免同学们在阅读时产生不必要的歧义。

  3. 最后,oo的作业安排是否可以压缩或者提前一些,因为最后两次作业就刚好进入了烤漆,给同学们确实带来了不少压力,完成作业的质量也会有所下降。

posted @ 2022-06-28 15:13  JackyZhuo  阅读(12)  评论(0编辑  收藏  举报