3

次のようなロジックがいくつかあります

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

これを読み取り可能なロジックに実装するための最良の方法は何ですか?何かをするのはたった1つのライナーなので、読みやすくするために大きなOOP手術をしたくありません。C /C++でのソリューションは高く評価されています

4

2 に答える 2

5

条件はブール値であり、明らかに独立しているため、単語内のビットとして扱いますswitch

#include <cstdio>

#define COMPOSE(a,b,c) ( ((!!(a)) << 2) | ((!!(b))<<1) | (!!(c)) )

int f(int i, int j, int k) {

  switch(COMPOSE( i==j, i+j<k, k!=42)) {
  case COMPOSE(true, true, true):
    printf("yo\n");
    break;
  case COMPOSE(true, true, false):
    printf("ye\n");
    break;
  case COMPOSE(true, false, true):
    printf("ya\n");
    break;
  }
}

int main () {
  f(1,1,1);
}
于 2012-05-01T19:53:15.900 に答える
5

すべて//do somethingが根本的に異なる場合、選択の余地はあまりありません (私の知る限り)。

コードスタイルについては、私が好む

if ( a && b && c ) 
{
}
else if ( a && b && !c )
{
}
else if ( a && !b && c )
...

これにより、複数レベルのインデントが不要になり、実際にどの条件が満たされているかが明確になります。

補足: 当然のことながら、なぜなら、else if を使用してa && b && !c述べることができます。コンパイラがそれを最適化する可能性があり、コードがきれいに見えるので、とにかくそのままにしておきます。a && b!(a && b && c)

于 2012-05-01T19:54:45.750 に答える