首页 › programming › 484万人学的面向对象课

484万人学的面向对象课:四大支柱被讲窄了的那部分

概述

一、视频基本信息

透明性说明:本文写作环境未获取该视频逐字稿,下文对“视频讲了什么”的还原,基于该视频标题所承诺的“简化版 OOP 入门”这一教学品类的标准知识主线重构,凡涉及视频原话与具体演示细节处均不作虚构转述。而本文真正的重心——这套知识的历史源头与工程检验——全部有可查证的公开文献支撑。

二、核心主张拆解:一条“简化版”OOP课的知识主线

所有以“简化”为卖点的 OOP 入门内容,几乎共享同一条最小完整路径。按教学叙事顺序,这条主线可以拆成五个要点:

要点一:先回答“为什么需要对象”——过程式的痛点

简化版 OOP 课的开场从来不是定义,而是动机:如果一段程序只是“从上到下执行的一串指令”(过程式),那么当程序变大,函数和全局数据会搅成一团——谁都能改数据、改了哪里没人知道、一个改动牵动全身。对象(object)给出的答案是把数据和操作这些数据的行为捆在一起:字符串知道自己的长度,列表知道怎么排序自己。这一步的教学价值在于立起 OOP 的核心直觉——程序不再是“指令的流水账”,而是“一组互相协作、各司其职的对象”。

要点二:类与对象——蓝图与实例

第二个要点是区分 class(类)与 object(对象):类是蓝图/模板,定义“这一类东西有哪些属性、哪些行为”;对象是根据蓝图造出来的具体实例,每个实例有自己的属性值。伴随这个区分,入门课必然引入两个语法概念:构造函数(constructor,负责在实例诞生时把属性初始化好)和 this/self(在方法内部指代“当前这个实例”)。这里有一个初学者最常见的误解值得点破:类不是“分类”,而是“工厂”——重点不是给世界贴标签,而是控制实例的出生方式和不变量。

要点三:封装——藏起来,只留门口

第三步讲封装(encapsulation):把字段设为私有(private),对外只暴露方法。教学版本通常以“getter/setter”演示:字段私有化,通过 getBalance()/deposit() 这样的方法访问。它给出的理由完全成立——防止外部代码绕过规则直接改内部状态(比如余额不允许被直接改成负数)。这个要点本身是对的,但“怎么教”埋下了后来要审计的第一个坑(见第四节)。

要点四:继承与多态——is-a 与同一消息的不同响应

第四步讲继承(inheritance):子类复用父类的属性和行为,并可覆盖(override)其中的方法;Dog 继承 Animal,重写 makeSound()。紧跟着的是多态(polymorphism):同一条消息发给不同类型的对象,得到各自不同的响应——代码里写 animal.makeSound(),运行时狗叫狗的、猫叫猫的。简化版课程在这里通常会展示多态最经典的工程收益:消灭满屏的 if (type == "dog") ... else if (type == "cat") ...,新增类型不用改调用方代码。

要点五:抽象——只暴露“是什么”,藏起“怎么做”

最后一步讲抽象(abstraction):一个对象对外只呈现“它能做什么”(接口),完全隐藏“它内部怎么做”。开电视不需要懂显像管,调用 sendEmail() 不需要知道 SMTP 栈。抽象和封装的分工在教学里常常被讲得含混,最干净的区分是:封装回答“把什么藏起来”,抽象回答“把什么露出来”——前者是藏的纪律,后者是露的设计。

以上就是这条视频承诺交付的全部知识面。四个支柱各占几分钟,节奏友好,例子直观——作为零基础第一课,它是合格甚至优秀的。问题在于:这套教学 canon 本身,是一条被历史反复改写过的叙事。下一节我们把它的来路挖开。

三、理论与人物溯源:四大支柱从哪里来

1. 起点:Simula 67 与两位挪威工程师

“类、对象、子类、虚方法”这一整套机制,最早诞生于 1967 年挪威计算中心的 Ole-Johan Dahl 与 Kristen Nygaard 开发的 Simula 67。他们最初是为了写离散事件仿真程序(港口调度、工厂流程),才发明了“把数据和操作绑成类、通过子类扩展行为”的结构。这解释了一个常被忽略的事实:面向对象一开始是仿真工具,不是软件工程哲学。Dahl 与 Nygaard 因此获得 2001 年图灵奖——这是 OOP 思想史上的第一个坐标。

2. 转折:Smalltalk 与 Alan Kay 的“消息传递”

