这样的代码如何写更优雅?

通常业务代码中会有这样的逻辑:

if(type === 'a') {
  dispatch('someAction', {
    params: {
      a: 1
    }
  })
}
if(type === 'b') {
  dispatch('someAction', {
    params: {
      b: 2
    }
  })
}
if(type === 'c') {
  dispatch('someAction', {
    params: {
      a: 1,
      b: 2
    }
  })
}

前面两个好解决,应用策略模式可以简化,但有多个对象如何优化呢?

const valueObj = {
  a: 1,
  b: 2
}
dispatch('someAction', {
  params: {
    [type]: valueObj[type]
  }
})
阅读 2.2k
3 个回答
dispatch('someAction', {params:({
    a: {a:1},
    b: {b:2},
    c: {a:1,b:2},
})[type]})
const valueObj = {
  a: 1,
  b: 2,
  c: {
      a: valueObj.a,
      b: valueObj.b,
  }
}

dispatch('someAction', {
  params: {
    [type]: valueObj[type]
  }
})

这个需要开发者有规则意识,具体怎么写要看实际业务逻辑的。简单来说就是在必要的时候去先去创建规则,然后再写代码。
对于示例代码,制定规则:为type创建命名符合middleAction${type.upperCase()}规则的解析函数,该函数仅用于处理参数,然后交给someAction继续处理。

const params = {a: 1, b: 2};
try {
    dispatch(`middleAction${type.upperCase()}`, {params});
} catch() {
    console.log(`没有找到${type}对应的解释逻辑`);
}
*middleActionA({payload}, {put}) {
    yield put({type: 'someAction', payload: {params: {a: params.a}}});
}
*middleActionB({payload}, {put}) {
    yield put({type: 'someAction', payload: {params: {b: params.b}}});
}
*middleActionC({payload}, {put}) {
    yield put({type: 'someAction', payload: {params}});
}
*someAction({payload})...

不过话说回来你的示例代码本身逻辑也不好,type应该作为参数一起传递的,不然3种类型都触发同一个action的,那你在action里面要先判断a,b是否undefined,但是如果type作为参数传递的话,外层就没必要判断了,对吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题