如何使if条件看起来更干净?

时间:2019-04-05 20:26:22

标签: javascript node.js

是否有一种方法可以使条件看起来更整洁,并且将来像开放式封闭原则那样轻松地添加更多查询搜索?

例如:

if (event.queryParameters["name"]) {
    result = await getResultByName(event.queryParameters["name"]);
} else if (event.queryParameters["emailAddress"]) {
    result = await getResultByEmail(event.queryParameters["emailAddress"]);
} else if (event.queryParameters["param1"]) {
    result = await getResultByParam1(event.queryParameters["param1"]);
} else if (event.queryParameters["something1"] && event.queryParameters["something2"]) {
    result = await getResultBySomething(event.queryParameters["something1"], event.queryParameters["something2"]);
}

如您所见,它看起来确实很凌乱。

3 个答案:

答案 0 :(得分:3)

制作一个条目表并使用Array.prototype.find()

const lut = [
  { keys: ['name'], getResultBy: getResultByName },
  { keys: ['emailAddress'], getResultBy: getResultByEmail },
  { keys: ['param1'], getResultBy: getResultByParam1 },
  { keys: ['something1', 'something2'], getResultBy: getResultBySomething }
]

const params = event.queryParameters
const entry = lut.find(
  ({ keys }) => keys.every(key => key in params)
)

if (entry) {
  const { keys, getResultBy } = entry
  const result = await getResultBy(...keys.map(key => params[key]))
  ...
}

原始代码的问题在于它不是DRY,因此任何增量修改都将不可避免地重复已经编写的内容。

比较以下两个增量更改:

...
{ keys: ['fizz', 'buzz', 'fizzbuzz'], getResultBy: getResultByFizzBuzz }
...
else if (params.fizz && params.buzz && params.fizzbuzz) {
  result = await getResultByFizzBuzz(params.fizz, params.buzz, params.fizzbuzz);
}

告诉我,您每次回去添加新功能时都希望输入哪个。

答案 1 :(得分:2)

由于值不同且功能不同,因此没有太多改进的地方。

没有必要使用方括号表示法,也没有理由每次都引用event对象。

它可以写为:

const { queryParameters } = event;

if (queryParameters.name) {
    result = await getResultByName(queryParameters.name);
} else if ...

除非在多个地方发生相同情况并将其干燥,否则无法进行其他改进:

const paramHandlers = [
  { handler: getResultByName, paramNames: ['name'] },
  ...
];

然后可以迭代paramHandlers来检查paramNames是否与event.queryParameters属性匹配。

答案 2 :(得分:-1)

因此,您所拥有的内容看起来完全可读,简单且干净。如果需要更大的灵活性,可以创建一个事件处理程序列表:

eventHandlers = [nameHandler, emailHandler, ...];
var result;
for (var handler of eventHandlers) {
    if (result = handler(event)) break;
}

在此示例中,事件处理程序是在事件被消耗且处理应结束时返回结果的函数。就您而言,您的结果可以是Promise或任何任意值。