2017-09-13 9 views
0

이 코드를 리팩터링하려고하는데 값이있는 사전을 만드는 것이 어렵지만 확실하지 않습니다.내부에 여러 문자열 조건이있는 여러 if 문을 리팩토링하는 방법은 무엇입니까?

String version "1.0"; 

if (version.Equals("1.0.0(beta)") || version.Equals("1.0.0(beta2)") || version.Equals("1.0.0(beta3)") || version.Equals("1.0.0")) 
      { 
       newVersion= executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)"; 
      } 
      else if(version.Equals("3.0.0(beta)") || version.Equals("3.0.0(beta2)") || version.Equals("3.0.0(beta3)") || version.Equals("3.0.0")) 
      { 
       newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)"; 
      } 
      else if (version.Equals("5.0.0(beta)") || version.Equals("5.0.0(beta2)") || version.Equals("5.0.0(beta3)") || version.Equals("5.0.0" || version.Equals("5.0.0.b")) 
      { 
       newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)"; 
      } 
      else if(same){ 
newVersion = same; 

7 인 경우 총계가 같습니다. .NET 2.0에서는이 작업을 수행해야합니다. .NET2.0를 들어

+0

여러분의 조건을 처리하기 위해'switch'를 사용하십시오.'||'에 대해'switch fallthrough'를 사용할 수 있습니다. https://en.wikipedia.org/wiki/Switch_statement –

+0

스위치를 사용하면 스위치를 사용해야합니다. (버전)을 비교하고 같은 줄에있는 동일한 여러 문자열을 사용하여 값을 비교하면됩니다. – dracarons

답변

2

난 당신이 switch을 고수 할 필요가 두려워 :이 "경우"를보고

switch(version) 
{ 
    case "1.0.0(beta)": 
    case "1.0.0(beta2)": 
    case "1.0.0(beta3)": 
    case "1.0.0":     
     newVersion = executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)"; 
     break; 
    case "3.0.0(beta)": 
    case "3.0.0(beta2)": 
    case "3.0.0(beta3)": 
    case "3.0.0": 
     newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)"; 
     break; 
    case "5.0.0(beta)": 
    case "5.0.0(beta2)": 
    case "5.0.0(beta3)": 
    case "5.0.0": 
    case "5.0.0.b": 
     newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)"; 
     break; 
} 

그러나 지금은 유사점이 더 볼 수 있습니다. 나는 당신의 나머지 값을 잘 모르겠지만, 당신이 시도 할 수있는 것처럼 이러한 경우는 볼 :

switch(version.SubString(0, 5)) // only test first 5 characters 
{ 
    case "1.0.0": 
     newVersion = executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)"; 
     break; 
    case "3.0.0": 
     newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)"; 
     break; 
    case "5.0.0": 
     newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)"; 
     break; 
} 

을 및 그 참이 사전 사용 후

Dictionary<string, string> versionsForInstall = new Dictionary<string, string> 
{ 
    {"1.0.0", "2.0.0(beta)"}, 
    {"3.0.0", "4.0.0(beta)"}, 
    {"5.0.0", "6.0.0(beta)"} 
}; 
Dictionary<string, string> versionsForOther = new Dictionary<string, string> 
{ 
    {"1.0.0", "1.0.0(beta)"}, 
    {"3.0.0", "3.0.0(beta)"}, 
    {"5.0.0", "5.0.0(beta)"} 
}; 

그리고 할

newVersion = executionType.Equals("Install") 
      ? versionsForInstall[version.SubString(0,5)] 
      : versionsForOther[version.SubString(0,5)]; 
+0

좋은 깨끗한 솔루션. 내가 추가 할 수있는 유일한 것은 사전에 전혀없는 버전을 검사하는 것입니다. 원본 질문에서 "같은"경우로 표현됩니다. –

+0

@KyleBurns이 코드에는 버전과 같은 오류 처리 기능이 없습니다. 사전에는 없지만 실제 코드를 모르므로 여기서 가장 좋은 오류 처리가 무엇인지 전혀 모릅니다. OP의 예에서 "같은"경우는 더 많은'if' 문구의 자리 표시 자입니다. 'newVersion'이'string' 일 때'if (same) newVersion = same'은 유효하지 않습니다. –

0

여기서 리팩토링을 할 수있는 부분이 많이 있지만, 첫 번째 단계는 모든 부분에 집중하는 것입니다. 연산자. 내가 하나 이상을 보게되면 (그리고 심지어 때로는 그것을 푸시한다) || 또는 & &을 평가할 때, 유지 보수 혼란과 이후 버그를 유발할 수있는 냄새가납니다.

if(IsV1Variant(version)) 
{ 
    ... 
} 
else if(IsV2Variant(version)) 
{ 
    ... 
} 

을 또한 유사한 스위치를 사용하여 논리를 단순화하고 균열

0

을 통해 전도되지 값의 위험을 줄일 수있는 StartsWith 비교 등이 경우에 보이는 : 나는 훨씬 읽기 쉽게 찾아 낼 것입니다 이

switch (version) 
{ 
    case "1.0.0(beta)": 
    case "1.0.0(beta2)": 
    case "1.0.0(beta3)": 
    case "1.0.0(beta)": 
    newVersion= executionType.Equals("Install") ? "2.0.0(beta)" : "1.0.0(beta)"; 
    break; 

    case "3.0.0(beta)": 
    case "3.0.0(beta2)": 
    case "3.0.0(beta3)": 
    case "3.0.0": 
    newVersion= executionType.Equals("Install") ? "4.0.0(beta)" : "3.0.0(beta)"; 
    break; 

    case "5.0.0(beta)": 
    case "5.0.0(beta2)": 
    case "5.0.0": 
    case "5.0.0.b": 
    newVersion= executionType.Equals("Install") ? "6.0.0(beta)" : "5.0.0(beta)"; 
    break; 
} 

줄을 많이 쓰는 것을 두려워하지 마십시오. CLS가 코드를 최적화합니다!