2009-02-12 82 views
2

我有一個對象通過包含從url讀取的參數的工廠構建。我應該總是驗證對象是否爲NULL?

從這個對象,我可以得到語言參數

$語言= $ my_parameters->使用getLanguage();

如果未設置語言,$ language爲NULL。

$ language也可能無效($ language-> isValid()返回false)。

所以,要建立我的頁面,我需要一些參數。

該頁面也建在槽工廠。然後我知道我需要建立它的參數。如果它錯過了參數,我會根據所要求的頁面建立一個有效的默認值。

此時,進入頁面工廠,如果一個參數無效,我會拋出異常。

我的頁面對象包含一個需要語言參數的正文對象。我知道我的參數在構建身體對象時是有效的。

進入我的身體的對象,我檢索語言

$語言= $ my_parameters->使用getLanguage();

此時,$ language **必須**纔有效。 所以我再次驗證

$language = $my_parameters->getLanguage(); 
if(is_null($language) or !$language->isValid()) { 
    throw new Exception('Language must be valid.'); 
} 

如果我需要4個參數,我有4個 IFS是驗證如果對象不爲NULL,而不是無效的。

我這樣做是因爲方法是公開的其中在正文對象中使用$ language。

而且人體可能會在工廠外建造。誰知道......

是否正確在這種情況下,以驗證?

什麼有關最佳做法?

回答

3

Here is the case for not checking for null來自Google測試博客最近的博客文章。

的說法是,它得到字跡清晰,容易單元測試的方式,因爲你不能真正假冒不事件,因爲你的異常/斷言將被拋出。

作者(MiškoHevery)的確評論說如果它是外部API,它可能仍然值得檢查錯誤條件。

+0

不錯的鏈接!我將它添加到我的提要閱讀器。坦克! – 2009-02-12 03:33:40

+0

我很喜歡這個網站。現在我實際上沒有做好測試(還)。但我渴望它。 :-) – pc1oad1etter 2009-02-12 03:41:03

1

我不是很瞭解你的域名,但在一般情況下,我喜歡斷言(NOT NULL)所有的地方,因爲通常如果我有一個空對象結束的地方,它是一個錯誤。

優選的參考類型通常甚至不能爲空也是一種好的做法。

1

我來自一個非常古老的C編程學校;所以我的事情是沒有被使用或已經free()'d的變量應該始終爲NULL。這只是我的看法。

編輯:在此基礎上,您應該始終使用它之前檢查變量是否爲NULL。如果變量爲NULL,並且不應該那麼你應該記錄一個錯誤。崩潰不應該是一個功能。

1

可以讓生活更簡單的自己通過分割使用getLanguage()爲兩種方法:

function getLanguageIfValid() { 
    // this method return a Language object, but only if it can be created 
    // correctly and the isValid() method returns TRUE. If the Language object 
    // can't be created correctly, then it will return null instead. 
} 

function getLanguageMustBeValid() { 
    // this method will always return an instance of Language, or else 
    // an exception will be thrown 
    if($return = $this->getLanguageIfValid()) 
     return $return; 
    throw new Exception("Couldn't get Language object"); 
} 

一旦你做到了這一點,在地方可以合理地說,語言的項目可能不正確地創建,使用第一種方法:

// we may or may not be able to get our Language object here 
if($language = $my_parameters->getLanguageIfValid()) 
    do_stuff($language); 

如果你是一定的語言對象應創建,然後用這將拋出異常爲你的第二個方法。

// we know the Language object is created at this point 
$language = $my_parameters->getLanguageMustBeValid(); 
do_stuff($language); 

所以回答你的問題是沒有 - 你不必驗證對象,只要你可以從我們保證不會返回null功能得到它不爲null。

1

從 - > getLanguage()拋出您的異常。

對我來說,應該自動拋出異常。你在做什麼似乎是錯誤代碼檢查和異常拋出的混合。

相關問題