UML是一门非常重要的语言,技术人员通过这样的统一语言,在进行方案制作、沟通等方面,都会有很多的便利,在工作中,遇到相应需求时也应该重新回看这本书,加深理解,温故而知新。
背景
“所有实用系统都会随着时间日趋复杂,不建模终会后悔。”
在我们开发过程中,经常需要写/阅读文档和开会。写文档是为了记录/了解程序设计,开会是为了需求分析、与大家沟通,这时就需要一套统一的建模语言来交流,否则各种图含义不明,交流不畅,就会导致分享和学习的效率低下。
笔者在写文档和开会过程中,因为上述问题苦恼多次,因此想要学习一下统一的建模标准,以更好地写系统建设文档。学习过程中做了一下简单的记录和注解,就有了这篇文章。
本文例子来源于网络,为了找便于理解的图,风格可能不大一致。如有错误,敬请指正。
正文
当前较为标准的建模语言就是UML,掌握UML就掌握了高效的交流手段。UML这三个字母的全称是Unified Modeling Language,直接翻译就是统一建模语言这里来简单介绍UML图的几种类型,并且配以案例。注意,UML不针对语言,但它是面向对象的。
简介
随着标准在改变,UML图的种类也在改变,但UML图表可大致分为结构性图表(Structure Diagram,表示系统的静态方面)和行为性图表(Bahaiour Diagram,表示系统的动态方面)两种,而行为图中有一类叫做交互图(Interaction Diagram,强调控制流和数据流)。下面简要地介绍了十三种UML图表。
结构性图表:
- 类图 (Class Diagram)
- 组件图 (Component Diagram)
- 部署图 (Deployment Diagram)
- 对象图 (Object Diagram)
- 包图 (Package Diagram)
- 复合结构图 (Composite Structure Diagram)
行为性图表:
- 用例图 (Use Case Diagram)
- 活动图 (Activity Diagram)
- 状态机图 (State Machine Diagram)
- 时序图 (Sequence Diagram)
- 通讯图 (Communication Diagram)
- 交互概述图 (Interaction Overview Diagram)
- 时间图 (Timing Diagram)
类图
类图是一切面向对象方法的核心建模工具,描述了系统中对象的类型细节以及它们之间存在的各种静态关系。
类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示。属性和方法中,“+”表示public,“-”表示private、“#”表示protected(friendly也归入这类)。
有三种主要的关系:
- 关联 - 代表类型之间的关系(一个人为公司工作,一间公司有多个办事处)。
- 继承 - 专为将实例关系图 (ERD) 应用于面向对象设计而设的一种关系。它在面向对象设计中的继承概念互相呼应。
- 聚合 - 面向对象设计中的一种对象组合的形式。
上图描述了消费者(customer)、订单(Order)、产品(Product)之间的关系。类与类之间常用的几种关系:关联、聚合、组合、依赖、继承、接口实现。
组件图
组件图描绘了组件如何连接在一起以形成更大的组件或软件系统。组件图(Component Diagram)描绘了组成一个软件系统的模块和嵌入控件。组件图比类图具有更高层次的抽象-通常运行时一个组件被一个或多个类(或对象)实现。它们象积木那样使得组件能最终构成系统的绝大部分。
每个组成部分在整个系统中负责一个明确的目标,并且只在需要知道的基础上与其他基本要素相互作用。
上图中,左侧为需求接口,右侧为供给接口,说明writer为左侧三个组件供给内容。
另一示例:
部署图
部署图(Deployment Diagram)用于对系统的物理结构建模。部署图将显示系统中的软件组件和硬件组件之间的关系以及处理工作的物理分布。
上图中,说明了几个硬件之间的关系,需要注意的是,几个节点(device,代表硬件或者软件)之间的关系,以及每个节点内部的工件(artifact,代表软件开发过程中的产品)。
对象图
对象图是实例 (Instance) 的表达,包括对象和数据值。对象图(Object Diagram)可以认为是类图的特殊情形,是类图元素子集,被用来及时强调在某些点,类的实例间的关系。UML对象图显示了系统中的对象实例如何在特定状态下彼此交互。它也表示那个状态下那些对象的数据值。换句话说,UML 对象图可以被看作是如何在特定状态下使用类(在 UML 类图中绘制)的表达。下面看对比案例:
类图:
对象图:
可以看出,主要是讲实例间的关系。
包图
包图(Package Diagram)用来表现包和它所包含元素的组织。当用来代表类元素时,包图提供了命名空间的可视化。包图最常用的用途是用来组织用例图和类图,尽管它不局限于这些 UML 元素。
主要考虑依赖关系,如果包里还包含别的包的话,就写到里面。除了dependency之外,还有use、import、access、trace等关系。
复合结构图
复合结构图显示类的内部结构,包括它与系统其他部分的交互点。也显示各部分的配置与关系,这些部分一起执行类元的行为。复合结构图可以包括内部零件,零件通过其互相交互或通过端口与外界交互。复合结构是一组相互关联的元素,它们在运行时进行协作以达到某种目的。每个元素在协作中都有一些定义的角色。
类元素已经在类图部分被详细地阐述,这部分用来说明类表现复合元素的方式,如:暴露接口,包含端口和部件。
用例图
用例图用来记录系统的需求,它提供系统与用户及其他参与者的一种通信手段。从用例的角度描述系统的功能需求,它是系统预期功能(用例)及其环境(参与者)的模型。
将用例模型想象成一个菜单,就像在餐馆中找到的菜单一样,通过查看菜单,你知道什么菜肴以及他们的价格,你也知道餐厅供应什么样的菜肴:意大利,墨西哥,中国等等。通过查看菜单,可以对该餐厅的用餐体验有个全面的了解。
活动图/流程图
UML中,活动图用来展示活动的顺序。显示了从起始点到终点的工作流,描述了活动图中存在于事件进程的判断路径。活动图可以用来详细阐述某些活动执行中发生并行处理的情况。活动图对业务建模也比较有用,用来详细描述发生在业务活动中的过程。
主要部分就是初始和最终结点、动作、活动、控制流,并且还区分泳道。
另一个例子
我理解活动图和流程图是较为相似的,流程图也是我们最常画的几个图。因此这里补充一下流程图的规范。
这里注意一下,流程图应该从上到下、从左到右;选择结构和循环结构用棱形,通常选择结构中,“Y”用直线,“N”用折线;同一路径的指示箭头只有一个,其余都只是线。案例:
状态机图
状态机图(state-machine-diagram)对一个单独对象的行为建模,指明对象在它的整个生命周期里,响应不同事件时,执行相关事件的顺序。
这里举一个之前做过的例子,使用状态机解析HTTP报文,刚好补充一下HTTP的知识。不了解HTTP报文结构的可以先google一下看。
从状态机:
从状态机三种状态
- LINE_OK ,完整读取一行
- LINE_OPEN,读取的行不完整
- LINE_BAD,读取的报文有误
从状态机每次从缓冲区读取一行信息,直至读取到 \r\n 表示读取到一行,同时将 \r\n 替换为 \0\0 便于主状态机读取该行,然后再将行起始标志定位到下一行的起始位置。
主状态机:
主状态机有三种状态
- CHECK_STATE_REQUESTLINE,解析请求行
- CHECK_STATE_HEADER,解析头部信息
- CHECK_STATE_CONTENT,解析正文
主状态机的初始状态是CHECK_STATE_REQUESTLINE,parse_request_line()函数中解析请求行,当解析请求行成功时,解析请求行内部函数将主状态转移至下一个状态。
当请求方法为GET时,请求报文没有请求正文,也就是说解析完头部字段后该报文的解析过程就完成了。解析请求行比较重要的一点是需要保存url,url对应客户端请求的文档。
时序图
时序图是交互图的一种形式,它显示对象沿生命线发展,对象之间随时间的交互表示为从源生命线指向目标生命线的消息。时序图能很好地显示那些对象与其它那些对象通信/交互。
时序图的重点在于对象+交互。
通讯图
通讯图也模拟用例的动态行为,但更侧重于显示对象的协作而不是时间顺序。其实际内容是一致的。
通讯图:
同样状态下的时序图:
可以看出,通讯图重交互,时序图重顺序。
交互概述图
一个交互概览图是活动图的一种形式,它的节点代表交互图。交互图包含时序图,通信图,交互概览图和时间图。 大多数交互概览图标注与活动图一样。例如:起始,结束,判断,合并,分叉和结合节点是完全相同。
交互概览图介绍了两种新的元素:交互发生和交互元素。
交互发生引用现有的交互图。显示为一个引用框,左上角显示 "ref" 。被引用的图名显示在框的中央。
交互元素与交互发生相似之处在于都是在一个矩形框中显示一个现有的交互图。不同之处在内部显示参考图的内容不同。
时间图
时间图显示了既定时间内对象的行为。跟时序图的横纵轴刚好相反,时间从左到右增加,生命线垂直排列。
主要关注状态和值的生命线。
总结
以上为UML图的简单案例以及说明,感觉日常工作中组件图、活动图、流程图、时序图、类图的使用较多,建议想要了解更多内容的可以点进参考资料或者自行查找。另外,在画图过程中,也不需要太过拘束,可以进行灵活改变,以更好地表达自己的意思。