# 对象过程建模

## 目录 <a href="#mu-lu" id="mu-lu"></a>

* UML
* OPM
* OPM优化

### UML <a href="#uml" id="uml"></a>

**1997年发布UML标准**

| 主要域  | 视图            | 图                    | 主要概念               |
| ---- | ------------- | -------------------- | ------------------ |
| 结构   | 静态视图          | 类图                   | 类、关联、泛化、依赖关系、实现、接口 |
| 用例视图 | 用例图           | 用例、参与者、关联、扩展、包括、用例泛化 |                    |
| 实现视图 | 构件图           | 构件、接口、依赖关系、实现        |                    |
| 部署视图 | 部署图           | 节点、构件、依赖关系、位置        |                    |
| 动态   | 状态机视图         | 状态机图                 | 状态、事件、转换、动作        |
| 活动视图 | 活动图           | 状态、活动、完成转换、分叉、结合     |                    |
| 交互图  | 顺序图           | 交互、对象、消息、激活          |                    |
| 协作图  | 协作、交互、协作角色、消息 |                      |                    |

**UML 用例建模**

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FGgrHrbV7dGFSvXWc3Zdh%2F269.jpg?alt=media\&token=ece05b64-932e-4365-9ba8-992de7706e1b)

图中有多个用例，每个用例有一个参与者，以及一个用例名称

用例是一个站在使用者的角度，他会在这个系统上做什么事情，这个事情可以称为一个用例

用户通过这个系统做成了一件事情，这是以目标为导向的，比如用户通过ATM机取钱，那么取钱就称为一个用例

用例更多的是涉及到用户和系统之间的交互

为了后期更加详细的设计，需要将用例图拆分为文档

| 内容   | 描述                          |
| ---- | --------------------------- |
| 用例名称 | 报名活动                        |
| 用例编号 |                             |
| 行为角色 | 访客、会员                       |
| 简要说明 | 访客只能查看、会员可报名                |
| 前置条件 | 用户已经通过活动列表进入具体活动介绍页面；用户已经登录 |
| 后置条件 | 报名按钮显示为：已报名                 |
| 流程图  |                             |

UML 会使用多种图来展示用例内部详细的过程，但是没办法进行层次缩放，这是使用 UML 做系统设计会存在的问题

### OPM <a href="#opm" id="opm"></a>

Object Process Methodology

* 系统视角
* 概念建模
* 系统分解

#### 系统视角 <a href="#xi-tong-shi-jiao" id="xi-tong-shi-jiao"></a>

任何系统都可以从两方面来看

* 结构（静态）
* 行为（动态）

#### 概念建模 <a href="#gai-nian-jian-mo" id="gai-nian-jian-mo"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FtIkQ64oVQdYK9RjM6XC6%2F270.jpg?alt=media\&token=e5c4d587-30b8-4088-ad63-15ffc0fd9a43)

在对象和对象之间建立抽象的关系

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F6LED2QwobRal8rMehLFD%2F271.jpg?alt=media\&token=8d804a59-2e0e-4b13-b702-ec6c2bdba13f)

过程影响对象

#### 系统分解 <a href="#xi-tong-fen-jie" id="xi-tong-fen-jie"></a>

* 从对象和功能开始建模
* 对象的状态
* 用过程链接联系对象

**从对象和功能开始建模**

对象是存在或可能存在的事物

过程是变换对象的事物

对象或过程都是一个事物

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FnOH1edSiljTgxbcolbtt%2F272.jpg?alt=media\&token=30e3fc20-f64d-4d8d-a88b-f81be65e78ed)

举一个导购分享的例子，首先导购生成分享链接会产生一条分享链接，这就是我们所说的对象

接着点击分享链接，分享链接作为这个过程的输入，点击链接会创建分享关系

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F0aeQzIKjyaV5TGxWF9ja%2F273.jpg?alt=media\&token=0547afd6-ec7b-4941-8ae5-38b683df06f9)

抽取对象的过程中需要注意正方形填的是名词，是一个对象；圆形填的是动词，是一个过程

过程一定会影响对象，使得对象的状态发生一些改变，或者包括创建和销毁这个对象，同样的，一个对象会作为另外一个过程的输入

**对象的状态**

一段时间内对象可能处于一种状态或者情形

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FsEivnOPL9sYOEHuBZiia%2F274.jpg?alt=media\&token=7b52224d-9914-4675-97ed-43f006b4b26b)

状态使用圆角矩形，分享链接有两种状态，有效的和无效的，通过状态与过程进行交互，只有链接是有效的才可以点击，如果是无效的需要重新生成

这个时候我们需要多一个请求分享链接的过程，这个过程与生成分享链接的过程是不可以连接的

过程与过程之间不可以连接，连接只能发生在一个对象与一个过程之间，所以这个图可能画错了，我们需要调整如下

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FuHMlnzpjvJjuV5bapzyE%2F275.jpg?alt=media\&token=7131bde6-70f9-4e88-b78d-3608d9474135)

状态的检查应该放到点击链接的时候，链接如果是有效的，才会生成分享关系

链接状态是分享链接的一个属性，通过属性连接（两个三角形中间实心的图标）

请求分享链接的时候一定有一个导购的对象，分享链接属于导购的一个属性

分享链接的状态分为已生成和未生成，请求分享链接如果未生成，则需要生成分享链接，双向的

**用过程链接联系对象**

