原创

OOAD利器之UML基础

UML:Unified Modeling Language,即统一建模语言,简单地说就是一种有特殊用处的语言。本文是我初步学习UML的学习笔记,对于我们菜鸟码农来说,让我们做设计的可能性不大,但至少能看懂是必要的。

一、所谓模型

1.1 模型是对现实的简化

  模型是提供系统的蓝图,模型可是包括详细计划。也可是是从更高程度考虑系统的总体计划,每个系统可以从不同的方面用不通过的模型来描述。因而每个模型都是在语义上闭合的抽象系统。模型可以是结构性的,强调系统的组织。也可是是行为性的,强调系统的动态方面。

1.2 为什么要建模?

  有人云:建模是为了能够更好地理解正在开发的系统

  通过建模可以达到如下目的:

  1、模型有助于按照实际情况或按照所需的样式对系统进行可视化;

  2、模型能够规约系统的结构或行为;

  3、模型给出了构造系统的模板;

  4、模型对做出的决策进行文档化;

PS:对于一个复杂的系统,如银行、电信系统建模的重要性就越大。如果不能很好的理解一个复杂系统,盲目开发,失败的可能性很大。

二、小谈UML

2.1 神马是UML?

  统一建模语言(Unified Modeling Language , UML) 是一种绘制软件蓝图的标准语言,可以用UML对软件密集的制品进行可视化、详述、构造和文档化。

2.2 UML的优点

  1、可视化:清晰的模型有利于交流

  2、详述:可以使用UML对分析、设计、实现等决策进行详细描述

  3、构造:把UML描述映射成编程语言

  4、文档化:系统的所有细节都可以是UML进行描述。如:项目计划、发布活动等

2.3 应用领域

  1、企业信息系统

  2、银行与金融服务

  3、电信

  4、国防、航天

  5、科学

  6、基于Web的分布式服务

三、类图—分析业务模型

3.1 类

  类是一组具有相同属性、操作、关系和语义的对象描述,一个类可是实现一个或者多个接口。下图是类在VS里面的图形表示:

  (1)UML预设了四种可见性,分别为公开(public)、私有(private)、保护(protected)、包(package) 减号(-)为私有可见性,加号(+)为公开可见性。可见,上图中的类图所有都为public。

  (2)在UML中抽象类与普通是同一个是图表示,只是名字会变成斜体,如下图所示,调整IsAbstract属性为True后类名变为斜体:

3.2 关系

  关系是事物之间的联系,在面向对象的建模中,有三种重要的关系是依赖、泛化、关联。

  (1)依赖

  依赖是一种使用关系,一个事物使用另一个事物。在图形上,把依赖画成一条有方向的虚线,指向被依赖的事物。如果被使用的类发生变化,那么另一个类的操作必然受影响。依赖关系在.net语言中体现为 局部变量方法的参数或者对静态方法的调用,如工具类,现实生活中人与锤子。

  (2)泛化

  在泛化关系中,子类继承了父类的行为和含义,子类也可以增加新的行为和含义或覆盖父类中的行为和含义。在图形上,在泛化画成一个带有空心三角行指向父类。泛化在.net中就是一个继承的关系。

  (3)关联

  关联是一种结构关系,它指明一个对象与另一个对象间的关系。

  ①相互关联体现的是两个类、或者 类与接口之间语义级别的一种强依赖关系,是一种长期的稳定的关系;表现在代码层面,为被关联类以类属性的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量。

  上图中ClassA与ClassB相互关联,在代码中各自有对方类型实例的一个属性。

  ②单向关联表现在代码层面,为被关联类B 以类属性的形式出现在关联类 A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

  上图中Subject关联Observer,并且是一个一对多的关系,那么在代码中Subject类中会有一个Observer类对象的集合属性。

  下面我们来看看几种特殊的关联关系,他们是:

  ③聚合关系:

  聚合是关联关系的一种特例,他体现的是整体与部分拥有的关系。此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如汽车与发动机;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

  ④组合关系:

  组合也是关联关系的一种特例,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。例如:孕妇死了胎儿自然也就死了(有点血腥的例子,抱歉!);表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

3.3 接口

  接口(interface)如同契约,负责的类必须负责实现它的公开操作,以及负责维护它的公开属性。

3.4 综合案例:公司-部门-员工 类图关系

