首页 文章

这种bool方法是一种不好的做法吗?

提问于
浏览
2

有时我发现自己写的bool方法看起来像这样:

public bool isRunning()
    {
        if (!(move == Moving.None) && staminaRegan == true)
        {
            if (keyState.IsKeyDown(Keys.Space))
            {
                EntityAnimation.interval = 10;
                return true;
            }
            else
            {
                EntityAnimation.interval = 65;
                return false;
            }
        }
        else 
        {
            EntityAnimation.interval = 65;
            return false;
        }
    }

(顺便说一下,这是XNA)正如你所看到的,我有一个bool isRunning,其中我做了一个if语句,我检查是否(玩家正在移动)&&(恢复耐力,一旦耐力达到低于值,则设置为假6.0f)然后我只是检查Space是否被按下,如果是,则我的动画更快(间隔越小,spritesheet更改越快),然后它发送true值,这意味着Player正在运行,否则我不是原因没有按空格 .

然后我必须在第一个if语句之外重复这个'else'代码,这样如果Player没有移动或者他的耐力Regan是假的,它会发送Player没有运行;

所以我只是想知道这种bool方法被认为是一种不好的做法(你在嵌套if中重新获得true和false值,然后在嵌套if之后返回false并重复相同的代码)?

5 回答

  • 1

    我认为我们为人(其他开发人员)编写代码,当然机器执行代码,但80%的开发人员的工作是阅读代码 .
    基于此,我认为读取的流程必须与执行代码的流程完全相同 - 这就是为什么我认为 return 语句不是一个坏事,甚至比方法底部只有一个return语句更好 .

  • 1

    我喜欢这种风格,我也喜欢它 . 首先,您可以更轻松地阅读代码,其次具有调试优势,因为您可以为其他个案设置断点 . 否则,您将需要使用断点条件 .

  • 7

    在方法中包含一个return语句是一个好习惯 . 一些人争论这个,但这是一个意见 .

    通过删除不必要的代码来清除if语句也是一种很好的做法:

    public bool isRunning()
    {
        bool result = false;
        if (move != Moving.None && staminaRegan)
        {
            if (keyState.IsKeyDown(Keys.Space))
            {
                EntityAnimation.interval = 10;
                result = true;
            }
            else
            {
                EntityAnimation.interval = 65;
            }
        }
        else
        {
            EntityAnimation.interval = 65;
        }
    
        return result;
    }
    
  • 1

    该方法有副作用,'s why it'是一个不好的做法:

    public bool isRunning()
    

    在查看方法的签名时,我们希望只有 true / false 答案,仅此而已 . 但是,该方法会更改实例的状态:

    ...
      if (!(move == Moving.None) && staminaRegan == true)
        {
            if (keyState.IsKeyDown(Keys.Space))
            {
                EntityAnimation.interval = 10; // <- Aaa! The interval is changed 
                return true;
            }
      ...
    

    我建议将初始方法拆分为属性和方法

    // No side effect: just answer is running or not
     public bool IsRunning {
       get {
         return (move != Moving.None) && staminaRegan && KeyState.IsKeyDown(Keys.Space);
       }
     }
    
     // Put the right interval based on instance internal state 
     // (if it's running etc.)
     public void AdjustInterval() {
       if (IsRunning) // and may be other conditions
         EntityAnimation.interval = 10; //TODO: move magic number into constant 
       else 
         EntityAnimation.interval = 65; //TODO: move magic number into constant
     }
    
  • 0

    您可以按如下方式重写代码;那么代码不会重复:

    public bool isRunning()
    {
        if (move != Moving.None && staminaRegan && keyState.IsKeyDown(Keys.Space))
        {
            EntityAnimation.interval = 10;
            return true;
        }
        else
        {
            EntityAnimation.interval = 65;
            return false;
        }
    }
    

    或者,如果您不想要冗余 else

    public bool isRunning()
    {
        if (move != Moving.None && staminaRegan && keyState.IsKeyDown(Keys.Space))
        {
            EntityAnimation.interval = 10;
            return true;
        }
    
        EntityAnimation.interval = 65;
        return false;
    }
    

    我会考虑在某种程度上引入一个名为boolean的自我文档,并将 staminaRegan 重命名为 staminaIsRegenerating

    public bool isRunning()
    {
        bool isMovingQuickly = (move != Moving.None) && staminaIsRegenerating && keyState.IsKeyDown(Keys.Space);
    
        if (isMovingQuickly)
            EntityAnimation.interval = 10;
        else
            EntityAnimation.interval = 65;
    
        return isMovingQuickly;
    }
    

    但最重要的是,您应该重命名该方法以更准确地描述它正在做的事情:

    public bool CheckIfRunningAndSetAnimationInterval()
    

相关问题