[英]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.