2017-09-13 4 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; 
} 

しかし、今では類似点が良く見ることができます。私はあなたの残りの値を知らないが、あなたはこれを試すことができますようにこれらの例は、見て:

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)]; 
の操作を行います。

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; 
} 

とその実際には2つの辞書を使います

+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はあなたのコードを最適化します!

関連する問題