达到外部价值?

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)

Ser*_*kiy 7

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)