最近项目处于设计阶段,需要画一些序列图,但是有些细节记不太清楚,所以找了一篇文章重新学习了一下.参考的是这边文章:www.uml.org.cn/oobject/201… 有些文字感觉说的很专业,就直接引用了,如果原作者有任何意见,请联系我
图的目的
序列图主要用于按照交互发生的一系列顺序,显示对象之间的交互.它的主要目的是把用例表达的需求转换为更加正式,精细的表达.用例常常被细化为一个或多个序列图.
基础
序列图根据定义的事件序列,产生希望的输出,它的重点是消息产生的顺序.图按照水平和垂直的维度传递信息: 垂直维度从上而下表示消息/调用发生的时间序列,而且水平维度从左到右表示消息发送的对象实例. 下面我们介绍常用序列图符号,熟练掌握它们可以更加清晰准确的描述对象之间的交互
框架
在UML2.0中引入了一个符号叫框架元件.很多人把它当作图形边化界来使用
除了提供一个图形化的边界外,框架元件也有描述交互的重要功能
注意:框架的标签以sd开始,具体格式如下:
图类型 图名称
UML规范提供特定的图类型文本值,比如:sd
代表序列图,activity
代表活动图,use case
代表用例图
生命线
当绘制序列图时,首先要放置生命线符号元件.生命线表示序列中建模的角色或对象实例.生命线包括上方的方格,以及一条由上至下的虚线.生命线名字放置到方格内.如上图的Bank,AccountLedger等.生命线的命名格式如下:
实例名:类名
上例中,类型名是Bank,实例名是buyersBank,并不是所有生命线都包含实例名. 序列图可以包含匿名的生命线
消息
为了便于阅读,序列图的第一个消息总是从顶端开始,并位于图的左边,然后发送消息给后序对象. 我们用带箭头的线从消息发送放指向消息接收方.
对于初学者需要注意的是,消息发送给接收方的过程就是发送方调用接收方方法的过程,如下图
Kid对象调用Toy对象的sing方法
因为消息分为同步和异步两种,并且我们往往需要知道消息执行结果,UML用以下线段来表示消息类型:
消息也可以发送给自己,比如我们常用的递归就是将消息发送给自己
约束
当对象交互时,有时必须满足一定条件消息才能传递给对方,在UML1.x,一个约束只能被分配到单一消息.方法是在消息名字前面加上约束的名字.约束的命名规则:[Boolean Test]
如上图中的
[balance >= amount]
,只有当余额大于转账数量时,才能进行转账.在UML2.0中,已经去掉了这种in-line
的约束,取而代之的是用了组合碎片的方式.
变体
变体就是一种组合碎片的一种,它可以指明在两个或多个消息之间的互斥选择,例如经典的if判断 :if-then-else
.我们用alt
来表示变体
比如网上购物,在结算时先获得此次订单的总金额,然后再检查账户余额,余额够则进行支付,并进一步通知物流.余额不够则更新订单状态,最终返回给用户
这里涉及四个对象,User,Payment,Bank和Delivery. User代表用户,它会发起支付请求,Payment代表支付对象,它会统计此次订单总额,并向银行账户发送查询余额的请求.Bank代表银行,它负责查询用户余额,以及支付账单.Delivery代表物流对象,它用来跟踪货物运输状态.
上图中,
user
对象调用Payment
对象来尝试支付,payment
收到消息后会先调用bank
的check
方法来检查余额.payment
获得余额后,如果余额大于等于订单金额,那么继续调用Bank
的deduct
进行支付,并进一步调用delivery
来创建物流对象.如果余额不足,那么调用自身的updateStatus
来更新订单状态,比如支付失败.
最后不论最终结果成功还是失败,返回消息给用户
注意else上方的虚线
选择项
选择项组合碎片与变体组合碎片类似,它只有一个操作并且永远不能有else
(没有理由,就是这么规定的)它使用opt
标签.例如有如下场景:当考试分数超过90后有奖励,否则什么也不干.
循环
循环碎片组合也很好理解,它使用loop
作为标签.例如在我们的系统中一般有重试功能,比如网络连接断开后重试三次
高阶用法
交互进行
上面介绍了序列图的常见用法,合理地使用它们会帮助你的团队更加清晰准确的理解项目需求和设计.此外,在UML2.0中引入了"交互进行"元件.它允许你设计更加复杂的场景.例如用户鉴权模块,它在其他模块中也会被频繁调用,因此我们可以设计独立的用户鉴权序列图,然后其他场景中引用.
交互进行用ref
来表示,并具有如下命名模式:
图类型 图名 [参数类型:参数名] [:返回值类型]
下图绘制了单独的用户鉴权个序列图Authorization
,它接受两个参数,用户标识和资源标识,并返回布尔型.
我们在删除产品时引用Authorization
.
跳转
跳转组合碎片用break
来表示,它表示一旦条件满足,将不再执行下面的消息.它常用于循环中的break或return,以及抛出异常等场景.
比如我们删除一个不存在的文件时,会触发异常,从而后序代码(发送邮件)无法进行.
并行
并行组合碎片也很好理解,它使用par
作为标签.比如我们使用微波炉加热时,其实是一边转动,一边加热
总结
写一篇图文并茂的文章真不容易,但是很值得.只有自己手动画一遍,才能充分了解和掌握各个细节 这篇文章描述了UML2.0的最新元件,并介绍了常用的符号使用.掌握文章中提到的各个符号用法,可以覆盖日常的绝大部分工作.当然,序列图还有更多的符号和细节,我们可以用到再查.
最后,感谢上面提到的连接,正是无数网友无私的分享才成就了当前无比丰富学习资源.