摘要:冴羽的博客学习函数组合
需求
现在需要一个函数,输入’world’,返回 ‘HELLO WORLD’
实现思路: 将输入的字符串小写转大写,再拼接字符串
1 | var toUpperCase = function(x) { |
如果有更多的需求,greet 中就会有更多的嵌套,嵌套函数由内而外运行,过多的嵌套不利于维护
函数组合
函数组合就是将多个函数组合成一个函数,让代码从右向左运行,而不是由内而外运行,可读性大大提升
underscore的compose实现:
1 | function compose() { |
用ES6实现:
1 | const compose = (...fns) => |
有了函数组合,我们就可以更明了的理解程序的执行过程
1 | var greet = compose(addHello, toUpperCase); |
pointfree
Pointfree 的本质就是使用一些通用的函数,组合出各种复杂运算。上层运算不要直接操作数据,而是通过底层函数去处理。这就要求,将一些常用的操作封装成函数。简单说,Pointfree 就是运算过程抽象化,处理一个值,但是不提到这个值。这样做有很多好处,它能够让代码更清晰和简练,更符合语义,更容易复用,测试也变得轻而易举
实战
假设我们从服务器获取这样的数据:
1 | var data = { |
现在我们需要写一个名为getIncompleteTaskSummaries的函数,接收一个username作为参数,从服务器获取数据(上面的data),然后筛选出这个用户的未完成的任务的ids、priorities、titles、和dueDate数据,并且按照日期升序排序
过程式编程:
1 | var fetchData = function() { |
利用柯里化(curry)和函数组合(compose) 非常有助于实现pointfree
利用柯里化,先确定处理函数,只剩最后需要处理的数据
pointfree模式:
1 | var fetchData = function() { |
直接使用ramda.js,可以省去编写基本函数(详细介绍Ramda 函数库参考教程)
1 | var getIncompleteTaskSummaries = function (membername) { |
利用compose(ramda.js提供的compose从右向左执行,pipe从右向左执行)
1 | var getIncompleteTaskSummaries = function (membername) { |
想了解更多请参考Pointfree 编程风格指南