2009-06-07 49 views
1

我想知道什麼是最好的方法來驗證一個類具有所有必需的細節才能使用。如何驗證類在使用前配置了所有屬性?

例如說我有一個Book類,我想將關於該書的一組屬性傳遞給Book構造函數。

Book book = new Book(bookProperties); 

我想確保BookProperties完成什麼,即擁有所有的信息。

讓我們在這個例子說,我有以下幾點:

  • 書名
  • 書作者
  • 書本原稿發佈日期

的一種方式是,我可以創建一個默認的構造函數只接受全部3項:

BookProperties bookProperties = new BookProperties("2001: A Space Odyssey", 
                "Arthur C. Clarke", 
                1968); 

現在沒問題,如果我們只有三個值,但是說我的類有10個或更多屬性需要用戶初始化,然後才能創建Book類。

我在想的一件事是在BookProperties中有一個名爲isValid的方法。然後在Book類的構造函數中,我會看到是否bookProperties.isValid並斷言返回是否爲假。

這是一個好主意,還是我對這一切都錯了?

回答

3

如果它需要需要 10個值,那麼將10個值傳遞給構造函數並不是聞所未聞 - 但是您所描述的聽起來更像是一個實體對象。爲了方便,通常只使用屬性設置器。在C#3.0中,你可以使用初始化語法方便,並明確做到這一點:

Book book = new Book { 
    Title = "2001: A Space Odyssey", 
    Author = "Arthur C. Clarke", 
    PublishedYear = 1968 
}; 

可以使用BookProperties對象(如某種建設者) - 但在這種情況下,爲什麼不把建築上的方法建造者?然後,構建器在創建Book(可能通過internal構造函數)之前執行驗證 - 如果出現問題,則引發異常。我假設使用的是BookProperties(例如)允許一個不變的Book - 但沒有必要爲建設者爲不可變的:

var bookProperties = new BookProperties(); // builder? 
bookProperties.Title = "2001: A Space Odyssey"; 
... 
Book book = bookProperties.CreateBook(); 

個人而言,我只使用Book方法(大多數情況下) - 這種方法在常見的.NET序列化引擎和綁定框架(這兩種框架類似於無參數構造函數和get/set屬性)中運行良好。如果要驗證,則可能只需將Validate()方法(或IsValue {get;}屬性)添加到Book即可。或者執行IDataErrorInfo

+0

但是,在按屬性構建狀態屬性時,始終難以保存正確的類不變量。如果你不小心,最終可能會得到一個具有不同模式的類,具體取決於是否填充了足夠的屬性。我更喜歡對象構建器方法(BookProperties),但是爲* it *使用初始化語法,而不是最終的類。 – 2009-06-07 08:35:38

1

如果這些屬性真的很重要,他們應該在構造函數中。您當然可以使用重載來忽略具有可接受默認值的屬性。

10或甚至20個參數可能不是很漂亮,但它比替代品更好。

+0

這也是我想到的解決方案之一。但我認爲即使是10個也會太多。 – 2009-06-07 08:14:40

相關問題