🐳 第三章 一切皆插件意味着什么
📄 一句话概括

插件可以动态挂卸(第 5 章的正题),但必须挂在明确的作用域里——边界不是限制动态,而是让动态敢用。

📝 本节和前面几节的关系

3.2.1 讲了作用域是什么,这一节讲为什么非要它不可:没有边界的动态组合,会出三种事故。

一、动态组合之前,先回答【挂在哪】

第 5 章会讲 Cordis 让插件动态组合——但【动态】两个字有个前提:每次挂卸都要指明作用域。

同一个插件,挂不同平面,命运完全不同——这不是实现细节,是设计核心。

二、口诀的正式版

1.2 的口诀——【会话内的进预设,跨会话的留宿主】——现在可以给出正式版:

判断标准只有一条:它该活多久?——跟会话同寿,还是跨会话存在。

三、没有边界的三种事故

对照 2.2(工作区)会发现同一个思路:先划边界,再谈能力。

四、边界让【动态】敢用

为什么边界是动态的前提?卸载要卸得干净,前提是知道它挂在哪、活到几时。

生命周期明确,卸载才是干净的,才敢在会话中途装卸插件;反过来,如果挂卸的位置说不清,【动态组合】就变成【动态添乱】——没人敢用。

所以本节标题说得直白:动态组合必须有边界。

五、动手 Demo:挂错平面的三种事故

三种挂错的方式,配上生活比喻:

cases = [
    ("该挂会话的挂到宿主", "会话 A 的状态漏进会话 B"),
    ("该挂宿主的挂到会话", "每个会话复制一份,还不一致"),
    ("会话结束后还想接着用", "引用的作用域已经销毁"),
]
for a, b in cases:
    print("  %-16s -> %s" % (a, b))
print()
print("判断标准只有一条:它该活多久?")

实跑输出:

--------------------------------------------------------------------
挂错平面的三种事故
--------------------------------------------------------------------
  动态组合之前,先要回答【挂在哪】。挂错了会怎样:

  挂法                     后果                           生活比喻
  -------------------------------------------------------------------------------
  该挂会话的挂到宿主       会话 A 的状态漏进会话 B        两个客人共用一间卧室
  该挂宿主的挂到会话       每个会话复制一份,还不一致     每个房间自带一套水电表
  会话结束后还想接着用     引用的作用域已经销毁           退了房还想用房卡开门
  -------------------------------------------------------------------------------

  算一笔账:一件 10 KB 的会话级状态,100 个会话用一天——

    挂对(会话平面)    用时挂上、结束销毁,常驻 0
    挂错(宿主平面)    常驻 100 份的写入点,还互相覆盖

  容量是小事,隔离才是大事:挂错平面,【两个会话互不干扰】这条承诺就破了。
  所以边界不是限制动态,而是让动态敢用。

三种事故的共同根因是同一个:生命周期与作用域不匹配。 算例那笔账的重点不在省内存,在隔离——挂错平面,两个会话互不干扰的承诺就破了。 【先划边界再谈能力】这思路在 2.2 的工作区上出现过一次,这是第二次。

30 秒实验

  1. 给这两个东西判断挂哪层:一个会话中途装的翻译插件/全局的 API 密钥配置。
  2. 说说【残留】事故具体怎么发生——用【房间】的比喻走一遍。
  3. 回看 1.2 的口诀,现在你能说出它的判断标准了吗?

常见误区

  1. 错误:作用域是性能优化,不影响正确性。——纠正:挂错平面先破的是隔离性,状态泄漏比浪费内存严重得多。
  2. 错误:动态组合就是想挂哪挂哪。——纠正:每次挂卸都必须指明作用域;没有边界的动态是添乱。
  3. 错误:会话结束后插件会自动进宿主平面继续服务。——纠正:作用域销毁就是销毁,没有自动搬家这回事。
自测三问(点开对答案) 1. 判断挂哪个平面的唯一标准是什么? —— **它该活多久**:跟会话同寿的挂会话平面,跨会话的挂宿主平面。 2. 没有边界的动态组合会出哪三种事故? —— 泄漏(状态跨会话)、残留(会话结束能力还在)、失控(权限收不回来)。 3. 为什么说边界是动态的前提? —— 卸载干净的前提是知道挂在哪、活到几时;**生命周期明确才敢中途装卸**。

相关笔记