这套方法在两个地方最好用:分类(集合论)和分工(职责分配)——实测 B ⊆ A 为 True、4 个动作干净地落到 2 个类上。
7.1 讲了怎么筛名词,这一节讲筛完之后往哪用。两个用途,一个管【谁包含谁】,一个管【谁负责什么】。
一、用途一:分类就是集合论
把一堆东西按共同点归堆,在数学上就是求子集和交集。 实测:A = 小说/教材/画册,B = 教材/画册,B 是 A 的子集,判定为 True。 继承关系就是子集关系——父类是全集,子类是真子集,这就是 4.9 讲的继承在数学上的样子。 顺带还能量出差集:A 里不在 B 里的,就是【小说】——这部分是父类独有、子类没有的共性。
二、用途二:职责分配
另一件事是把动作分给名词:谁来做这件事?
实测四个动作——借书、还书、算逾期天数、算出罚款,干净地落到 2 个类上。
Loan 领走三个动作,Fine 领走一个——有多个动作的类不算问题,那叫聚合。
规矩只有一条:每个动作必须恰好有一个归属。两个类都能做,就是职责重叠。
三、两个用途的共同点
都不需要写代码——在纸上就能做,做完才动手。 都决定了代码长什么样:分类决定继承树,职责决定方法放在哪个类里。 这正是这一章的主旨:面向对象里有一套与语言无关的整理方法,它先于代码存在。
四、落到后面几章
分类的结果 → 第 8 章用类图画出来。 职责分配的结果 → 第 10 章讲拟人化和职责分配。 所以 7.2 是个转轴:往前它是整理方法,往后它是图和第 10 章的设计原则。
五、动手 Demo:应用于集合论和职责分配
先用集合运算验证【继承=子集】。 再把四个业务动作分给两个类,看有没有重叠。
book = {"小说", "教材", "画册"}
sub = {"教材", "画册"}
print(sub <= book) # True,继承关系成立
print(sorted(book - sub)) # ['小说'],父类独有
action = {"借书": "Loan", "还书": "Loan",
"算逾期天数": "Loan", "算出罚款": "Fine"}
owners = {}
for act, cls in action.items():
owners.setdefault(cls, []).append(act)
print(owners) # {'Loan': [三个], 'Fine': ['算出罚款']}
实跑输出:
--------------------------------------------------------------------
应用于集合论和职责分配
--------------------------------------------------------------------
这套方法在两个地方特别好用:**分类(集合论)**和**分工(职责分配)**。实测:
分类:
A = 小说/教材/画册
B = 教材/画册
B 是 A 的子集吗 True ← 继承关系成立
A 与 B 的交集 教材/画册
A 里不在 B 里的 小说
职责分配:
动作一共 4 个
归属的类 2 个
Fine 负责 算出罚款
Loan 负责 借书/还书/算逾期天数
有多个动作的类 1 个(不是问题,是聚合)
**集合论给的是【谁包含谁】**——继承关系就是子集关系,这一点第 8 章的类图要画它。
**职责分配给的是【谁负责什么】**——每一个动作必须恰好有一个归属,这是第 10 章的正题。
**两件事都不需要写代码,但它们决定了代码长什么样。**
实测:B ⊆ A 判定 True,交集是教材/画册,差集是小说。
职责那边 4 个动作落到 2 个类,Loan 领 3 个、Fine 领 1 个。
每个动作只有一个归属——这条守住了,后面第 10 章的职责分配才有得谈。
30 秒实验
- 把你的项目里的类画成一棵包含关系树,看看哪个【父类独有】的部分最大。
- 列出 5 个业务动作,逐个注明归属;找找有没有两个类都能做的。
常见误区
- 以为分类是【凭感觉归堆】。子集判定是可以算的,算出来才知道对不对。
- 以为一个类管多个动作就是设计错误。聚合不是问题,重叠才是。
自测三问(点开对答案)
1. 继承关系在集合论里是什么? —— 子集关系:子类是父类的真子集,实测 B ⊆ A 判定为 True。 2. 职责分配只有一条硬规矩,是什么? —— 每个动作必须恰好有一个归属;两个类都能做就是职责重叠。 3. 为什么说 7.2 是个转轴? —— 往前它是与代码无关的整理方法,往后它的成果要用类图表示(第 8 章)、要按职责分配落地(第 10 章)。- ☐ 7.3 在上游工程中化为通用的归纳整理法
相关笔记
- 软件不会直接表示现实世界 — 筛名词的前一步
- 三大要素之三:去除类的重复定义的继承 — 继承的机制版
- 在上游工程中化为通用的归纳整理法 — 这套方法能走多早
- 🧩 面向对象是怎样工作的 · 索引