2017-07-16 9 views
1

ネストされたIfs以外の複雑な条件付きロジックを書くことを可能にするデザインパターンまたは方法論や言語はありますか?条件付きロジックのネストされたものに代わるもの

少なくとも、この種の質問または問題に名前がありますか?私はここで何かを見つけることができなかったし、私が解決しようとしていたことを記述したGoogleを介して、あなたのIFをSwitchのステートメントに置き換えただけではありませんでした。

私は大量のデータを生成するためにスクリプトを使用しています。その一環として、多様性を提供し、特定の組み合わせをブロックする必要がある分岐条件付きロジックを多数追加したいと考えています。

UserがグループAの一部である場合、グループBのメンバーになることはできません。また、属性Cを持つ場合は、特性5または6に制限されますが、それ以下または上にはありません。

+0

switch文とif文の組み合わせを使う必要があると思います。あなたは、switchステートメントを持っているより小さなヘルパー関数にswitchステートメントを壊すことができます。 –

+0

@ whs.bsmith私は、switch文がネストされた 'if'を簡略化した1つの例(プログラミングのほぼ20年)を覚えていません。しかしおそらく私はちょうど幸運を得た;) – 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から撮影します。

関連する問題