Loading

OO第四单元总结

OO unit4

本单元作业的架构设计

本单元我学到最重要的一个概念就是模型化设计,对于我们解析UML模型的结果后,我采取了极为经典的组件图模式来进行。

UML元素管理,我从原有的UML.Models源码中进行抽象,以对象元素为基础,管理关系元素为辅的模式,构建了如下的结构。

类图

顺序图

状态图

上述为元素层次之间的关联以及管理关系,其在从用户交互功能场景的角度,我们可以称之为实体类

框架

而除了这些储存对象元素,属性的实体类之外,我们还需要边界类控制类,来完成我们解析类图查询信息检查格式等等任务。这被我按照以下结构进行拆分。


图引用:北航OO课程组PPT-Lec14-模型及模型化设计

  • model:代表上述类图、顺序图、状态图中所有元素。
  • modelBuilder:与model有直接联系,是从源UmlElement类创建MyUmlElement数据的工厂。并且负责处理各个数据之间的管理关系,主要调用其handleXXXRelation函数,来完成不同图的元素关联关系构建。并将得到的最终结果,交给modelManager进行统一的数据管理。
  • modelManager:与modelBuilder有直接联系,是接受从modelBuilder创建的MyUmlElement,并提供同一的接口进行访问和筛选的管理器。其中,modelManager的直接管理对象为三种不同类图的顶层元素MyUmlClassMyUmlInteractionMyUmlMachine。并提供诸如getClassByName()查询,getAllFinalState()筛选等接口供modelValidator使用。
  • modelValidator:与modelManagermodel直接相连,该模块我将其设计为实现课程组要求的UserApi模块。其通过给定参数namemodelManager中查询相应元素信息,然后进行逻辑判断等,最后返回相应的值。

除上述主体框架部分,我还实现了算法与控制类分离,将对于过程中会使用到的深度优先、广度优先等算法进行了包装提供统一的接口以及访问方式,使得代码的可移植性和可替换性大大增强。

设计思维及OO方法理解的演进

对于这一过程我想是十分十分值得一提的。

第一单元尚未建立起良好的面向对象编程思想时,我的代码耦合复杂度非常高。虽然第一单元层次化的特征十分明显。但我也仅仅做到了数据层面的抽象,将不同的Term, Expression,单独建立。但未做到行为层次的抽象,既没有把控制逻辑,查询逻辑,操作逻辑等等单独包装。而是将其一股脑的塞进了与之相关数据类中,并未实现最小职责等基础思想。这导致我想替换算法,或者改进逻辑时,往往需要重构整个流程。万幸的是,我也在第一单元学习到了工厂模式,这为后来其他单元的设计打下了良好的基础。

而在第二单元的学习中,我逐渐明白了将行为抽象的好处,也正是从这个时候开始,我将管理数据的元素elevator,passenger与其控制逻辑controller等分开,并学到了诸如单例模式等优秀的设计模式。让我的代码结构层次更加清晰

到了第三单元第四单元,我也进一步体会到了层次化设计和抽象的好处。具体就是在本单元的设计中,将数据元素model,工程modelBuilder,管理modelManager,以及边界类modelValidator,还有算法等。分别包装,实现,形成了更佳良好的架构。

测试理解与实践的演进

我测试的一个进化流程大致分为三个阶段。

  • 最开始在第一单元和第二单元时,我都偏向于逻辑层次的正确性。既创建简单用例来测试代码的行为逻辑是否正确。这是最基本的测试,但往往面临覆盖性不足测试量不够等问题。难以发现边界条件下的bug。
  • 而后,为了进一步提高测试用例的可靠性。我选择编写数据生成器,使用全自动化脚本,生成测试用例,并进行比较。这样做的好处是测试量提上去了能够发现很多细小的bug,但覆盖性仍然不佳
  • 最后就是,构造特殊测试用例,通常是一些边界条件下的数据。这类数据的好处是其能测试到大家最容易忽视的点。也是互测中hack别人的好数据。

课程收获

  • 关于JAVA设计模式的初步理解与使用。
  • 关于面向对象层次化设计的架构理解与收获,这是本门课程带给我最珍贵的东西。
  • 开始接触并理解多线程编程的思想。这也直接是的我在另一门OS课程中,选择实现线程功能的挑战性任务。
  • 开始逐步接触自动化测试的思想以及如何编写测试用例等等。
  • 进一步规范了我的代码风格,架构风格。

课程建议

  • 对于课程的指导书,由于每次作业内容不少,所以指导书的体量内容也很大。很容易导致某一次作业中漏读某些信息,或者错误理解某些内容。这也导致了课程助教们,经常需要回答许多关于指导书理解的问题。希望以后能添加更多的说明用例,类似本单元作业的最后一次的RXXX系列。
  • 关于第三章JML。实话实说,虽然其是一门很好用并且也很出色的语言。但这一单元反而是我学到东西最少的一个单元,除了我需要耗费大量时间去理解JML,关键是这东西网上的资料也很少。我不清楚业界,或者那些地方是否在大力发展JML语言。但给我的感觉是,离开OO这门课程以后,我都不会再次遇到这门语言。这使得学习他的意义有所减弱。
posted @ 2022-06-28 16:41  carkham  阅读(43)  评论(3编辑  收藏  举报