UML(United Modeling Language)统一建模语言,一种基于面向对象的可视化建模语言
UML采用一组形象化的图像(如类图)符号作为建模语言,是这些符号可以形象地描述系统的各个方面
UML通过建立图形之间的各种关系来描述模型!
我在学习中使用的是StarUML,这是一款开源免费的UML图绘制工具,点击这里即可下载,当然在有一些其他的UML工具,比如RationalRose 、PowerDesigner 等等不在此一一赘述!
软件工程可以分为三个大阶段:需求、设计、测试与维护
一、需求:开发目标、可行性分析、需求分析
二、设计:概要设计、详细设计、编码与单元测试
三、测试与维护:综合测试、维护
一般来说,软件开发生命周期可以使用PDCA来概述:
从软件开发的观点看,它就是使用适当的资源(包括人员,软硬件资源,时间等),为开发软件进行的一组开发活动,在活动结束时输入(即用户的需求)转化为输出(最终符合用户需求的软件产品)
描述系统的静态结构
描述系统行为的各个方面
用例图
时序图
协作图
状态图
活动图
UML中的关系主要是包括四种:
关联关系(association)
依赖关系(dependency)
泛化关系(generalization)
实现关系(realization)
用例图(Use Case Diagram):也称为用户模型图,是从软件需求分析到最终实现的第一步,它是从客户的角度来描述系统功能
用例图包括3个基本组件:参与者(Actor)、用例(Use Case)、关系
相关操作:右键添加各种图像,通过文件导出为图像
泛化关系:表示同一业务目的(父用例)的不同技术实现(各个子用例),在UML中,用例泛化用一个三角箭头从子用例指向父用例
一个用例可以包含其他用例的行为,并把它包含的用例行为作为自身行为的一部分,在UML中包含关系用虚线箭头+《include》
,箭头指向被包含的用例
如果在完成某个功能的时候偶尔会执行另外一个功能,则用拓展关系表示,在UML中拓展关系用虚线箭头+《extend》
,箭头指向被拓展的用例
下面是关于一个公司的人事管理系统的需求的简单描述,建立其相应的用例模型:该人事管理系统的用户是公司的人事管理干部.该系统具有人事档案库, 保存员工的人亊信息,包括姓名,性别,出生年月,健 康状况,文化程度,学位,职称,岗位,聘任时间,任期 ,工资,津贴,奖罚记录,业绩,论著和家庭情况等,系统提供的基本眼务有人事信息的管理,包括人事规定的权调动与聘任,职称评定,奖罚等,并且可以按照限查询人事信息,生成与输出统计报表等.该人事系统每月向公司的财务系统提供员工的工资,津贴等数据.
类是类图的重要组件,由三部分组成:类名、属性和方法
在UML中类用矩形表示,顶端存放类名,中间存放类的属性(属性的类型及值),底部存放类的方法(方法的参数和返回值类型)
在UML中可以根据实际情况有选择的隐藏属性部分和方法部分或者两者都隐藏
在UML中公有(public)的东西使用+
表示,私有(private)的东西使用-
表示,保护(protected)的东西使用#
表示,UML工具的开发者也可以自定义符号来表示
属性的完整表示方式:可见性 名称 :类型 [ = 缺省值] 中括号中的内容表示是可选的,例如下图所示的类图:
接口中包含方法,但是不包含属性,在UML中接口用一个带有名称的圆圈表示,并且通过一条实线与它的模型元素相连,但是有时候接口也用普通类的矩形符号表示:
在UML中泛化关系用来表示类与类、接口与接口之间的继承关系,泛化关系有时也称为:is a kind of
关系
以下面的代码作为例子,假设Person类一个对象上班需要乘客车,或者这个对象是卖客车的,那么Person类就与Car类产生联系,这种联系就叫做依赖关系:
class Car{ };
class Person{
public:
//上班乘车
void GoToWork(Car& car){ }
//卖车
Car& SellCar(){ }
};
关联关系很好理解,借助上面的例子,原来Person对象是做客车去上班,关联关系就可以理解为这次Person对象是开私家车去上班!
两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间应该是关联关系,意思就是:一个类是另一个类的成员变量,例如:订单与客户之间的关系,每个订单对应着特定的客户,每个客户对应着特定的订单!
class Car{
public:
void run(){ };
};
class Person{
public:
void GoWork(){
myCar.run();
};
private:
Car myCar;
};
关联关系的多重性是指有多少个对象可以参与该关联,多重性可以用来表达一个取值范围,特定值,无限定值的范围:
表示法 | 说明 | 表示法 | 说明 |
---|---|---|---|
0 |
表示0个对象 | 1..n |
表示1-n个对象 |
0..1 |
表示0-1个对象 | n |
表示n个对象 |
0..n |
表示0-n个对象 | * |
表示许多对象 |
1 |
表示一个对象 |
这个比较简单,这好比一辆汽车可以选择很多型号和品牌的发动机
聚合使用 空心菱形+实线
表示
如果是聚合关系是一辆汽车可以选择很多型号和品牌的发动机,那么组合关系联系就更加紧密了,这就好比人和自己的五脏六腑,生命周期一致的缺一不可!
组合使用 实心菱形+实线
表示
汽车和自行车都是交通工具(vehicle),一辆自行车(bicycle)只归一个人(person)所有,但是一辆汽车(auto)可以归一个人或者两个人所有,一个人可能没有自行车或者汽车,也可能有多辆自行车或者汽车,人分为男人(male)和女人(female),每个人都有年龄(age)和名字(name),每辆交通工具都有自己的颜色(color)和商标(brand),每辆汽车都有两个前灯(headlight)和一台发动机(motor)
下面是一个Person对象使用MacBook Pro对象和ASUS_Windows的示例:
时序图中对象使用矩形表示,并且对象名称下有下划线,将对象至于时序图的顶部说明在交互开始时对象就已经存在了,如果对象的位置不在顶部表示对象实在交互的过程中被创建的
生命线是一条垂直的虚线,表示时序图中对象在一段生命周期内的存在,每个对象底部中心位置都带有生命线
两个对象之间的单路通信,从发送方指向接收方,在时序图中很少使用返回消息
在UML中,活动图本质上就是流程图,它用于描述系统的活动,判定点,分支等等
原子的,不可中断的动作,并在此动作完成之后向另一动作转变,在UML中动作状态用圆角矩形表示,动作状态所表示的动作卸载圆角矩形的内部
分支在软件系统中很常见,一般用于表示对象所具有的条件行为。用一个布尔表达式的真假来判断动作的流向,条件行为用分支和合并表达。在活动图中,分支用空心小菱形表示,分支包括一个入转换和两个带条件的出转换,出转换的条件应该是互斥的,须保证只有一条出转换能够被触发,合并两个带条件的入转换和一个出转换
分叉用来描述并发线程,每个分叉可以有一个输入转换和两个或多个输出转换,每个转换都可以是独立的控制流,汇合代表两个或者多个并发控制流同步发生,当所有的控制流都达到汇合点后,控制才能继续往下进行,每个汇合可以有两个或多个输入转换和一个输出转换,在UML中分叉和汇合用一条粗直线表示
泳道将活动图的活动划分为若干组,并将每一组指定给负责这组活动的业务组织,泳道区分负责活动的对象,明确的表示是哪些活动是由哪些对象进行的。每个活动制定明确的属于一个泳道,在活动图中,泳道用垂直的实线绘出,垂直线分割的区域即为泳道
某公司销售人员接到订单后,将订单传给财务人员和 仓库人员.财务人员开具发票,并收款。仓库人员准备货物,并查看是否货物加急,葙是加急采用EMS方式发货,否则采用普通包裹方式发货.完成之后由销售人员关闭该订单.根据上面描述画出该公司销售过程的活动图:
状态图通过建立对象的生命周期模型来描述对象随时间变化的动态行为!
用圆角矩形表示,状态名称表示状态的名字, 通常用字符串表示,一个状态的名称在状态图所在的
上下文中应该是唯一的.
用带箭头的直线表示,一端连着源状态,一端连着目标状态.
每个状态图都有一个初始状态,此状态代表状态图的起始位置,初始状态只能作为转换的源,
不能作为转换的目标,并且在状态图中只能有一个。初始状态用一个实心圆表示.
模型元素的最后状态,是一个状态图的终止点,终止状态在一个状态图中可以有多个
下面是Linux进程状态图的练习,当然不是很详细,像僵尸状态没有画出来:
协作图(也叫作合作图、通信图)是一种交互图
时序图主要侧重于对象间消息传递在时间上的先后关系,而协作图表达对象之间的交互的过程以及对象之间的关联关系,时序图跟协作图可以相互转化,不难理解,协作图的构成有角色,对象,连接,消息。具体含义同时序图。
协作图表现的是对象在空间上的联系,所以不存在时序图中的生命线和激活器
协作图是动态图的另一种表现形式
包图由包和包之间的关系组成,包的图标就如同一个带标签的文件夹
包提供了一种用于组织各种元素的分组机制,在UML中,包用来对元素进行分组,并为这些元素提供命名空间,包所拥有的或者引用的所有元素称为包的内容,包没有实例
组件图用来建立系统中各组件之间的关系,各组件通过功能组织在一起
构件图 = 构件(Component)+接口(Interface)+关系(Relationship)+端口(Port)+连接器(Connector)
JavaBean、ejb、jsp都是组件,在UML中,组件使用左侧有个两个小矩形的的大矩形来表示
组件图可以用来设计系统的整体框架
部署图用来帮助开发者了解软件中的各个组件驻留在什么硬件位置,以及这些硬件之间的交互关系。使用部署图可以显示运行时系统的结构,同时还传达构成应用程序的硬件和软件元素的配置和部署方式。
节点:用来表示一种硬件,可以是打印机,计算机等。节点的标记符号是一个三维框,在框的左上方包含 了节点的名称。包括节点的表示,节点的分类,节点中的构件,节点属性,节点与构件。
节点通过通信关联建立彼此的关系,采用从节点到节点绘制实线来表示关联,对于企业的计算机系统硬件设备间的关系,但是通常关心的是节点之间是如何连接的,因此描述节点间的关系一般不使用名称,而是使用构造型描述