工作方法编程之路

《Thinking in UML》笔记

2018-08-13  本文已影响60人  独木舟的木

💡最后更新:20180815

UML —— 统一建模语言

面向对象编程

面向对象( Object Oriented,简称OO)方法将世界看作一个个相互独立的对象,相互之间并无因果关系,它们平时是“鸡犬之声相闻,老死不相往来”的。只有在某个外部力量的驱动下,对象之间才会依据某种规律相互传递信息。这些交互构成了这个生动世界的一个“过程”。在没有外力的情况下,对象则保持着“静止”的状态。

要解决面向对象的困难我们需要这样一些方法

UML 是一种建模语言

面向对象分析设计完整过程

建模流程 面向对象分析设计完整过程.png

业务模型

业务模型真实映射了参与者在现实世界中的行为。

概念模型

分析模型:建立适合计算机理解和实现的模型。

设计模型

在设计模型中,概念模型中的边界类可以被转化为操作界面或者系统接口;控制类可以被转化为计算程序或控制程序,例如工作流、算法体等;实体类可以转化为数据库表、XMI文档或者其他带有持久化特征的类。

从概念模型向设计模型转化时,可以遵循的规则有:

用例驱动

建模公式

用例驱动是统一过程的重要概念,或者说整个软件生产过程就是用例驱动的。用例驱动软件生产过程是非常有道理的。让我们再次回顾建模公式,很容易得出一个推论,要解决问题领域就要归纳出所有必要的抽象角度(用例),为这些用例描述出可能的特定场景,并找到实现这些场景的事物、规则和行为。再换个说法,如果我们找到的那些事物、规则和行为实现了所有必要的用例,那么问题领域就被解决了。总之,实现用例是必须做的工作,一旦用例实现了,问题领域就解决了。这就是用例驱动方法的原理。

RUP——统一过程

RUP

统一过程归纳和整理了很多在实践中总结出来的软件工程的最佳实践,是一个采用了面对象思想,使用UML作为软件分析设计语言,并且结合了项目管理、质量保证等许多软件程知识综合而成的一个非常完整和庞大的软件方法。

统一过程归纳和集成了软件开发活动中的最佳实践,它定义了软件开发过程中最重要的阶段和工作(四个阶段和九个核心工作流),定义了参与软件开发过程的各种角色和他们的职责,还定义了软件生产过程中产生的工件,并提供了模板。最后,采用演进式软件生命周期(迭代)将工作、角色和工件串在一起,形成了统一过程。

统一过程

UML & PUP

实施统一过程的原因

  1. 提高软件成熟度的需要;
  2. 提高软件技术水平和质量的需要;
  3. 统一过程适于开发稳定的架构;

软件项目真正的灵魂是「软件过程」

站在软件过程的角度看待问题:先了解一个软件项目是怎么做的,再去 UML 中寻找需要的工具,用 UML 中适合的工具把软件过程要达到的要求记录下来。

建模基础

建模

通过对客观事物建立一种抽象的方法,用来表征事物并获得对事物本身的理解,再把这种理解概念化,并将这些逻辑概念组织起来,形成对所观察的对象的内部结构和工作原理的便于理解的表达。

建模 建模公式

抽象层次

抽象层次越高,具体信息越少,但是概括能力越强。反之,具体信息越丰富,结果越确定,但相应的概括能力越弱。

抽象的两种方法:

  1. 自顶向下:适用于从头开始认识一个事物。
  2. 自底向上:适用于在实践中改进和提高认识。
统一过程一般抽象层次

对象分析方法

对象分析方法

核心元素

版型

对 UML 元素基础定义的扩展,在同一个元素基础定义的基础上赋予特别的含义,使得这个元素适用于特定的场合。

参与者(actor)、主角

actor 是在系统之外与系统交互的某人或某事物。

Jietu20180808-142730 参与者

业务主角

业务工人

人工坐席、被动参与业务,是系统边界中的一部分。

区分参与者和业务工人的方法:判断是在边界之外还是边界之内。

参与者&涉众&用户&角色

参与者是涉众的代表,它代表涉众对系统的利益要求,并向系统提出建设要求;参与者通过代理给其他用户或将自身实例化成用户来使用系统;参与者的职责可以用角色来归纳,用户被指定扮演哪个或哪些角色因此来获得参与者的职责。
参与者的核心地位还体现在,系统是以参与的观点来决定的。参与者对系统的要求,对系统的表述完全决定了系统的功能性。

