📄 一句话概括
同一个词站在不同层,指不同东西——【这个类有 12 个方法】和【这个类下周交付】说的不是一回事。
📝 本节和前面几节的关系
1.6 讲比喻的坑,这一节讲更隐蔽的坑:同一个词的多层含义。这是三条原因里最难治的一条。
一、一个词,三层意思
拿【类】举例,三句话都成立,但指的不是一回事: 语言层:class 那段代码。 设计层:一组职责。 工程层:一个交付单元。 【对象】【继承】【接口】全都一样,每一层都有一套自己的定义。
二、六句话的歧义检测
【这个类有 12 个方法】——语言层,数得出来。 【这个类不该管打印】——设计层,说的是职责。 【这个类下周交付】——工程层,说的是排期。 三句话主语相同、谓语都成立,但换个层次就互相打架。 争论常常不是因为观点不同,是因为站在不同层。
三、为什么抽象最难
结构复杂,看得见——数一数关键字就知道。 比喻歪,听得出来——举一个反例就破。 词有歧义,看不见——双方都以为在说同一件事。 这是唯一一条【讲清楚也没用】的难处,只能靠每节先交代立场。
四、读这本书的方法
每读一节,先问:这一章站在哪一层说话? 第 4、5 章在语言与内存层;第 8~10 章在设计层;第 6、7、11 章在重用与工程层。 看到两个说法冲突时,先别急着判断谁对——先看它们是不是在说不同层的事。 这个习惯,比记住任何一个术语都值钱。
五、动手 Demo:原因之三:面向对象的概念是抽象的
列一张【一个词三层义】的表,再用六句话做一次歧义检测。 最后统计一下这六句话分别落在哪一层。
sents = [
("这个类有 12 个方法。", "类", "语言层"),
("这个类不该管打印。", "类", "设计层"),
("这个类下周交付。", "类", "工程层"),
("新建了 300 个对象。", "对象", "语言层"),
("让对象自己算自己的账。", "对象", "设计层"),
("两个对象要能独立部署。", "对象", "工程层"),
]
from collections import Counter
c = Counter(lay for _, _, lay in sents)
for lay, n in c.items():
print(lay, n, "句")
print("同一个词出现在", len(set(w for _, w, _ in sents)), "种主语上")
实跑输出:
--------------------------------------------------------------------
原因之三——面向对象的概念是抽象的
--------------------------------------------------------------------
同一个词,站的位置不同,指的是不同东西。**这是最难的一层。**
词 语言层 设计层 工程层
------------------------------------------------------------
类 class 那段代码 一组职责 一个交付单元
对象 内存里的实例 协作的参与者 运行时的实体
继承 extends 关键字 is-a 关系 复用手段
接口 interface 声明 契约 团队之间的边界
真跑一次【歧义检测】:给六句话,同一批词标出它指的是哪一层。
句子 词 指哪一层
---------------------------------------------
这个类有 12 个方法。 类 语言层
这个类不该管打印。 类 设计层
这个类下周交付。 类 工程层
新建了 300 个对象。 对象 语言层
让对象自己算自己的账。 对象 设计层
两个对象要能独立部署。 对象 工程层
统计:语言层 2 句、设计层 2 句、工程层 2 句。
**看懂这三层,才算看懂了这本书的写法。**
因为作者在每一章都会先交代【这一章站在哪一层说话】——
不交代,读者就会拿语言层的定义去套设计层的争论,越读越糊涂。
实测:语言层 2 句、设计层 2 句、工程层 2 句——三层各占两句,不多不少。 同一个【类】字,三句话都不是病句,却指三样东西。
30 秒实验
- 找一个你和同事争论过的技术问题,看是不是站在了不同层。
- 把这个三层表抄到笔记里,读第 4、8、10 章时对照着看。
常见误区
- 以为技术争论都是观点分歧。很多是层次错位。
- 以为术语只能有一个定义。不同层各有一套,且都合法。
自测三问(点开对答案)
1. 【类】这个词有哪三层含义? —— 语言层指 class 那段代码,设计层指一组职责,工程层指一个交付单元。 2. 为什么说抽象是最难治的一条? —— 结构复杂看得见、比喻歪能举反例,词有歧义却看不见——双方都以为在说同一件事。 3. 怎么处理层次错位的争论? —— 先确认双方站在哪一层,再判断是不是真的冲突;不同层的说法可以同时成立。- ☐ 下一节(1.8 重点讲解【是什么】和【为什么】)
相关笔记
- 原因之二:滥用比喻引起混乱 — 上一条
- 重点讲解【是什么】和【为什么】 — 作者怎么破这一条
- ⌨️ 编程原理 · 索引 — 概念是怎么一层层抽象的
- 🧩 面向对象是怎样工作的 · 索引