替代嵌套if for条件逻辑

时间:2017-07-16 04:13:11

标签: conditional

是否有设计模式或方法或语言允许您编写复杂的条件逻辑而不仅仅是嵌套的Ifs?

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

我正在玩一个脚本来生成一堆数据。作为其中的一部分,我想添加许多分支条件逻辑,它应该提供多样性以及阻止某些组合。

类似的事情,如果用户是A组的一部分,那么他们就不能成为B组的一部分,如果他们有属性C,那么这会将他们限制在特征5或6,但不低于或高于该值。< / p>

3 个答案:

答案 0 :(得分:0)

答案很简单:重构。

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

if (a) {
    if (b) {
        if (c) {
             // do something
        }
    }
}

可以替换为:

if (a && b && c) {
    // do something
}

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

if (visitorIsInActiveTestCell(visitor) &&
    !specialOptOutConditionsApply(request, visitor) &&
    whatEverWeWantToCheckHere(bla, blabla)) {
    // do something
}

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

def shouldDoSomething(request, visitor, bla, blabla) {
    return visitorIsInActiveTestCell(visitor) &&
        !specialOptOutConditionsApply(request, visitor) &&
        whatEverWeWantToCheckHere(bla, blabla)
}

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

if (shouldDoSomething(request, visitor, bla, blabla)) {
    // do something
}

有时提取这样的逻辑和重构并不是直截了当的,可能需要花一些时间来考虑它,但我还没有遇到一个不可能的例子。

答案 1 :(得分:0)

假设您使用的是面向对象的语言,可能需要用polymorphism替换条件逻辑。

即代替:

class Bird:
    #...
    def getSpeed(self):
        if self.type == EUROPEAN:
            return self.getBaseSpeed();
        elif self.type == AFRICAN:
            return self.getBaseSpeed() - self.getLoadFactor() * self.numberOfCoconuts;
        elif self.type == NORWEGIAN_BLUE:
            return 0 if isNailed else self.getBaseSpeed(self.voltage)
        else:
            raise Exception("Should be unreachable")

你可以说:

class Bird:
    #...
    def getSpeed(self):
        pass

class European(Bird):

    def getSpeed(self):
        return self.getBaseSpeed()


class African(Bird):

    def getSpeed(self):
        return self.getBaseSpeed() - self.getLoadFactor() * self.numberOfCoconuts


class NorwegianBlue(Bird):

    def getSpeed():
        return 0 if self.isNailed else self.getBaseSpeed(self.voltage)

# Somewhere in client code
speed = bird.getSpeed()

取自here

答案 2 :(得分:0)

所有上述答案似乎都遗漏了这个问题。 硬件接口中经常发生的一种模式如下:

if (something) {
  step1;
  if ( the result of step1) {
    step2;
     if (the result of step2) {
       step3;
     ... and so on
}}}...

由于每个步骤都取决于上一个步骤的结果,并且它本身可能具有内部条件,因此不能将这个结构折叠成一个逻辑连接。

在汇编代码中,这很简单,只需测试即可跳转到一个通用目标;即,可怕的“转到”。在C语言中,您最终得到了一堆缩进的代码,经过大约8个级别,很难阅读。

关于我能想到的最好的方法是:

while( true) {
  if ( !something)
    break;
  step1
  if ( ! result of step1)
    break;
  step2
  if ( ! result of step2)
    break;
  step3
  ...
  break;
}

有人有更好的解决方案吗?