北航OO第四单元总结

面向对象第四单元

本单元架构设计

第一次作业

本次作业实现的是一个类图解析器。除Main类外我创建了四个类,分别是MyClass、MyInterface、MyOperation、 MyUmlInteraction。其中前三个类分别对题目中的Class、Interface、Operation功能的扩展,UmlInteraction中实现了初始化的功能,将其余各个元素保存在新建立的类中。

第二次作业

对一些其他的元素建立了自己的类对存储调用等功能进行了扩展。类图是其中元素最多功能最复杂的,时序图与状态转移图的逻辑架构相对简单一些,有了前面的经验,这一单元的设计过程是比较顺利的。

第三次作业

本次作业增加了一些正确性判断的要求,我的判断过程是在MyUmlInteraction过程中进行的,由于初始化也在这一模块中进行,我可以方便的在这一模块调用任何一个图中出现的元素,从而方便的进行正确性检查。

三次作业回顾总结

我认为这一单元最大的收获是在层次化设计的方面有所进步,类图、时序图、状态图的构建保存对层次化设计提出了更高的要求,本次作业设计过程我有了下面的一些思考。

  • 增量开发过程一定要有一个良好的设计架构,而不是只要在原有基础上只要能实现新的功能就行。在我的设计中代码大量集中在了MyUmlInteraction部分,导致这个类的代码行数达到了七百行左右。实际上可以单独构建自己的类来实现不同功能,比如给初始化构建以各类,整个图构建一个类,分别实现各自功能,另外一旦感觉不对劲一定要及时重构,绝对不能在错误的道路上越走越远。

  • 遇到需要方便访问的地方可以无脑选用HashMap,这样可以快速存取元素,例如一个key对应一个元素的id,这样的保存方式非常适合需要大量访问的场景。

  • 按名字查询的地方可以选择HashMap嵌套一个ArrayList来实现,名字作为key,这样就HashMap一个键只能对应一个值的问题,同时又能通过名字方便地进行访问。

  • 使用HashSet可以方便的去重,不过需要注意的是HashSet中的元素一定要有合适的Hash值。

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

第一单元

在第一单元第一次接触面向对象设计构造就要完成表达式求导的任务,这对我来说无疑是一个巨大的挑战,这一单元的作业对整体设计思路逻辑要求极高,需要选择合适的结构保存数据,需要不重不漏考虑到所有可能出现的情况,我觉得这也是非常接近真正的应用开发的一次作业。

这次作业强迫我耗费大量的时间精力去学习java语法、去掌握各种容器使用方法以及区别、去学习正则表达式、去思考设计方法,一个单元的痛苦学习也让我在面向对象渐渐走入正轨。

第二单元

在我看来第二单元是最具魅力的一次作业,也是难度最大的一次。和第一次作业相比,可能少了 一些初始java时的青涩,但这一单元对于设计思路提出了更高的要求,设计过程的自由度也更大,我们可以随心所欲选择自己喜欢的一种设计架构,只要能实现最终的目标即可,这也是我最喜欢这一单元作业的原因。

不过另一个角度来看,多线程真的是一件很折磨人的事,不同线程同步运行需要考虑的无疑是更多的,也更容易出现不易察觉的bug,这一单元让我对多线程安全问题有了更深的理解,也让我面向对象的设计思维有了很大进步。

第三单元

第三单元主要介绍了规格,这与第二单元设计的随心所欲形成了鲜明对比。我们需要去仔细阅读JML语言,这一方法最大的优势就是它十分详尽细致,考虑到了所有情况,但同时这也是他的缺点,繁琐复杂。不过这一单元的设计过程无疑是最轻松的,无论出现什么问题我都可以在JML规范中找到我想要的答案,不过JML的规范也在一定程度上限制了设计思维,容易以一种固定的思维去设计。最后也是最重要的一定,一定要耐下心阅读JML语言的每一行每一句,不然很容易由于某一个bug导致评测时的死亡。

第四单元

这一单元主要考察了层次化的设计,需要理解清楚图中各个元素的逻辑关系,比第三单元的设计灵活很多,对时间要求较低因此我们也不需要太多考虑时间复杂度的问题。

对测试的理解

实际上我在测试方面花费的时间不是很多,只在某几次作业中尝试了一些简单的测试,不过一个学期的学习过后还是有了一些思考。

  • 测试一定要保证覆盖全面,不能遗漏一些边界数据,这也是通过评测所必须的。

  • 我们可以去思考如何使用随机性更好的方式去生成测试数据,这可以帮助我们全面覆盖。

  • 测试过程一定不要陷入到设计过程的思维中,不然会导致测试实际上就相当于自己设计出程序的几次运行,而无法真正实现测试的目的。正确的方式是根据题目要求,从要求的角度去设计测试方法。

课程收获

  • 代码风格很重要,好的代码风格对于代码阅读理解帮助很大。

  • 要多写注释,在进行大规模开发的过程中很容易忘记前面写的代码或设计的变量是用来做什么的,这个时候住是可以解决很多问题。

  • 要设计出扩展性良好的思路,通过模块化的方式设计出层次清晰的代码。

  • 学会使用继承接口多态,这样可以帮助我们理清代码逻辑,实现代码的复用。

  • 不同容器有着不同的作用,善用各种容器真的会对设计提供很大的帮助。

  • 写代码的过程一定要头脑清晰,不然很可能一个小时写出需要找一天的bug。

建议

  • 我认为互测可以往两个方向发展,一方面是放开互测的很多限制条件,让同学们能够去发挥自己的能力构造各种数据,以求代码涉及的完美,另一方面是让同学设计构造的互测数据尽可能接近评测集数据,达到培养同学们自主构造测试数据的目的。

  • 上机题目可以进行讲解或给出答案,我认为每次上机对设计过程思维的启发作用还是非常大的。

  • pre部分可以适当增加难度,帮助同学们更好的过渡到第一单元。

  • 第二单元关于电梯换乘的测试数据可以设计一些更具针对性的测试数据,不然无法真正考察到换乘的功能。

  •  

posted @ 2021-06-26 11:15  tiny_dreamer  阅读(82)  评论(1)    收藏  举报