一、让函数的职责单一
1.在函数式编程中,我们其实往往希望一个函数的问题尽可能的单一,而不是将一大堆的处理过程交给一个函数来处理;
2.那么是否就可以将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果;
例:比如下面的案例我们进行一个修改:传入的函数需要分别被进行如下处理
function add(x, y, z) {
return x + y + z
}
每传入一个参数都对其进行一个处理
1.第一个参数+2;
2.第二个参数*2;
3.第三个参数**2
function add(x,y,z){
实际开发逻辑会更繁琐
x=x+2;
y=y*2;
z=z*z;
return x+y+z
}
//把处理变到了3个函数里,哪个出问题了处理对应的就可以了
function sum(x,y,z){
x=x+2;
return function(y){
y=y*2;
return function(z){
z=z*z
//这一步不接收参数了,直接返回就可以了
//return function(){
// return x+y+z
// }
return x+y+z;
}
}
}
console.log(sum(10)(20)(30))
Ps:在函数式编程中,我们往往希望一个函数处理的问题是尽可能单一的,而不是将一大堆问题交给一个函数,全部由他来处理,函数式编程里所有的问题都是一个一个的小函数来解决的,可以放到一个大函数挨个处理,处理完成后将结果返回出去;另外一种编程方式是让一个函数的功能尽可能单一,一个处理完之后把结果交给下一个然后依次处理,而不是把所有的东西封装到一个函数里(可读性和可扩展性和单一职责的原则都很弱)
设计模式:单一职责原则
面向对象:封装一个类时,让这个类做的事情尽可能单一 (一个类只做一个东西,调用其他单一的类)
二、柯里化–逻辑的复用
例1:
function sum(m,n){
return m+n
}
//假如在程序中,我们经常需要把5和另外一个数字进行相加
console.log(sum(5,10))
console.log(sum(5,14))
console.log(sum(5,156))
console.log(sum(5,10333))
//这样写每次都要写这个5
//这个时候就可以这样做
function makeAdder(count){
count=count*count
return function(num){
return count+num
}
}
//var result=makeAdder(5)(10)
//从闭包角度说是对count的复用
var adder5=makeAdder(5)
adder5(10)
adder5(14)
例2:
//打印日志
function log(data,type,message){
console.log(`[${data.getHours()}:${data.getMinutes()}][${type}]:[${message}]`)
}
log(new Date(),"DEBUG","查找轮播图的Bug")
log(new Date(),"DEBUG","查询菜单的bug")
log(new Date(),"DEBUG","查询数据的bug")
//柯里化的优化
var log=date=>type=>message=>{
console.log(`[${data.getHours()}:${data.getMinutes()}][${type}]:[${message}]`)
}
//如果我现在打印的都是当前时间
var nowLog=log(new Date())
nowLog("DEBUG")("查找轮播图的bug")
nowLog("FETURE")("新增了添加用户的功能")
var nowAndDebugLog=log(new Date)("DEBUG");
nowAndDebugLog("查找轮播图的Bug")
nowAndDebugLog("查找轮播图的Bug")
var nowAndFetureLog=log(new Date)("FETURE");
//不同的功能用同一个方法实现