把 OOP 推成一门“思想”的是施乐帕克(Xerox PARC)的 Smalltalk 项目——Alan Kay、Dan Ingalls、Adele Goldberg 等人在 1970 年代的工作。但这里出现了整部 OOP 思想史上最大的反讽:Kay 心中的面向对象,核心根本不是类和继承,而是消息传递——对象之间像细胞、像网络上的计算机一样互相发消息,每个对象封装自己的状态,系统由独立个体的协作涌现而出。Kay 在 OOPSLA 1997 的著名演讲《The Computer Revolution Hasn't Happened Yet》及其后的公开邮件中反复强调这一点,并留下了那句广为流传的话:他当年提出 object-oriented 这个词时,“脑子里想的肯定不是 C++ 那样的东西”。Kay 于 2003 年获图灵奖。换句话说:今天教科书上的“四大支柱”,是 Simula 机制经过 C++/Java 工业化之后的版本,而创始人本人的愿景(消息传递、类细胞系统)在教学 canon 里几乎消失了。

3. 定型:GoF 与“组合优于继承”

1994 年,Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 四人(即 "Gang of Four")出版《Design Patterns: Elements of Reusable Object-Oriented Software》,把 OOP 实践推向巅峰,也第一次系统性地写下了那条著名纪律——优先使用对象组合而非类继承(favor object composition over class inheritance,见原书第一章)。注意这个时间点的意味:就在 OOP 教学 canon 定型的同一本书里,作者们已经在提醒读者别滥用继承。四大支柱里的“继承”,在它自己的权威文献里就是一个需要被约束的成分。

4. 工程化补丁:SOLID

Robert C. Martin 在 2002 年的《Agile Software Development: Principles, Patterns, and Practices》及其系列文章中,把 OOP 设计经验整理为 SOLID 五原则(单一职责、开闭、里氏替换、接口隔离、依赖倒置)。SOLID 的本质,是给四大支柱“打补丁”:它不告诉你支柱是什么,而是告诉你支柱搭错了会怎么塌。一条 OOP 入门课教的是砖块,SOLID 教的是承重墙在哪。

四、批判性审查:哪些站得住,哪些被讲窄了

站得住的

