一般软件的领域对象分析

领域对象分析是建领域模型的第一步:从现实问题里把对象一个一个找出来。一般软件(GUI、服务器、工具类)找对象的方法有固定套路——从业务名词用户操作目标数据流里挖。这条线和「游戏/建模的领域对象分析」是两条不同的线:一般软件的对象来自业务流程,游戏的对象来自世界规则。


一、对象不是「想出来的」,是「分析出来的」

新手做软件,常常直接从界面或类开始:

1
2
❌ 先画界面 → 再补数据 → 对象随机出现
❌ 先建类 → 类名凭感觉 → 对象和业务对不上

领域对象分析的正确顺序是从业务出发:

1
2
3
4
5
6
7
业务问题
↓ 分析
业务名词(对象候选)
↓ 追问
对象属性、关系、状态
↓ 确认
领域对象

对象不是发明的,是在业务里发现的——它本来就存在于问题描述里,只是需要分析动作把它挖出来。


二、三个分析来源

1. 业务名词(最常用)

业务描述里的名词就是对象候选:

1
2
「用户可以创建项目,把图片按文件夹整理,搜索时按元数据过滤,
编辑后的图片可以保存回原文件」
1
用户 / 项目 / 图片 / 文件夹 / 搜索 / 元数据 / 原文件

但名词要筛:不是所有名词都是对象。

1
2
3
4
5
对象:有属性、有状态、有关系、会变化的实体
→ 项目(有名字/路径/状态)、图片(有格式/尺寸/状态)
非对象:只是修饰/动作/属性值
→ 「整理」「过滤」「保存」是操作,不是对象
→ 「按元数据」的「元数据」要单独判断(它有属性,是对象)

判断标准:

一个名词,如果它有自己的属性、状态、或与其他对象的关系,它就是领域对象;如果只是修饰语或动作的一部分,就不是。

2. 用户操作目标(补充来源)

从用户用软件「要完成什么」倒推:

1
2
3
4
5
6
用户目标:管理一批图片
→ 需要「图片」「文件夹」对象
用户目标:快速找到某张图
→ 需要「搜索」「搜索条件」对象
用户目标:编辑并保存
→ 需要「编辑文档」「保存结果」对象

操作目标里的动作对象往往就是领域对象。

3. 数据流(验证来源)

画出「数据从哪里来到哪里去」,每个被传递/被转换的东西都是对象:

1
文件系统 → 读入 → ImageFile → 处理 → 编辑文档 → 保存 → 文件系统

这条流上的节点:ImageFileEditorDocument——都是领域对象。数据流能验证名词分析的结果是否完整。


三、完整例子:图片管理器

用三个来源交叉验证:

1
2
3
业务名词:项目/文件夹/图片/搜索/元数据
用户目标:创建项目/整理图片/查找图片/编辑保存
数据流:文件系统 → ImageFile → EditorDocument → 文件系统

分析出领域对象:

1
2
3
4
5
6
Project          项目
Folder 文件夹
ImageFile 图片文件
ImageMetadata 图片元数据
SearchQuery 搜索条件
EditorDocument 编辑中的文档

每个对象再补属性、关系、状态:

1
2
3
4
ImageFile
├── 属性:path, format, width, height, size, modified
├── 关系:属于 Folder;拥有 ImageMetadata
└── 状态:Closed → Opened → Modified → Saving → Saved

这就完成了「一般软件」的领域对象分析。


四、另一类一般软件:调试器

调试器是工具类软件,对象分析同样从业务来:

1
2
3
4
5
6
业务问题:调试一个正在运行的程序
→ 对象候选:进程、模块、线程、断点、内存区域、符号、寄存器

进程(有 pid/名字/基址,有关联线程) → 对象
断点(有地址/条件/命中次数/状态) → 对象
寄存器(一组被读取的值,无独立状态) → 看需求,通常作为进程的属性

发现没有:调试器的对象分析套路和图片管理器完全一样——从业务名词 + 操作目标出发,判断哪个名词有属性/状态/关系。


五、一般软件 vs 游戏/建模:两条线的分界

维度 一般软件 游戏 / 建模
对象从哪来 业务流程、用户操作目标 世界规则、实体、交互
对象是什么 业务实体(图片、订单、进程) 世界实体(玩家、敌人、道具)
分析依据 「用户要完成什么任务」 「这个世界里有什么东西、什么规则」
核心问题 软件帮用户做什么 世界如何运转、玩家如何行动

一般软件的对象来自用户与业务的交互;游戏/建模的对象来自世界的结构。所以领域对象分析是两条独立的线(本线和下一篇)。


六、和其他线的关系

1
2
3
4
5
6
7
8
9
10
11
12
领域对象分析(本线)→ 领域模型
对象分析是建领域模型的第一步:先挖出对象,再建属性/关系/规则

领域对象分析 → 数据结构
挖出的对象 → Domain 数据(ProcessInfo 等)

领域对象分析 → 功能设计
对象 + 对对象的操作 = 功能
(图片对象 + 打开/保存/搜索 = 图片管理功能)

领域对象分析 → 从输入到交互
一般软件的用户流程(GUI 等)操作的就是这些领域对象

收束

1
2
3
4
5
6
7
8
9
10
11
对象不是发明的,是在业务里发现的
业务名词 + 用户操作目标 + 数据流 → 交叉挖出对象

判断标准:有属性/状态/关系 的名词才是对象
修饰语、动作的一部分 → 不是对象

一般软件对象来自业务流程
图片管理器:Project / Folder / ImageFile / SearchQuery
调试器: Process / Module / Thread / Breakpoint

vs 游戏/建模:一般软件从「用户任务」分析,游戏从「世界规则」分析

先分析业务,再发现对象。 一般软件的对象分析,起点永远是「用户要通过这个软件完成什么」。