2011-12-08 34 views
-4

作爲參考,我想指出this question考慮如何的準備測試。什麼是驗證參數的正確順序?

讓我們以下兩種片段作爲一個例子:

public void DoSomething1(Dictionary<string, string> param1, Object param2) 
{ 
    if (null == param1) 
     throw new ArgumentNullException("param1"); 
    if(!param1.Keys.Contains("somekey")) 
     throw new ArgumentException("param1 must contain key \"somekey\""); 
    if(null == param2) 
     throw new ArgumentNullException("param2"); 

    // now we do some stuff 
} 

public void DoSomething2(Dictionary<string, string> param1, Object param2) 
{ 
    if (null == param1) 
     throw new ArgumentNullException("param1"); 
    if (null == param2) 
     throw new ArgumentNullException("param2"); 
    if(!param1.Keys.Contains("somekey")) 
     throw new ArgumentException("param1 must contain key \"somekey\""); 

    // now we do some stuff 
} 

這兩種方法都將完成該方法的內部工作同樣的保護。

我的問題是...

什麼是正確的做法/爲了驗證傳遞給方法的參數(如本例)爲什麼

請引用備用答案。

+3

我不認爲這有一個「正確的方法」。在這種情況下,它看起來像是一個偏好問題。 –

+0

正確的方法是有道理的。例如,在調用'Contains()'之前,應首先檢查param1上的null異常,就像您在代碼示例中所做的那樣。 –

+0

我瞭解這兩項工作;你應該在驗證param2之前完全驗證param1嗎?還是應該從測試中最簡單的例子到更復雜的例外? –

回答

0

沒有「正確的順序」。

它完全實現特定。換句話說,更重要的是要報告參數爲空,或者在您接觸參數時深入檢查參數更重要嗎?

如果我這樣做,我會採取「性能」方法。換句話說,我會首先測試所有必要的參數都是非空的,然後我會打開每個參數以確保我得到了我想要的。執行空引用檢查比檢測字典是否包含密鑰更快(略)。

當然,我唯一擔心的是如果這個方法註定要被稱爲每秒數百次,並且它有可能被傳遞null參數。對於影響有限的方法,我會堅持調用者首先需要知道的內容。

+0

我和你一樣有同感。但是,通過在所有*案件中的表現來建立testin的「最佳實踐」是否公平? –

+0

@davids:不,我們可以做很多事情來編寫代碼以使其表現更好。但是,高性能的代碼會導致代碼不可讀。從這個角度來看,你必須逐個案例地確定性能是否比可讀性更受歡迎。 – NotMe

+0

另一個原因是,一種方式相對於另一種方式編寫的代碼的性能差異對於應用程序的執行可能是微不足道或零的。例如,如果您的示例中的代碼每小時最多執行一次,那麼以這種方式對其進行優化意義不大。但是,如果每秒執行數百次或數千次,那麼高度優化和未優化之間的差異實際上可能會對滿足性能目標所需的硬件產生財務影響。這就是爲什麼常見的最佳做法是隻在必要時進行優化。 – NotMe

相關問題