2013-03-11 27 views
4

我的意思是,我讀過寫一種方法的好方法是通過規則引導:一種方法應該只執行一項任務。如果我有不同的順序操作,那麼我需要將該方法分成幾個。它應該使代碼更簡潔,自我解釋的方法名稱。 但是,如果我想要實現方法,應該做些什麼,然後返回布爾值 - 真是成功,假如失敗。例如,假設我們有一個名爲setObjectValue()的setter。 [再次,這只是一個例子]。什麼是執行某些操作並返回指示在Java中成功的布爾值的良好做法?

問: 難道是很好用這個名字,並返回布爾值,或者它應該是什麼爲: isSuccessfullsetObjectValue(),setObjectValueAndCheckIsOk(),或者應該有兩種方法還是什麼?因爲名稱「setObjectValue()」不會告訴您該方法除了設置值之外還在做某些事情。

+0

我不明白你在問什麼。似乎是一個關於命名的問題,或者關於如何將代碼拆分成方法的問題,或者有關匈牙利符號的問題......我不確定。 – 2013-03-11 19:37:13

+0

@LaRRy我猜setter是一個錯誤的例子。你需要它的二傳手? – amod 2013-03-11 19:38:52

+0

命名是否可以返回布爾指標作爲方法的額外特徵。或者更適合返回指標的方法(當然,正在提出例外)。 – LaRRy 2013-03-11 19:41:26

回答

11

除非有很好的理由,否則我通常會使用例外來表明這一點。這有兩個好處:

  1. 你跟1種方法的公約 - 1個想法
  2. 你強迫自己(如果該異常檢查),用於處理故障情況。如果你返回一個布爾值,那麼代碼很容易忽略這種情況。

如果你做這樣的事情:

try{ 

    setObjectValue("foo") 
} catch(SomeKindOfException e){ 
    //handle 
} 

然後你得到它的閱讀,如英語的另一個好處:「嘗試設置對象的值,但如果你不能再經處理它...「

+2

關於拋出是否存在相當多的爭議像這樣的例外是非常好的做法。不確定它在這裏最有意義。 – 2013-03-11 19:39:19

+0

完美的+1 .. :) – amod 2013-03-11 19:39:45

+0

相關:http://stackoverflow.com/questions/77127/when-to-throw-an-exception。如果您在這裏購買最佳答案,那麼如果基本假設是錯誤的,則會拋出異常。由於制定者通常不應該失敗,這似乎是合適的。 – 2013-03-11 19:43:19

0

從我的角度來看,除非你打電話給慢速存儲設備(比如Web服務),否則setter不應該返回一個值,但是在這種情況下拋出異常將會更清晰。

0

我想如果你提到在JavaDoc中要使用的返回值是什麼,我會返回一個布爾值而不明確地說明該值在方法簽名中表示的值是否可以。這是在Java Collections API中完成的(不是Collections API是黃金標準),所以在Java中這通常是一種公認​​的做法。

1

它確實取決於你的代碼在做什麼,但是從你描述的內容來看,它是非常有意義的,並且可能是可取的行爲(同樣取決於你的代碼在做什麼)。

例如,Collection如果作爲操作結果而被更改,則返回布爾值。另一個例子是AtomicBoolean。在這些情況下,由於您可能需要知道是否修改了某些內容,因此返回布爾值是有意義的。只要有意義,方法的命名確實無關緊要。

在這些例子中,知道您的設置是否成功並且這是唯一真正做到這一點的地方非常重要。但是,我不會有用於設置某些值的方法,這也會執行很多其他非相關操作。

此外,如果您在您的示例中返回false的原因是某些驗證錯誤的結果,那麼您最有可能在嘗試設置值之前檢查該值。

1

在我看來,詹姆斯的回答非常好。但想想更多的制定者和由此產生的try-catch-blocks。 一個稍微不同的方法是通過驗證器來處理這些設置器的值,例如,用戶做了一些輸入或類似的東西。

String userInput = ...; 
if (myValidator.isValid(userInput)) { 
    myObject.setObjectValue(userInput); 
} 

方法isValid(boolean valueToCheck)指示它將返回一個布爾值。您的setObjectValue(String newValue)只需要完成這項工作而不返回任何價值。

你仍然可以在你的setter中檢查newValue。如果這是一個無效的輸入,你會拋出一個IllegalArgumentException(快速失效)。

if (newValue==null || newValue.contains("foo")) { 
    throw new IllegalArgumentException("Illegal value for newValue: "+newValue); 
} 
this.value = newValue; 

所以在你的代碼中,你可以使用你的setter來獲取你自己的值。我的意思是,你寫了這個方法,並且應該知道你的輸入,所以這應該沒問題。 如果用戶進行了一些輸入,請使用設置器的驗證器。會有奇怪的投入,相信我! ;-)

結果是,如果你有異常(如果你不使用驗證器),你不必處理這個數量的try-catch塊並知道去哪裏看。

0

安裝人員通常應該是無效的(不返回值)。有幾種方法可以在不使你的setter返回布爾值的情況下實現你的目標。一種方法是將布爾標誌設置爲實例變量,只要您設置了特定的值,該變量就會設置爲true。這個標誌可以通過它自己的吸氣器來訪問。

例如,您有一個具有姓名和電話號碼屬性的人員。你希望能夠設置一個人的電話號碼,後來確定該電話號碼是否已設置:

public class Person 
{ 
    private String name; 
    private String phone; 
    private boolean hasPhone; 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setPhone(String phone) 
    { 
     this.phone = phone; 
     hasPhone = true; 
    } 

    public String getPhone() 
    { 
     return phone; 
    } 

    public boolean hasPhone() 
    { 
     return hasPhone; 
    } 
} 
0

這是OK創建檢查一些條件,並返回一個布爾值的方法,而另一種方法在執行某些操作之前可能會使用條件檢查。

boolean checkSomeCondition(); 

您的代碼不會受到

if (checkSomeCondition()) {...} 
else {...} 

但是當該方法無法執行它的名字規定動作的情況下,應使用異常。他們實際上是爲此創造的。

try { 
    DoSmth(); 
} catch (ParticularError e) { 
    ... 
} 

它一般用來風格,可能是處理該函數的體內內容時發生錯誤的最好方式。

相關問題