簡體   English   中英

在方法開始時使用返回錯誤的編碼實踐?

[英]Is using return at the start of method bad coding practice?

我發現自己使用了以下練習,但每次使用它時,我內心都會有些畏縮。 基本上,它是參數的前提條件測試,以確定是否應該完成實際工作。

public static void doSomething(List<String> things)
{
    if(things == null || things.size() <= 0)
        return;

    //...snip... do actual work
}

優秀的做法是盡早回來。
這樣就可以執行和評估最少量的代碼。

不運行的代碼不能出錯。

此外,它使函數更容易閱讀,因為您不必處理所有不再適用的情況。

比較以下代碼

private Date someMethod(Boolean test) {
  Date result;
  if (null == test) {
    result = null
  } else {
    result = test ? something : other;
  }
  return result;
} 

VS

private Date someMethod(Boolean test) {

  if (null == test) { 
    return null 
  }
  return test ? something : other;
} 

第二個更短,不需要else而且不需要temp變量。

請注意,在Java中, return語句立即退出函數; 在其他語言(例如Pascal)中幾乎等效的代碼result:= something; 不回來。
由於這個事實,習慣上在Java方法中返回許多點。
稱這種bad practice是忽略了這樣一個事實,即那條特定列車早已離開了Java站。

如果您要在函數的許多點退出函數,最好盡早退出

這是一種風格和個人偏好的問題。 這沒什么不對。

據我所知 - 沒有

為了便於調試, 子程序,方法函數中只應有一個返回/退出點

使用這種方法,您的程序可能會變得更長,更不易讀,但在調試時,您可以在出口處設置斷點並始終查看返回的狀態。 例如,您可以記錄所有局部變量的狀態 - 這對於故障排除可能非常有用。

看起來有兩個“學校” - 一個說“盡早返回” ,而另一個說“一個程序中應該只有一個返回/退出點”

我是第一個的支持者,雖然在實踐中有時會跟隨第二個,只是為了節省時間。

另外,不要忘記異常 通常情況下,您必須提前從方法返回,這意味着您處於異常情況。 在您的示例中,我認為拋出異常更合適。

PMD似乎這么認為,並且你應該總是讓你的方法運行到最后,但是,對於某些快速的健全性檢查,我仍然使用過早的return語句。

它確實會損害該方法的可讀性,但在某些情況下,這可能比添加另一個if語句或其他方法更好地運行該方法到所有情況。

它沒有任何固有的錯誤,但如果它讓你畏縮,你可能會拋出IllegalArgumentException 在某些情況下,這更准確。 但是,無論何時調用doSomething ,它都會產生一堆代碼:

try {
    doSomething(myList);
} catch (IllegalArgumentException e) {}

這個問題沒有正確的答案,這是一個品味問題。

在上面的具體示例中,可能有更好的方法來強制執行前提條件,但我將多個早期返回的一般模式視為類似於函數式編程中的保護。

我個人對這種風格沒有任何問題 - 我認為它可以使代碼更清晰。 嘗試扭曲所有內容以獲得單個退出點可能會增加冗長度並降低可讀性。

這是一個很好的做法。 繼續你的好工作。

沒有什么問題。 就個人而言,我會使用else語句來執行函數的其余部分,並讓它自然返回。

如果你想避免你的方法中的“返回”:也許你可以使用自己的異常子類並在方法的調用中處理它?

例如 :

public static void doSomething(List<String> things) throws MyExceptionIfThingsIsEmpty {
    if(things == null || things.size() <= 0)
        throw new MyExceptionIfThingsIsEmpty(1, "Error, the list is empty !");    

    //...snip... do actual work
}

編輯:如果您不想使用“return”語句,則可以在if()中執行相反的操作:

if(things != null && things.size() > 0)
// do your things

如果函數很長(例如,20行或更多),則最好在開始時返回少量錯誤條件,以便代碼讀取器在讀取函數的其余部分時可以關注邏輯。 如果函數很小(例如5行或更少),那么一開始的return語句可能會讓讀者分心。

因此,決策應主要基於函數是否更具可讀性或更低可讀性。

Java良好實踐表明,返回語句應盡可能獨特,並在方法結束時編寫。 要控制返回的內容,請使用變量。 但是,對於從void方法返回,就像您使用的示例一樣,我要做的就是在僅用於此目的的中間方法中執行檢查。 無論如何,不​​要把這個看得太嚴肅 - 像continue這樣的關鍵字永遠不應該根據Java的良好實踐使用,但它們就在你的范圍內。

暫無
暫無

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

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