如何重构这么大的 IF-ELSE 语句

本文关键字:IF-ELSE 语句 何重构 重构 | 更新日期: 2023-09-27 17:55:26

我有一个很大的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;
}

如何重构这么大的 IF-ELSE 语句

你开始编写单元测试;并使用覆盖率来达到一个点,即你确信你理解通过你的方法的所有路径。然后,通过使用众所周知的方法开始重构它;你的测试告诉你,你在前进的过程中不会破坏任何东西。

最后,你

抛弃所有这些;你用TDD重新启动,你专注于提出一个合理的设计。在您的情况下:您将实现状态机...但使用多态性;而不是级联的 if/else 语句。

长话短说:你的选择是基于覆盖率的重构;或者如果时间允许,重新设计整个组件;因为你目前的实现只是一个伪装得非常糟糕的状态机。