UML精粹3 - 类图,序列图,CRC
类图Class diagram
类图描述系统中的对象类型,以及它们之间的各种静态关系。类图也展示类的性质和操作,以及应用于对象连接方式的约束。UML中的特性feature,涵盖了性质property和操作operation。
性质property
性质可以以两种方式出现:属性attribute和关联association。属性是类方框内的一行文本(语法“visibility name: type multiplicity = default {property-string}”),关联是一根两个类之间的实线,方向从源到目标类,性质的名称及多重性放在关联的目标端。例如
性质表示为属性:
性质表示为关联:
性质一般解释为编程语言中的字段。
多重性
略。
双向关联
双向关联是一对性质,它们从两个方向连接在一起。例如,Car有性质owner,Person有性质cars。使用双向箭头更容易突出双向连接的关系。编程语言实现双向关联关系的维护比较复杂,一般在关联的一端维护,如果是1对多的关联,在多的这一端维护。
或者
操作operation
操作是类知道如何执行的动作,对应于类中的方法。
操作的语法:
visibility name (parameter-list) : return-type {property-string}
操作和方法method:操作是对象上可以调用的某些东西--例程申明--而方法是例程体。在多态情况下,两者是不同的。如果一个超类型有3个子类,每个子类都覆盖了超类型的getPrice操作,你有一个操作和4个实现它的方法。当然,人们通常会混用这两个概念。
泛华generalization
。略。
注解符和注释
。略。
依赖dependency
如果改变一个元素(supplier)的定义会导致改变其它类(client),那么两个元素之间就存在依赖。依赖的存在有各种原因:一个类发送消息给另一个类;一个类拥有另一个类作为其数据的一部分;一个类把另一个类作为操作的参数。只有当依赖直接和你要沟通的特定主题相关时,才有选择地展示它们。为了理解和控制依赖,你最好只在包图上使用依赖。
约束规则
画类图时,你正在做的大部分事情都是表明约束。关联、属性和泛华的基本构造已经描述了许多重要的约束,但还是有不能表达每一个约束。UML运行你使用任何形式来描述约束,唯一的规则是要把它们放进花括号中。例如,{不允许乱伦:丈夫和妻子不能是兄弟、姐弟}
何时使用类图。
类图是UML的骨架,因此你会发现你自己总是用到它。类图的最大危险是你可能只聚焦于结构,而忽略了行为。因此,画类图的时候,总是要结合某些形式的行为技术。
序列图Sequence diagram
交互图(interaction diagram)描述对象组在某些行为中如何协作。序列图是最常见的交互图,通常用来捕获单个场景的行为。下面是两张计算订单价钱的序列图,一张采用中央控制的方式,由Order来控制计算的过程;一张采用分布控制的方式,每个参与的对象完成一点计算,最后得到结果。序列图可以清晰地指出参与者交互的差异。名词解释:参与者participant,参与交互的对象;寻获消息found message,第一个消息,来自一个不确定的源;生命线lifeline,对象存活时间;激活activation,对象在交互中处于活动状态。
采用中央控制的时序图
采用分布控制的时序图
- 创建和删除参与者。下图展示序列图如何表示对象的创建和删除。
循环,条件等
下图是序列图表示循环和条件的一个例子,注意这不是序列图的强项,最好使用活动图或者代码本身来展示。把序列图当做对象如何交互的可视化,而不是展示建模控制逻辑的方式。
下面是对应的伪代码:
循环和条件都使用交互框interaction frame,框包含序列图的某些区域,可以划分成多个片断。每个框有一个操作符,每个片断可以有一个警戒条件。常见操作符有:
- alt,多选一的片断
- opt,可选的,等同于只有一个片断的alt
- par,并行
- loop,循环
- region,关键区域;片断一次只有一个线程执行
- neg,否定,片断展示无效的交互
- ref,引用;应用到另一张图中定义的交互。
- sd,序列图;
交互框是UML2新加的功能,在UML1使用迭代标记(iteration marker)和警戒条件(guard)来表示循环和条件。
同步和异步
UML2使用实心箭头表示同步消息调用,条形箭头表示异步消息调用;在这之前,人们也用半箭头表示异步调用,全箭头表示同步。
何时使用序列图
当要查看单个用例内的若干个对象的行为时,你应该使用序列图。序列图擅长展示对象之间的协作,不大擅长于精确定义行为。
如果你要查看跨越多个用例的单个对象的行为,使用状态图。如果你要查看跨越许多用例或许多线程的行为,考虑活动图。
如果你要快速探索多个多选一的交互,最好使用CRC卡,这样可以避免许多绘制和擦除的工作。使用CRC卡探索,然后使用序列图捕获定下来的交互。
CRC(Class Responsibility Collaboration,类-职责-协作)卡
下面是一个CRC卡的样例。
CRC式思考的一个重要部分是识别责任。一项责任是一个短句子,概况了对象应该做的事情:对象执行的动作、对象维护的一些知识或者对象做的一些重要决定。思路是,你应该能够拿起任何类,用一些责任来概括它。这样做能够帮助你清晰地思考类的设计。
协作者collaborator指需要和这个类一起工作的其它类,这样能帮助你思考类之间的链接。
注意不要列举大量的低级别的责任,这样容易迷失目标。
类图:进阶概念
关键词
使用关键词来标记一个符号,例如<<interface>>或者{interface}。
责任
描述类的责任。
静态操作和属性
使用下划线表示静态。
聚合aggregation和组合composition
一般来说,聚合和关联没有什么区别,组合强调对象的独占关系。
聚合的例子
组合的例子
派生性质derived property
可以基于其他值计算出来。在前面加上个斜杠/表示。
接口和抽象类
一个接口和抽象类的Java例子
使用小球-球窝表示法(UML2引进)
使用棒棒糖表示法(人们也经常使用的方法)
只读和冻结。使用关键字来描述{readonly},{frozen}。
引用对象和值对象。{value}
限定关联qualified association
限定关联是UML里关于数组、图、哈希和词典这些编程概念的等同物。
下图使用限定符表示Order和Order Line类之间的关联,说明在和一个Order的关联中,对应每一个Product实例,可能有一个Order Line。
从软件的角度看,限定暗示以下接口:
这样,到给定Order Line的所有访问都需要一个Product作为参数,说明这是一个使用键/值数据结构的实现。
在概念建模中,只在为了展示约束“在每个Order上每个Product有单个Order Line”时,才使用限定符构造关联。
分类classification和泛华generalization
人们经常谈论说类型化是一个is-a关系,但是要小心,is-a还可以有不同的含义。考虑下面的语句。
- Shep是一只博德牧羊犬
- 一只博德牧羊犬是一只犬
- 犬是动物
- 一只博德牧羊犬是一个品种
- 犬是一个物种
现在试着组合语句。如果结合语句1和2,得到“Shep是一只犬”;结合语句2和3,得到“博德牧羊犬是动物”;结合1、2、3,得到“Shep是一只动物”。到目前为止,一切都好。现在尝试结合1和4,得到“Shep是一个品种”;结合2和5,得到“博德牧羊犬是一个物种”。这些就不那么合适了。
为什么会这样呢?原因是一些是分类(对象Shep是类型博德牧羊犬的一个实例),一些是泛华(类型博德牧羊犬是类型犬的子类型)。泛华是传递性的,分类不是。可以在分类后跟着泛华,但反之不行。
要小心is-a,不要不合适地使用子类型化以及混淆责任。这个例子中,更好的子类型化测试是语句“犬是一种动物”和“每个博德牧羊犬的实例是犬的实例”。
UML使用<<instantiate>>关键字的关联表示分类。
下面的内容略
- 多重和动态分类。
- 关联类。
- 模板(参数化)类。
- 枚举
- 主动类
- 可见性
- 消息
UML精粹3 - 类图,序列图,CRC的更多相关文章
- UML学习(三)-----序列图
UML的模型中可分为两种,动态模型和静态模型.用例图.类图和对象图都是UML中的静态结构模型.而在UML系统动态模型的其中一种就是交互视图,它描述了执行系统功能的各个角色之间相互传递消息的顺序关系.序 ...
- UML精粹5 - 状态图,活动图,通信图,组合结构,组件图,协作,交互概述图,时间图
状态机图state machine diagram 下面是状态图的一个例子(一个城堡中的秘密保险箱的控制面板). 转换transition包括3个部分:trigger-signature [guard ...
- 转载:UML学习(三)-----序列图(silent)
原文:http://www.cnblogs.com/silent2012/archive/2011/09/14/2172219.html UML的模型中可分为两种,动态模型和静态模型.用例图.类图和对 ...
- UML精粹4 - 对象图,包图,部署图,用例
对象图object diagram 对象图是某个时间点上的对象在系统中的快照,也经常被称为实例图.一般在展示组合对象结构时比较有用.例如 组合结构的类图 一个时刻的对象图 包图package diag ...
- 从 Java 代码逆向工程生成 UML 类图和序列图
from:http://blog.itpub.net/14780914/viewspace-588975/ 本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM® Rational® Sof ...
- UML 序列图
序列图 序列图主要用于按照交互发生的一系列顺序,显示对象之间的这些交互.显示不同的业务对象如何交互,对于交流当前业务如何进行很有用.序列图是一个用来记录系统需求,和整理系统设计的好图.序列图 ...
- Visio画UML类图、序列图 for Java
参考文档: 1.百度搜索: 怎样用Visio 2007画C++类图 连接 https://jingyan.baidu.com/article/9f7e7ec07286e16f281554f7.html ...
- PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)
面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...
- UML 之 序列图和协作图
序列图(Sequence Diagram) 亦称为时序图或循序图,是一种UML行为图.它通过描写叙述对象之间发送消息的时间顺序显示多个对象之间的动态协作.它能够表示用例的行为顺序,当运行一个用 ...
随机推荐
- uva 818 (位运算 + 判环)
Cutting Chains What a find! Anna Locke has just bought several links of chain some of which may be ...
- UE3:SkeletalMesh的绘制流程
[目标] SkeletalMesh的绘制流程 [思路] 1 顶点缓冲流 静态数据流向 动态数据流向(紫红色箭头) 2 FGPUSkinVertexFactory.ShaderDataType.Bone ...
- git add 命令添加所有改动内容
git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件. 注意 -A 选项后面还有一个句点. git add -A表示添加所有内容 ...
- 省常中模拟 day2
第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...
- Http协议访问DataSnap Rest 服务器
用TIDHttp访问DataSnap Rest服务器,在服务器采用了用户验证的情况下,客户端需要注意下面的细节,否则不能正常连接. 假如服务器有如下的用户验证: procedure TSC.DSAut ...
- Cache-control使用Cache-control:private学习笔记
其作用根据不同的重新浏览方式,分为以下几种情况:(1).打开新窗口值为private.no-cache.must-revalidate,那么打开新窗口访问时都会重新访问服务器.而如果指定了max-ag ...
- ajax对象属性withCredentials
默认情况下,ajax跨源请求不提供凭据(cookie.HTTP认证及客户端SSL证明等).通过将设置ajax的withCredentials属性设置为true,可以指定某个请求应该发送凭据.如果服务器 ...
- 2014年5月份第3周51Aspx源码发布详情
HGM简单连连看游戏源码 2014-5-19 [VS2010]源码描述:这是一款基于WinForm窗体程序的简单水果连连看的小游戏.界面比较美观, 功能如下:该游戏可以显示当前关卡,还有剩余时间.重 ...
- 黑马程序员——【Java高新技术】——JavaBean、注解
---------- android培训.java培训.期待与您交流! ---------- 一.JavaBean * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector.在J ...
- rpm软件包管理
RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证. 下面我们就来逐一的讲解吧. 一. 安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i386.rp ...