其一,四大支柱作为语言机制的描述是准确的:封装、抽象、继承、多态确实是对主流语言(Java/C#/C++/Python)提供机制的忠实概括,这一点任何语言规范都可验证。其二,多态消灭类型分支的工程收益是真实且巨大的——它是插件架构、依赖注入、可测试性的根基,这条在五十年工程史里从未被推翻。其三,“用方法约束状态变更”的封装直觉方向正确——问题只在实现手段(见下)。

被讲窄或需要修正的

第一,继承不等于默认的复用方式。入门课常把“继承=代码复用”讲成 OOP 的常规操作,但工程界为此付出了几十年的“脆弱基类”代价——父类一改,所有子类默默遭殃。Erlang 之父 Joe Armstrong 在 Peter Seibel 的《Coders at Work》(2009)里留下那段著名的吐槽:你想要一根香蕉,结果得到的是握着香蕉的猩猩、以及它背后的整片丛林——说的就是深继承树把“复用一小块”变成“拖走一大家子”。GoF 在 1994 年给出的替代方案(组合优先)至今仍是更可靠的建议:能用“拥有一个”就别用“是一个”。

第二,getter/setter 不等于封装。这是教学 canon 里最持久的一个误读。Allen Holub 在 2003 年发表于 JavaWorld 的名文《Why getter and setter methods are evil》系统论证过:把每个字段配上一对访问器,只是用更啰嗦的语法把公开字段重新表演了一遍——数据还是暴露的,规则还是可以绕过的。真正符合封装精神的是“告诉对象做什么”(tell, don't ask):问对象要数据再自己做决定,不如让对象自己带着数据完成决定。

第三,Kay 的愿景被教学窄化了。如第三节所述,面向对象创始人心中的核心是消息传递与独立个体的协作,而不是“用类搭出继承树”。Rich Hickey(Clojure 作者)2011 年在 Strange Loop 的演讲《Simple Made Easy》从另一侧给出了同样的批评:主流 OOP 把身份、状态、时间、认知焊死成一个个可变对象,恰恰是复杂度失控的源头之一。这两条批评角度不同、指向一致——四大支柱是 OOP 的一种实现,不是 OOP 的全部。

第四,当代工程已经在绕开继承。游戏行业的数据导向设计(如 Stoyan Nikolov 在 CppCon 2019 的演讲《OOP Is Dead, Long Live Data-oriented Design》所代表的路线)用“数据布局优先”替代对象层级,换来缓存友好的性能;Rust 干脆没有继承,用 trait 与组合实现全部多态;Unity DOTS、Bevy 等 ECS 框架把“对象”拆成“组件+系统”。这些不是边缘实验,而是各自领域的主流路线——它们共同证明:四大支柱描述的是一种风格,而不是软件的物理定律。

第五,2026 年的语境变化。当 AI 编码助手能批量生成结构工整的类与继承体系时,“会写一个类”的价值在快速缩水,而“判断这个类的边界画得对不对、这层继承该不该存在、这个 getter 是不是伪装的公开字段”的价值在快速上升。四大支柱正在从写作模板变成评审清单——这是这条 484 万播放的入门课在 2026 年最需要被补上的一层解读。

五、认知提升与实用启示

建议一:给每一次继承做“is-a 审计”。写下继承关系时强迫自己说完整这句话:“X 是一种 Y,且任何用到 Y 的地方都期望被换成 X”。说不通,就改用组合。这条源自 GoF 第一章的纪律,能提前拦截大部分脆弱基类事故——深于两层的继承树,今天几乎总该有更好的画法。

建议二:给旧代码做一次“getter 减脂”。挑一个你熟悉的类,删掉一半访问器,然后问:调用方拿这些数据去干什么?把那个“干什么”变成对象自己的方法。做完这一个练习,tell-don't-ask 就不再是口号,而是你对封装的肌肉记忆——这比背四大支柱定义有用得多。

建议三:把四支柱升级为 AI 代码评审清单。下次 AI 生成一批类时,按四个问题过一遍:状态变更是否都走了有业务含义的方法(封装)?对外呈现的是能力还是实现(抽象)?这层继承是 is-a 还是偷懒(继承)?新增一种类型要改几处老代码(多态)?AI 负责写出合规的类,你负责让它别长出丛林。

六、视频论证结构图

flowchart TD
    A["484万播放的OOP简化课<br/>Object-Oriented Programming, Simplified"] --> B["教学主线:类与对象<br/>蓝图/实例 · constructor · this"]
    A --> C["四大支柱"]
    C --> C1["封装:藏状态"]
    C --> C2["抽象:露能力"]
    C --> C3["继承:is-a复用"]
    C --> C4["多态:同消息不同响应"]
    C1 --> D["工程化补丁层<br/>GoF 1994 · SOLID 2002"]
    C4 --> D
    C3 --> E["五十年工程修正"]
    E --> E1["脆弱基类<br/>香蕉与猩猩(Coders at Work)"]
    E --> E2["组合优于继承(GoF 第1章)"]
    E --> E3["getter≠封装(Holub 2003)"]
    E --> E4["数据导向设计<br/>CppCon 2019 · Rust无继承"]
    E2 --> F["2026年的综合认知:<br/>支柱是描述不是定律 ·<br/>写作模板退位给评审清单"]
    E1 --> F
    E3 --> F
    E4 --> F

延伸阅读

  1. Simple Made Easy — Rich Hickey(Strange Loop 2011) — 本文批判性审查部分提到的经典演讲:从函数式视角拆解主流 OOP 如何把“简单”焊成“复杂”,是这条入门课最好的对照读物。
  2. Peter Seibel, Coders at Work(Apress, 2009)— Joe Armstrong“香蕉与猩猩”吐槽的原始出处,全书是十几位编程语言先驱的口述史,可视为本文思想史部分的立体注脚。

参考来源

  1. Object-Oriented Programming, Simplified — Programming with Mosh — 本文解读的核心视频,播放量据 2026-09-06 UTC 素材快照为 4,840,084 次
  2. Simple Made Easy — InfoQ/Strange Loop 存档 — Rich Hickey 对主流 OOP 状态模型批评的原始演讲录像
  3. Erich Gamma 等,Design Patterns: Elements of Reusable Object-Oriented Software(Addison-Wesley, 1994)— “优先组合而非继承”的原始文献
  4. Alan Kay, OOPSLA 1997 演讲《The Computer Revolution Hasn't Happened Yet》及其公开邮件(ACM 图灵奖 2003 获奖演说相关记录)— “OOP 本意是消息传递”的第一手来源
  5. Ole-Johan Dahl 与 Kristen Nygaard 的 Simula 67 相关记录(ACM 图灵奖 2001)— 类与继承机制的诞生坐标

    本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入