[英]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.