xox*_*_tw 0 c# refactoring if-statement
spriteManager是我拥有的外部类的一个实例,要访问PlayerHelath和selectedFrameOffset,我必须重新开始:spriteManager.多次.
if (spriteManager.PlayerHealth == 3)
spriteManager.selectedFrameOffset = 0;
else if (spriteManager.PlayerHealth == 2)
spriteManager.selectedFrameOffset = 30;
else if (spriteManager.PlayerHealth == 1)
spriteManager.selectedFrameOffset = 60;
else if (spriteManager.PlayerHealth == 0)
spriteManager.selectedFrameOffset = 90;
Run Code Online (Sandbox Code Playgroud)
有没有机会我可以参考spriteManager的使用.只有一次并最终得到这个:代码,以获得更多的可读性?
if (PlayerHealth == 3)
selectedFrameOffset = 0;
else if (PlayerHealth == 2)
selectedFrameOffset = 30;
else if (PlayerHealth == 1)
selectedFrameOffset = 60;
else if (PlayerHealth == 0)
selectedFrameOffset = 90;
Run Code Online (Sandbox Code Playgroud)
spriteManager.selectedFrameOffset = GetFrameOffset(spriteManager.PlayerHealth);
Run Code Online (Sandbox Code Playgroud)
获得偏移的地方是简单的开关
private int GetFrameOffset(int playerHealth)
{
switch(playerHealth)
{
case 3: return 0;
case 2: return 30;
case 1: return 60;
// etc
default:
throw new ArgumentException();
}
}
Run Code Online (Sandbox Code Playgroud)
考虑将这个逻辑转移到SpriteManager
类中.例如,您可以selectedFrameOffset
根据当前的健康值计算财产:
public int selectedFrameOffset
{
get
{
switch(PlayerHealth)
{
case 3: return 0;
case 2: return 30;
case 1: return 60;
// etc
default:
throw new ArgumentException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于@daryal注意到你的if..else块中隐藏的逻辑,我会在SpriteManager
课堂上使用以下解决方案:
private const int frameOffset = 30;
public int SelectedFrameOffset
{
get
{
if (PlayerHealth <= 3)
return (3 - PlayerHealth) * frameOffset;
return defaultValue; // or throw
}
}
Run Code Online (Sandbox Code Playgroud)