数字化转型与架构 - 架构设计篇|建模之“聚类”
类图是系统建模设计的最后一步,完成类图设计之后就可以进入正式的编码阶段。类图明确了类之间的层级关系和类之间的逻辑结构,是展示系统代码结构的最好可视化工具。
类图如何演变而来?
类图中的组成元素是类和类之间的关系,下面我们要先从类讲起。类是面向对象编程(Object-OrientedProgramming,OOP)中的核心概念,也是面向对象编程与面向过程编程的最大差异。
面向过程编程把程序看作是一系列连续的命令,每个命令完成特定的任务。程序按照线性顺序执行,从一个命令执行到下一个命令。面向过程编程可以把一段代码片段定义为一个函数,这个函数可以看作是新定义的命令。面向过程编程通过自定义函数实现了代码的隔离和复用,但是随着程序规模的增大,代码难以维护和扩展。特别是全局数据容易导致命名冲突和不稳定性。
面向对象编程把程序看作是一组相互关联的对象,对象既包含操作(方法)又包含数据(属性)共同完成特定的任务。程序按照对象之间的交互顺序执行。有相似属性和行为的对象聚集到一起称之为类,它是对象的一个“模版”,它代表着对象又不是对象本身。面向对象编程通过类实现了封装、继承、多态等功能,提高了代码的可维护性、可扩展性和可重拥性。
类图如何绘制
类图中除了类自身包含的属性和方法,更重要的是类与类之间的关系。类之间的关系包含以下几种:关联、泛化、聚合、组合、依赖。
关联:关联表示两个类之间有协作关系,但两个类并不一定是对方的一部分。例如:顾客在商场注册为会员,商场和这个会员就存在注册关联。
泛化:泛化表示一般类与特殊类之间的继承关系,父类是一般类,子类作为特殊类是父类的一种特例。子类除了继承父类的属性和方法,还有自己独有的属性和方法(独有的方法可能是对父类方法的改变)。例如:VIP 会员是一种高级别的会员,除了拥有基础的会员权益还拥有额外的权益。
组合:组合表示整体与部分之间的关系,但是部分无法独立于整体而存在,会随着整体一起消亡。例如:会员参与商场的营销活动或购物获得积分。当会员注销时,积分随之清零。
聚合:聚合表示整体与部分之间的关系,但是部分可以独立于整体而存在。例如:订单是会员购物的记录,同时也是商场销售的记录。当会员注销时,订单不会随之消失,仍然会保留在系统之中。
依赖:依赖表示一个类使用了另一个类,并且自身的改变可能会影响到另一个类。例如:会员购物完成订单之后,系统会为用户分配新的积分,积分因为订单的状态改变而随之改变。
下图是一个会员视角的类关系示例图。
类图关系示意图
类图中类与类之间会呈现出天然的聚集和分散的形态。聚集在一起的类,它们的关系更紧密,任意一个类的改动可能影响到相邻类的变化。而分散的类相对独立,可以很好的通过接口隔离内外部的变化。从业务视角看,这就是不同类所处的领域不同。在同一领域内,类与类之间更紧密交互也更多,跨领域的类之间影响越小,可以通过完善的接口定义进行隔离。
类是一种代码隔离的手段,系统是功能隔离的手段。当系统越来越复杂时,所有的类已经不适宜作为一个程序存在,而是由多个小型程序组成一个大型系统的架构。在二者之间如何用小型程序(微服务)进行隔离,我们也可以通过类图的“聚集”程度进行划分。
一个完整的可视化系统从人机交互的视角,可以分为视图、控制和模型(数据)三层,即 MVC 三层架构。在前后端分离的系统开发架构下,前端交互软件通常包含 VC 两层,后段服务通常包含 CM 两层。所以在根据业务需求完成类设计之后,还需要对类进行重新的调整和补充,已满足实际开发的分层需求。
类图与其它模型的关系
我们参考前面数据模型的三层结构:概念模型、逻辑模型和物理模型。那么其它模型与类图和代码的关系如下图:
建模图形关系示意图
类图与用例模型的关系
类图中类的方法或方法组合,应该包含所有用例之中的功能。同一角色的功能应该聚集到一个类或者同一领域内的多个类。
类图与时序图和逻辑流程图的关系
每个时序图应该对应类图中的一个或者多个方法,方法数量等同于时序图中包含的系统角色数量。每个逻辑流程图应该对应类图中的一个方法。所有方法按照图中的交互要求和逻辑含义进行编码,方法内部可以调用其它方法保障代码结构清晰。
类图与状态机和并发模型
类图作为一个“静态”模型,它无法表示程序运行后的“动态”场景。程序运行过程中,使用类图“模版”创建出来的对象实例,才具有生命周期性和并发协作的特性。在类图中只能确认类对象是否包含了表示生命周期的状态属性。
类图与 ER 图的关系
类图中有数据类和控制类。控制类中的数据更多是运行过程中的参数,控制类与 ER 图中的实体相关,但是数据结构差异较大。数据类是程序从数据存储中获取数据的一种映射,即对象关系映射(Object-RelationalMapping,ORM)。数据类可以从实体中找到映射,但数据类为了便于程序使用,往往一个数据类的属性对应多个实体连接后的宽表。
类图不只在初次设计阶段有重要作用,在重构一个陌生系统时也可以通过代码逆向生成类图,通过类图快速了解系统代码的概况。类图不仅表示了代码结构,也反应出了业务关系的紧密程度。在领域驱动设计(Domain-drivendesign,DDD)过程中,通过业务领域分析构建领域模型,从而实现领域的划分。其实类图和领域模型的关系就如同先有鸡还是先有蛋一样。
版权声明: 本文为 InfoQ 作者【数字随行】的原创文章。
原文链接:【http://xie.infoq.cn/article/60ae054eb863073621c0d624d】。文章转载请联系作者。
评论