* 过程链接
* 结构链接
* 事件链接
* 行为控制

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F6HFy25Xeq5dNspACDm0n%2F276.jpg?alt=media\&token=414974d3-a537-44af-8957-c9895d3a402c)

过程链接：将一个对象（或其状态）与一个过程联系起来，比如分享链接与请求分享链接的联系

结构链接：将一个对象与另一个对象（或者一个过程与另一个过程联系起来），比如请求分享链接与点击链接的联系

**过程链接**

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F1ZgU9UPxkQVAd0K1Jnjf%2F277.jpg?alt=media\&token=53727494-6dbe-44e6-85cb-5ab1728212aa)

主体链接：系统的参与者，用户主导了整个过程，比如导购和请求分享链接的联系，客户和点击链接的联系

手段（支持）链接：提供手段和支持，比如链接提供器和生成链接的联系

两者的区别是一类是主体对象，一类是支持对象

变换链接：过程就是用来改变对象的状态，影响一个对象的状态或者吸收一个对象，比如分享链接和生成链接的联系

**过程链接只能建立再对象和过程上**

**结构链接**

结构链接是建立在对象与对象之间，过程与过程之间，它们之间往往拥有一种持久的关系，属性、继承、组成等等

* 结构关系
* 组成关系

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FX4atJ3CwiP4GS2Lr4Rt8%2F278.jpg?alt=media\&token=6f2a13c8-213d-4542-814e-a9413babf96c)

属性：分享链接是导购的属性，链接状态是分享链接的属性，通过属性连接建立联系

继承：零售客户和分销商客户继承客户，浏览器点击和APP点击继承点击链接

**事件链接**

在结构/过程链接之上添加 e 标注，代表是偶发的

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F0mCJxZeumx7NIptIqrbC%2F279.jpg?alt=media\&token=244bab82-9b02-4568-bd02-f25db7755518)

Server 支持请求响应这件事情是偶发的，并不是一直有的，所以可以加上e标注

**行为控制**

* 布尔对象
* 条件 if
* 或（OR）/ 与（XOR）

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FZuNUvpjPBu3GkdUrSSGN%2F280.jpg?alt=media\&token=a541f766-6fd1-4d25-8103-631928c9e584)

布尔对象：建立在支持对象之上，但是会有一个判断，比如我们获取链接的时候会有一个判断，如果没有链接则生成链接，有链接则返回

条件 if：和事件链接相似，比如在链接状态有效的时候创建分享关系，添加 c 标注，无效的时候异常退出

或（OR）/ 与（XOR）：或表示走一个或者多个都可以，亦或表示只能走一个，比如在是否有链接的两个选项中间加两条弧线，表示只能选一个；如果是或则画一条弧线

**过程链接与结构链接集合**

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FXheLHjCotQxngqZiZZ0w%2F281.jpg?alt=media\&token=749a4698-06e6-4e3c-88b0-43f9fa2a3d89)

### OPM优化 <a href="#opm-you-hua" id="opm-you-hua"></a>

* 抽象与细化
* 过程与判定
* 复杂度管理

#### 抽象与细化 <a href="#chou-xiang-yu-xi-hua" id="chou-xiang-yu-xi-hua"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FPQ5goneYH0sYULnVglyf%2F282.jpg?alt=media\&token=1147a479-62b6-4320-ab9d-1b8ed825204c)

抽象与细节之间会有一个继承关系，导购继承用户，分享链接抽象为推广

员工，客户也可以导购；展示二维码也可以作为一种分享链接

#### 过程与判定 <a href="#guo-cheng-yu-pan-ding" id="guo-cheng-yu-pan-ding"></a>

很多时候没办法确定是一个对象还是一个过程，最简单的方式就是根据是动词还是名词判断，以及根据过程有没有改变对象的状态判断

#### 复杂度管理 <a href="#fu-za-du-guan-li" id="fu-za-du-guan-li"></a>

* 状态显示与状态隐藏
* 展开与折叠（放大与缩小）
* 端口折叠

**状态显示与状态隐藏**

人为的控制是否要显示状态，比如链接状态

**展开与折叠（放大与缩小）**

把图画的层次高一点则简单易懂，画的层次毕竟低一点则复杂一些，但是表现会更加清晰，可以对它们进行切割

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FJTnOaY9OwDe91Z9oczsF%2F283.jpg?alt=media\&token=1517e414-e447-4eec-9925-eabee1b0d625)

如果把分享放大，则可以在里面画更加细节的过程，同时可以在获取链接里面再画更加细节的过程

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2Fqz4jIxb0v4BXN4t1vOAt%2F284.jpg?alt=media\&token=527f4ef7-89bb-420d-9f63-7ae6a3bde5ed)

我们也可以在多张图中进行缩放，比如获取链接放到第二个图中

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2Fu1lDId0owshijxqG4Z9S%2F285.jpg?alt=media\&token=e9b3744f-6893-4efe-930d-94da85ba28af)

**端口折叠**

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FRrqeFNxUkYG3625lcJrX%2F286.jpg?alt=media\&token=be7a478a-2ca6-415c-8b33-101c8b146577)

比如在是否有链接的条件 if 可以折叠起来，直接在外部通过两个端口有和无来和其他对象过程建立链接

**作业**

尝试把自己之前那个系统架构图里面的过程进入展下，一直向下到不可分割的原子级别（可以到某个类级别）
