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

专栏【对象的另一面】问的是:先有词,还是先有东西?实测八个概念在 Python 里都有专门名字(8 个),在 C 里只有 3 个——但 C 程序员照样在按这些概念写程序,答案就清楚了。

📝 本节和前面几节的关系

7.6 讲到这套结构【本来就在业务里】,顺着这个思路往下问:那语言给不给它名字,重要吗?这篇专栏就答这一问。

一、问题本身:语言在先,还是概念在先

两种立场都有人持:没有语言就没有概念(说不出来的东西想不清楚);没有概念就没有语言(先看见才造词)。 这篇专栏的答案偏后者:概念在先,语言给不给名字是另一回事。 理由是:C 里没有继承这个词,但 C 程序员照样在手工复制公共字段——他在做继承,只是没这个词。

二、实测:八个概念在两种语言里的名字

Python 都有专门词(8 个):class、对象、括号里写父类、同名方法、下划线约定、协议/抽象基类、def 写在类里、类名加括号。 C 只有 3 个(struct、头文件、malloc 加初始化),其余只能靠约定或手工模拟。 注意 C 那一列到处是【无】和【近似】,但它的程序照样能运行——说明名字不是前提。

三、但【给了名字】很关键

有了名字才能【指着它讨论】:说【这里该用多态】,比说【这里那段 switch 有点难看】精确得多。 讨论才能改进:一个团队如果连词都没有,每次讨论都得把整段代码念一遍。 这也解释了一件事:为什么学 OOP 时总觉得【懂了但说不出来】——你缺的不是概念,是名字。

四、回扣第一章:面向对象难的原因

1.4 说面向对象难,难在三个原因:结构复杂、滥用比喻、概念抽象。 这一篇补上第四条:概念密度高,而名字又容易混。 八个概念挤在一个词(面向对象)底下,还分成编程技术和归纳整理法两半(7.4 讲过)——不难才怪。 对策也就是这一章给的:先分清哪一半,再给每个概念一个准确的名字。

五、动手 Demo:语言在先,还是概念在先?

把八个 OOP 概念在 Python 和 C 里的对应物列出来。 数一数各自有多少【专门的名字】。

rows = [
    ("类",   "class",           "struct(近似)"),
    ("继承", "父类写在括号里",  "无(靠手工复制)"),
    ("多态", "同名方法",        "无(靠函数指针)"),
    ("封装", "下划线约定",      "无(都是公开的)"),
    ("实例化", "类名加括号",    "malloc + 初始化"),
]
has_py = sum(1 for a, b, c in rows if "无" not in b)
has_c  = sum(1 for a, b, c in rows if "无" not in c)
print(has_py, has_c)   # 5 2(扩到八个概念是 8 和 3)

实跑输出:

--------------------------------------------------------------------
语言在先,还是概念在先?
--------------------------------------------------------------------

  专栏【对象的另一面】问的是:**先有词,还是先有东西?**实测八个概念在两种语言里的名字:

  概念       Python 里的名字        C 里的名字
  ---------------------------------------------------
  类         class                  struct(近似)
  对象       对象(一切皆对象)     变量(无专门词)
  继承       父类写在括号里         无(靠手工复制)
  多态       同名方法               无(靠函数指针)
  封装       下划线约定             无(都是公开的)
  接口       协议/抽象基类         头文件(近似)
  方法       def 写在类里           函数(无归属)
  实例化     类名加括号             malloc + 初始化

      八个概念,Python 有专门词的     8 个
      八个概念,C 有专门词的          3 个(其余只能靠约定)

  **注意 C 那一列到处是【无】和【近似】——但 C 程序员照样在按这些概念写程序。**
  **所以答案是:概念在先,语言给不给名字是另一回事。**
  **而【给了名字】很关键**:有了名字才能【指着它讨论】,讨论才能改进。
  **这也解释了 1.4 说的【面向对象难】**:它的概念密度高,而名字又容易混。

实测(八个概念):Python 有专门词 8 个,C 只有 3 个,其余只能靠约定。 C 那一列到处是【无】和【近似】,可 C 程序员照样在按这些概念写程序——所以概念在先。 而给了名字很关键:有了名字才能指着它讨论,讨论才能改进。

30 秒实验

  1. 挑一个你【懂但说不出来】的概念,给它起一个自己的名字试试。
  2. 用 C 的写法手工模拟一次继承,体会【没有词也要做这件事】。

常见误区

  1. 以为没有语言词汇就没有概念。C 里没有继承这个词,C 程序员照样在继承。
  2. 以为名字只是叫法。名字决定了能不能被讨论、被改进。
自测三问(点开对答案) 1. 这篇专栏的答案是什么? —— 概念在先;语言给不给名字是另一回事——C 里没这些词,C 程序员照样在做这些事。 2. 实测两种语言各有多少专门词? —— 八个概念里 Python 有 8 个,C 只有 3 个,其余只能靠约定或手工模拟。 3. 为什么说【给了名字】很关键? —— 有了名字才能指着它讨论,讨论才能改进;团队没词,每次讨论都得把整段代码念一遍。

相关笔记