🧩 面向对象是怎样工作的(第3版)
照着《面向对象是怎样工作的(第3版)》([日]平泽章 著,侯振龙 译,人民邮电出版社 · 图灵程序设计丛书,2022-09,282 页)做的自学笔记 —— 前三本讲的是机器怎么造、程序怎么跑、网络怎么连,都是硬邦邦的机制;这一本转过来问一件看不见的事:一堆代码凭什么能被组织成好改、好复用、好分工的样子?全书 12 章 134 节 + 附章《函数式语言是怎样工作的》15 节 + 三个专栏系列共 10 处,共 159 篇:先讲清面向对象到底解决了什么痛(为什么它难、为什么比喻会骗人、为什么一个词有三层意思),再从编程语言的历史一路捋到类/多态/继承三大要素,下潜到内存结构(栈与堆、指针、引用计数、垃圾回收、继承时的内存布局),讲重用(类库、框架、组件、设计模式),两种用法(编程技术与归纳整理法),然后进上游工程:UML 十三种图、建模、面向对象设计与职责分配,最后是敏捷开发与「时代追上了面向对象」。这本是思想课+机制课:不需要装 Java 或 UML 工具也能读完,各篇「动手 Demo」都是沙箱里真跑过的 Python 小脚本(模拟类与实例的内存布局、多态分发、引用计数、设计模式的最小骨架),书里的 Java/UML 图用【📋 实操路径】单列。教材成书于 2022 年,凡与现状不同处各篇用【⚠️ 2026 现状】单列。大白话、不跳步骤、必带生活比喻、常见误区、可折叠自测题。
前置课程:程序是怎样跑起来的(同一系列,讲程序怎么跑)、计算机是怎样跑起来的(硬件怎么搭)、编程原理(编程全貌)、Java 基础(面向对象在真语言里的写法)。本书与网络是怎样连接的同属图灵「是怎样」系列。
内容来自我的 Obsidian 自学笔记 · 全 12 章 134 节 + 附章 15 节 + 10 专栏 · 共 159 篇完结 ✅
第一章 面向对象:让软件开发变轻松的技术
面向对象是软件开发的综合技术
三套答案共用一个名字:编程技术管代码怎么…
以对象为中心编写软件的开发方法
以对象为中心=把数据和操作它的代码放在一…
从编程语言演化为综合技术
1967 Simula 到 2004 R…
面向对象难的原因
难不是错觉:同一件事过程式 9 行 3…
原因之一:OOP结构复杂
一个五脏俱全的类要交代八件事:类名/继承…
原因之二:滥用比喻引起混乱
五条比喻里【多态=变形】歪得最狠;更隐蔽…
原因之三:面向对象的概念是抽象的
一个词三层义:类在语言层是 class…
重点讲解【是什么】和【为什么】
What 讲透、Why 讲透、How 只…
本书的构成
12 章加附章分四块:入门与前提 27…
当今的OOP 易上手、有深度的Python
同一件事(词频前 5)5 行就能出结果…
第二章 似是而非:面向对象与现实世界
对照现实世界介绍面向对象
圈名词就能起手:四个名词变四个类、实测…
类指类型,实例指具体的物
类模板对实例;实测两个同名顾客 name…
多态让消息的发送方法变得通用
同一句 s.area() 落到两个实现…
继承对共同点和不同点进行系统的分类和整理
上提共同点、下放不同点;实测 MRO 是…
使用比喻进行讲解容易造成混乱
同名不同义:car.drive 是车在跑…
面向对象和现实世界是似是而非的
企鹅继承鸟后 fly() 照样返回飞起来…
明确定义为编程结构
对象只有状态/行为/标识三样:实测 va…
软件并不会直接表示现实世界
四种不对齐,加实测九个类名里四个是纯软件…
与现实世界的相似增大了可能性
业务词命名 7 业务/0 技术,技术词命…
对象的另一面 成为潮词的面向对象
四句常见说法里只有两句能落到机制上;潮词…
第三章 理解OOP:编程语言的历史
OOP的出现具有必然性
干扰对数是 n×(n-1)÷2:实测 5…
最初使用机器语言编写程序
5+3 的机器码 9 个字节 72 位…
编程语言的第一步是汇编语言
汇编只是给机器码配名字:实测机器码 41…
高级语言使程序更加接近人类语言
同一条加法汇编 3 条、高级语言 1 条…
重视易懂性的结构化编程
goto 版 6 行 2 跳转 2 标签…
提高子程序的独立性,强化可维护性
抄三份改三处、提成函数改一处;价值不在少…
实现无GOTO编程的结构化语言
拿源码逐行数:goto 2 跳转 2 标…
进化方向演变为重视可维护性和可重用性
四件办不到:复用、数据不被乱改、加功能不…
没有解决全局变量问题和可重用性差的问题
40 个函数 × 12 个全局变量=48…
编程往事 COBOL编译器的【鸡和蛋】问题
两行程序把自己的定义当数据打印出来(输出…
第四章 面向对象编程技术:去除冗余、进行整理
OOP具有结构化语言所没有的三种结构
类治参数重复、多态治分支重复、继承治代码…
OOP的结构会根据编程语言的不同而略有差异
多继承/接口/可见性/垃圾回收四大差异…
三大要素之一:具有三种功能的类
类是汇总+隐藏+创建很多个,顺序不能反…
类的功能之一:汇总
参数从 8 个降到 1 个,更关键是【忘…
类的功能之二:隐藏
一个下划线靠自觉、两个被改名;实测 _b…
类的功能之三:创建很多个
造 10000 个实例编号 0~9999…
实例变量是限定访问范围的全局变量
改类变量两个都变、给 u1 赋值只变 u…
三大要素之二:实现调用端公用化的多态
调用端只写一份:实测 total 一行算…
三大要素之三:去除类的重复定义的继承
重复 5 行降 0 行、改动点 2 处降…
对三大要素的总结
三要素各对一种重复:类→汇总隐藏、多态→…
通过嵌入类型使程序员的工作变轻松
动态语言类型嵌在运行时;注解存进 __a…
将类作为类型使用
isinstance 算子类、type…
编程语言【退化】了吗
退化=把活儿交给机器:同一加法汇编 3…
更先进的OOP结构
包、异常、垃圾回收其实都在管边界:命名边…
进化的OOP结构之一:包
实测已加载 111 个模块(顶层 96…
进化的OOP结构之二:异常
level1→2→3 抛异常,中间两层一…
进化的OOP结构之三:垃圾回收
引用计数实测 2→3→2,减到 0 自动…
对进化的 OOP结构的总结
三条边界三笔代价:包→目录变复杂、异常→…
决心决定OOP的生死
改动上下文实测 6 行 vs 5 行,形…
当今的OOP 从网页工具进化而来的PHP
PHP 从嵌在 HTML 里的脚本进化到…
第五章 理解内存结构:程序员的基本素养
理解OOP程序的运行机制
一行 s.area() 走四步:找变量(…
两种运行方式:编译器与解释器
2000 次执行里翻译 1 次对 200…
解释、运行中间代码的虚拟机
一行 return w * h 被拆成…
CPU 同时运行多个线程
实测算数任务 4 线程 0.03 秒对…
使用静态区、堆区和栈区进行管理
静态区放类信息与常量、堆放实例、栈放局部…
OOP 的特征在于内存的用法
同一份数据全局版只有 2 个键 1 份…
每个类只加载一个类信息
造 10000 个实例、类对象只有 1…
每次创建实例都会使用堆区
五个实例的 id 与五本字段表 id 全…
在变量中存储实例的指针
y = x 后 id 相同、引用计数 3…
复制存储实例的变量时要多加注意
浅复制改内层原件跟着变([1,2,3])…
多态让不同的类看起来一样
一个列表装两个不同类实例,分别落到 Re…
根据继承的信息类型的不同,内存配置也不同
普通类 48+296=344 字节/个…
孤立的实例由垃圾回收处理
del 后弱引用立刻变 None(引用计…
编程往事 OOP中dump看起来很费劲?
一行 repr 只给类名和地址,两层对象…
第六章 重用:OOP带来的软件重用和思想重用
OOP的优秀结构能够促进重用
函数带算法、类带算法+数据+规则、框架带…
类库是OOP的软件构件群
标准库 290 个模块;collecti…
标准类库是语言规范的一部分
json/csv/re/datetime…
将Object类作为祖先类的继承结构
实测继承链 Leaf → Mid → P…
框架存在各种含义
分界只有一条:谁调谁。类库你调它、框架它…
框架是应用程序的半成品
实测骨架 10 行、填空 6 行共 16…
世界上可重用的软件构件群
复用从抄代码变成挑构件;实测干净环境标准…
独立性较高的构件:组件
实测 textwrap 依赖 1 条、j…
设计模式是优秀的设计思想集
策略 3 行(实测 80.0)+工厂 2…
设计模式是类库探险的路标
collections.abc 里 53…
扩展到各个领域的思想的重用
自定义类只实现 __iter__/__l…
通过类库和模式发现的重用的好处
手写 CSV 8 行对 csv 1 行…
当今的OOP 因Rails框架而走红的Ruby
Rails 带火 Ruby 和【约定优于…
第七章 化为通用的归纳整理法的面向对象
软件不会直接表示现实世界
七个现实名词(读者/书/借阅记录/书架/…
应用于集合论和职责分配
B ⊆ A 判定 True(继承=子集)…
在上游工程中化为通用的归纳整理法
同一份结构用三次:需求 5 条/概念 3…
两种含义引起混乱
实测八句话:编程技术 4 句、归纳整理法…
分为编程技术和归纳整理法进行思考
六个说法过两问:代码侧能验 6 个、组织…
为何化为了通用的归纳整理法
5 个业务动作独占 3、共担 2(开票/…
对象的另一面 语言在先,还是概念在先?
八个 OOP 概念:Python 有专门…
第八章 UML:查看无形软件的工具
UML是表示软件功能和结构的图形的绘制方法
一句 18 字需求实测藏 3 处没写清(…
UML有13种图形
结构 6 种(类/对象/包/组件/部署/…
UML的使用方法大致分为三种
三种用法引用 10 次、去重只 7 种…
UML的使用方法之一:表示程序结构和动作
实测 3 个类/4 个属性/4 个方法…
类图表示OOP程序的结构
反射实测三格:Account 2 属性…
使用时序图和通信图表示动作
同一批消息两种排法:4 条消息落在 3…
UML的使用方法之二:表示归纳整理法的成果
概念类图只列属性不列方法:两个阶段属性都…
使用类图表示根据集合论进行整理的结果
issubclass 矩阵 True 共…
表示职责分配的时序图和通信图
5 个动作落到 3 个类、重叠 0 处…
UML的使用方法之三:表示非面向对象的信息
7 条语句/6 处函数调用/0 个类的过…
使用用例图表示交给计算机的工作
2 个参与者/6 个用例/2 条包含+1…
使用活动图表示工作流程
7 个节点/8 条箭头/2 个判定点/3…
使用状态机图表示状态的变化
6 个状态/7 条迁移/7 种事件,从新…
弥补自然语言和计算机语言缺点的【语言】
五维打分 UML 拿 4 个,唯一做不到…
第九章 建模:填补现实世界和软件之间的沟壑
现实世界和软件之间存在沟壑
借书这件事 11 个现实事实里软件只记…
计算机擅长固定工作和记忆工作
同一函数跑 10000 次结果完全一致…
通过业务分析、需求定义和设计来填补沟壑
三道筛子:业务分析 8 条 → 需求定义…
建模是顺利推进这三个阶段的工作的技术
12 个该谈清的信息点,口头讨论漏 5…
应用程序不同,建模的内容也不一样
业务系统看数据与流程(用例图/类图)、嵌…
业务应用程序记录现实中的事情
借阅表 6 个字段:4 个来自现实事件…
对图书馆的借阅业务进行建模
8 个名词只有 4 个成概念类(读者/书…
使用用例图来表示图书馆业务
3 个参与者 8 个用例:读者 4/馆员…
用概念模型表示图书馆系统的信息
4 个概念类、11 个属性、3 条关系…
在业务应用程序中,数据结构反映现实世界
4 张表 17 个字段 3 个外键,与…
嵌入式软件替代现实世界的工作
温控设备 100 次/秒即 6000 次…
嵌入式软件中设备的研究开发很重要
洗衣机控制器实现 12 行、验证 21…
使用状态机图表示全自动工作的情形
7 条迁移只有 1 条需要人按(按启动)…
嵌入式软件一直执行单调的工作
主循环 10000 圈同一段代码、只有…
建模蕴含着软件开发的乐趣
4 个类 7 个属性 3 条关系,把能明…
第十章 面向对象设计:拟人化和职责分配
设计的目标范围很广
10 件设计事项里只有 5 件与代码结构…
相比运行效率,现在更重视可维护性和可重用性
改一次税率或取整规则两边都只有 1 个改…
设计目标之一:去除重复
12 行里 3 种重复行各出现 3 次共…
设计目标之二:提高构件的独立性
强依赖版 6 个参数(6 个外部对象)→…
提高构件独立性的诀窍
三个手法:只暴露必要的方法(7→3)、依…
设计目标之三:避免依赖关系发生循环
5 个类 5 条依赖里检测出 1 个环…
面向对象设计的【感觉】是拟人化和职责分配
4 个类分 10 件事:最忙 Loan…
进行了职责分配的软件创建的奇妙世界
上帝类要知道 8 件事,拆成 5 个类后…
当今的OOP 执行时不受类约束的JavaScript
实例挂 3 个属性兄弟拿不到、类上加 1…
第十一章 衍生:敏捷开发
仅靠技术和技术窍门,软件开发并不会成功
10 个常见问题里技术只能解 5 个;需…
系统地汇总了作业步骤和成果的开发流程
流程=步骤+每步的产物:5 步 5 份产…
限制修改的瀑布式开发流程
瀑布式的唯一特征是产物冻结;在测试阶段提…
瀑布式开发流程的极限
20 条需求开工时只能定清 12 条,剩…
灵活响应变化的迭代式开发流程
每轮澄清 5 条、4 轮澄清完,第 1…
打破诸多限制的 XP
4 条价值观、12 项实践,列出 6 项…
确定团队工作推进方式的框架的Scrum
3 个角色+3 个产物+4 个会议=10…
快速编写优秀软件的敏捷宣言
四句【比起 A 更重视 B】,背后 12…
支持敏捷开发的实践
8 项实践里技术侧 4 项、管理侧 4…
先编写测试代码,一边运行一边开发的测试驱动开发
红→绿→重构三步循环;3 条测试里有 2…
在程序完成后改善运行代码的重构
1 个 10 行函数拆成 4 个、最长…
经常进行系统整合的持续集成
120 条测试一次 0.2 秒、一天提交…
实践敏捷宣言理念的方法
4 条价值观各配 3 个可检查的动作,共…
敏捷开发源于面向对象
类小→能单独测、接口多态→换实现不动调用…
不存在最好的开发流程
四流程按需求稳定/多变/小团队/大团队打…
编程往事 过去不被允许的XP
当年不被允许的 5 个做法里 3 个已成…
第十二章 熟练掌握面向对象
面向对象这一强大概念是原动力
一个 class 买到 5 种能力(实例…
时代追上了面向对象
实测一次动态派发 58 纳秒、一条 if…
面向对象的热潮不会结束
Python 内置异常就是 103 个类…
将面向对象作为工具熟练掌握
同一需求三版:函数 8 行/类 12 行…
享受需要动脑的软件开发
12 章里 4 章有标准答案、8 章要自…
附章 函数式语言是怎样工作的
面向对象编程语言和函数式语言混合占据主流的时代
同一件事四种写法:for 循环 3 条语…
函数式语言的7个特征
7 条拿到 Python 上验:完全具备…
特征1:使用函数编写程序
同一件事语句式 6 条语句 4 个中间变…
特征2:所有表达式都返回值
能当表达式 4 种(算术/三元/推导式/…
特征3:将函数作为值进行处理
赋值/装列表/当参数/当返回值四件事全成…
特征4:可以灵活组合函数和参数
partial 固定参数、pipe 串三…
特征5:没有副作用
纯函数调 100 次只有 1 种结果、带…
特征6:使用模式匹配和递归来编写循环处理
模式匹配 4 个分支把判断与取值合成一步…
特征7:编译器自动进行类型推断
同一个 sum 换输入类型自动跟变、代码…
对7个特征的总结
按 2/1/0 打分:满分 14、实得…
函数式语言的分类
按副作用分三类共 9 门语言:纯函数式只…
函数式语言的优势
三条硬指标:语句 3→1、10 个用例要…
函数式语言的课题
递归超 1000 层直接崩;朴素 fib…
函数式语言和面向对象的关系
同一需求:类版 1 个可变状态、函数版…
掌握函数式编程
五个动作(推导式/不改入参/抽纯函数/用…
当今的OOP 打造了函数式语言的箱庭的Java
同一件事匿名类写法 12 行、lambd…