阅读 71

不写if-else还可以写什么?

举个👉,假设你要封装一个可以返回一年的每个月中天数的函数(为方便起见,不考虑闰年)

采用原始的if-else能这么写:

// 获取一年中每个月对应的天数
function getOneYearMonthDays(month) {
    let days
    if (month == 1) { days = 31 }
    else if (month == 2) { days = 28 }
    else if (month == 3) { days = 31 }
    else if (month == 4) { days = 30 }
    else if (month == 5) { days = 31 }
    else if (month == 6) { days = 30 }
    else if (month == 7) { days = 31 }
    else if (month == 8) { days = 31 }
    else if (month == 9) { days = 30 }
    else if (month == 10) { days = 31 }
    else if (month == 11) { days = 30 }
    else if (month == 12) { days = 31 }
    // console.log('🌈🌈🌈🌈🌈🌈',days);
    return days
}
getOneYearMonthDays(2)
复制代码

本来很简单的一件事,代码却这么冗余,解决这个的办法可以使用表驱动法。

// 表驱动法
function _getOneYearMonthDays(month) {
    let daysArray = [31,28,31,30,31,30,31,31,30,31,30,31]
    // console.log('❤️❤️',daysArray[month - 1]);
    return daysArray[month -1]
}
_getOneYearMonthDays(4)
复制代码

表驱动法是一种可以使你在表中查找信息,而不必用很多的逻辑语句(if或case)来把他们找出来的方法。在简单的情况下,逻辑语句往往有更简单明了的语法。其意义在于逻辑和数据分离,修改数据和修改逻辑的成本和风险是不同的,后者往往更高。

这里总结下,使用数据和业务逻辑分离的形式好处是:

  1. 修改数据更灵活并且代码风格式实现统一;
  2. 修改数据比修改业务逻辑的成本和风险更低;
  3. 数据和业务逻辑真正实现了分离,便于更快速的找到需要修改的代码;

if-else 的场景怎么能少的了 switch-case 呢?

还是举个👉,假设有一个需求:传入cash,check,draft,ali_pay,wx_pay,对应输出:现金,支票,汇票,支付宝,微信支付。采用原始的 switch-case 能这么写:

function getPayWay(way) {
    switch(way) {
        case 'cash': return '现金';
        case 'check': return '支票';
        case 'draft': return '汇票';
        case 'ali_pay': return '支付宝';
        case 'wx_pay': return '微信支付';
    }        
}
// console.log(getPayWay('cash')
getPayWay('cash')
复制代码

如果业务需求变了,下次再加一个 bank_trans 对应输出银行转账呢,这样代码又要修改。和上面一样,数据和业务逻辑分离,代码如下:

function _getPayWay(way) {
    let payWayChinese = {
        'cash': '现金',
        'check': '支票',
        'draft': '汇票',
        'ali_pay': '支付宝',
        'wx_pay': '微信支付',
        'bank_trans ': '银行转账',
    }
    return payWayChinese[way]
}
复制代码

配置对象数据法可应用于需要显示通过后端返回的某个code或者status值,前端来自定义对应的显示文本内容。

这里总结下,使用配置对象代替switch-case的好处:

  1. 使用对象后续添加数据会更加灵活;
  2. 使用对象不需要switch去逐个遍历case值判断;
  3. 数据和业务逻辑真正实现了分离,和上个案例一致;