参与者、涉众、用户和角色关系

用例

用例定义了一组用例实例,其中每个实例都是系统所执行的一系列操作,这些操作生成特定主角可以观测的值。

Jietu20180808-151109 用例的构成

用例 != 功能

一个用例是一个参与者如何使用系统,获得什么结果的一个集合,通过分析用例,得出结构性的和功能性的内容,最终实现用例,也就实现了使用者的观点。

用例的特征

用例的特征

用例的粒度

业务用例

业务用例实现

业务用例实现

概念用例

系统用例=用例

系统用例是用来定义系统范围、获取功能性需求的。系统用例是软件系统开发的全部范围,系统用例是我们得到的最终需求。

用例实现

一个用例实现代表了用例的一种实现方式。

边界

业务实体

业务实体代表业务角色执行业务用例时所处理或使用的“事物”。

理解业务实体

  1. 业务实体来自现实世界。
  2. 业务实体一定是在分析业务流程(业务用例场景)的过程当中发现的。
  3. 业务实体作为类的一个版型,具有对象的所有性质,包括属性和方法。
    • 属性:在特定的场景下,只需要关心与这个场景直接关联的属性。
    • 方法:在特定的场景下,只需要关心与这个场景有直接关系的方法。

获取业务实体

  1. 建立业务用例场景;
  2. 从业务用例场景中逐个分析动词后面的名词,它们就是业务实体的备选对象;
  3. 分析业务实体之间的关系,并决定哪些应当单独建模,哪些应当作为属性。
寄信业务实体模型图

Jietu20180808-174111 常用的包的版型

分析类

分析类用于获取系统中主要的“职责簇”。它们代表系统的原型类,是系统必须处理的主要抽象概念的“第一个关口”。

  • 分析类是从功能性需求向计算机实现转化过程中的“第一个关口”。
  • 分析类可以产生系统设计的主要抽象——系统的设计类和子系统。
分析类

边界类

边界类是一种用于对系统外部环境与其内部运作之间的交互进行建模的类。

边界类常用的场景:

控制类

控制类用于对一个或几个用例所特有的控制行为进行建模。控制对象(控制类的实例)通过控制其他对象,因此它们的行为具有协调性质。

实体类

实体类是用于对必须存储的信息和相关行为建模的类。实体对象(实体类的实例)用于保存和更新一些现象的有关信息。

分析类的三高

设计类

「设计类」

设计类由类型、属性和方法构成。设计类的名称、属性和方法也直接映射到编码中相应的class、
property 和 method。

可见性

类的属性和方法的可见性定义:

关系

关联关系(association)

关联关系

依赖关系(dependency)

依赖关系:A依赖于B

扩展关系(extends)

扩展关系:A扩展出B

包含关系(include)

包含关系

实现关系(realize)

实现所代表的含义是,基本用例描述了一个业务目标,但是该业务目标有多种可能的实现途径,每一种实现途径可以用用例实现(或称用例实例)来表示,而用例实现与基本用例之间就构成了实现关系。换言之,每个实现途径都实现了基本用例的业务目标。

Jietu20180809-150433 实现关系

精化关系(refine)

精化关系:A精化了B

泛化关系(generalization)

泛化关系:A继承自B

聚合关系(aggregation)

A 聚合到 B 上,或者说 B 由 A 组成。

聚合关系:A聚合到B上

组合关系(composition)

A 组合成 B,或者说 B 由 A 组成。

组合关系

组件

组件是系统中实际存在的可更换部分,它实现特定的功能,符合一套接口标准并实现一组接口。

使用组件

节点

节点是带有至少一个处理器、内存以及可能还带有其他设备的处理元素。

在实际工作中,一般说来服务器、工作站或客户机可以称为一个节点。节点是应用程序的部署单元。节点元素特别用于部署视图,描述应用程序在物理结构上是如何部署在应用环境中的,是一种包括软、硬件环境在内的拓扑结构描述。

使用节点的场景:

核心视图

在 UML 里,结构性特征是用==静态视图==来表达的,行为性特征是用==动态视图==来表达的。

UML 核心视图

静态视图

静视图就是表达静态事物的。它只描述事物的静态结构,而不描述其动态行为。

用例图

业务用例视图:使用业务主角和业务用例描述业务建模的功能性需求

