簡體   English   中英

如何使if條件看起來更干凈?

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

如果條件看起來更簡單,並且將來像開放式封閉原則那樣輕松地添加更多查詢搜索,是否有辦法做到這一點?

例如:

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

如您所見,它看起來確實很凌亂。

制作條目表並使用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);
}

並告訴我,您每次回去添加新功能時都希望輸入哪個。

由於值不同且功能不同,因此沒有太多改進的地方。

不需要括號表示法,也沒有理由每次都引用event對象。

它可以寫成:

const { queryParameters } = event;

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

除非在多個地方發生相同的情況並將其干燥,否則無法進行其他改進:

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

然后可以迭代paramHandlers來檢查paramNames匹配event.queryParameters屬性。

因此,您所擁有的內容看起來完全可讀,簡單且干凈。 如果需要更大的靈活性,可以創建一個事件處理程序列表:

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

在此示例中,事件處理程序是在事件被消耗且處理應結束時返回結果的函數。 在您的情況下,您的結果可以是Promise或任何任意值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM