🧩 第四章 面向对象编程技术:去除冗余、进行整理
📄 一句话概括

结构化只有三种结构,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 秒实验

  1. 数一数你项目里某个函数被传了几次同样的参数,乘一乘就知道有多少次重复。
  2. 找一个写着 if 类型判断的地方,看看它加一种类型要改几行。

常见误区

  1. 以为结构化已经把问题解决完了。它只规整了流程,没动数据。
  2. 以为三大要素是三个抽象名词。它们各自对着一种可以数出来的重复。
自测三问(点开对答案) 1. OOP 在三种结构之外又加了哪三种? —— 类、多态、继承;分别治参数重复、分支重复、代码重复。 2. 三种重复怎么量? —— 参数个数(5 个函数 × 3 个参数=15 次)、if 分支数(3 条)、重复行数(4 行)。 3. 为什么说三大要素不是抽象名词? —— 因为每一条都对着一种能数出来的重复,不是三个需要背的标签。

相关笔记