条件逻辑的嵌套 if 的替代方案

ADa*_*Man 5 conditional-statements

是否有一种设计模式、方法或语言可以让您编写超越嵌套 If 的复杂条件逻辑?

至少,这种问题有名字吗?我无法在这里或通过 Google 找到任何描述我试图解决的问题,而不仅仅是用 Switch 语句替换 IF 。

我正在使用脚本来生成一堆数据。作为其中的一部分,我想添加大量分支条件逻辑,这些逻辑应该提供多样性并阻止某些组合。

例如,如果用户是 A 组的一部分,那么他们就不能是 B 组的一部分,如果他们具有属性 C,那么这会将他们限制为特征 5 或 6,但不能低于或高于该特征。

alf*_*sin 3

答案很简单:重构。

我们举个例子(伪代码):

if (a) {
    if (b) {
        if (c) {
             // do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以替换为:

if (a && b && c) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

现在,假设a,bc是复杂的谓词,这使得代码难以阅读,例如:

if (visitorIsInActiveTestCell(visitor) &&
    !specialOptOutConditionsApply(request, visitor) &&
    whatEverWeWantToCheckHere(bla, blabla)) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

我们也可以重构它并创建一个新方法:

def shouldDoSomething(request, visitor, bla, blabla) {
    return visitorIsInActiveTestCell(visitor) &&
        !specialOptOutConditionsApply(request, visitor) &&
        whatEverWeWantToCheckHere(bla, blabla)
}
Run Code Online (Sandbox Code Playgroud)

现在我们的if条件不再嵌套,变得更容易阅读和理解:

if (shouldDoSomething(request, visitor, bla, blabla)) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

有时提取这样的逻辑和重构并不简单,可能需要花一些时间思考,但我还没有遇到不可能的例子。