四、用例图—描述系统的行为

  用例图用来表达系统对外提供的服务或功能,适合用来作为需求搜集阶段的工作。

4.1 用例与执行者

  实际设计中,常用用例(UseCase)来表达系统需求或者系统对外呈现的行为。用例采用椭圆图示,参与者(Actor)是人型图示。由于它会参与系统的运作,因此它跟用例之间有连接线段。

4.2 包含关系

  包含(include)关系指的是两个用例之间的关系,其中一个用例(称作基本用例,base use case)的行为包含了另一个用例(称作包含用例,include case)的行为。如下图,取款的 时候会包含一个用户验证的用例。

4.3 扩展关系

  扩展(extend)关系将基本用例中一段相对独立并且可选的动作,用扩展(Extension)用例加 以封装,再让它从基用例中声明的扩展点(Extension Point)上进行扩展,从而使基用例行为更简练和目标更集中。如下图,我们在取完款后,可以打印凭条,也可以不用打印凭条。这个功能就可以使用扩展来表示。

五、活动图—流程分析利器之一

  活动图通常用来表达业务流程、工作流或系统流程中一连串的动作。在我的实习前期,就经常用到活动图来绘制需求调研到的业务流程,并将活动图展示给客户以确认需求,客户也能看轻松地看懂。例如,下图是一个简单的登陆流程,登陆失败跳转到登陆页面,登陆成功则跳转到主界面。

PS:每个活动图只能有一个开始节点,但是可以有多个结束节点

  (1)动作

  动作(activity)是最重要的组成元素,它代表一个执行步骤。

  

  (2)控制流

  带箭头的连接线称为控制流(control flow)。当来源动作结束之后,控制流会启动目标动作。

  

  (3)对象节点与对象流

  对象节点(object node)为矩形图示,对象流(object flow)的图示与控制流相同,不过它的其中一个端点必须是对象节点,而另一端必须是其他节点。控制流的两个端点不可以都是对象节点。对象流不同于控制流,对象流可以携带数据或对象。

  

  上图所示,在登陆成功后,我们将用户的Session对象传递到下一个节点,下一个节点可以使用此对象。

  (4)决策与合并

  活动流程中,流程交汇点,称为合并节点(merge node)。一个合并节点会有多条进入线,但是只有一条离开线,合并节点的图示是大的空心菱形,所有进入合并节点的支流都会经历同一条离开线。

  

  决策节点(decision node)与合并节点共用图示,两者都是大的空心菱形。不过,决策节点只有一个进入线,但有多条离开线

  

  (5)分叉和连接

  分叉表示的是一个控制流被两个或多个控制流代替,经过分叉后,这些控制流是并发进行的。

  连接正好与分叉相反,表示两个或多个控制流被一个控制流代替。使用分叉需要使用连接把分叉的流汇聚成一个流。

  (6)发送信号和接受事件

  发送信号操作是一种操作,可以将消息或信号发送给另一个活动。

  接受事件操作是一种要在等到消息或信号后才能继续执行的操作。

  如上图所示,创建发票是一个发送信号,将发票这个消息发给另一个活动:收款。而收款是一个接受事件,它必须等到开完发票才能继续执行后续操作。

六、时序图—流程分析利器之二

  时序图,又称序列图,用来表达系统内部一群对象的交互情况,它是一种行为图。水平方向是对象维,垂直方向是时间维。例如:page与action之间的交互情况可以用时序图来表示,在发送list请求的时候我们需要一个返回结果集。

  (1)生命线

  生命线(lifeline)代表一个参与交互的实例,它的图示是顶端连接矩形的虚线,虚线顶部的矩形可以放置生命线的名称。

  (2)执行发生

  对象在接收到消息之后执行一项活动,执行期间称为执行发生(execution occurrence),它的图示是长条矩形。

  (3)消息

  消息(message)的图示是一条带箭头的线段,横跨在两个生命线上,对象之间通过发送消息来交互。

  (4)终止

   生命线有生有灭,终止(stop)就是用来表达生命线终止的时刻。终止的图示是一个大叉,放置在生命线的虚线底部,代表生命线已经终止。

参考资料

  (1)张传波,《火球——UML大战需求分析》,http://www.amazon.cn/tushu/dp/B0079FMI40  

  (2)周猛,《UML统一建模语言基础》,http://wenku.baidu.com/view/28fe7f65ad02de80d4d840ec.html

 

正文到此结束
本文目录