2014-02-12 34 views
0

編輯:我對特定編程實踐或編碼方式更感興趣,以避免這種情況。但任何建議都是值得歡迎的。在C#代碼中簡化case-if-else梯形圖

我寫了這個難看的代碼來執行某些任務:

switch(arg[0]) 
{ 
    case "a" 
    { 
     foreach(var c in obja) 
     { 
      if(c.entry == 'a') 
      { 
       if (Independent_condition_1) 
       { 
        // do logging 
        continue; 
       } 
       if (Independent_condition_2) 
       { 
        // do logging 
        continue; 
       } 
       // Do something if above two conditions are false 
      } 
      else 
      { 
       if (Independent_condition_3) 
       { 
        // do logging 
        continue; 
       } 
       if (Independent_condition_4) 
       { 
        // do logging 
        continue; 
       } 
       // do something if above 2 conditions are false. 
      } 
     } 
     break; 
    } 
    case "b" 
    { 
     // similar if else ladder 
    } 
} 

問題是代碼看起來很醜,是非常不可讀。爲了簡化代碼,我將if-else中的大部分內容移到了函數中。這種長嵌套if-else的替代方案是什麼?

+0

問題是更適合HTTP: //codereview.stackexchange.com/ – venerik

回答

0

您可以創建很多私人方法來決定或處理單個案例,也可以將各個案例的邏輯封裝在單獨的類中。後者使測試變得更容易,而前者則可以防止代碼變得笨重。

我傾向於瞄準的不超過5單一方法中的圈複雜度(如果我能幫助它...)http://msdn.microsoft.com/en-us/library/ms182212.aspx

使用私有方法的代碼示例:

private void method(string[] arg) 
    { 
     switch (arg[0]) 
     { 
      case "a": 
       HandleCaseA(); 
       break; 

      case "b": 
       HandleCaseB(); 
       break; 
      default: 
       throw new ArgumentException("arg"); 
     } 
    } 



    private void HandleCaseA() 
    { 
     foreach (var c in obja) 
     { 
      if (c.entry == 'a') 
       HandleSubCaseA(); 
      else if (!(Independent_condition_3 || Independent_condition_4) 
      HandleSubCaseAWithConditions3And4(); 

     }   
    } 

    private void HandleSubCaseA() 
    { 
     if (!(Independent_condition_1 || Independent_condition_2)) 
      { 
       // Do something 
      } 
     } 
    } 

    private void HandleCaseB() 
    { 
     //Do stuff 
    } 

    private void HandleSubCaseAWithConditions3And4() 
    { 
     //Do stuff 
    } 
} 
0

您可以組合條件和處理方法。如果條件爲你寫獨立的,沒有開關,所以你必須在更具可讀性分配工作(以下不可讀)塊,像這樣:

if (c.entry == 'a') 
{ 
    ProcessEntryA(c); 
} else ... 
    // etc 
} 
1

首先,你有很多不必要的在你的代碼中分支。我會結合並否定它們。這將使代碼更具可讀性。

switch(arg[0]) 
{ 
case "a" 
{ 
    foreach(var c in obja) 
    { 
    if(c.entry == 'a') 
    { 
     if(!(Independent_condition_1 || Independent_condition_2)) 
     { 
      // Do something 
     } 
     } 
    else 
     { 
     if(!(Independent_condition_3 || Independent_condition_4) 
     { 
     // do something 
     } 
     } 
    break; 
     } 
case "b" 
    { 
    //similar if else ladder 
    } 
} 

接下來我會分解成不同的方法。通過爲方法命名一些合理的東西,可以使代碼更具可讀性。這也意味着當您正在進行更改時,您只需要考慮正在處理的小部分,而不是整個複雜的方法。

switch(arg[0]) 
{ 
case "a" 
{ 
    foreach(var c in obja) 
    { 
    newMethod(c); 
    break; 
     } 
case "b" 
    { 
    //similar if else ladder 
    } 
} 

void newMethod(str c) { 
    if(c.entry == 'a') 
    { 
     if(!(Independent_condition_1 || Independent_condition_2)) 
     { 
      // Do something 
     } 
     } 
    else 
     { 
     if(!(Independent_condition_3 || Independent_condition_4) 
     { 
     // do something 
     } 
     } 
} 

然後,你可以繼續把它分解成更小的好名稱的方法,直到它更容易理解。

+0

任何評論爲什麼這是被投票? –

2

你可以創建它執行的if/else東西的方法和調用開關裏面,你不會是重複的代碼,你不會有一個巨大的開關塊:

switch(arg[0]) 
{ 
    case "a": 
     DoStuff('a'); 
     break; 
    case "b": 
     DoStuff('b'); 
     break; 
    default: 
     break; 
} 

private void DoStuff(char c) 
{ 
    foreach(var c in obja) 
    { 
     if(c.entry == c) 
     { 
      if (Independent_condition_1) 
      { 
       // do logging 
       continue; 
      } 
      if (Independent_condition_2) 
      { 
       // do logging 
       continue; 
      } 
       // Do something if above two conditions are false 
     } 
     else 
     { 
      if (Independent_condition_3) 
      { 
       // do logging 
       continue; 
      } 
      if (Independent_condition_4) 
      { 
       // do logging 
       continue; 
      } 
      // do something if above 2 conditions are false. 
     } 
    } 
}