2016-07-15 91 views
2

有时候我发现自己写,看起来像这样一个布尔值方法:这种布尔方法是不好的做法吗?

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)正如你所看到的,我有我做的if语句布尔isRunning其中进出口检查如果(玩家正在移动)& &(恢复耐力,一旦耐力达到小于6.0f的值就设置为假) 然后我只是检查空间是否按下,如果是,那么我的动画更快(间隔越小, Spritesheet变化越快),然后它发送真值,这意味着Player正在运行,否则Im不会导致空间没有按下。

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

所以我只是想知道这是一种布尔方法被认为是一种不好的做法(在嵌套的情况下,如果重复真假值,然后在嵌套的情况下返回false,并重复相同的代码)?

回答

1

在方法中有一个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; 
} 
+3

我同意有一个return语句,它在底部,看起来很干净。并且,由于您已经将结果初始设置为false,因此无需在方法中进一步重置 - 从而增加了可读性。 – horHAY

+0

*在一个方法中有一个返回语句是一个好习惯。* [No.](http://programmers.stackexchange.com/questions/118703/where-did-the-notion-of-one-return-只有来自)将代码强制调整为与实际执行的逻辑不匹配的特定模式是不好的。另见http://www.goodreads.com/quotes/353571-a-foolish-consistency-is-the-hobgoblin-of-little-minds-adored –

+0

是的,只有一个返回语句是好的做法,它是甚至在我为之工作的大多数公司中也是如此。代码更可读,但更重要的是维护更重要。我看到人们搜索几小时,为什么在方法底部的retun语句之前新添加的logmethod没有得到执行。 – GuidoG

0

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

1

您可以重写代码如下:那么代码不重复:

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; 
} 

我会考虑引入一个名为布尔自我文档一些,而且我重命名staminaReganstaminaIsRegenerating

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() 
7

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

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

为什么我不应该在bool方法中更改一些(其他类 - 公共静态变量)值,我只是在将true或false返回到bool之前更改了一些内容:/ –

+3

因为每个方法只应做一件事。你应该做一个方法IsRunning和一个方法AdjustInterval。比你可以使另一种方法CheckRunningAndAdjustInterval如果你想 – GuidoG

+0

(所有这一切)没有惊喜! – TaW

1

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

+0

多个return语句应该被编译器识别,并且它应该给出一个错误。这是无法读取的,并且是编程历史上最大的错误供应商 – GuidoG

+1

@GuidoG:您是否有任何引用来支持您的论点,即多重返回语句“是编程历史上最大的错误提供者”。我经常看到复杂的,令人费解的代码,这些代码在尝试实现单个返回语句时引入了错误 - 代码将被简化得更加简单,并且更易于维护以实现多个返回语句。 – PaulF

+0

如果方法首先只做一件事情,那么我们不会遇到乘法返回语句的问题。 – Fabio