🧩 第六章 重用:OOP带来的软件重用和思想重用
📄 一句话概括

三种复用单位各能带走什么——函数带算法、类带算法+数据+规则、框架带骨架,实测抄写量从 12 行降到 4 行。

📝 本节和前面几节的关系

第五章讲完内存,这一章换话题:这些结构让代码能被重复用了。

一、三种复用单位

函数:带走算法,带不走要的数据——每次调用还得把数据递进去。 类:带走算法+数据+规则,自己带着,几乎不用改。 框架:带走骨架+流程,只留几个洞让你填。 关键差别在中间那一行:类凭什么比函数多带一样东西?因为类有实例变量。

二、实测抄写量

三个类各写一遍同样的初始化(3 个字段+1 次校验):复制版 12 行。 提到一个父类里写一遍:继承版 4 行。 少抄 8 行,而且改的时候只改一处。 三个子类各写一句 pass——共 3 行,一行逻辑都没有。

三、为什么说【OOP 的结构】促进重用

因为继承和组合让【数据和规则】能被整体搬走,而函数只能搬算法。 这就是 4.4 讲的【汇总】在重用上的回报:先装进盒子,盒子才能被复制。 反过来看:一个只会写函数的人,想复用就得连全局变量一起搬——搬不动,只好复制。

四、这一章的路线

6.2~6.4 讲类库:一堆写好的类,以及所有类的祖先。 6.5~6.8 讲框架与组件:半成品,和能单独换掉的构件。 6.9~6.12 讲设计模式与思想重用:从【复用代码】走到【复用想法】。

五、动手 Demo:OOP 的优秀结构能够促进重用

三种复用单位各能带走什么。 再用实测数据看复制和继承的抄写量差多少。

# 复制版:三个类各写一遍同样的初始化(3 字段 + 1 校验)
# 继承版:提到 Base 里写一遍,三个子类各写一句 pass

class Base:
    def __init__(self, name, level, rate):
        self.name = name
        self.level = level
        self.rate = rate
        if rate < 0:
            raise ValueError("rate 不能为负")

class A(Base): pass
class B(Base): pass
class C(Base): pass

实跑输出:

--------------------------------------------------------------------
OOP 的优秀结构能够促进重用
--------------------------------------------------------------------

  三种复用单位,**各自能带走什么**,这是本章的地基:

  单位     能带走               带不走的             复用时要改
  ----------------------------------------------------------------
  函数     算法                 要的数据             参数得重新传
  类       算法+数据+规则     没有(自己带着)     基本不用改
  框架     骨架+流程           具体业务             只填空

  实测【复制 vs 继承】的抄写量——三个类各写一遍同样的初始化:

      复制版:三个类各抄一遍        12 行
      继承版:只写一遍              4 行
      少抄                          8 行
      三个子类各写一句 pass         共 3 行

  **注意带不走的那一列**:函数复用的是【算法】,**数据还得每次递进去。**
  **类之所以能带走三样,是因为它自己有实例变量。**
  **这就是 4.4 讲的【汇总】在重用上的回报。**

实测:复制版 12 行、继承版 4 行,少抄 8 行,三个子类各一句 pass。 注意函数带不走数据——类能带走三样,是因为它自己有实例变量,这是【汇总】的回报。

30 秒实验

  1. 找一段被你复制过两次以上的初始化代码,试着提成父类。
  2. 列一张表:你项目里的复用单位,各自能带走什么、带不走什么。

常见误区

  1. 以为函数复用就等于代码复用。数据带不走,复用就不完整。
  2. 以为继承只为少写字。它是为了只留一个能改的地方。
自测三问(点开对答案) 1. 三种复用单位各能带走什么? —— 函数带算法;类带算法+数据+规则;框架带骨架+流程。 2. 复制版和继承版的实测差多少? —— 复制 12 行、继承 4 行,少抄 8 行;三个子类各一句 pass。 3. 类凭什么比函数多带一样东西? —— 因为类有实例变量,数据跟着它一起被复制、传递、复用;函数每次都要别人把数据递进来。

相关笔记