简体   繁体   English

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

[英]How to make the if conditions look cleaner?

Is there a way to make this if conditions look cleaner and easily to add more Query search in the future as in Open–closed principle? 如果条件看起来更简单,并且将来像开放式封闭原则那样轻松地添加更多查询搜索,是否有办法做到这一点?

For example: 例如:

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"]);
}

As you can see it look really messy. 如您所见,它看起来确实很凌乱。

Make a table of entries and use Array.prototype.find() : 制作条目表并使用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]))
  ...
}

The problem with the original code is that it isn't DRY, and so any incremental modification will inevitably repeat what was already written. 原始代码的问题在于它不是DRY,因此任何增量修改都将不可避免地重复已经编写的内容。

Compare the following two incremental changes: 比较以下两个增量更改:

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

And tell me which one you'd rather be typing every time you go back and add a new function. 并告诉我,您每次回去添加新功能时都希望输入哪个。

Since values are different and functions are different, there's not much place for improvement. 由于值不同且功能不同,因此没有太多改进的地方。

There's no necessity for bracket notation and there's no reason to reference event object every time. 不需要括号表示法,也没有理由每次都引用event对象。

It could be written as: 它可以写成:

const { queryParameters } = event;

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

No other improvements can be made, unless the same case occurs in several places and could be DRYed up: 除非在多个地方发生相同的情况并将其干燥,否则无法进行其他改进:

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

Then paramHandlers can be iterated to check if paramNames match event.queryParameters properties. 然后可以迭代paramHandlers来检查paramNames匹配event.queryParameters属性。

So what you have looks perfectly readable, simple, and clean. 因此,您所拥有的内容看起来完全可读,简单且干净。 You could create an event handler list if you need more flexibility: 如果需要更大的灵活性,可以创建一个事件处理程序列表:

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

In this example, the event handlers are functions that return a result if the event was consumed and processing should end. 在此示例中,事件处理程序是在事件被消耗且处理应结束时返回结果的函数。 In your case your result can be a Promise or any arbitrary value. 在您的情况下,您的结果可以是Promise或任何任意值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM