Pregunta

Veo este patrón una y otra vez y quería obtener opiniones:


Opción 1: en el objeto de conexión y la composición del objeto de negocio:

En el objeto de cableado t: los datos que se serializan y envían de un lado a otro a través de las máquinas (cliente / servidor, etc.). Este es un objeto POCO.

Por ejemplo:

public class Order
{
    public int Price;
    public int Amount;
}

Business Objects : otra clase que generalmente tiene algunas o todas las propiedades como el objeto de conexión, pero también algunos campos calculados. Esto usualmente usa la composición en la parte superior de " en el cable " objeto.

public class OrderBusinessObject  
{  
     private Order _order;

     public OrderBusinessObject(Order o)
     {
          _order = o;
     }

     public int Price {return _order.Price;}  
     public int Amount{return _order.Amount;}  
     public int Total{return _order.Price * _order.Amount;}            
}  

Opción 2: en el objeto de cable y el objeto de negocio por conversión:

Esto sería lo mismo en el objeto de cable como en el ejemplo 1, pero el objeto de negocio, en lugar de usar la composición, usaría las traducciones:

public class OrderTranslator
{
    public OrderBusinessObject Translate(Order o)
    {
         OrderBusinessObject bo = new OrderBusinessObject();
         bo.Amount = o.Amount;
         bo.Price = o.Price;
         return bo;
    }
}

public class OrderBusinessObject  
{    
     private int _price;
     private int _amount;

     public int Price {return _price;}  
     public int Amount{return _amount;}  
     public int Total{return _price * _amount;}            
}  

Opción 3: No tenga el objeto comercial en absoluto y haga que todos sus cálculos se realicen en una clase de calculadora separada. NOTA: los consumidores obtienen el objeto de conexión y una calculadora

public class Consumer
{
     public void ShowTotal(Order o)
     {
         Calculator calc = new Calculator();
         double total = calc.ShowTotal(o);
      }
}

Quería obtener las opiniones de la gente sobre si hay una mejor práctica o patrón aquí o esto es solo una cuestión de preferencia del usuario

¿Fue útil?

Solución

En los sistemas de nivel empresarial, mi preferencia es optar por la opción 2. Este método es propicio para el desarrollo primero en el contrato en un entorno SOA y permite que los objetos de su dominio permanezcan independientes de las representaciones por cable. Facilita los cambios en los contratos a lo largo del tiempo y permite que los contactos de dominio y de datos cambien de forma independiente entre sí. El código de traducción puede ser un poco molesto, pero puedes usar una herramienta como Automapper para acelerar eso.

Dicho esto, es posible que no necesite este nivel de flexibilidad en todas las aplicaciones.

Para mí, la Opción 3 tendería a ir en contra de los principios orientados a objetos y dominados porque externaliza el comportamiento, lo que lleva a un modelo de dominio anémico. La opción 1 también va un poco en contra del diseño impulsado por el dominio porque los modelos de su dominio dependerían de los contratos de datos, cuando en realidad eso debería ser al revés. En un modelo centrado en el dominio, esos objetos de dominio deben ser independientes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top