📄 一句话概括
一对方向相反的声明:Effect(我给系统增加什么)与 Coeffect(我需要系统给我什么)——依赖图、撤下顺序、缺失检测全从这一对来。
📝 本节和前面几节的关系
5.2 讲了 Effect,这一节把它的反面补齐——一件插件既有给出去的,也有要回来的。
一、一对声明,两个方向
- Effect:我给系统增加什么——提供的工具、注册的命令、隔离的键。
- Coeffect:我需要系统给我什么——会话上下文、配置项、别的插件的服务。
打个比方:Effect 是我来交电费,Coeffect 是我家要用电。
缺了任何一边,系统都算不清账:只有 Effect 不知道你会找谁要,只有 Coeffect 不知道你会动什么。
二、实测里这两个方向的样子
- Effect 侧:
isolate声明——这一组提供一个隔离的键。 - Coeffect 侧:
disabled: !!js '!ctx.get('profileContext')'——需要会话上下文才挂。 - 配置段本身:插件要求的配置项写明在 config 里。
双向声明齐全,系统才有完整的图——谁给什么、谁要什么。
三、这一对声明能算出什么
- 依赖图:谁需要谁——Coeffect 指向的提供方。
- 撤下顺序:被依赖的最后走(5.5.2 的逆序发起)。
- 缺失检测:你要的还没人给——立刻知道,而不是运行到一半崩。
- 影响半径:你给的有哪些——撤你时要恢复哪些(5.2 的边界)。
一张图四个用途——这就是声明式管理的全部回报。
四、对写插件的人意味着什么
- 把需要的写出来,别在代码里偷偷找——偷偷找的依赖,系统图里没有,撤下时必然漏。
- 把给出去的写小,Effect 越小越好撤——影响半径小,热替换也容易(5.6)。
- 依赖缺失要早失败——装载期就报出来,别等运行到一半。
五、动手 Demo:Effect 与 Coeffect——给什么,要什么
两个方向,加一份【能算出什么】的清单:
pair = [("Effect", "我给系统增加什么", "我来交电费"),
("Coeffect", "我需要系统给我什么", "我家要用电")]
for a, b, c in pair:
print(" %-9s %-14s (%s)" % (a, b, c))
print()
for u in ("依赖图", "撤下顺序", "缺失检测", "影响半径"):
print(" 能算出: %s" % u)
实跑输出:
--------------------------------------------------------------------
Effect 与 Coeffect——给什么,要什么
--------------------------------------------------------------------
一对概念,方向相反:
概念 回答的问题 打个比方
-----------------------------------------------
Effect 我给系统增加什么 我来交电费
Coeffect 我需要系统给我什么 我家要用电
-----------------------------------------------
实测里能对上的例子:
Effect isolate 声明:这一组【提供】一个隔离的键
Coeffect disabled 条件里的 ctx.get(...):【需要】会话上下文才挂
有了这一对声明,系统能算出:
依赖图 谁需要谁 -> 撤下顺序 -> 5.5.2 的逆序发起
缺什么 你要的还没人给 -> 5.8 实验里的【消失与回来】
双向齐全才有完整的图——只声明一半,账就有一半是猜的。 四个用途里最实用的是缺失检测:装载期就知道缺谁。 给写插件的人三句话:需要的写出来、给出去的写小、缺了早失败。
30 秒实验
- 在配置里各找一处 Effect 与 Coeffect 的身影。
- 解释:为什么【偷偷找依赖】的插件撤下时必然出问题?
- 用【电费】的比方给外行讲一遍这一对概念。
常见误区
- 错误:Effect 与 Coeffect 是一回事,都是依赖。——纠正:方向相反——一个是给系统的,一个是向系统要的。
- 错误:依赖在代码里能找到就行,不用声明。——纠正:没声明的依赖系统图里没有——撤下顺序与缺失检测全失效。
- 错误:Effect 越大越强大越好。——纠正:Effect 越小越好撤——影响半径小,热替换和清理都容易。
自测三问(点开对答案)
1. Effect 与 Coeffect 各声明什么? —— Effect=**我给系统增加什么**;Coeffect=**我需要系统给我什么**。 2. 这一对声明能算出哪四件事? —— 依赖图、撤下顺序、缺失检测、影响半径。 3. 写插件的三句忠告是什么? —— **需要的写出来、给出去的写小、缺了早失败。**- ☐ 下一节(5.8 动手实验:让依赖出现,消失,再回来)
相关笔记
- Effect 的边界 —— 本节是它的完整版
- 不要把 Tool 看成一个函数 —— 多入口就是多份声明
- 【一切皆插件】不等于没有内核 —— 依赖解析就是内核三件事之一
- 🐳 DeepSeek Harness · 索引