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

一对方向相反的声明:Effect(我给系统增加什么)与 Coeffect(我需要系统给我什么)——依赖图、撤下顺序、缺失检测全从这一对来。

📝 本节和前面几节的关系

5.2 讲了 Effect,这一节把它的反面补齐——一件插件既有给出去的,也有要回来的。

一、一对声明,两个方向

打个比方:Effect 是我来交电费,Coeffect 是我家要用电。

缺了任何一边,系统都算不清账:只有 Effect 不知道你会找谁要,只有 Coeffect 不知道你会动什么。

二、实测里这两个方向的样子

双向声明齐全,系统才有完整的图——谁给什么、谁要什么。

三、这一对声明能算出什么

一张图四个用途——这就是声明式管理的全部回报。

四、对写插件的人意味着什么

五、动手 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 秒实验

  1. 在配置里各找一处 Effect 与 Coeffect 的身影。
  2. 解释:为什么【偷偷找依赖】的插件撤下时必然出问题?
  3. 用【电费】的比方给外行讲一遍这一对概念。

常见误区

  1. 错误:Effect 与 Coeffect 是一回事,都是依赖。——纠正:方向相反——一个是给系统的,一个是向系统要的。
  2. 错误:依赖在代码里能找到就行,不用声明。——纠正:没声明的依赖系统图里没有——撤下顺序与缺失检测全失效。
  3. 错误:Effect 越大越强大越好。——纠正:Effect 越小越好撤——影响半径小,热替换和清理都容易。
自测三问(点开对答案) 1. Effect 与 Coeffect 各声明什么? —— Effect=**我给系统增加什么**;Coeffect=**我需要系统给我什么**。 2. 这一对声明能算出哪四件事? —— 依赖图、撤下顺序、缺失检测、影响半径。 3. 写插件的三句忠告是什么? —— **需要的写出来、给出去的写小、缺了早失败。**

相关笔记