2009-10-22 79 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和序列化覆盖了大部分(对象创建)。