答案一句话:软件要处理的本来就是人的组织。实测 5 个业务动作里 2 个由两个岗位共担、两两组合 10 对——这张没有一行代码的表,已经决定了代码结构。
7.5 讲了怎么分开想,这一节回答更根本的问题:为什么它本来就能通用?不是巧合,是因为业务本身就是一堆对象在分工。
一、先看一张纯业务的表
5 个业务动作:开票、发货、收款、退货、对账。 由一个岗位独占的 3 个:发货(仓储)、收款(财务)、对账(财务)。 由两个岗位共担的 2 个:开票(销售+财务)、退货(销售+仓储)。 动作两两之间的组合 10 对——这就是需要协调的界面数量,共担的 2 个正是界面所在。
二、这张表原样搬进代码会变成什么
岗位 销售 → 类 Sales;岗位 财务 → 类 Finance。
动作 开票 → 方法 invoice();共担的动作 → 调用方自己决定调谁的。
实测这张表里没有一行代码,但它已经决定了代码的结构。
这就是它【能通用】的原因:业务本身就是一堆对象在分工,软件只是把它照下来。
三、所以【通用】不是提炼出来的,是本来就有的
很多人以为:程序员把代码里的经验抽象出来,成了通用的方法。 这本书的说法更彻底:那套结构本来就在业务里,程序员只是发现了它、给它起了名字。 证据:不写程序的人也在用同一套结构做分工——他们没用过 class,但一直在分职责。
四、落到第 10 章
第 10 章讲【拟人化和职责分配】,讲的就是这张表:把人换成对象,把岗位换成类。 这也解释了为什么 OOP 的很多说法像管理学术语(职责、协作、消息)——因为它们本来就是。 但别过度拟人化:对象没有主观能动性,它只是【被规定好该怎么反应】。
五、动手 Demo:为何化为了通用的归纳整理法
拿一张纯业务的职责表,数一数独占和共担各几个。 然后把这张表逐行翻译成类和方法,看它是不是已经等于代码结构。
duty = {
"开票": ["销售", "财务"],
"发货": ["仓储"],
"收款": ["财务"],
"退货": ["销售", "仓储"],
"对账": ["财务"],
}
overlap = {k: v for k, v in duty.items() if len(v) > 1}
n = len(duty)
print(n, n - len(overlap), len(overlap), n * (n - 1) // 2) # 5 3 2 10
实跑输出:
--------------------------------------------------------------------
为何化为了通用的归纳整理法
--------------------------------------------------------------------
为什么这套东西能从代码里搬出来?**因为软件要处理的本来就是【人的组织】。**实测:
业务动作一共 5 个
由一个岗位独占的 3 个
两个岗位共担的 2 个
共担的是 开票/退货
动作两两之间的组合 10 对
把这张表原样搬进代码,**它长成的就是类和方法:**
岗位 销售 → 类 Sales
岗位 财务 → 类 Finance
动作 开票 → 方法 invoice()
共担的动作 → 调用方自己决定调谁的
**实测这张表里没有一行代码,但它已经决定了代码的结构。**
**这就是它【能通用】的原因**:**业务本身就是一堆对象在分工**,软件只是把它照下来。
**所以第 10 章讲【拟人化和职责分配】时,讲的就是这张表。**
实测:5 个动作、独占 3 个、共担 2 个(开票/退货)、两两组合 10 对。 共担的那 2 个就是需要协调的界面——它们最容易在代码里变成【谁都能改】的地方。 这张表决定了类怎么分、方法放哪,而它一个字都没提代码。
30 秒实验
- 把你公司的 5 个业务动作列成表,标出哪些是两个岗位共担的。
- 把这张表逐行翻译成类名和方法名,看有没有翻译不动的行。
常见误区
- 以为通用方法是程序员抽象出来的。那套结构本来就在业务里。
- 以为拟人化可以推到极致。对象没有主观能动性,它只是被规定好该怎么反应。
自测三问(点开对答案)
1. 这套方法为什么能通用? —— 因为软件要处理的本来就是人的组织——业务本身就是一堆对象在分工,软件只是把它照下来。 2. 实测 5 个动作的分布是什么? —— 独占 3 个、共担 2 个(开票由销售和财务共担、退货由销售和仓储共担),两两组合 10 对。 3. 共担的动作在代码里是什么? —— 是需要协调的界面,也是最容易变成【谁都能改】的地方;由调用方自己决定调谁的。- ☐ COLUMN 对象的另一面 语言在先,还是概念在先?
相关笔记
- 分为编程技术和归纳整理法进行思考 — 上一节的两问法
- 对照现实世界介绍面向对象 — 与现实对齐的起点
- 对三大要素的总结 — 结构侧的总收束
- 🧩 面向对象是怎样工作的 · 索引