2016-07-15 96 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