🐳 第五章 Cordis让插件能够动态组合
📄 一句话概括

Effect =【我会改变什么】;边界 =只改声明过的——声明了才允许,没声明就不该发生;撤下时也只恢复声明过的。

📝 本节和前面几节的关系

5.1 说变化必须能撤下,这一节讲凭什么知道要恢复哪些——答案是:装的时候声明过。

一、Effect 是一份声明

插件装上时声明 Effect:我会改变什么。

类比函数签名:签名声明了参数与返回值,调用方才知道会发生什么;Effect 声明了影响范围,系统才知道该管什么、该收什么。

二、边界换来的两件事

没有声明会怎样?撤下时要么【全量恢复】(误伤),要么【凭记忆恢复】(漏项)——两条路都是灾难。

三、实测里 Effect 思想的影子

配置里那些声明字段,全是 Effect 思想的落地:

系统里没有一个【悄悄生效】的改动——这是整套机制的性格。

四、边界的另一面是自由

听起来边界是束缚,其实正相反:边界内是充分自由。

这和 2.2 的工作区是同一个哲学:先把范围划清,范围内的动作越自由越好。

五、动手 Demo:Effect 的边界

声明与边界的一一对应:

rules = [
    ("声明了要改 A", "只允许改 A"),
    ("没声明, 却改了 B", "出了边界, 不该发生"),
]
for a, b in rules:
    print("  %-18s -> %s" % (a, b))
print()
print("  声明的两个回报:")
print("    可预期: 看声明就知道影响半径")
print("    可恢复: 撤下时照着声明逐项恢复")

实跑输出:

--------------------------------------------------------------------
Effect 的边界
--------------------------------------------------------------------
  Effect =【我会改变什么】。边界 =【只改声明过的】。

  情形                       系统的态度
  ----------------------------------------------
  声明了要改 A,就只改 A     允许
  没声明,却改了 B           不该发生——出了边界
  ----------------------------------------------

  类比一下最好懂:函数签名。

    函数签名声明了参数和返回值   -> 调用方知道会发生什么
    插件声明了 Effect            -> 系统知道该管什么、该收什么

  没有边界的动态组合,等于允许【装一个插件,顺便改半个系统】。
  有了 Effect 声明,撤下时才知道要恢复哪些东西——
  这也是 5.1 那条【必须能撤下】能成立的前提。

两条回报里,可恢复直接服务 5.1 的硬规矩——撤下照声明逐项来。 类比函数签名:签名让调用方安心,Effect 让系统安心。 边界内自由、边界外拒绝——这是机制的性格,不是官僚。

30 秒实验

  1. 把 Effect 的类比讲给外行:函数签名声明什么,Effect 就声明什么。
  2. 找一个你用过的软件,说说它哪一步【悄悄生效】让你吃过亏。
  3. 对照 2.2 的工作区设计,数数【先划边界再谈自由】出现了几次。

常见误区

  1. 错误:Effect 是插件实现里的效果列表,系统自己扫描。——纠正:是装上时的声明——系统按声明监管,不做全量扫描。
  2. 错误:边界越宽越灵活越好。——纠正:宽边界让撤下变成全量恢复,误伤与漏项都来了。
  3. 错误:声明是给文档看的,不影响运行。——纠正:声明就是监管依据——出边界当场不该发生。
自测三问(点开对答案) 1. Effect 声明的是什么? —— **我会改变什么**——影响范围的清单。 2. 为什么说边界换来的是自由? —— **边界内随便改不用请示**,系统只守一条线;没有边界才是处处设防。 3. 撤下时恢复哪些东西? —— **照着 Effect 声明逐项恢复**——没有声明就只能全量恢复或凭记忆漏项。

相关笔记