pointfree

从一个问题开始

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

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)