重要技能
UML基础案例与应用(转)(可下载)
1.1了解软件建模的原因
1.2理解统一建模过程1.3什么是UML
1.4认识UML的构件
1.5寻找有效的UML建模工具
1.1了解软件建模的原因
1.1.1分析、设计与实现
依赖大量的分析,而不是设计,甚至也不是实现。
行业专家:谁要使用这个系统
重要提示:
1、模型是真实世界的简化。用模型表示系统的行为和结构。
2、使双方(需求方、开发方)更好地理解需要开发的系统。
1.1.2软件生命周期模型
三种:
瀑布型
螺旋型(迭代型)
增量型
1.2理解统一建模过程
UML(Unified Modeling Language):建模语言、建模方法(不是设计方法)
RUP(Rational Unified Process):统一过程应用于UML。即用UML来严格实施RUP。
软件开发过程:是将产品或者系统从概念形成为成品所遵循的一系列阶段。在RUP中有4个阶段:
初始阶段(Inception):确定要开发的系统,包括其内容及业务。
筹划阶段(Elaboration):实施详细的设计,确定系统的功能。
构建阶段(Construction):编写软件。
转换阶段(Transition):将系统交付给用户(rolling out)
1.2.1初始阶段:确定业务需求,建立用例模型。
1.2.2筹划阶段(重点):
设计团队从用例进行工作以得到对如何构建系统的统一认识。
用例分解----域、子系统、与之相关的业务对象设计(这是一个重要环节)----域模型---模型图---类和类成员模型
1.2.3构建阶段:
进行实际的软件产品构建。开发部分是一个增量过程。
1.2.4转换阶段:
1.3什么是UML
可以应用于任何软件开发过程的标记法和语义语言。
1.4认识UML的构件
主要构件:结构图和行为图
1.4.1结构图(Structural Diagrams)
类图和实现方式图
-
类图和对象图
类图(class diagram):用于表示不同的基础构件(类),它们之间的关系以及它们属于哪个子系统。类图包括属性、操作,以及许多类型的角色和关联。
对象图(object diagram):与类图非常相似,用于处理类的实例---对象。多用于具体示例的设计。前者是一般,后者是单独。
-
组件图和部署图
组件图(component diagram):用于说明系统的组件之间如何进行交互,它将显示源文件与类之间的依赖性,以及它们属于哪个组件。组件图成为UML核心功能。
部署图(deployment diagram):用于组件安装之后在哪里配置组件,以及这些系统如何交互建立模型。
1.4.2行为图(behavioral diagram)
用于显示组件、类、用户和系统之间的流程。
-
用例图(use case diagram)
包括用例和参与者,用来说明这两个集合之间的关系。它是分析阶段的起点。以求把系统的整个结构和有效性反映给非技术人员,它还可以图示化系统的主事件流程,也可以图示化选择流程。
-
活动图(activity diagram)
用于分析较复杂的用例中的行为,并显示它们之间的交互作用。活动图是用于对业务工作流程进行建模的。常用于表示较为复杂的业务活动,以帮助你确定出用例或用例之间及用例内部的交互作用。
-
序列图(sequence diagram)
用于显示参与者与对象之间,以及对象之间的交互作用。消息由参与者发送至对象,由对象发送至对象,再由对象发送至参与者以显示系统中的控制流。
-
协作图(collaboration diagram)
用于将类图带入下一个步骤。它表示了在域建模过程初期的各个步骤中所创建的对象之间的交互作用及相互关系。
-
状态图(statechart diagram)
用于对子系统的行为建模、对类与系统界面的交互作用建模,以及实现用例。用于分析和设计阶段之间的过渡时期,是可视化应用程序流程的极好方法。
第二章
用例图
重要技能
2.1定义用例图
2.2找到用例图建模的原因
2.3认识用例图的标记符组件
2.4理解泛化技术
2.5理解如何使用包含关系和扩展关系
2.6学习如何建立用例图模型
2.1定义用例图
它设计新系统的起始点。明确业务需求,是有关系统细节的最高形式。用例图说明的是谁使用这个系统以及他们使用该系统可以做些什么。
2.2找到用例图建模的原因
用例图为我们提供了系统的一个概览,对系统提供给用户的功能进行说明。
用例图与用例的不同之处:
用例简单地描述了用户要求系统所具备的动作。
用例图把用户、用例以及这两者包含在一个系统中,或者一个或多个子系统中。
同时用例图也是测试产品的一个好方法。
2.3认识用例图的标记符组件
解析一个用例图,可以发现它包含4个基本组件。
系统、参与者、用例、关系
2.3.1系统
系统是为用户执行某类功能的一个或多个软件构件。一个系统可能会有自己的子系统,它们是系统中被组织起来的组件。
2.3.2参与者
用于表示使用系统的对象,它可以是一个人或另一个系统,不要以实际人名命名,应该以参与者在系统中扮演的角色命名。
2.3.3用例
用例是用户期望系统具备的动作。在命名中不能使用冒号。因为在说明某个用例所属包时会用到它。
2.3.4关系
用例图的实质内容---关系(通信):由一条连接参与者与用例的线来图示说明。
2.3.5子系统
将一个大型系统分为更易于维护的构件,这种构件就是子系统。
如Development Environment includes Compile、Editor、Debugger、Source Control
2.4理解泛化技术
泛化是一种用于表示UML中项目的继承的技术。它可以应用于参与者和用例来表示其子项从父项继承功能,而且还表示父亲的每个孩子都有着略微不同的功能或目的以确保自己的唯一性。
2.4.1用例与用例的关系
2.4.2参与者与参与者的关系
2.5理解如何使用包含关系和扩展关系
包含和扩展是在两个用例紧密相关时,关联用例的两种方法。包含关系用于表示用例为执行其功能从其他用例引入功能。扩展关系则表示用例可以通过其他用例得到扩展。
2.5.1包含关系
包含着包含(including)和被包含(included)2种类型的用例。前者是一个从后者获取功能的用例。后者的功能被前者包含了。当2个以上的用例有相同的功能,则可以将这个功能分解到另一个用例中。或当一个用例功能太多时,可以用包含关系建模2个小用例。在已建立模型的系统中确定出被包含用例是十分明智的,因为这有助于确定系统中哪些功能可以重用,这也是基于组件设计和开发的主要益处之一。
2.5.2扩展关系
包含着扩展(extending)和被包含(extended)2种类型的用例。后者在一定条件下可以可选择地被前者中的功能扩展。一个被扩展用例可以有多个扩展点,而所有的扩展点必须对被扩展的用例为真。
扩展与包含关系相似,只是扩展只能在特定的设计点发生,称这个点为扩展点。
2.6学习如何描述用例
见成绩管理系统.mdl文件
切记:UML建模是一个迭代过程,它不是一个简单记录数据的过程。没有人希望你在第一轮建模时就把这个图拿出来。
2.7学习如何建立用例图模型
创建用例图的5项任务:
-
找出系统中的参与者和用例
-
区分用例的优先次序
-
细化每个用例
-
建立用例模型结构
-
建立用户界面的原型
切记:一对多,多对一
2.7.1找出系统中的参与者和用例
由系统分析员完成
2.7.2区分用例优先次序
由系统构造师完成:找出最关键、最艰巨、可以重用的任务,如Record Grades。
2.7.3细化每个用例
练习:构建一个用例图
销售产品系统的需求
第三章
活动图的工作流建模
重要技能
3.1定义活动图
3.2了解为什么建模活动图
3.3确定活动图的标记符组件
3.4学习如何使用条件
3.5学习活动图中的其它标记符
3.6学习如何建模活动图
活动图的作用:在面向对象的系统的不同组件之间建模工作流。用它能够演示出系统中哪些地方存在功能,以及这些功能和系统中其它组件的功能如何共同来满足前面用例图建模的商务需求。
3.1定义活动图
使用活动图为把用例带入下一级分析阶段的方式。
活动图用于系统分析阶段对系统充分描述,允许读者了解系统的执行,以及如何根据不同的条件和刺激改变执行方向。
3.2了解为什么建模活动图
进一步规划用例,标识用例的前后条件,并且发现新的用例。
3.3确定活动图的标记符组件
3种:
3.3.1活动(活动状态)
指示要完成某项工作的指示符。(圆角较大)
3.3.2状态
活动内部的值,与活动类似,如stopped(状态)、stop(活动),2种特殊的状态:开始、结束。(圆角较小)
3.3.3转移
用来显示从状态到活动、活动之间或者状态之间的控制流。
3.3.4综合运用
3.4学习如何使用条件
条件是让转移修改任何工作流的方向所必需的。使用条件来增强活动图。
使用控制点和决策点可以建模修改活动图流程的条件。
3.4.1控制点(表达式)
控制点(guard):用来允许工作流仅沿着满足预置条件的方向继续。
如guard_SaveFile活动图
3.4.2决策点(标记)
决策点需要对工作流继续的方向做出决策。使用菱形标记符。
在带有大量不同条件的大型图中尤其有用。常规时与控制点作用相同。
控制点也用于决策点,但是是从转移分支到决策点,而不是从指涉的活动到决策点。
决策点的使用增加了阅读活动图的方便。
3.5学习活动图中的其它标记符
事件(event)和触发器(trigger)的用法与控制点类似,区别是前者是被触发来把工作流移到对应的方向,而后者是通过表达式的限制来控制工作流。泳道(swim lane)用来根据活动绘制对象的域来隔离它们。分岔(fork)和联结(join)用于并行处理的转移(在两个转移同时发生时)。
3.5.1事件(event)和触发器(trigger)
事件可以包含在转移中来强制控制工作流采取某个方向。
3.5.2泳道
增强活动图的可读性。明确对象或域与哪些活动关联。当模型中使用多个对象时强力推荐使用泳道。
3.5.3分岔和联结
分岔用于开始并行处理,联结用于把并行处理流转换为单向处理流。分岔的每一分支都是独立的活动图,与其它分支没有任何关系。每一个工作流不必等待其它的工作流,直到遇到联结为止。
3.6学习如何建模活动图
创建活动图共有5个任务:
-
标识需要活动图的用例
-
建模每一个用例的主路径
-
建模每一个用例的从路径
-
添加泳道来标识活动的事务分区
-
改进高层活动并添加到更多活动图中
注意:Unified Process是一个反复的过程,要比较模型修改前后的对整个工程的影响。
3.6.1标识用例
以教师修改学生分数用例为例。Update Grades(包括Save Grades和Load Grades)
3.6.2建模主路径
在开始创建用例的活动图时,往往利用一条明显的主路径执行工作流,然后再进行扩展。
主路径从开始到结束,没有任何错误或判断的从路径。
3.6.3建模从路径
有了主路径后,应该检查一下其他可能的工作流情况。如错误处理或执行其它活动。
3.6.4添加泳道
抽象对象为:1)Teacher(用例的参与者)
2)Website(提供后端功能的泛化组织)
利用泳道再一次向活动图添加更多的细节。
要添加状态,以便指示现在处于哪一个转折点。
第四章
使用顺序图建模行为
重要技能
4.1 定义顺序图
4.2 为什么要建模顺序图
4.3 了解顺序图的标记符组件
4.4 理解如何使用消息进行通信
4.5 学习顺序图使用的其他技术
4.6 学习如何建模顺序图
4.1定义顺序图
顺序图:是用来显示你的参与者如何以一系列顺序的步骤与系统的对象交互的模型。
顺序图用来建模以时间顺序安排的对象的交互,并且把用例行为分配给类。它贯穿Unified Process描述的软件开发生命周期的始终。
4.2为什么要建模顺序图
1、目的用来实现用例。
2、对用例指定的泛化功能所缺乏的解释,为设计阶段提供足够的信息。
3、演示某个用例最终产生的所有的路径。
4.3了解顺序图的标记符组件
2个主要的标记符组件:活动对象和这些活动对象之间的通信。
其中消息是顺序图的关键。因为它说明了对象之间的控制流,对象是如何交互的,以及什么条件会改变控制流。
4.3.1活动对象:系统的参与者或者任何有效的系统对象(对象实例—类的实例、参与者)。
生命线:按照时间的顺序对象所发生的事件。
4.3.2 消息:不同活动对象之间(相邻或不相邻或自己)的通信。
4.4 理解如何使用消息进行通信
消息可以包含条件。
4种类型的消息:
-
同步(Synchronous):指示在消息完成之前,以及该消息发送的任何消息完成之前,工作流被中断。
-
返回(Return):显示控制流返回到调用的活动对象,并且同步消息完成了其操作。
-
异步(Asynchronous):用于被返回的消息,活动对象不等待来自该消息的响应。
-
简单(Flat):不分同步、异步。
注意:什么时候应该建模活动图,什么时候应该建模顺序图?
4.5 学习顺序图使用的其他技术
4.5.1创建对象
Create
Destroy
在顺序图的控制流过程中创建对象目的有多种:
-
使用一个对象(一个消息框)向用户显示一条错误消息;
-
打开数据库连接
4.5.2使用状态
状态属于对象,直接在对象的生命线上存在
4.5.3分支和从属流
两种方法来修改顺序图的控制流:使用分支和从属流。
控制流的改变是由于不同的条件导致控制流走向不同的道路。
分支允许控制流走向不同的对象。
从属流还允许控制流根据条件改变,但只允许控制流改变为相同对象的另一条生命线分支。
4.6 学习如何建模顺序图
创建顺序图包含4项任务:
-
确定需要建模的工作流;
-
从左到右布置对象;
-
添加消息和条件以便创建每一个工作流;
-
绘制总图以便连接各个分图。
4.6.1 确定工作流
1)教师成功检查学生的分数;
2)教师试图检查某个学生的分数,但是该学生在系统中不存在;
3)教师试图检查某个学生的分数,但是该学生的分数在系统中不存在;
4.6.2 布置对象
1)从左到右
2)参与者和对象
4.6.3 添加消息和条件
每个工作流作为独立的顺序图建模;
先建立基本的、独立的(成功),如1)
再以独立的顺序图建模从属工作流(出错条件)。
注意:使用条件来指示在什么时候发送什么消息
4.6.4 绘制总图
把所有独立的工作流连接为一个总图。
第五章
使用类图定义域模型
重要技能
5.1 定义类图
5.2 为什么要建模类图
5.3 学习类图的标记符组件
5.4 学习如何建模类
5.5 学习如何为特性提供信息
5.6 学习如何为操作提供参数
5.7 学习如何建模类图
面向对象设计的基础是使用类;
类是用来代表现实事物或功能的构造块;
通过学习建模类及其相互之间的关系,在编写代码之前对系统拥有全面的认识。
5.1 定义类图
类图是由组成系统或者子系统的构造块构成的静态图;
类图的建模贯穿工程的分析和设计阶段的始终;
类之间的关系可以反映执行流的路径(与活动图和顺序图中的路径相关)。
5.2 为什么要建模类图
更详细描述产品;
提供高层功能的类和底层(数据访问和通讯)功能的类,也是一个反复的过程;
显示系统中的执行流的每一条,提供所需功能的位置,及其处理的信息;
指出数据在哪里,类的特性、操作在哪里。
5.3 学习类图的标记符组件
类图由类及其关系组成;
类包含特性和操作。
5.3.1类
类是类图的主要成分;
类是表现事物的,具有状态(通过特性的数据来记录),提供功能(使用操作或者方法完成);
只封装对其重要的信息和功能;
只封装在系统环境中对其重要的所有信息。
5.3.2 关系
关联(association):给定类的对象个体之间的语义连接,是两个类或多个类之间的一个关系。包含多重性,有连接、聚合和组合。
5.4 学习如何建模类
四种不同方式:
-
不显示特性和操作
-
只显示特性
-
只显示操作
-
同时显示特性和操作
5.4.1 特性和操作
特性用来表示类特有的数据,并最终提供类的状态。
操作用来为与建模的类相关的其它类提供功能。
注意它们之前的符号含义。
5.4.2 对象:类实例
对象是类的实例。
对象的标记符号:对象名:类名+下划线
类的实例具有状态。
它具有特性值,使得它在某种意义上是唯一的。
许多对象可以具有相同的特性值,也可以不同。特性值显示在特性名之后。
5.4.3 包
包是一种把类分组为通用类目的方式。
在指定类和对象所属包时,需要在类名前追加包名和双冒号(::)的形式表示。
即对象名:包名::类名
5.5 学习如何为特性提供信息
1)数据类型:表达方式 特性:数据类型
2)初始值:表达方式 特性:数据类型=初始值或默认值
3)多重性:某个特性值有多个,如Grades:Integer={90,95,87,45,100,99}
4)派生的特性:特性值由数学函数、字符串函数或者将要在应用程序中实现的其它商务逻辑中派生。表达形式:在特性名前加"/",并且要附加一个注释。
5.6 学习如何为操作提供参数
操作可以包含参数列表和返回值。
如ChangePassword(in OldPassword:String,in NewPassword:String):Boolean
注意:in、out、inout
in:值传递参数,把数据复制件发送到操作,因此操作不会改变值的主备份。
inout:操作修改传递到操作的参数值的主备份。
out:由操作把值返回给参数。
如:RetrieveDataByKey(in Key:String,out ErrorCode:Long):String
5.7 学习如何建模类图
建模类图需要两个反复执行的步骤:
-
确定类及其关联;
-
确定特性和操作;
开始创建类图最好参照点:用例图(成绩管理系统.mdl)
5.7.1 确定类和关联
1、分析用例图确定类及其关联:分析用例中处理哪些信息,是否需要保存(数据库),
如:成绩管理系统.mdl中的Grades类和ReportCard类。
2、通过使用参与者名称确定附加的类。
如,参与者:Teacher、Student、Administrator
当需要为参与者提供相关信息(名称、登录状态、密码等),或为参与者提供功能时,为一个参与者创建一个类。
-
GUI开发中一个常用技术就是把用户封装到一个类中,然后把实际用户的动作传递到类。
-
检查用例图并确定各个功能所属的类
-
开始创建类的关联
-
为使用自己的类的功能创建类。如WebSite、Logon
-
标示出类关联之间的多重性。
5.7.2 确定特性和操作
1、添加特性和操作,以便提供数据存储和需要的功能来完成我们开始工作时的用例图中的用例。
2、为特性和操作提供参数、数据类型和初始值。
该类图经历了4个反复的过程:
最高层:适合于让管理人员了解系统的工作流是如何处理的;
最底层:适合于开发小组使用;
总结:
-
确定可以在用例图中找到的类;
-
关联类,给出它们的关联名词;
-
巩固相似的类;
-
确定任何合适的角色名;
-
为任何已经封装到另一个类中的独立的功能添加类;
-
添加特性和操作以便提供类图中需要的功能;
-
为操作和特性提供数据类型和参数等信息。
第六章
协作图
重要技能
6.1 定义协作图
6.2 为什么要建模协作图
6.3 了解协作图的标记符组件
6.4 学习不同的消息类型
6.5 深入研究消息
6.6学习如何建模协作图
协作图的目的:表示类之间是如何通信的。
6.1 定义协作图
协作图可以看成是类图和顺序图的交集。
6.2 为什么要建模协作图
1)协作图用来建模对象或者角色之间交互,描述对象或者角色之间是如何通信的。
2)通过发送消息,更清楚了解消息在对象之间传递的路径以及对象或角色需要完成什么功能。
3)建模协作图可以更好地解释正在分析的设计。
6.3 了解协作图的标记符组件
6.4 学习不同的消息类型
Synchronous(同步消息):用于逐步的通讯中,在继续下一步之前必须完成前一步。
Asynchronous(异步消息):用于并行处理的通讯中。
Flat message(简单消息):消息类型对于模型而言是未知的或不重要。
举例:Compiler、Linker、User-Press Button
6.5 深入研究消息
1)使用消息完成很多任务。
2)枚举消息,按照一定的顺序执行。
3)包括控制点条件的消息,以便限制发送哪一条消息。
4)可以创建带消息的对象实例。
6.6学习如何建模协作图
第七章
深入学习类图
重要技能
7.1学习聚集和组成
7.2学习关联注释
7.3学习端点标记符
7.4建模多个关联
7.1学习聚集和组成
7.1.1聚集
Aggregation:描述两个类之间的整体与部分的关系,其中一个类为整体,由一个或者多个部分类组成。
注意:部分类可以独立存在。当整体类销毁时,部分类可以独立存在,部分类销毁时,整体类也独立存在。
7.1.2 组成
也是一种聚集关联,但是用来组成整体类的部分类不能独立存在。
注意:销毁整体类将会同时销毁部分类。部分类至少有一个对于整体类的多重性。
7.1.3 使用带有泛化的聚集和组成
7.2学习关联注释
7.3学习端点标记符
有序、排序、导航
7.4建模多个关联
第八章
使用状态图建模行为
重要技能
8.1定义状态图
8.2为什么要建模状态图
8.3学习状态图的标记符组件
8.4 学习如何指定状态的动作和事件
8.5 学习如何使用合成状态
8.6 如何建模状态图
状态图与活动图的区别:
活动图:建模不同区域的工作如何彼此交互。
状态图:表示单个对象,以及对象的行为如何改变其状态。
8.1定义状态图
建模对象如何改变状态。
状态:定义为对象行为在某一个时刻的snapshot或者转折点。
8.2为什么要建模状态图
1)说明当调用对象的行为时对象的状态如何改变;
2)说明基于用户输入的屏幕状态的改变;
3)说明复杂用例的状态进展情况。
8.3学习状态图的标记符组件
状态图由状态、转移和事件组成。
状态:
转移:一个状态到另一个状态的处理流
决策点:在状态图中可视化地把多个转移从一个状态移到其他多个状态;
同步:使用同步条,是为了说明某些状态在哪里需要跟上或者等待其他状态;用来显示并发状态。同步条必须配对;两个或多个转入,只有一个转出。
8.4 学习如何指定状态的动作和事件
动作和事件用来描述状态如何到达,状态到达时发生了什么。
事件:指示什么触发了转移;
动作:说明当事件发生时会产生什么行为。
5种基本动作类型:Entry、Exit、Do、Include、Event
动作有2种标记符:action-label/action、event-name(parameters)[guard-condition]/action
8.5 学习如何使用合成状态
8.6 如何建模状态图
建模状态图步骤:
-
标识出需要进一步建模的实体;
-
标识出每一个实体的开始和结束状态;
-
确定与一个实体相关的事件;
-
从开始状态创建状态图;
-
如果必要则指定建合成状态。
8.6.1标识出需要进一步建模的实体
具有清晰、有序的状态的实体最适合使用状态图进一步建模。如Grade
8.6.2标识出每一个实体的开始和结束状态
首先,确认实体如何实例化的,以及何时开始。
如:Grade对象在有了一个新的分数需要保存时实例化。
8.6.3确定与一个实体相关的事件
事件用来最终完成实体的功能。
如:Grade对象,它的任务是保存分数,包括接受数据、成功保存数据和不成功保存数据。
由此事件产生的状态:
Ready(用于数据加载时)、
Persisting(用于数据保存时)、
Saved(用于数据已经保存后)、
Error(用于数据由于出错而未成功保存时)