有时我发现自己在编写一个如下所示的 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/