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

Bru*_*lip 2 c# performance xna

有时我发现自己写的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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dmi*_*nko 7

该方法有副作用,这就是为什么这是一个不好的做法:

 public bool isRunning()
Run Code Online (Sandbox Code Playgroud)

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

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

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

 // 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
 } 
Run Code Online (Sandbox Code Playgroud)

  • 因为每种方法都应该只做一件事.你应该创建一个方法IsRunning和一个方法AdjustInterval.如果您愿意,可以使用另一种方法CheckRunningAndAdjustInterval (3认同)