函数式编程库:Ramda函数思维导图,帮你快速选择要用的函数

1,817 阅读2分钟

为什么要用ramda库

  • Pointfree 的概念,也就是函数级别的抽象,我们经常说复用逻辑,复用逻辑的关键的就是抽象,无论是面向对象还是架构设计。但是很少有人谈到函数级别的复用,当我了解ramda库的时候,我觉得这是一个很不错的方案。举个例子

假如我们有这么一段数据,需要筛选其中属性isMan: true的值:

var list = [{ name: 'zhangsan', isMan: true }, { name: 'xiaoli', isMan: false }, ...]

我们看看不同的处理函数的写法,带来的复用性的差别

// Plain JS  
var manList = list.filter(function(task) {
    return task.isMan;
});

复制代码使用LoDash,会简单一点:

var manList = _.filter(list, {isMan: true});

复制代码上面两种情况,我们都会得到一个经过过滤的任务列表。 现在使用Ramda,我们可以这样做:

var filterManList = R.filter(R.where({complete: false});

可以看出,其实ramda是在组装函数,连数据都没有,你要筛选数据的时候需要filterManList(list)

也就是说,处理数据的时候,我们不要把数据和函数耦合在一起,用一种可拆分的函数组装的方式去处理,会让复用性更强。例如下图

fn = R.pipe(f1, f2, f3);

也就是函数和可以任意组合成新的函数fn,这个思想跟面向对象编程里,设计模式中的责任链模式非常相似,比如redux中间件组合也是这种思想。

  • 其实用什么库不是很重要,只要能帮助你快速完成业务需求,才是最重要的,ramda只是一种选择,你认同这种编程思想。

学习ramda最大的难点

  • 我也接触时间并不长,学习它我觉得最大的问题是官网那么多函数,让自己去筛选想要的很难第一时间找到,这就会极大的阻碍继续使用这个库的信心,所以我总结了一张思维导图表,按业务需求常见的类似增删改查这样的逻辑分了一下类,帮助想用这个库的同学快速找到对应的函数

  • 总结这个真的非常费力,图很大,需要保存到电脑上(结合官方文档,可以查看用法示例ramda.cn/docs/)