2009-10-22 9 views
6

El problema es muy simple, tengo una clase de "stock", quiero cargar su "StockName" propiedad ", StockCode' de la db.¿Cómo inicializar una clase?

por lo cual Patten debo usar?

patrón 1) Utilice la clase de servicio que crearla


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

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

patrón 2) Utilice el método estático en la


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

patrón 3) Utilice el constructor para cargar

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

para el patrón 1: parece que usar tantos código para crear un objeto de la acción, y el método "SaveStock" parece un poco no oponerse a orientar.
para el patrón 2: el método "Guardar" parece correcto, pero el método GetStock es un método estático, parece una clase de Utilidad que siempre utiliza el método estático.
para el patrón 3: el constructor cargará los datos de db cuando se inicialice. parece confundido también

+0

¿Qué idioma es este? –

+0

C# o java, pueden ser ambos – Graviton

Respuesta

0

algo similar al método 1 donde debe estar llamando a las clases de la capa de base de datos para obtener el objeto cargado desde allí, aunque es posible que desee utilizar un ORM para cuidar de todo el acceso a datos para que

0

Personalmente, me gusta tener mis objetos abstraídos de su fuente de datos, así que elegiría un método como el # 1. # 3 definitivamente no quiere hacer ... demasiado procesamiento en constructores puede meterlo en problemas. La preferencia de # 1 vs # 2 probablemente se reduzca a la 'carga' que desee que tengan sus objetos de datos.

Si alguna vez prevé obtener su objeto de otra fuente de datos, querrá seguir con el n. ° 1, ya que ofrece mucha más flexibilidad.

0

Me gustaría ir con el patrón 1. Presenta una clara separación de preocupaciones entre el modelo de dominio y el acceso a los datos. También es más fácil probar la unidad.

0

si desea que se inicialice automáticamente, entonces use el constructor estático que ha sido llamado por el servicio de cargador de clases .net.

5

patrón 2) es el patten de fábrica (método) y me recuerda a los singleton (estáticos = singleton). Nota singletons are evil. El método de fábrica no es polimorfo. No puede cambiarlo para las pruebas (es decir, no puede simularlo). ¡Es malvado! Evítalo!

patrón 3) viola que el constructor no debe hacer demasiado. En mi opinión, consultar la base de datos es demasiado para un coordinador. El objeto y su creación son preocupaciones diferentes y deben separarse. Además, se debe separar más creación de una instancia de la instancia, por lo tanto, trate de usar fábricas (o inyectores). Puede reemplazar la fábrica más fácil que la extensión "nueva clase" a través de su código.

patrón 1) permanece, que es un patrón abstracto de fábrica. Es bueno. Puede usar otra implementación para probar (una simulación). Separa la creación del objeto. (Principio de la responsabilidad individual como Carl Bergquist lo llama.)

Así que iría con el patrón 1.

+0

Los patrones de fábrica generalmente usan métodos estáticos. En la instancia 1 aquí, una clase se inicializa solo para permitirle usar una interfaz. No hay variables de clase, por lo que podría reescribirse fácilmente para que sea estático. – cjk

+0

IStockService es un patrón abstracto de fábrica que no tiene estadísticas. No podría tener estática si puedo evitarlo. –

0

usted debe separar la clase de entidad (de valores) y la lógica de que la llena (stockservice), pero en lugar de la escritura una clase stockservice simplemente usa un orm para asignar db a su clase de entidad (stock).

1

Te estás faltando algo importante. Específicamente, ¿dónde obtienes tu cadena de conexión para hablar con la base de datos?

Actualice cada uno de sus ejemplos con el origen de la cadena de conexión y creo que hará que salga la respuesta correcta.

2

Patrón 1:
- fácil poner a prueba
- principio de responsabilidad individual
- puede requerir más código.

Patrón 2:
- Las clases/métodos estáticos pueden hacer que el burlarse sea mucho más difícil. Intento evitarlo tanto como puedo.

Patrón 3:
- Está bien para las clases pequeñas. Pero mantenga la lógica lejos del constructor

Pero creo que Orm y la serialización cubren la mayoría de las partes (creación de objetos).

Cuestiones relacionadas