2010-04-29 49 views
4

我正在C#中創建一個類,最終它將成爲其他用戶可以使用的庫的一部分。 此類的用戶必須設置一些屬性,然後使用公共方法來檢索結果。用戶在不設置所有屬性的情況下調用方法時應該怎麼做?拋出異常並期望用戶捕捉它?尚未設置proprities的類

感謝

+0

取決於您如何與該用戶進行交互。拋出異常,日誌消息,顯示對話框 - 這一切都取決於你與該用戶的交互。 – Nayan 2010-04-29 12:57:18

+0

它是庫,所以選項如日誌消息,顯示對話框的氣味... – Andrey 2010-04-29 12:58:18

+0

你應該拋出異常,用戶會注意到,一旦他調試;) – Stormenet 2010-04-30 13:21:56

回答

1

雖然我不同意你設計屬性的設計,然後調用方法,但最好的選擇似乎是拋出異常,因爲它是庫。引發例外情況以通知發生了異常情況 - 您可以額外傳遞消息,但在調用給定的方法之前提及分配屬性。

+0

謝謝。當我有大約10個屬性需要設置時,我還可以怎樣設計它? – koumides 2010-04-30 07:54:40

12

這可能是最好創建一個構造函數的參數,讓你構建一個對象實例,它是處於可用狀態。

+0

+1我認爲這是更好的解決方案。否則,我會拋出。 – 2010-04-29 13:04:28

+0

不幸的是我有大約10個需要設置的屬性。我不認爲向構造函數發送10個參數是個好主意。 – koumides 2010-04-29 13:57:05

+1

@koumides - 這只是一個標誌,您可能需要打破課堂或將一些參數聚合到他們自己的課程中。 – 2010-04-30 13:10:40

1

如果你不能(或不應該)以已知的良好狀態啓動你的對象,那麼我會建議向調用者拋出某種異常。

0

一個好的設計使得很難做錯事。也許在這種情況下,API應該將所有輸入作爲參數傳遞給方法,然後可能是靜態的。

1

如果必須設置屬性,則將它們作爲構造函數的必需參數並隱藏默認的無參數構造函數。

如果不是所有的屬性都需要設置,那麼您將需要依靠日誌/異常來控制行爲。

+0

問題是我有大約10個。 – koumides 2010-04-29 14:16:03

4

除了提到的所有其他選項,您可以將屬性設置爲默認值。然後,如果用戶不需要默認行爲,則必須將其設置爲不同的內容。但真的不知道你的代碼在做什麼,很難說什麼是最好的選擇。

+2

這與MS'組件'模型一致,其中組件公開了配置操作的屬性,然後合適的方法啓動該操作。各種WinForms對話框組件就是一個很好的例子。這是避免缺少命名/可選參數的一種方法,因爲您可以提供合理的默認設置和易於閱讀的類配置,而不會造成混亂的重載構造函數。 – 2010-04-29 13:36:56

0

即使有像你這樣的10個屬性,如果它們是必需的,並且給它們默認值沒有意義,我會說它們全部放在構造函數中。

如果其中一些可以有合理的默認值,那麼你可以將它們從構造函數中刪除,並將它們設置爲默認值。

如果以上都不是可行的,例如對象可能需要在這些屬性的值已知之前構造,那麼我會看看是否有意義,可以將所需屬性作爲參數傳遞給方法(例如,它要麼沒有很多參數,要麼不可能被稱爲很多次,或者如果它真的在響應它自己的內部狀態)。

除上述所有情況外,應引發異常。你還提到「拋出異常並期待用戶捕捉它?」拋出異常的目的不應該是因爲你期望調用者捕獲它,你應該期望他們確保該屬性已被設置。抓住它應該是最後的手段,因爲他們無法合理確定財產是否確定,並且他們不關心您的方法是否因此而失敗。

0

你可以使用.NET 4嗎?在這種情況下,消費者可以使用命名參數,如果你想保持清晰。因此,與屬性,你將有:

new Class 
{ 
    Prop1 = 123, 
    Prop2 = 123, 
    ... 
}; 

並與命名參數:

new Class(
    param1: 123, 
    param2: 123, 
    ... 
); 

另外,如果你使用的引用類型,你會想要檢查的空任何一種方式。區別在於,使用構造函數參數只需檢查一次,而使用屬性時,每次調用方法時都必須檢查。

相關問題