是否有一种方法可以使条件看起来更整洁,并且将来像开放式封闭原则那样轻松地添加更多查询搜索?
例如:
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"]);
}
如您所见,它看起来确实很凌乱。
答案 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或任何任意值。