卸下if-else 侠的皮衣!- 适配器模式
🤭当我是if-else侠的时候
😶怕出错
给我一个功能,我总是要写很多if-else,虽然能跑,但是维护起来确实很难受,每次都要在一个方法里面增加逻辑,生怕搞错,要是涉及到支付功能,分分钟炸锅
😑难调试
我总是不知道之前写的逻辑在哪里,一个方法几百行逻辑,而且是不同功能点冗余在一起!这可能让我牺牲大量时间在这查找调试中
🤨交接容易挨打
当你交接给新同事的时候,这个要做好新同事的白眼和嘲讽,这代码简直是坨翔!这代码简直是个易碎的玻璃,一碰就碎!这代码简直是个世界十大奇迹!
🤔脱下if-else侠的皮衣
先学习下开发的设计原则
单一职责原则(SRP)
就一个类而言,应该仅有一个引起他变化的原因
开放封闭原则(ASD)
类、模块、函数等等应该是可以扩展的,但是不可以修改的
里氏替换原则(LSP)
所有引用基类的地方必须透明地使用其子类的对象
依赖倒置原则(DIP)
高层模块不应该依赖底层模块
迪米特原则(LOD)
一个软件实体应当尽可能的少与其他实体发生相互作用
接口隔离原则(ISP)
一个类对另一个类的依赖应该建立在最小的接口上
在学习下设计模式
大致可以分三大类:创建型
,结构型
,行为型
创建型:工厂模式 ,单例模式,原型模式
结构型:装饰器模式,适配器模式,代理模式
行为型:策略模式,状态模式,观察者模式
上篇文章学习了 策略模式,有兴趣可以过去看看,下面我们来学习适配器模式
场景:将一个接口返回的数据,转化成列表格式,单选框数据格式,多选框数据格式
用if-else来写,如下
let list = []
let selectArr = []
let checkedArr = []
http().then(res =>{
//处理成列表格式
this.list = this.handel(res,0)
//处理成下拉框模式
this.selectArr = this.handel(res,1)
//处理成多选框模式
this.checkedArr = this.handel(res,2)
})
handel(data,num){
if(num == 0){
....
}else if(num ==1){
....
}else if(num ==2){
....
}
}
分下下问题,假如我们多了几种格式,我们又要在这个方法体里面扩展,违反了开放封闭原则(ASD)
,所以我们现在来采用适配器模式来写下:
//定义一个Adapter
class Adpater {
data = [];
constructor(){
this.data = data
}
toList(col){
//col代表要的字段,毕竟整个data的字段不是我们都想要的
//转列表
return this.data.map(item =>{
const obj = {}
for(let e of col){
const f = e.f
obj[f] = item[f];
}
return obj
})
}
//用了map的省略写法,来处理转化单选的格式
toSelect(opt){
const {label,value} = opt
return this.data.map(item => ({
label,
value
}))
}
//同上处理转化多选的格式
toChecked(opt){
const {field} = opt
return this.data.map(item => ({
checked:false,
value:item[field]
}))
}
}
//下面是调用这个适配类
let list = []
let selectArr = []
let checkedArr = []
http.then(data =>{
const adapter = new Adatpter(data)
//处理列表
list = adapter.toList(['id','name','age'])
//处理下拉
selectArr = adapter.toSelect({
label:'name'
value:'id'
})
//处理多选
checkedArr = adapter.toChecked({
field:'id'
})
})
这个扩展性就能大大提高,看着也会好看很多,可以通过继承等等方式来扩展,继承方式下次有机会再来写代码,文章先到这里!
结尾
遵守设计规则,脱掉if-else的皮衣,善用设计模式,加
作者:向乾看
来源:juejin.cn/post/7265694012962537513
油,骚年们!给我点点赞,关注下!来源:juejin.cn/post/7265694012962537513