2016-07-06 3 views
-3

私はこのような大きなif-elseステートメントを持っています。どうすればそれをリファクタリングできますか?誰かがそれをより美しくする方法をいくつか挙げることができますか?ありがとう!このような大きなIF-ELSEステートメントをリファクタリングする方法

public enum FireState 
{ 
    None, 
    NoneToMinor, 
    Minor, 
    MinorToNone, 
    MinorRecovery, 
    MinorToMajor, 
    Major, 
    MajorToNone, 
    MajorRecovery 
} 

private static FireState GetFireState(int previousRespinCount, int currentRespinCount, bool isRecovery) 
{ 
    FireState fire = FireState.None; 

    if ((isRecovery || previousRespinCount == 0) && currentRespinCount < MinorJackpotMinRange) 
    { 
     fire = FireState.None; 
    } 
    else if (previousRespinCount == 0 && 
     (currentRespinCount >= MinorJackpotMinRange 
     && currentRespinCount < MinorJackpotMaxRange)) 
    { 
     fire = FireState.MinorRecovery; 
    } 
    else if (isRecovery && currentRespinCount >= MinorJackpotMaxRange) 
    { 
     fire = FireState.MajorRecovery; 
    } 
    else if (previousRespinCount == (MinorJackpotMinRange - 1) 
     && currentRespinCount == MinorJackpotMinRange) 
    { 
     fire = FireState.NoneToMinor; 
    } 
    else if (previousRespinCount >= MinorJackpotMinRange 
     && (currentRespinCount > 0 && currentRespinCount < MinorJackpotMaxRange)) 
    { 
     fire = FireState.Minor; 
    } 
    else if ((previousRespinCount >= MinorJackpotMinRange && 
     previousRespinCount < MinorJackpotMaxRange) && 
     currentRespinCount == 0) 
    { 
     fire = FireState.MinorToNone; 
    } 
    else if (previousRespinCount == (MinorJackpotMaxRange - 1) 
     && currentRespinCount == MinorJackpotMaxRange) 
    { 
     fire = FireState.MinorToMajor; 
    } 
    else if (previousRespinCount >= MinorJackpotMaxRange && 
     currentRespinCount >= MinorJackpotMaxRange) 
    { 
     fire = FireState.Major; 
    } 
    else if (previousRespinCount >= MinorJackpotMaxRange 
     && currentRespinCount == 0) 
    { 
     fire = FireState.MajorToNone; 
    } 

    return fire; 
} 
+6

http://codereview.stackexchange.com/ –

+2

JavaとC#のソリューションは異なるでしょうので、私はこのトピックをオフトピックとして閉じることにしました。これはC#のようですが、Javaではなく、そうですか? – dasblinkenlight

+1

@TimSchmelterオフトピックです。また、コードレビューではより適切です。しかしそれはOn-Topicであり、ここに有効な近い理由はない。 – Kaz

答えて

1

ユニットテストの作成を開始します。あなたの方法を通してすべてのパスを理解していることを確信できるようになるように、カバレッジを使用してください。その後、よく知られている方法を使用してリファクタリングを開始します。あなたのテストは、あなたが何かを壊していないことを伝えています。

最後に、このすべてを捨てます。あなたはTDDで再起動し、合理的な設計を考え出すことに集中します。あなたの場合:あなたは状態マシンを実装するでしょう...しかし多態性を使用する;カスケードされたif/elseステートメントの代わりに。

短いストーリー:カバレッジベースのリファクタリングを選択することです。時間が許せば、部品全体を再設計すること。あなたの現在の実装は非常に偽装された状態マシンにすぎません。

関連する問題