2017-07-16 119 views
1

是否有設計模式或方法或語言,使您可以編寫複雜的條件邏輯超越嵌套的Ifs?替代嵌套如果條件邏輯

至少,這種問題或問題是否有名字?我無法在這裏或通過Google找到任何描述我想解決的事情,不僅僅是用一個Switch語句替換您的IF。

我正在玩一個腳本來生成一堆數據。作爲其中的一部分,我想添加很多分支條件邏輯,這些邏輯應該提供變化以及阻止某些組合。

類似的,如果用戶是組A的一部分,那麼他們不能成爲B組的一部分,並且如果他們具有屬性C,那麼它將它們限制爲特性5或6,但是沒有低於或高於該特性。

+0

我認爲你需要使用switch語句和if語句的組合。您可以將您的開關語句分解爲也具有開關語句的較小幫助函數。 –

+0

@ whs.bsmith我甚至不記得一個例子(在將近20年的編程中),switch語句簡化了嵌套的if語句。但也許我只是很幸運;) – alfasin

+0

@alfasin看看redux中的選擇器。 –

回答

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 
} 

有時它不是簡單的提取等邏輯和重構,並且可能需要一些時間來考慮它,但我還沒有碰到一個不可能的例子。

+0

這對於改進我今天開始的工作非常有用,並幫助我重新構建了問題。 基本上現在我有分類數據,並試圖找到方法來減少需要顯式評估的案例數量。每個參數限制在下一個參數中找到的選項數量,但對於分類數據,必須對每個個案進行評估以反駁它。 我想知道,如果我試圖找到一種方式來表達它作爲一個範圍,那麼我可能只是沒有評估任何高於/低於某個點的東西。 – Aaron

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服用。