前言
大家好,我是DongZi30_ ,前段时间在业务中遇到一个需求,简单可以理解为根据某个值的结果,需要处理不同的逻辑,最终得到的结果格式相同。可能第一反应是直接使用if else一把梭,但考虑到后期维护,于是就进行了简单的抽离。
处理方案
返回结果格式相同
由于返回格式相同,因此封装了一个结果函数,每个分支在处理完逻辑后,都调用该方法。
const getResult = (name, value) => {
return {
name,
value,
text: `${name}-${value}`
}
}
抽离各分支
const fn1 = ({name,value}) => {
...此处进行复杂的逻辑处理,只有满足条件才会继续往下执行,否则返回undefined
if(condition){
return getResult(name, value)
}
}
const fn2 = ({name,value}) => {
...此处进行复杂的逻辑处理,只有满足条件才会继续往下执行,否则返回undefined
if(condition){
return getResult(name, value)
}
}
...其他分支也同样处理
循环遍历,获取最终结果
把各分支方法统一放在一个数组列表中进行管理,通过遍历该数组,得到最终的结果.
const fnList = [fn1, fn2, ....]
let result
let targetFn = = fnList.find(fn => !!(result = fn({name, value})))
if (targetFn) return result
参数不同又该如何
上述方案主要是针对抽离的不同分支函数在参数相同的前提下,但如果各个分支函数所需要的参数不一样又该如何处理呢? 其实可以通过闭包的形式进行处理。方案如下:
const fn1 = ({name, value}) => {
return (otherParams) => {
...此处进行复杂的逻辑处理,只有满足条件才会继续往下执行,否则返回undefined
if(condition){
return getResult(name, value, otherParams)
}
}
}
for(let fn of fnList) {
if(fn()) {
return fn
}
}
通过以上方式可以保证各分支互相独立且便于维护,如果后期有新的逻辑分支,只需要追加新的分支方法即可,无需关心之前逻辑。