业务用例视图的两个视角:

  1. 业务主角视角:有利于向业务主角确认其业务目标是否都已经齐全,以此来检查是否有遗漏的业务用例没有发现。

    业务用例视图之业务主角视角
  2. 业务模块视角:有利于从业务的完整性角度出发,检查完成某个业务的所有业务主角和业务用例是否已经齐全,以此来检查是否有遗漏的业务用例没有被发现。

    业务用例视图之业务视角
  3. 其他视角

业务用例实现视图:描述业务的实现途径
业务用例实现视图
概念用例视图

概念用例视图用于展现从业务用例中经过分析分解出来的关键概念用例,并表示概念用例和业务用例之间的关系。一般来说这些系有扩展、包含和精化。

借阅图书概念用例视图
系统用例视图

系统用例视图展现系统范围,将对业务用例进行分析以后得到的系统用例展现出来。

借阅图书系统用例

它表达的含义是计算机系统将开发本视图中所列举出的系统用例,而检查借阅证可能是手工工作而不需要纳入系统建设范围。

系统用例实现视图

如果一个系统用例有多种实现方式,也应当为其绘制实现视图。

类图

类图用于展示系统中的类及其相互之间的关系。

本质上说,类图是现实世界问题领域的抽象对象的结构化、概念化、逻辑化描述。

在UML中,从开始的需求到最终的设计,类图也是围绕着这三个层次(概念层、说明层、实现层)的观点进行建模的。类图建模是先概念层而说明层,进而实现层这样一个随着抽象层次的逐步降低而逐步细化的过程

概念层类图

概念层的观点认为,在这个层次的类图描述的是==现实世界中问题领域的概念理解==,类图中表达的类与现实世界的问题领域有着明显的对应关系,类之间的关系也与问题领域中实际事物的关系有着明显的对应关系。需要注意的是,概念层类图中的类和类关系与最终的实现类并不一定有直接和明显的对应关系。在概念层上,类图着重于对问题领域的概念化理解,而不是实现,因此类名称通常都是问题领域中实际事物的名称。概念层的类图是独立于实现语言和实现方式的。

概念层类位于业务建模阶段。领域模型图、业务实体图描述。

概念层类图
说明层类图

说明层的观点认为,在这个层次的类图考察的是==类的接口==而不是实现,类图中表达的类和类关系应当是对问题领域在接口层次抽象的描述

说明层类位于概念建模阶段。分析类、分析模型图描述。

说明层类图
实现层类图

实现层观点认为,类是==实现代码的描述==,类图中的类直接映射到可执行代码。在这个层次上类必须明确采用哪种实现语言、什么设计模式、什么通信标准、遵循什么规范等

实现层类图位于设计建模阶段。类图可视为伪代码。

实现层类图

包图

包图一般都用来展示高层次的观点。

在 UML 所有视图中,包图或许是最自由、约束最小的一种。除了特定的版型之外,包几乎可以用在任何阶段。

动态视图

故名思义,动态视图是描述事物动态行为的。需要注意的是,==动态视图不能够独立存在,它必==
==须特指一个静态视图或UML元素,说明在静态视图规定的事物结构下它们的动态行为。==

活动图

活动图描述了为了完成某一个目标需要做的活动以及这些活动的执行顺序。

活动图的两个层面:

  1. 描述用例场景——用例活动图;
  2. 描述对象交互——对象活动图;

活动图主要用于:

  1. 业务场景建模;
  2. 用例场景建模;
用例活动图

用例——参与者的一个目标

用例场景——如何来达到这个目标

活动图——描述用例场景(业务流程)

登机手续用例场景活动图示例
对象活动图

展示对象的交互,不推荐使用。

泳道

泳道,顾名思义,就像一个游泳运动员只能在一个道里进行比赛一样,一个对象也只能在一个业务流程中担任一个(或一类)职责。泳道代表了一个特定的类、人、部门、层次等对象的职责区,这些对象在业务流程中负责执行的活动集合构成了它们的职责。
即使加入泳道后对象交互图有了些模样,笔仍然不推荐使用它。泳道最主要的用途是在分析用例场景时用来获取角色职责。

状态图

