2011-08-17 41 views
-3

那麼它可能是一個愚蠢的問題,但我無法找到答案:雙人或單開關

的情況很簡單,我在進入一個整數和兩個變量的不同分配功能那。問題是分配給變量的值在某些情況下是通用的,但這兩種變量的情況並不相同。 (如果不夠清楚,請參閱示例)。

我想知道這種情況的最佳做法是什麼。 它是這樣的:

function test(a){ 
    var x,y; 
    switch (a){ 
     case 0: 
     case 1: 
     case 7: 
      y=...; 
      break; 
     case 2: 
     case 6: 
      y=...; 
      break; 
     case 3: 
     case 4: 
     case 5: 
      y=...; 
    } 
    switch(a){ 
     case 5: 
     case 6: 
     case 7: 
      x=...; 
      break; 
     case 0: 
     case 4: 
      x=...; 
      break; 
     case 1: 
     case 2: 
     case 3: 
      x=...; 
    } 
    ... 
} 

function test(a){ 
    var x,y; 
    switch (a){ 
     case 0: 
      x=...; 
      y=...; 
      break;    
     case 1: 
      x=...; 
      y=...; 
      break; 
     case 2: 
      x=...; 
      y=...; 
      break; 
     case 3: 
      x=...; 
      y=...; 
      break; 
     case 4: 
      x=...; 
      y=...; 
      break; 
     case 5: 
      x=...; 
      y=...; 
      break; 
     case 6: 
      x=...; 
      y=...; 
      break; 
     case 7: 
      x=...; 
      y=...; 
    } 
    ... 
} 

或者使用兩者的組合在每種情況下指定x的值,並在組爲y的值?

請注意,可能有8個以上的值,僅供參考。 在此先感謝。

回答

3

如果switch語句中的不同情況之間沒有真正的重疊,那麼最好讓它們分開。

如果這些操作之間存在大多數通用性,可以將它們與個別case塊中的某些特殊情況組合,但您似乎表明這不是這種情況。

但是,如果這不是一個更復雜的情況下只是一個簡單的例子,你可以實現的東西,如一個更緊湊的解決方案:

//      index: 0 1 2 3 4 5 6 7 8 9 10 11 12 
static const int lookupX[] = { 2, 7, 1, 8, 2, 8, 1, 8, 2, 8, 4, 5, 9}; 
static const int lookupY[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9}; 
if ((a >=0) && (a < sizeof(lookupX)/sizeof(*lookupX))) 
    x = lookupX[a]; 
if ((a >=0) && (a < sizeof(lookupY)/sizeof(*lookupY))) 
    y = lookupY[a]; 

這將讓你保持的值在一個更小的「配置」部分,以便您可以輕鬆看到意圖。範圍檢查和查找然後變得非常簡單。

該代碼是爲C定製的 - 我不確定您使用的是什麼特定語言(因爲var語句),但它基本上只在索引有效時才進行查找。您需要將該位翻譯成您選擇的語言。

+0

那麼這個問題不是專用於任何特定的語言。 感謝您的答案和想法,這似乎很好。 – 2011-08-17 12:05:25