Javascript 如何使if条件看起来更干净?
如果条件看起来更干净,并且将来可以像开放-封闭原则那样轻松添加更多查询搜索,那么有没有办法做到这一点 例如:Javascript 如何使if条件看起来更干净?,javascript,node.js,Javascript,Node.js,如果条件看起来更干净,并且将来可以像开放-封闭原则那样轻松添加更多查询搜索,那么有没有办法做到这一点 例如: if (event.queryParameters["name"]) { result = await getResultByName(event.queryParameters["name"]); } else if (event.queryParameters["emailAddress"]) { result = await getResultByEmail(eve
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"]);
}
正如您所见,它看起来非常凌乱。因此,您所拥有的内容看起来非常可读、简单、干净。如果需要更大的灵活性,可以创建事件处理程序列表:
eventHandlers = [nameHandler, emailHandler, ...];
var result;
for (var handler of eventHandlers) {
if (result = handler(event)) break;
}
在本例中,事件处理程序是函数,如果事件已被使用,则返回结果,并且处理应结束。在您的情况下,您的结果可以是承诺或任意值。制作一个条目表并使用: 原始代码的问题在于它不是干的,因此任何增量修改都不可避免地重复已经编写的代码 比较以下两个增量更改:
...
{ keys: ['fizz', 'buzz', 'fizzbuzz'], getResultBy: getResultByFizzBuzz }
请告诉我,每次返回并添加新函数时,您希望键入哪一个。由于值不同,函数也不同,因此没有多少改进的余地 没有必要使用括号表示法,也没有理由每次都引用
事件
对象
它可以写为:
const { queryParameters } = event;
if (queryParameters.name) {
result = await getResultByName(queryParameters.name);
} else if ...
除非同一情况在多个地方发生,并且可以干燥,否则无法进行其他改进:
const paramHandlers = [
{ handler: getResultByName, paramNames: ['name'] },
...
];
然后可以迭代
paramHandlers
以检查paramNames
是否匹配event.queryParameters
属性。对于事件查询参数,使用新的get()
函数怎么样?例如:get('email')
我认为没有理由这么做。它并不比queryParameters.name
简单。如果queryParameters
包含太多字符,则变量的名称可能会较短。此外,如果避免使用else If
,而只使用多个If
,这将导致不同的逻辑。如果有多个参数,将调用多个函数。如果这是您想要的,请坚持使用If
。否则else如果
是正确的方法。您在查询什么?一个数据库?为了确保问题清楚,到底是什么让这段代码“不那么干净”?我投票决定关闭这段代码,因为我需要一个主要基于意见的答案。这并不是说这不是一个好问题,而是一个好问题。但很明显,这个话题引发的辩论比必要的多,而且当讨论的大多数所谓“问题”都是完全假设的时候,很难给出客观的答案。不,这个答案是正确的。目标不是为他写OP的代码,但是要给他正确的使用方法。你如何使用这种方法来使用结果
。@JakeHolzinger处理程序可以返回如上所述的结果。这种解决方案无法简化示例代码,并且暗中隐藏了每个处理程序
函数中容易忽略的样板文件需要包装OP.Error@PatrickRoberts中使用的函数。这里绝对没有任何东西可以阻止异步处理。你应该学会承诺是如何起作用的。显然,处理程序只有在接受事件时才会返回承诺。也根本没有样板。根据定义,每个处理程序处理不同的用例。您的其他注释不相关。如果任何函数需要获取事件中没有的其他参数,则此操作将无效。查询参数
或使用事件的其他属性
,这是非常常见的要求。这过于复杂,不能满足OP以可维护的方式轻松添加新用例的需求。(注意:Mods删除了以前的评论。如果您要允许对其他答案发表评论,则应允许对所有答案发表评论。)请参阅此处的旧评论,了解此操作不起作用的原因:
const { queryParameters } = event;
if (queryParameters.name) {
result = await getResultByName(queryParameters.name);
} else if ...
const paramHandlers = [
{ handler: getResultByName, paramNames: ['name'] },
...
];