举个👉,假设你要封装一个可以返回一年的每个月中天数的函数(为方便起见,不考虑闰年)
采用原始的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)来把他们找出来的方法。在简单的情况下,逻辑语句往往有更简单明了的语法。其意义在于逻辑和数据分离,修改数据和修改逻辑的成本和风险是不同的,后者往往更高。
这里总结下,使用数据和业务逻辑分离的形式好处是:
- 修改数据更灵活并且代码风格式实现统一;
- 修改数据比修改业务逻辑的成本和风险更低;
- 数据和业务逻辑真正实现了分离,便于更快速的找到需要修改的代码;
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的好处:
- 使用对象后续添加数据会更加灵活;
- 使用对象不需要switch去逐个遍历case值判断;
- 数据和业务逻辑真正实现了分离,和上个案例一致;