如何重构这么大的 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;
}
你开始编写单元测试;并使用覆盖率来达到一个点,即你确信你理解通过你的方法的所有路径。然后,通过使用众所周知的方法开始重构它;你的测试告诉你,你在前进的过程中不会破坏任何东西。
最后,你抛弃所有这些;你用TDD重新启动,你专注于提出一个合理的设计。在您的情况下:您将实现状态机...但使用多态性;而不是级联的 if/else 语句。
长话短说:你的选择是基于覆盖率的重构;或者如果时间允许,重新设计整个组件;因为你目前的实现只是一个伪装得非常糟糕的状态机。