💻 第七章 成为会使用面向对象编程的程序员吧
📄 一句话概括

观点 1:程序=组件的拼装。类就是零件,先造小零件类、再拼成大程序——与第二章拼装微型计算机是同一个思路。

📝 本节和前面几节的关系

地图铺好了,本节摸第一个部位:拼装。硬件事先造好零件再组装,软件同理。

一、组件是什么

类就是有标准接口的零件:内部藏着数据和实现,对外只露一组方法。 对接全靠方法调用:要用引擎就调 start(),不必知道点火线圈怎么绕——接口是零件的【插座规格】。 第二章造微机时,CPU 插座、内存插槽各有规格,插对就能用——软件组件的接口就是数字版的插座规格。

二、拼装的层次

小类拼成大类:引擎类+车轮类拼成汽车类; 大类拼成子系统:若干汽车类+道路类拼成交通模拟子系统; 子系统拼成整个程序——层层向上,每一层只跟相邻层打交道。 第二章的层次感一模一样:元件拼成部件、部件拼成主板、主板拼成整机。

三、拼装的前提:接口稳定

零件能互换,靠的是接口不变、内部随便换——发动机升级成 V8,油门踏板还是那个油门。 这条【接口稳定】的规矩,正是下一节【可维护性】红利的来源——拼装观和效率观是一根藤上的。

四、动手 Demo:把组件拼装到一起

造引擎、造车轮,再把它们拼进 Car 类,看拼装式开发怎么跑起来。

class Engine:
    def start(self): return "引擎发动"
class Wheel:
    def roll(self): return "车轮滚动"
class Car:
    def __init__(self):
        self.engine = Engine()
        self.wheels = [Wheel() for _ in range(4)]
    def go(self):
        parts = [self.engine.start()]
        parts += [w.roll() for w in self.wheels]
        return " -> ".join(parts)
print(Car().go())

实跑输出:

--------------------------------------------------------------------
观点 1——把组件拼装到一起构建程序
--------------------------------------------------------------------

类就是【零件】: 先造小零件, 再拼成大机器。拼一辆玩具车试试:

    第 1 步: 造引擎零件 (Engine 类)
    第 2 步: 造车轮零件 (Wheel 类)
    第 3 步: 把 1 个引擎 + 4 个车轮拼进车壳 (Car 类)
    第 4 步: car.go() 试车:
    引擎发动 -> 车轮滚动 -> 车轮滚动 -> 车轮滚动 -> 车轮滚动

  零件类     提供的本领       拼装位置
  -----------------------------------------
  Engine     start() 发动     车头 1 台
  Wheel      roll() 滚动      四角各 1 只
  Car        go() 整车跑      把零件装进来

第二章拼微型计算机是同一思路: CPU + 内存 + I/O 拼成整机。
软件里的拼装, 拼的是类; 对接全靠方法调用, 不问内部细节。

Car 类里没写一句【怎么发动引擎】——它只负责把零件拼起来再调用,这正是拼装者的本分。 第二章拼的是 CPU+内存+I/O,本节拼的是 Engine+Wheel——硬件软件,拼装同构。

30 秒实验

  1. 把一台电水壶拆成组件视角:加热类、控温类、外壳类,接口各是什么?
  2. 给你写的上个小程序找一处【能拆成两类】的地方,动手拆一次。

常见误区

  1. 以为拼装就是把代码堆进一个文件——拼装要求各零件接口清晰、互不掺和。
  2. 以为用类就是 OOP 了——类若大而无当、接口混乱,照样拼不起来。
自测三问(点开对答案) 1. 观点 1 把程序看成什么? —— 组件的拼装——类是零件,接口是插座规格。 2. 组件之间怎么对接? —— 只通过公开方法调用,不关心对方内部实现。 3. 本章哪个硬件章节与拼装观同构? —— 第二章——元件拼部件、部件拼整机。

相关笔记