2009-10-22 66 views
6

問題是非常簡單的,我有一個類「股票」,我想加載其屬性「StockName」,「StockCode」從DB。如何初始化一個類?

所以我應該使用?

模式1的彭定康)使用服務類來創建它


public interface IStockService{ 
      Stock GetStock(string stockCode); 
      void SaveStock(Stock stock); 
     } 
     public class StockService : IStockService{ 
     } 

     IStockService stockService = new StockService(); 
     Stock stock = stockService.GetStock(); 

圖案2)在庫存


     public class Stock{ 
      public static Stock GetStock(){ 
       Stock stock = new Stock; 
       //load stock from db and do mapping. 
       return stock; 
      } 
      public void Save(){ 
      } 
     } 

圖案3使用靜態方法)使用構造加載

 public class Stock{ 
      public Stock(){ 
       //load stock from db and do mapping. 
       this.stockName = ... 
       this.stockCode = ... 
      } 
     } 

爲模式1:好像它使用這麼多的代碼創建一個股票的對象,而「SaveStock」方法似乎有點不是面向對象的。
對於模式2:「保存」方法似乎沒問題,但GetStock方法是一種靜態方法,它似乎總是使用靜態方法的Utility類。
對於模式3:構造函數將在初始化時從db加載數據。它似乎也感到困惑。

+0

這是什麼語言? – 2009-10-22 07:15:48

+0

C#或java,既可以是 – Graviton 2009-10-22 07:25:46

回答

0

類似於方法1,你應該打電話到DB層類的東西來獲取對象從那裏加載,雖然你可能想使用ORM照顧所有的數據訪問你

0

我個人喜歡讓我的對象從他們的數據源中抽象出來,所以我會使用像#1這樣的方法。 #3你絕對不想這麼做......在構造函數中處理太多會讓你陷入困境。 #1和#2的偏好很可能歸結爲您希望數據對象如何「加載」。

如果你曾經預見過從另一個數據源獲取對象,你會想要堅持#1,因爲它提供了更好的靈活性。

0

我會使用模式1.它顯示了領域模型和數據訪問之間的明確分離問題。單元測試也更容易。

0

如果您希望自動初始化它,請使用由類加載器.net服務調用的靜態構造函數。

5

模式2)是工廠(方法)模式,讓我想起單身(靜態=單身)。注意singletons are evil。工廠方法不是多形的。你不能改變它的測試(即你不能嘲笑它)。這是邪惡的!躲開它!

模式3)違反構造函數不應該做太多。在我看來,查詢數據庫對於ctor來說太多了。對象和它的創造是不同的問題,應該分開。進一步創建實例應該與實例分離,所以嘗試使用工廠(或注入器)。您可以通過代碼輕鬆地替換「新類」傳播的工廠。

模式1)仍然存在,這是一個抽象工廠模式。這很好。您可以使用其他實現進行測試(模擬)。它將創作與對象分離開來。 (單一職責原則卡爾·貝格斯調用它。)

所以我會去模式1

+0

工廠模式通常使用靜態方法。在這裏的實例1中,一個類只是被初始化以允許它使用一個接口。沒有類變量,所以很容易被重寫爲靜態的。 – cjk 2009-10-22 07:40:33

+0

IStockService是一個抽象工廠模式,沒有靜態。如果我能幫上忙,我就不會有任何靜力學。 – 2009-10-22 15:52:31

0

你應該獨立實體類(股票),並填充它(的StockService)的邏輯,但不是寫stockservice類只是使用orm將db映射到實體類(stock)。

1

你錯過了一個重要的部分。具體來說,你在哪裏得到連接字符串與數據庫交談?

更新你的每個例子的連接字符串來自哪裏,我認爲它會彈出正確的答案。

2

模式1:
- 更容易測試
- 單一職責原則
- 可需要更多的代碼。

模式2:
- 靜態類/方法可能會使模擬變得困難得多。我儘可能地避免它。

模式3:
- 適用於小班。但保持邏輯遠離構造函數

但我認爲Orm和序列化覆蓋了大部分(對象創建)。