🧩 第七章 化为通用的归纳整理法的面向对象
📄 一句话概括

这套方法在两个地方最好用:分类(集合论)和分工(职责分配)——实测 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 秒实验

  1. 把你的项目里的类画成一棵包含关系树,看看哪个【父类独有】的部分最大。
  2. 列出 5 个业务动作,逐个注明归属;找找有没有两个类都能做的。

常见误区

  1. 以为分类是【凭感觉归堆】。子集判定是可以算的,算出来才知道对不对。
  2. 以为一个类管多个动作就是设计错误。聚合不是问题,重叠才是。
自测三问(点开对答案) 1. 继承关系在集合论里是什么? —— 子集关系:子类是父类的真子集,实测 B ⊆ A 判定为 True。 2. 职责分配只有一条硬规矩,是什么? —— 每个动作必须恰好有一个归属;两个类都能做就是职责重叠。 3. 为什么说 7.2 是个转轴? —— 往前它是与代码无关的整理方法,往后它的成果要用类图表示(第 8 章)、要按职责分配落地(第 10 章)。

相关笔记