以下纯属个人理解,如果错的离谱,欢迎
喷我指出。
1. 什么是代数式?
回忆一下高深的小学数学,应该是长这样:
2x + 3y + 4z
可以给这个代数式起个名字 —— getNum。
2. 变成函数
function x() {}
function y() {}
function z() {}
function getNum() {
let a = 2 * x()
let b = 3 * y()
let c = 4 * z()
return a + b + c
}
上面代码中的 x
、y
、z
三个函数,就是「代数式」getNum
中的三个变量。
3. 有什么问题?
getNum
依赖于 x
、y
、z
三个函数。
以函数的作用来分类:做什么 -> getNum()
,怎么做 -> x()
y()
z()
。
「做什么」与「怎么做」是耦合的。
4. 如何解耦?
function getNum() {
let a = 2 * perform `x`
let b = 3 * perform `y`
let c = 4 * perform `z`
return a + b + c
}
好了,先定义好「做什么」,保证主流程畅通,至于怎么做,关我屁事。
至于「怎么做」,可以写在任意地方,比如另外一个文件中:
try {
getNum();
} handle (effect) {
if (effect === 'x') {
// ...
} else if (effect === 'y') {
// ...
} else if (effect === 'z') {
// ...
}
}
WARNING: 上面的是伪代码,目前 js 中并没有实现上述语法。
5. 什么是代数效应?
效应(Effects),就是 x
y
z
三兄弟,这三个函数会产生作用,它们被称为「效应」。
而代数(Algebraic),注意,是个形容词。
什么是代数效应?
就是「效应」如同「代数式」中的变量一样,被插入了函数。
所以「代码效应」这个翻译很猥琐,全称应该是「像是代数式中变量一样的效应」。
这就是我的理解,完了 😇。
如果觉得我说的很扯蛋,
赶紧看一下这个:overreacted.io/algebraic-e…