从一个问题开始
我们有一堆用户,现在要从中找出所有的女性用户并返回这些女性用户的电话号码。我们可以向下面这样实现
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的意义所在。
我们可以写更基本更简单的函数,然后他们组合起来,实现我们想要的功能。