架构师之路 -UML 入门
什么是 UML
UML 是统一建模语言(英语:Unified Modeling Language,缩写 UML)的简称,它是一种由一整套图表组成的标准化建模语言,用于帮助系统开发人员来说明,可视化,构建和记录软件系统的产出。用人话说 UML 就是用图形符号帮助我们描述系统和设计系统的语言工具。
UML 最初由 Rumbaugh,Booch 和 Jacobson 三人于 1994-1995 合作开发,后面随着参与 UML 建设的组织越来越多,比如微软,甲骨文,IBM等等,UML 1.0 版本在 1997 年正式推出,随着不断改良完善,现在的 UML 版本更新到了 2.5。
为什么需要 UML
UML 最大的特点的就是定义了丰富的图形符号,可以很好地描述一个系统的内部结构或者一个业务流程,让我们应对现实问题能快速抽象建模;并且图表相比文字,更容易让我们理解和沟通,使用统一的规范也能减少人与人之间交流成本,是系统设计人员的必备工具。
如何用好 UML
要用好 UML 首先要认识清楚各种 UML 图,目前 UML 一共有 14 种图形,整体分成结构性图形,行为式图形和交互性图形三类。
结构性图形表达的是系统式的建模,有类图,对象图,包图,组件组,部署图,剖面图;
行为式图形强调的是系统中触发的事件,有活动图,状态图,用例图;
交互性图形则强调的是系统中控制流程和数据流,有时序图,通信图,时间图,交互概述图。
实体和实体关系
UML 作为建模语言,自然来不开对模型实体的描述和实体关系的描述。
针对实体描述,UML 主要提供以下概念:
参与者(Actor):用户在系统扮演的角色,这里的参与者可以是人,也可以是一个外部系统。
类:对一组具有相同属性,方法,关系和语义的对象的描述。
接口:一组操作的规范,没有具体的实现。
用例:一组由一个共同的目标捆绑在一起的场景,总是由参与者发起。
包:UML 中对模型进行组织的分组单位。
组件:一个系统中提供一个或者多个接口的封装模块。
注释:一个用来对元素或元素符号进行注解或约束时所用的符号
节点:表示具有一个内存和计算能力的物理元素
针对实体关系的描述,UML 主要提供 6 个 概念:
关联:描述一种拥有关系,如果一个实体单方向访问另一个实体,就称为单向关联,用一个箭头的实线表示;如果两个实体可以互相访问,那么就是双向关联,用两个箭头或者不用箭头的实线;箭头指向的一方就是被拥有者。
聚合:描述整体与局部的关系;属于当某个实体聚合成另一个实体的情况,通常用带空心菱形的实线表示,菱形指向整体,箭头指向局部实体。
组合:也是描述整体与局部的关系,但比聚合关系更要严格,组合关系的实体间伴随着的是相同的生命周期,就比如手与人之间属于组合关系,大雁与雁群属于聚合关系。但它的图形很类似,用带实心菱形和箭头的实线表示,菱形指向整体,箭头指向局部实体。
泛化:描述实体之间的继承关系,用带三角箭头的实现表示,指向的一方为父实体。
实现:描述抽象实体与具体实体之间的关系,类似泛化关系图形,用带三角箭头的虚线表示,指向的一方为抽象实体。
依赖:描述的是当一个实体的改变会影响到另一个实体时这两个实体之间的关系;比如汽车依赖汽油,如果没有汽油,汽车无法行驶,这里的汽车与汽油之间的关系就是属于依赖关系。图形表示用带普通箭头的虚线表示,箭头方指向被依赖者。
最后,再对上面的六种实体关系进行总结下,实体间关系按照从强到弱,依次是:继承 -> 实现 -> 组合 -> 聚合 -> 关联 -> 依赖。结合图形符合的特点,我们可以将继承和实现为一组,组合和聚合为一组,关联和依赖为一组进行分组对比理解,来加深记忆。
描述完实体和实体关系之后,再来看下 7 个常用的 UML 图,深入了解下。
类图
类图作为使用频率最高的 UML 图之一,描述的是系统中的类,以及类之间的各种静态关系,比如继承,实现,依赖等。类图中的类通常就是业务所涉及事物,如订单,员工等。类图中的类通常用三个矩形表示,最上面部分来标识类的名称;中间的部分标识类的属性;最下面的部分标识类的方法,如下图所示:
并且类与类之间存在的关系就跟前文介绍的六种实体关系是一致的,也会有关联、聚合、组合、继承、实现和依赖这六种。除此之外,通常在类图中两个类的关系是存在数量联系的,这种数量关系的表示形式主要有 1 (一个),0..1(零或一个),*(零或多个)这样三种,比如人与车的类关系结合数量可以用下面的简单类图描述:
有了类和关系的图形表示,我们就可以方便地表示类与类,类与接口或者接口与接口之间如何协作,使用类图能帮助我们更好理解业务实体间的联系。
用例图
用例图主要描述系统的功能需求,结合参与者(Actor)和用例,以及系统的关系,帮助我们从最终用户的角度设计系统,并且使得以一种可视化的方式理解系统的功能需求。
用例图主要由人型符号的参与者,用例,连接和系统边界组成。参与者表示用户的概念;用例表示具体的系统功能,通常由动词+名字方式命名;通信连接用来表示参与者与用例之间关系;系统边界可以是整个系统,或者某个特点模块。
使用用例图是帮助了解系统功能需求的一项重要手段,但要知道的是它表现的是系统外层交互,表达不了系统内部的类之间的任何关系;并且不要在一个用例图中包含了太多的用例,最好能根据业务功能划分,形成多个用例图来呈现关键的功能需求。
时序图
时序图根据时间序列展示实体如何进行协作,它展示了在用例的特定场景中实体如何与实体对象交互。
时序图主要的图形符号有参与者,生命线,活动,消息调用,消息返回,自我消息,递归消息,创建信息
,销毁消息,持续消息组成。时序图在垂直方向上以发生的时间顺序显示消息调用的顺序,在水平方向上显示消息调用到的实体,借助时序图即使是非程序员也能大体看懂系统或者模块的顺序交互过程。
时序图擅长表现对象间,组件间的协作过程,当需要了解单个用例中多个对象间的行为过程时,可以使用。
状态图
状态图描述实体的不同状态和该类的状态转换过程,通过它能清楚看到实体的整个生命周期。状态机关系图通常用于描述实体与状态相关的行为,并且实体对同一事件作出不同的响应取决于它处于什么状态。
如下图所示,状态图的符号有初始起点,实心圆表示;状态之间的转换,带箭头的实线表示;状态,圆角矩形表示;终止点,内部包含实心圆的圆表示。要绘制状态图,首先绘制起点和一条指向该类的初始状态的转换线段。状态本身可以在图上的任意位置绘制,然后只需使用状态转换线条将它们连接起来。
我们经常使用状态图来描述业务中一个关键实体在多个用例中的行为和状态变化情况,帮助我们理解不同状态小下实体行为的变化。
活动图
活动图表示在处理某个活动时,两个或者更多类对象之间的过程控制流,用于展示具体的控制流程。活动图最适合用于对较高级别的过程建模,比如公司当前在如何运作业务,或者业务如何运作等,相比时序图更加易懂。
活动图的符号集与状态图中使用的符号集类似,从一个连接到初始活动的实心圆开始,到内部包含实心圆的圆结束,活动间可以通过带箭头的实现连接,活动图还可以表达角色与活动间的关系,将角色在首部显示,在这里叫做泳道,通过跨泳道的信息交互可以更好的表达出对象间与活动间的信息交互。
活动图能清晰地表达事物的处理流程,是工作流建模和过程建模的重要工具。
组件图
组件图描绘了组件如何连接在一起以形成更大的组件或软件系统。它展示了软件组件的体系结构以及它们之间的依赖关系。这里的软件组件包括运行时组件,可执行组件和源代码组件。
组件图符号集合主要有组件接口,子系统,端口,关系组成,当我们需要将系统划分为组件,并希望通过接口来显示它们的相互关系或将组件分解为更低层次的结构时,就可以使用组件图来实现目的。
部署图
部署图描述软件系统如何部署到物理环境中去,表明了硬件配置与软件之间的关系。
部署图中的符号包括组件图中所使用的符号元素,还新增了一些符号,比如表示机器的节点符号,表示软件的构件等。
利用部署图,我们就能很方便地看出哪些软件部署在哪里地方,它们将如何彼此通信,因此使用好部署图,对于我们规划系统的体系结构和节点部署都有很帮助。
综合运用
说完上述常用的 UML 图,我们再来结合软件设计的三大阶段:需求分析,概要设计,详细设计来说明下每个阶段下,一般需要画哪些 UML 图。
首先是需求分析阶段,在此阶段主要就是明确好用户对软件的需求,定义清楚“要解决什么问题”,一般需要使用的 UML 图有:用例图,时序图,活动图,状态图。并且处于该阶段的相关人员为用户,客户,产品经理和项目经理等。
接下来在概要设计阶段,确定系统模块的划分和技术栈,说明软件的整体实现思路和关键难点,通常会用上的 UML 图有:时序图,活动图,组件图,部署图;相关人员为管理人员,开发人员和架构师。
最后一个是详细设计阶段,主要是正对概要设计进一步细化,说明每个模块的分工和实现细节,通常需要用到有 UML 图有:类图,时序图,活动图,状态图;相关人员为管理人员,开发人员和架构师。
在选择使用 UML 图时我们要明确了所要表达设计意图,选对合适的图形,才能发挥出 UML 图的价值,表达清楚问题和方案。
参考资料
版权声明: 本文为 InfoQ 作者【闻人】的原创文章。
原文链接:【http://xie.infoq.cn/article/dec02ba7889f362ee75cf74c7】。文章转载请联系作者。
评论