把现实名词摊开数一遍:7 个词只有 3 个成了类,实测落成率 43%——软件表示的是【要处理的信息】,不是现实本身。
这本书里有两节同名(2.8 和 7.1),但角度不同:2.8 讲【像不像】,这一节讲【落成多少】。同时这是第七章的开篇,话题从【怎么写代码】转到【怎么整理信息】。
一、先说清这节和 2.8 的关系
2.8 的结论是【软件并不会直接表示现实世界】,讲的是为什么不像:现实有无穷细节,软件只需要其中一小部分。 这一节从同一个结论出发,换了个问法:现实里的那些名字,有多少能落成类? 2.8 讲【不对齐】,7.1 讲【怎么筛】。筛的标准只有一条——要不要处理它。
二、实测:七个名词,三个成类
拿图书馆借书这个最小业务,把现实名词摊开:读者、书、借阅记录、书架、管理员、罚款、图书馆。
成类的三个:读者 → Reader、书 → Book、借阅记录 → Loan。
没成类的四个:书架、管理员、图书馆、罚款。
落成率 43%——不到一半。这个比例不是巧合,大部分业务都落在这个量级。
三、消失的四种原因各不相同
书架:物理位置,软件不关心书放在哪一层。 管理员:在软件里只是一组权限,而权限不是一个对象。 图书馆:软件本身就是它——容器不需要再成为一个类。 罚款:现实里是一整套流程(定价、通知、缴纳、催缴),软件里只留下【金额】这一个字段,挂在 Loan 上。 四种消失理由不同,共同点是:它们都不是【要处理的信息】。
四、这条筛选法的实际操作
问三个问题:它有状态要记吗?它有动作要算吗?它要跟别的名词区分开吗? 三个都答【是】→ 成类;只答前两个 → 多半只是一个字段。 注意这个筛选是业务决定的,不是技术决定的:换个业务,同样七个名词可能落成五个类。 第七章要干的事,就是把这套筛选法从代码里抽出来——抽出之后它就不只属于程序了。
五、动手 Demo:软件不会直接表示现实世界
把一个最小业务的七个现实名词摊开,看几个成了类。 顺便验证一下这本书里两处同名的节到底差在哪。
nouns = ["读者", "书", "借阅记录", "书架", "管理员", "罚款", "图书馆"]
kinds = {
"读者": "成了类 Reader",
"书": "成了类 Book",
"借阅记录": "成了类 Loan",
"书架": "没成类(物理位置,软件不管)",
"管理员": "没成类(软件里只是权限)",
"罚款": "没成类(变成 Loan 的一个字段)",
"图书馆": "没成类(软件本身就是它)",
}
as_class = sum(1 for v in kinds.values() if "成了类" in v)
print("落成率", 100.0 * as_class / len(nouns)) # 43%
实跑输出:
--------------------------------------------------------------------
软件不会直接表示现实世界
--------------------------------------------------------------------
拿一个最简单的业务——图书馆借书——把现实名词摊开,看几个成了类:
现实里的名词 在软件里变成了什么
------------------------------------------------
读者 成了类 Reader
书 成了类 Book
借阅记录 成了类 Loan
书架 没成类(物理位置,软件不管)
管理员 没成类(软件里只是权限)
罚款 没成类(变成 Loan 的一个字段)
图书馆 没成类(软件本身就是它)
现实名词 7 个
变成类的 3 个
没变成类的 4 个
落成率 43%
**注意这本书里有两节同名**(2.8 和 7.1),**但角度不同**:2.8 讲【像不像】,这一节讲【落成率】。
**书架、管理员、图书馆在软件里【消失】了——不是漏了,是不需要。**
**而【罚款】现实里是一整套流程,软件里只是一个字段。**
**这就是 2.8 说的【不对齐】:软件表示的是【要处理的信息】,不是现实本身。**
实测:七个现实名词,三个成类,落成率 43%。 罚款那一行最值得看——现实里的一整套流程,进软件后压缩成了一个字段。 这正是 2.8 说的【不对齐】:软件表示的是【要处理的信息】,不是现实本身。
30 秒实验
- 拿你手上的一个业务,列出 10 个现实名词,看看几个能成类。
- 把没能成类的那些,各写一句【软件为什么不需要它】。
常见误区
- 以为现实里的东西都该有对应的类。落成率不到一半才是常态。
- 以为没成类的就是漏了。罚款从流程变成字段是精简,不是遗漏。
自测三问(点开对答案)
1. 7.1 和 2.8 有什么区别? —— 同一句结论、不同角度:2.8 讲【像不像】(为什么不对齐),7.1 讲【落成多少】(筛的标准)。 2. 实测落成率是多少? —— 七个现实名词三个成类,落成率 43%。 3. 罚款为什么没成类? —— 现实里是一套流程,软件里只需要金额这一个字段,挂在 Loan 上。 4. 书架和图书馆没成类,为什么理由不同? —— 书架是物理位置,软件根本不关心;图书馆是容器,软件本身就是它——容器不必再成为一个类。- ☐ 7.2 应用于集合论和职责分配
相关笔记
- 软件并不会直接表示现实世界 — 同名两节,那一节讲【像不像】
- 面向对象和现实世界是似是而非的 — 不对齐的总纲
- 应用于集合论和职责分配 — 筛完之后这套方法怎么用
- 🧩 面向对象是怎样工作的 · 索引