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

标签 c# performance boolean 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;
        }
    }

(顺便说一下,这是 XNA)如您所见,我有一个 bool isRunning,我在其中做了一个 if 语句,我在其中检查 if (Player is moving) && (regains stamina,一旦达到 stamina 就设置为 false值小于 6.0f) 然后我简单地检查是否按下了 Space,如果是,那么我的动画速度更快(间隔越小,spritesheet 变化越快),然后它发送真值,这意味着 Player 正在运行,否则我不是因为 Space 是没有按下。

然后我必须在第一个 if 语句之外重复这个“else”代码,以便在 Player 没有移动或他的耐力 Regan 为 false 时发送 Player 没有运行;

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

最佳答案

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

 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
 } 

关于c# - 这种 bool 方法是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38393923/

相关文章:

c# - MongoDB 无尽的查找 ToListAsync

javascript - VueJS 在 v-model 中反转值

列表上的 Python boolean 运算 - 不一致的结果

c# - 将通用预加载方法从 EF6 转换为 EF Core

c# - 我应该如何在自定义异常中存储数据?

c - 在针对顺序运行优化的程序上使用 openMP 后没有性能提升

performance - CentOS 中的 NIC/网络性能调整

c++ - 按位与函数在 C++ 中返回 bool

c# - 并行 for 循环和读取将在多个线程中使用的文件,最佳实践?

javascript - 是否值得收集 jQuery 相关的脚本在文档末尾运行它们?