從一個問題開始
我們有一堆用戶荤胁,現(xiàn)在要從中找出所有的女性用戶并返回這些女性用戶的電話號碼。我們可以向下面這樣實現(xiàn)
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))
職能拆分
上面的代碼沒有任何問題舅桩,但是如果你要找男性的電話號碼的時候酱虎,你就要完全重寫你的函數(shù)了。根據(jù)單一職責原則擂涛,我們應當拆分上面的函數(shù)
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函數(shù),就是把篩選女性用戶和獲取用戶電話號碼這兩個函數(shù)給結合了起來聊记,組成了一個新的函數(shù)撒妈。這個函數(shù)的功能和之前一樣。
我們注意到一點排监,我們真正調用的函數(shù)是getFemaleUserPhone狰右,但是,這個函數(shù)中舆床,我們根本沒有看到參數(shù)users! 這就是pointfree的意義所在棋蚌。
我們可以寫更基本更簡單的函數(shù)嫁佳,然后他們組合起來,實現(xiàn)我們想要的功能谷暮。