面对函数式编程,低耦合高内聚一个基本需求,所以一些复杂的逻辑可以拆分为多个简单的逻辑进行操作,如下代码,每一个函数就单一的实现了加、减、乘的基本功能。
function multiplyValue(num, value) {
return num * value;
}
function addValue(num, value) {
return num + value;
}
function minusValue(num, value) {
return num - value
}
如今有个需求,是对4进行先减1后加2最后乘3,那么借用上面的函数,则是通过以下两种方法实现
let result = minusValue(4,1)
result = addValue(result,2)
result = multiplyValue(result,3) // 15
let result = multiplyValue(addValue(minusValue(4,1),2),3); // 15
compose和pipe函数
- compose函数可以理解为为了方便执行这些连续的方法,把传值调用的过程封装了起来,我们只需要给compose函数传递需要执行的方法,他就会从左往右自动执行,将上一次的结果作为下一次的参数传入,这里使用数组的reduce方法实现。
function compose() {
const args = Array.from(arguments);
return function (num) {
const _args = [...arguments].slice(1);
return args.reduce((acc, curr, i) => {
return curr(acc, _args[i])
}, num);
}
}
compose(minusValue, addValue, multiplyValue)(4, 1, 2, 3) // 15
- pipe函数 与compose函数类似,不过执行顺序是从右往左执行,所以将reduce方法改为reduceRight就好
function pipe() {
const args = Array.from(arguments);
return function (num) {
const _value = [...arguments].slice(1);
return args.reduceRight((acc, curr, i) => {
return curr(acc, _value[i])
}, num);
}
}
console.log(pipe(minusValue, addValue, multiplyValue)(4, 1, 3, 5)); // 22