卸下if-else 侠的皮衣!- 适配器模式

🤭当我是if-else侠的时候

😶怕出错

给我一个功能,我总是要写很多if-else,虽然能跑,但是维护起来确实很难受,每次都要在一个方法里面增加逻辑,生怕搞错,要是涉及到支付功能,分分钟炸锅

😑难调试

我总是不知道之前写的逻辑在哪里,一个方法几百行逻辑,而且是不同功能点冗余在一起!这可能让我牺牲大量时间在这查找调试中

🤨交接容易挨打

当你交接给新同事的时候,这个要做好新同事的白眼和嘲讽,这代码简直是坨翔!这代码简直是个易碎的玻璃,一碰就碎!这代码简直是个世界十大奇迹!

🤔脱下if-else侠的皮衣

先学习下开发的设计原则

单一职责原则(SRP)

就一个类而言,应该仅有一个引起他变化的原因

开放封闭原则(ASD)

类、模块、函数等等应该是可以扩展的,但是不可以修改的

里氏替换原则(LSP)

所有引用基类的地方必须透明地使用其子类的对象

依赖倒置原则(DIP)

高层模块不应该依赖底层模块

迪米特原则(LOD)

一个软件实体应当尽可能的少与其他实体发生相互作用

接口隔离原则(ISP)

一个类对另一个类的依赖应该建立在最小的接口上

在学习下设计模式

大致可以分三大类:创建型,结构型,行为型

创建型:工厂模式 ,单例模式,原型模式

结构型:装饰器模式,适配器模式,代理模式

行为型:策略模式,状态模式,观察者模式

上篇文章学习了 策略模式 ,有兴趣可以过去看看,下面我们来学习适配器模式

场景:将一个接口返回的数据,转化成列表格式,单选框数据格式,多选框数据格式

用if-else来写,如下

js 复制代码
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),所以我们现在来采用适配器模式来写下:

js 复制代码
//定义一个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的皮衣,善用设计模式,加油,骚年们!给我点点赞,关注下!

相关推荐
变与不变8067 小时前
jQuery怎么使用
前端·javascript
神膘护体小月半7 小时前
flex 布局的 order 属性
前端·css
paopaokaka_luck7 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
仰望.7 小时前
vue 表格组件 vxe-table 树表格懒加载支持拖拽排序的详细用法
前端·javascript·vue.js·vxe-table
前端 贾公子7 小时前
vite-plugin-uni-manifest 升级指南
前端
小码哥_常8 小时前
iPhone 用户传了张 HEIC,我的前端崩了
前端
小码哥_常8 小时前
你发的原图可能暴露你家地址——聊聊图片 EXIF 隐私
前端
java1234_小锋8 小时前
【技术专题】CSS3 网页技术 - CSS3 优先级
前端·css·css3
鸿蒙开发9 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
屏什么录9 小时前
录屏超过两小时就卡顿崩盘?从参数调优到代码实现,一文彻底搞定长时间录屏
前端·音视频开发