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

【框架】这词被用滥了,真正的分界只有一条:谁调谁——类库你调它,框架它调你。

📝 本节和前面几节的关系

6.4 讲完类库的共同祖先,这一节转向另一种复用单位:框架。

一、一个词,很多意思

应用框架、测试框架、Web 框架、UI 框架……叫法一样,东西差别很大。 共同点只有一条:它替你定了骨架,你在骨架里干活。 所以判断一个东西是不是框架,不看它叫什么,看它有没有【替你决定流程】。

二、分界线:谁调谁

类库:你调它。你写 lib_add(1, 2),调完就回来。 框架:它调你。你写好一个 hook 交上去,由它在合适的时机调你。 实测调用顺序:你→类库函数;你→框架入口;框架→你填的 hook;你的 hook 执行完。 这个反过来的顺序,就叫控制反转。

三、为什么框架难学

学类库只要查一个函数签名。 学框架要搞清它在什么时候、按什么顺序调你——这个知识往往不写在函数签名里。 所以框架的文档重心在流程图,类库的文档重心在 API 列表。

四、选框架看什么

看它的骨架和你的流程合不合——不合就要跟它对着干,那比不用更累。 看它的控制反转点够不够多——点太少,你就只能在它的流程里硬塞。 看它多久没改接口——框架比类库更绑人,接口一动你就得跟着搬。

五、动手 Demo:框架存在各种含义

同样做一个加法,用类库和用框架各写一遍。 把实际调用顺序打出来,看谁调谁。

# 类库:你调它
def lib_add(a, b):
    return a + b

# 框架:它调你
def framework_run(hook):
    return hook()

def my_hook():
    return "结果"

print(lib_add(1, 2), framework_run(my_hook))

实跑输出:

--------------------------------------------------------------------
框架存在各种含义
--------------------------------------------------------------------

  【框架】这词被用滥了。**真正的分界只有一条:谁调谁。**实测两种:

      类库:你调它    你 → lib_add(1, 2) → 3
      框架:它调你    你 → framework_run(hook) → 结果

      实际调用顺序:
        1. 你 → 类库函数
        2. 你 → 框架入口
        3. 框架 → 你填的 hook
        4. 你的 hook 执行完

  它是什么     谁调谁     你要写什么
  -------------------------------------
  类库         你调它     调用语句
  框架         它调你     填空的那几段

  **【控制反转】听着玄,实测就是调用顺序反过来。**
  **所以框架比类库难学**:你得先搞清它在什么时候调你,而不是只查一个函数签名。

实测调用顺序:你→类库函数;你→框架入口;框架→你填的 hook——最后一步方向反了。 这个反转就叫控制反转,也是框架比类库难学的原因:你得知道它什么时候调你。

30 秒实验

  1. 挑一个你用的库,判断它是类库还是框架(看谁调谁)。
  2. 画出你项目里框架的调用顺序:哪一步是它回头调你的。

常见误区

  1. 以为带【框架】两个字就是框架。看它有没有替你决定流程。
  2. 以为框架一定比类库高级。不合骨架的框架比不用更累。
自测三问(点开对答案) 1. 类库和框架的分界线是什么? —— 谁调谁:类库是你调它,用完就回来;框架是它调你,由它在合适时机调用你填的 hook。 2. 什么叫控制反转? —— 把【什么时候执行你的代码】的决定权交给框架——实测调用顺序里最后一步方向反了。 3. 为什么框架比类库难学? —— 学类库只要查签名,学框架要搞清它在什么时候按什么顺序调你,而这往往不写在签名里。

相关笔记