专栏【对象的另一面】问的是:先有词,还是先有东西?实测八个概念在 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 秒实验
- 挑一个你【懂但说不出来】的概念,给它起一个自己的名字试试。
- 用 C 的写法手工模拟一次继承,体会【没有词也要做这件事】。
常见误区
- 以为没有语言词汇就没有概念。C 里没有继承这个词,C 程序员照样在继承。
- 以为名字只是叫法。名字决定了能不能被讨论、被改进。
自测三问(点开对答案)
1. 这篇专栏的答案是什么? —— 概念在先;语言给不给名字是另一回事——C 里没这些词,C 程序员照样在做这些事。 2. 实测两种语言各有多少专门词? —— 八个概念里 Python 有 8 个,C 只有 3 个,其余只能靠约定或手工模拟。 3. 为什么说【给了名字】很关键? —— 有了名字才能指着它讨论,讨论才能改进;团队没词,每次讨论都得把整段代码念一遍。- ☐ 下一章(第八章 UML:查看无形软件的工具)
相关笔记
- 为何化为了通用的归纳整理法 — 这一篇的前提
- 面向对象难的原因 — 三个原因的出处
- 原因之二:滥用比喻引起混乱 — 名字混用的另一种后果
- 🧩 面向对象是怎样工作的 · 索引