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

汇总把参数从 8 个降到 1 个——更关键的是【忘传参数】这类错误在语法上就不成立了。

📝 本节和前面几节的关系

4.3 把类拆成三件事,这一节讲第一件,也是后两件的地基。

一、散着写长什么样

total = 0; items = [] 加上三个函数:add_item(total, items, name, price)、clear(total, items)、report(total, items)。 每个函数都要把【全套家当】再传一遍。 而且传的顺序还不能错——两个都是容器,传反了编译器不报错,运行时才炸。 这就是参数重复的真实代价:不是写起来累,是错起来隐蔽。

二、汇总之后

self.total、self.items 放进 Cart,方法改成 add(name, price)、clear()、report()。 实测参数个数:每个函数从 2~4 个降到 0~1 个;三个函数合计从 8 个降到 1 个。 数据从【每次都要递进去】变成【本来就待在里面】。

三、错误在语法上不成立

散着写时,忘传一个参数——运行时才炸,而且可能炸在很远的地方。 汇总之后,没有那个参数可忘。 这比【小心点】可靠得多:约定靠记性,语法靠编译器。 这也是为什么 1.2 说【以对象为中心】:它不是让你少打字,是让一类错误根本写不出来。

四、汇总的另一层:责任有主体

谁想动购物车,就得走 Cart 的方法。 汇总划出了【谁负责这块数据】——这是第 10 章讲职责分配的第一块砖。 数据一旦有了主人,改它的人就必须先找到主人。这一步就把 3.9 那 480 条依赖边砍掉了一大半。

五、动手 Demo:类的功能之一——汇总

同一套购物车逻辑写两遍:一遍散着,一遍汇总进类。 数一数每个函数要传几个参数。

# 散着的时候:每个函数都要把 total 和 items 传进去
def add_item(total, items, name, price): ...
def clear(total, items): ...
def report(total, items): ...

# 汇总之后:它们本来就在 self 上
class Cart:
    def __init__(self):
        self.total = 0
        self.items = []
    def add(self, name, price): ...
    def clear(self): ...
    def report(self): ...

实跑输出:

--------------------------------------------------------------------
类的功能之一——汇总
--------------------------------------------------------------------

  【汇总】就是把**该在一起的数据和操作它的代码**放进同一个盒子。

      # 散着的时候
      total = 0; items = []
      def add_item(total, items, name, price): ...
      def clear(total, items): ...
      def report(total, items): ...

      # 汇总之后
      class Cart:
          def __init__(self): self.total = 0; self.items = []
          def add(self, name, price): ...
          def clear(self): ...
          def report(self): ...

  实测参数个数的变化:

                       散着         汇总后
  -------------------------------------------
  每个函数要传几个     2~4 个       0~1 个
  3 个函数合计         8 个参数     1 个参数
  谁会忘传             调用方       没得忘

  **注意最后一行**:汇总之后,**【忘传参数】这类错误在语法上就不成立了。**
  这比【小心点】可靠得多。

  汇总还有一层意义:**它划出了【谁负责这块数据】。**
  谁想动购物车,就得走 `Cart` 的方法——**责任有了主体。**

实测:每个函数从 2~4 个参数降到 0~1 个,三个函数合计从 8 个降到 1 个。 汇总之后,【忘传参数】这类错误在语法上就不成立了——这比小心点可靠得多。

30 秒实验

  1. 找一个参数表超过四个的函数,看其中几个参数是不是总一起出现。
  2. 把它们收进一个类,看调用方要改几处。

常见误区

  1. 以为汇总只是【把代码放进 class 里包一层】。它改的是参数的传递方式。
  2. 以为汇总能自动带来隐藏。它只是把东西装进来了,口子还得自己开。
自测三问(点开对答案) 1. 汇总解决的是哪一类重复? —— 参数重复:同一组数据在多个函数之间传来传去。实测三个函数合计从 8 个参数降到 1 个。 2. 汇总最硬的好处是什么? —— 【忘传参数】这类错误在语法上就不成立了——不再靠小心,靠编译器。 3. 汇总的第二层意义是什么? —— 它划出了【谁负责这块数据】:谁想动就得走这个类的方法,责任有了主体。

相关笔记