状态图显示一个状态机。状态机用于对模型元素的动态行为进行建模,更具体地说,就是==对系统行为中受事件驱动的方面进行建模==。通使用状态图来说明业务角色或业务实体可能的状态——导致状态转换的事件和状态转换引起的操作。状态图常常会简化对设计的确认。对于类的对象所有可能的状态,状态图都显示它可能接收的消息、将执行的操作和在后类的对象所处的状态

图书生命周期状态图

时序图

时序图描述了在参与交互的对象中所发生的事件(从激活的角度来说明),以及这些对象如何通过相互发送消息进行通信。可以为用例事件流的各种不同形式制作时序图。

业务模型时序图

业务模型时序图用于为领域模型中的业务实体交互建模,其目的是实现业务用例。

网上购买商品业务模型时序图
概念模型时序图

概念阶段的时序图采用分析类来绘制,目标同样是实现业务用例

设计模型时序图

设计模型时序图使用设计类作为对象绘制。目标是实现概念模型中的某个事件流,一般以某个完整交互为单位,消息细致到方法级别。

协作图

协作图描述了对象间交互的一种模式;它通过对象之间的连接和它们相互发送的消息来显示参与交互的对象。
协作图中可以有对象和主角实例,以及描述它们之间关系和交互的连接和消息。通过说明对象间如何通过互相发送消息来实现通信,协作图描述了参与对象中发生的情况。可以为用例事件流的每一个变化形式制作一个协作图。
与时序图的作用相似,协作图用于显示对象之间如何进行交互以执行特定用例或用例中特定部分的行为,协作图的建模结果用于获取对象的职责和接口。与时序图不同的是,协作图因为展示了对象间的关系,使得它更适用于获得对对象结构的理解,而时序图则更适于获得对于调用过程的理解。不过在本质上,它们是可以互换的。

[图片上传失败...(image-d222e7-1534144287983)]

核心模型

要建立什么模型,首先要确定的是该项目要采用什么样的生命周期。

UML 核心模型

用例模型

用例模型是系统既定功能及系统环境的模型。

业务用例模型

概念用例模型

概念用例模型帮助我们简化和理解业务模型,帮助我们初步从对象角度来理解业务,从而建立软件架构并产生系统用例。

完整的概念用例模型

系统用例模型/用例模型

系统建模=需求获取

系统用例模型代表了实际业务转化为计算机功能性需求以后的结果,是系统开发的契约。

完整的用例模型

领域模型

领域模型是采用业务对象建立起来的一种模型。

领域模型推导

分析模型

分析模型使用分析类来建立系统原型,获得系统实现需求的第一手方案。

软件架构和框架

架构代表了一个软件项目对系统的定义和理解。软件架构在较高的抽象层次上,将系统规划为一些独立的逻辑部件,各负其责,这些部件通过标准的通信接口传递信息。一个架构就是一个系统的骨架。

框架是针对某个问题领域通用解决方案,它通常集成了最佳实践和可复用的基础结构,对开发工作起到减少工作量、指导和规范作用。

架构师系统蓝图,是对系统高层次的定义和描述。框架是解决方案,是加速和提高系统质量的半成品。

业务架构

业务架构在先启阶段建立,在精化阶段得以改进。业架构的目标是为业务领域建立一个维护和扩展的逻辑结构,描述业务的构成。业架构对我们理解客户业务,尤其是开发行业解决方案有着重要的作用。另一方面,业务架构是软件架构的重要输入。
业务架构来源于两个主要的输入:业务用例领域模型。如果没有业务架构,只有业务用例和领域模型时,我们将“只见树木不见森林”因为不论是业务用例还是领域模型,它们都只是业务领域的一个部分,尤其业务用例本身就是一个独立的单元,仅凭对它们的理解不足以俯瞰整个业务领域。

软件架构

软件架构需要在业务架构的基础上引入计算机环境,计算机环境包括硬件环境和软件环境。软件架构需要说明业务架构如何分布在计算机环境中,并得以执行。

一个典型的软件架构包括两个视角:广度视角深度视角,这两个视角构成对软件架构的“立体”描述。

软件层次广度视角架构图 软件层次深度视角

设计模型

设计模型是一个描述用例实现的对象模型,它可作为对实施模型及其源代码的抽象。设计模型用作实施和测试活动的基本输入。

设计模型就是我们所熟知的详细设计。

设计模型的主要输入

组件模型

实施模型

实施模型配置节点组件组成。

参考

上一篇下一篇

猜你喜欢

热点阅读