📄 一句话概括
结构化只有三种结构,OOP 又加三种——它们各自专治一类重复:实测 15 次传参、3 条分支、4 行重复。
📝 本节和前面几节的关系
3.9 收在【结构化管住了流程,没管住数据】,这一节给出 OOP 新增的三把工具。
一、原来的三种结构管什么
顺序、选择、循环——它们管的是【流程怎么走】。 流程走对了,程序就正确。但流程正确,代码照样能烂成一团。 因为结构化不回答【数据放在哪】和【这段逻辑重复了几遍】。 这两件事要等规模上来才看得见,所以在小项目里被长期忽略。
二、三种重复
参数重复——同一组数据在多个函数之间传来传去。量法:参数个数。 分支重复——调用方反复判断【这是什么类型】。量法:if 分支数。 代码重复——多个类里有一模一样的代码。量法:重复行数。 实测一遍:5 个函数各传 3 个参数=15 次;三种形状各判一次=3 条分支;两个类各有 4 行相同=4 行重复。
三、一一对应
类治第一种,多态治第二种,继承治第三种。 这不是巧合,是设计——每一种新结构都对着一种具体的痛。 所以【三大要素】这个说法容易背混,【三种结构专治三种重复】好记得多。 记不住的时候,就想那句:【这条结构替我省了什么重复?】
四、本章的路线
4.3~4.10 讲三大要素本身,4.11~4.13 讲语言的实现细节。 4.14~4.19 讲三大要素跑起来之后才暴露的问题:包、异常、垃圾回收。 注意这个顺序:先有要素,才有要素之间的问题。
五、动手 Demo:OOP 具有结构化语言所没有的三种结构
把三种重复各量一遍:参数传了几次、if 分了几支、代码重了几行。 量出来的三个数,正好对应三种新结构。
fns, args = 5, 3 # 5 个函数,每个要传 3 个参数
kinds = 3 # 3 种形状各判一次
dup = 4 # 两个类各有 4 行相同
print("传参次数", fns * args)
print("if 分支数", kinds)
print("重复行数", dup)
实跑输出:
--------------------------------------------------------------------
OOP 具有结构化语言所没有的三种结构
--------------------------------------------------------------------
结构化语言有三种结构:**顺序、选择、循环。**
OOP 在这三种之外,又加了三种——**它们各自专治一类【重复】。**
新增结构 专治哪种重复 量一下
----------------------------------------------------------
类 同一组数据在多个函数间传来传去 参数个数
多态 调用方反复判断【这是什么类型】 if 分支数
继承 多个类里有一模一样的代码 重复行数
三种重复各量一遍:
重复一:cart、name、price 三个参数,5 个函数各要传一遍
→ 参数传递 5 次 × 3 个 = 15 次
重复二:调用方要判断 rect/circle/tri 各一次
→ if 分支 3 条
重复三:两个类各有 4 行初始化代码完全相同
→ 重复 4 行
实测三项合计:**15 次传参、3 条分支、4 行重复。**
**注意这个说法:【三种结构专治三种重复】。**
它比【三大要素】好记得多,因为**每一条都指着一个具体的痛。**
4.3~4.9 就是一条一条把这些重复消掉。
实测三项合计:15 次传参、3 条分支、4 行重复。 三种结构专治三种重复——这个说法比【三大要素】好记,因为每一条都指着一个具体的痛。
30 秒实验
- 数一数你项目里某个函数被传了几次同样的参数,乘一乘就知道有多少次重复。
- 找一个写着 if 类型判断的地方,看看它加一种类型要改几行。
常见误区
- 以为结构化已经把问题解决完了。它只规整了流程,没动数据。
- 以为三大要素是三个抽象名词。它们各自对着一种可以数出来的重复。
自测三问(点开对答案)
1. OOP 在三种结构之外又加了哪三种? —— 类、多态、继承;分别治参数重复、分支重复、代码重复。 2. 三种重复怎么量? —— 参数个数(5 个函数 × 3 个参数=15 次)、if 分支数(3 条)、重复行数(4 行)。 3. 为什么说三大要素不是抽象名词? —— 因为每一条都对着一种能数出来的重复,不是三个需要背的标签。- ☐ 下一节(4.2 OOP的结构会根据编程语言的不同而略有差异)
相关笔记
- 对三大要素的总结 — 这三种结构的收口
- 没有解决全局变量问题和可重用性差的问题 — 上一章留下的两个短板
- 重视易懂性的结构化编程 — 原来的三种结构
- 🧩 面向对象是怎样工作的 · 索引