2015-07-19 56 views
1

我沒有通過閱讀使用指南找到信息,所以我在這裏問我的問題: 假設下面的情況:冗餘代碼合同,前提條件的C#使用

/// <summary> 
    /// Initalisiert eine neue Instanz des SettingsManager 
    /// </summary> 
    /// <param name="settingsRepo">Das SettingsRepository welches die Einstellungen enthält</param> 
    public SettingsManager(ISettingsRepository settingsRepo) 
    { 
     Contract.Requires<ArgumentNullException>(settingsRepo != null, "The parameter settingsRepo cant be null"); 

     _settingsRepo = settingsRepo; 
    } 

    /// <summary> 
    /// Lädt alle Einstellungen 
    /// </summary> 
    public void Load() 
    { 
     Contract.Requires<NullReferenceException>(_settingsRepo != null, "The repository cant be null"); 
     . 
     . 
     . 
    } 

其中_settingsRepo是一家全球私人領域SettingsManager。在構造函數中,我定義了前提條件,參數settingsRepo不爲空。因此,當settingsRepo等於null時,會引發異常。但方法Load()使用在實例化期間確定不是null的字段_settingsRepo。但是,我不知道_settingsRepo目前是否等於null,當使用Load()時,我在方法Load()中定義的前提條件被認爲是多餘的,或者我應該將其擱置。

+1

Load是一種實例方法。如果'settingsRepo'爲空,則在C'tor中拋出異常,因此該對象未創建。你可以在'Load'中刪除驗證。 –

+0

'_settingsRepo'聲明爲'readonly'嗎? –

回答

2

正如我在這個問題的評論提到前運行代碼分析。您可以從Load方法中刪除驗證。 您使用的圖案稱爲Constructor Injection。 C'tor注入背後的想法是你正在創建的對象需要一個依賴關係,如果你不提供依賴關係,就沒有任何默認/替代行爲。在你的情況下,似乎恰恰是這種情況。

綜述:您驗證_settingsRepo不在C'tor空,因此你不需要在Load'方法再次進行驗證。

This是關於DI的一本很好的書,我建議你閱讀它。

0

儘管您沒有傳遞給該方法的參數,但值得一提的是一般規則是驗證公用方法的參數。

所有傳遞給外部可見方法的引用參數都應該根據null進行檢查。如果合適,請在參數爲null時引發ArgumentNullException。

如果一個方法可以從未知程序集中調用,因爲它被聲明爲public或protected,那麼應該驗證該方法的所有參數。如果方法設計爲僅由已知程序集調用,則應使該方法內部化並將InternalsVisibleToAttribute屬性應用於包含該方法的程序集。

這正好代碼分析下:CA1062:驗證的公共方法

論點,但既然你已經在不同的地方,是必不可少的驗證_settingsRepoLoad功能是存在的,那麼你可以省略驗證。但是,這可能會釋放後觸發警告,我的建議是釋放碼

Read more