达到外部价值?

时间:2013-12-17 12:49:17

标签: c# if-statement refactoring

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;

我是否有机会参考spriteManager的使用。只有一次并最终得到这个:代码,以获得更多的可读性?

    if (PlayerHealth == 3)
        selectedFrameOffset = 0;
    else if (PlayerHealth == 2)
        selectedFrameOffset = 30;
    else if (PlayerHealth == 1)
        selectedFrameOffset = 60;
    else if (PlayerHealth == 0)
        selectedFrameOffset = 90;

3 个答案:

答案 0 :(得分:7)

spriteManager.selectedFrameOffset = GetFrameOffset(spriteManager.PlayerHealth);

获得偏移是简单的开关

private int GetFrameOffset(int playerHealth)
{
    switch(playerHealth)
    {
       case 3: return 0;
       case 2: return 30;
       case 1: return 60;
       // etc
       default:
            throw new ArgumentException();
    }
}

考虑将此逻辑移至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();
        }
    }
}

由于@daryal注意到if..else块中的隐藏逻辑,我会在SpriteManager类中使用以下解决方案:

private const int frameOffset = 30;

public int SelectedFrameOffset
{
    get 
    { 
        if (PlayerHealth <= 3)
           return (3 - PlayerHealth) * frameOffset; 

        return defaultValue; // or throw
    }
}

答案 1 :(得分:3)

spriteManager.selectedFrameOffset = GetFrameOffset(spriteManager.PlayerHealth);

private int GetFrameOffset(int playerHealth)
{
    return (3 - playerHealth) * 30;
}

答案 2 :(得分:1)

在VB.net中你可以这样做:

Dim theCustomer As New Customer

theCutomer.Name = "Paul"
theCutomer.City = "New York" 

// or alternativly:

With theCustomer
    .Name = "Paul"
    .City = "New York" 
End With 

但是在C#中无法做到这一点。 在C#中,您可以使用较短的变量名称:

SpriteManager sp = new SpriteManager();
sp.selectedFrameOffset = 90;

或使用switch优化您的代码 - 状态等等,如谢尔盖所​​示。