2015-06-29 12 views
1

我有以下代碼來獲取對象的名稱。如果沒有「if」大小寫匹配,請在開頭設置默認值或明確設置

public String getName(Object... manyVarsToCreateObjectName) { 
    String ObjectName = defaultValue; 
    if(something...) { 
     ObjectName = "object1" 
    } else { 
     if(somethingElse...) { 
     ObjectName = "object2" 
    } 
    } 

    return ObjectName; 
} 

有許多如果影響最終目標名稱的情況下,並且在開始設置,如果從句,如果沒有匹配返回默認值。我的問題是:

  1. 我應該在開始時設置默認值還是明確地設置它,如果沒有,如果大小寫匹配。
  2. 只要找到匹配項,或者將其賦值給某個值並在最後返回,是否更好地返回objectName?
+1

它並不重要。這只是編碼風格的問題。我個人返回一旦我找到匹配或返回defaultValue結束,如果達到。 – Onheiron

+0

如果您首先設置了值,那麼如果任何If語句匹配,您可以在方法中設置它兩次。 如果你在默認值中設置一個else,那麼你要確保該變量只設置一次。如果您在某些情況下對變量設置了兩次感到困擾,這是一種偏好混合。最後返回。更好的方法是,當你有很長的方法去除時,如果你有1個返回而不是很多分散的返回語句 – Skepi

+0

另一個選擇是聲明你的局部變量爲'final',保證它只會被設置一次。 – biziclop

回答

3

我想盡快離開的方法,因爲我發現,無論是先決條件得不到滿足,或者我有一個結果,如:

public String getName(Object... manyVarsToCreateObjectName) { 
    if (!myImportedAssumption) { 
     return null; // or anything signalling invalidity (or even throw) 
    } 

    if (something...) { 
     return "object1"; 
    } 

    if (something else...) { 
     return "object2"; 
    } 

    // ... 

    return defaultValue; 
} 

對我來說,這是最清楚的結構。調試時,如果在方法的其餘部分發生任何其他事情,即使時間很長,也不用擔心。理解非常簡單,因爲你甚至不需要邏輯else。最後並非最不重要,它鼓勵清晰的設計:該方法只做一件事,沒有額外的計算或混亂由if序列確定的值。如果可能的話,我嘗試使用switch,而不是使用相同的提前退出風格。

+1

儘管它並不總是最清晰的結構,特別是如果你從循環獲得條件返回。儘管你可以爭辯說那裏還有其他的設計問題。 – biziclop

+0

我會;-)有些人也堅持只有一個'return'語句的方法,但是我沒有看到這樣一個規則的優點。 –

+0

有兩個主要原因:它可以讓你更容易地證明你的代碼是正確的(使用Hoare邏輯),並且它用於幫助在沒有'finally「塊或等價語言的語言中進行資源管理。更多關於[這裏](http://programmers.stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from)。在實踐中,我更喜歡雙管齊下的方法:在驗證輸入參數時,我尋求提前退出,但一旦我們到達業務邏輯,我會盡力堅持單一回報。雖然沒有引入幾個狀態變量的代價。 – biziclop

0

如前所述,這是一種代碼風格偏好。就個人而言,我發現下面幾點是最容易閱讀:

public String getName(Object... manyVarsToCreateObjectName) { 
    if(something...) { 
     return "object1"; 
    } else if(somethingElse...) { 
     return "object2"; 
    } 
    return defaultValue; 
} 

這樣,任何讀者將immediatelly看到什麼是在匹配的情況下返回。而如果使邏輯結構更易於遵循,則與嵌套結構相比。