FunctionalPrograming, To abstract

FunctionalPrograming

[code lang="javascript"]

function splat(fun){
return function(array){
return fun.apply(null, array);
}
};
var addArrayElements = splat(function(x, y){
return x + y
});
addArrayElements([1, 2]);
//3

function unsplat(fun){
return function(){
return fun.call(null, _.toArray(arguments));
};
}
var joinElements = unsplat(function(array){return array.join("")});
joinElements('_', '$', '/', '!', ':');
//"_$/!:"
[/code]

To abstract

[code lang="javascript"]

//origin
function parseAge(age){
if(!_.isString(age)) throw new Error("this is not String")
var a;
console.log("you will change age to number");
a = parseInt(age, 10);
if(_.isNaN(a)){
console.log(["cant change age to number"].join(""));
a = 0;
}
return a;
}
parseAge("42")
//you will change age to number
//42

parseAge(42)
//Uncaught Error: this is not String(…)

parseAge("frab")
//you will change age to number
//can't change age to number
//0

//To abstract
function fail(thing){
throw new Error(thing);
}
function warn(thing){
console.log(["worn:", thing].join(""));
}
function note(thing){
console.log(["info:", thing].join(""));
}

function parseAge(age){
if(!_.isString(age)) fail("this is not String");
var a;
note("you will change age to number");
a = parseInt(age, 10);
if(_.isNaN(a)){
warn(["cant change age to number"].join(""));
a = 0;
}
return a;
}

parseAge("fbob");

//info:you will change age to number
//warn:can't change age to number
//0

parseAge("1");

//info:you will change age to number
//1
[/code]

reference