簡體   English   中英

這種bool方法是一種不好的做法嗎?

[英]Is this kind of a bool method a bad practice?

有時我發現自己寫的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語句,我在這里檢查是否(玩家正在移動)&&(恢復耐力,一旦耐力達到小於某個值,則設置為假6.0f)然后我只是檢查Space是否被按下,如果是,則我的動畫更快(間隔越小,spritesheet更改越快),然后它發送true值,這意味着Player正在運行,否則我不是原因沒有按空格。

然后我必須在第一個if語句之外重復這個'else'代碼,這樣如果Player沒有移動或者他的耐力Regan是假的,它會發送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
 } 

在方法中包含一個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;
}

您可以按如下方式重寫代碼; 那么代碼不會重復:

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

我會考慮在某種程度上引入一個名為boolean的自我文檔,並且我將staminaRegan重命名為staminaIsRegenerating

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

我認為我們為人(其他開發人員)編寫代碼,當然機器執行代碼,但80%的開發人員的工作是閱讀代碼。
基於此,我認為讀取流程必須與執行代碼流程完全相同 - 這就是為什么我認為乘法return語句不是壞事,甚至比方法底部只有一個return語句更好。

我喜歡這種風格,我也喜歡它。 首先,您可以更輕松地閱讀代碼,其次它具有調試優勢,因為您可以為其他個案設置斷點。 否則,您將需要使用斷點條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM