pointfree

作者: bigtom | 来源:发表于2016-08-10 09:14 被阅读463次

从一个问题开始

我们有一堆用户,现在要从中找出所有的女性用户并返回这些女性用户的电话号码。我们可以向下面这样实现

var users = [
  {name:"john lennon", sex: "male", phone:"123"},
  {name:"prince", sex: "male", phone:"234"},
  {name:"rihanna", sex:"female", phone:"345"},
  {name:"taylor swift", sex:"female", phone:"456"}
]

var getFemaleUserPhone = function(users){
  var phones = []
  users.forEach(function(u){
    if(u.sex === "female"){
      phones.push(u.phone)
    }
  })
  return phones
}

console.log(getFemaleUserPhone(users))

职能拆分

上面的代码没有任何问题,但是如果你要找男性的电话号码的时候,你就要完全重写你的函数了。根据单一职责原则,我们应当拆分上面的函数

var FemaleUser = function(users){
  return users.filter(function(u){return u.sex === "female"})
}
var getPhone = function(users){
  return users.map(function(u){return u.phone})
}
console.log(FemaleUser(users))
console.log(getPhone(FemaleUser(users)))

works great!

更进一步

var compose = function(f,g){
  return function(x){
    return f(g(x))
  }
}
getFemaleUserPhone = compose(getPhone,FemaleUser)
console.log(getFemaleUserPhone(users))

我们写了一个compose函数,就是把筛选女性用户和获取用户电话号码这两个函数给结合了起来,组成了一个新的函数。这个函数的功能和之前一样。
我们注意到一点,我们真正调用的函数是getFemaleUserPhone,但是,这个函数中,我们根本没有看到参数users! 这就是pointfree的意义所在。
我们可以写更基本更简单的函数,然后他们组合起来,实现我们想要的功能。

相关文章

  • pointfree

    从一个问题开始 我们有一堆用户,现在要从中找出所有的女性用户并返回这些女性用户的电话号码。我们可以向下面这样实现 ...

  • 阅迹(一)

    3.22 看过 Thunk 函数的含义和用法 Pointfree 编程风格指南 redux-thunk redux...

  • func 开篇() -> 在Swift中自定义操作符

    此文集可以大致看作网站PointFree讨论内容的翻译:如何在Swift中高效、便捷地使用函数式编程。每期视频需要...

  • 2017-08-30读书笔记(函数式编程之Pointfree)

    今天看的是函数式编程的相关文章,之前虽然没接触过函数式编程,但是这并不能阻止我们读文章啊。 文章是这篇 Point...

网友评论

      本文标题:pointfree

      本文链接:https://www.haomeiwen.com/subject/txidsttx.html