Javascript 对于传入类型、遍历一些条件和返回对象,什么样的设计模式比较好
我有一堆条件语句,就像上面的一样,它们是在不同案例操作失败时执行的。大多数操作具有相同的if/elseIf结构,但有些操作具有附加的elseIf或一个或多个的减法Javascript 对于传入类型、遍历一些条件和返回对象,什么样的设计模式比较好,javascript,design-patterns,Javascript,Design Patterns,我有一堆条件语句,就像上面的一样,它们是在不同案例操作失败时执行的。大多数操作具有相同的if/elseIf结构,但有些操作具有附加的elseIf或一个或多个的减法 const someFailedAction = (caseIds, growlMessages) => { if (caseIds.length > 1) { toastr.error(growlMessages[0], errorToastrOptions); } else if (i
const someFailedAction = (caseIds, growlMessages) => {
if (caseIds.length > 1) {
toastr.error(growlMessages[0], errorToastrOptions);
} else if (isCaseDetailsDisplayed) {
toastr.error(growlMessages[1], errorToastrOptions);
} else if (errorParts.fieldIds.length === 0) {
toastr.error(growlMessages[2], errorToastrOptions);
} else {
toastr.error(growlMessages[3], errorToastrOptions);
}
}
我想知道是否有一种很好的设计模式,我可以在没有长嵌套重复的switch语句的情况下传入消息的类型和数组。只需使用布尔数组并找到成功的索引:
const SomeOtherFailedAction = (caseIds, growlMessages) => {
if (caseIds.length > 1) {
toastr.error(growlMessages[0], errorToastrOptions);
} else if (isCaseDetailsDisplayed) {
toastr.error(growlMessages[1], errorToastrOptions);
} else {
toastr.error(growlMessages[2], errorToastrOptions);
}
}
或者,您可以存储一个可重用的函数数组,逐个执行并返回函数返回true的第一个索引:
const i = [
caseIds.length > 1,
isCaseDetailsDisplayed,
errorParts.fieldIds.length === 0,
true
].indexOf(true);
toastr.error(growlMessages[i], errorToastrOptions)
Jonas的解决方案非常有效。请注意,您可以通过设置默认索引来干燥现有内容,并且只在条件中覆盖它。然后在最后调用函数一次
const tests = [
() => caseIds.length > 1,
() => isCaseDetailsDisplayed,
() => errorParts.fieldIds.length === 0,
() => true
]
const i = tests.findIndex(f => f());
toastr.error(growlMessages[i], errorToastrOptions)
在您的例子中,我看到在
someFailedAction
函数中,您在每个条件下都有几乎相同的行:toastr.error(growlMessages[%index%],options)
在someFailedAction
的末尾调用error
不会更好,但是在每种情况下,您都为growlMessages
指定了索引
,IsCaseDetails显示在哪里
和errorParts
来自哪里?感谢您的快速回复。我正在重构一堆代码,当您已经看到一个解决方案(尽管是一个糟糕的解决方案)时,有时很难找到更好的解决方案
const someFailedAction = (caseIds, growlMessages) => {
let idx = 3// replaces final `else` and is default
if (caseIds.length > 1) {
idx=0;
} else if (isCaseDetailsDisplayed) {
idx = 1;
} else if (errorParts.fieldIds.length === 0) {
idx= 2;
}// last `else` removed since already have a default
toastr.error(growlMessages[idx], errorToastrOptions);
}