🧩 第一章 面向对象:让软件开发变轻松的技术
📄 一句话概括

同一个词站在不同层,指不同东西——【这个类有 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 秒实验

  1. 找一个你和同事争论过的技术问题,看是不是站在了不同层。
  2. 把这个三层表抄到笔记里,读第 4、8、10 章时对照着看。

常见误区

  1. 以为技术争论都是观点分歧。很多是层次错位。
  2. 以为术语只能有一个定义。不同层各有一套,且都合法。
自测三问(点开对答案) 1. 【类】这个词有哪三层含义? —— 语言层指 class 那段代码,设计层指一组职责,工程层指一个交付单元。 2. 为什么说抽象是最难治的一条? —— 结构复杂看得见、比喻歪能举反例,词有歧义却看不见——双方都以为在说同一件事。 3. 怎么处理层次错位的争论? —— 先确认双方站在哪一层,再判断是不是真的冲突;不同层的说法可以同时成立。

相关笔记