Ok, he buscado y no he podido encontrar una solución adecuada para mi problema, estoy rediseñando una parte de nuestro sistema de punto de venta. Vamos a suponer que tenemos las siguientes clases:Cómo diseñar la dependencia de clase tratando de evitar la Ley de Demeter
TWorkShift = class
Date: TDateTime;
fTotalSold: Currency;
fSales: TList<TSale>;
public
property TotalSold: Currency read fTotalSold write fTotalSold;
property Sales: Currency read fSales write fSales;
end;
TSale = class
fAmount: Currency;
fWorkShift: TWorkShift;
public
property Amount: Currency read fAmount write fAmount;
procedure Save;
end;
Ahora, el problema que estoy enfrentando está tratando de llegar a la mejor idea sin violar la Ley de Demeter. Lo que estoy tratando de lograr es la siguiente:
- Cada vez que un nuevo Tsalé se guarda Quiero añadir a la lista de ventas de la TWorkShift del usuario actual, y también quiero sumar la cantidad de la venta a "TotalSold" de TWorkShift.
he intentado dos enfoques diferentes:
Enfoque A:
// Vamos a suponer que tenemos un turno de trabajo con el ID de 1 y se carga de base de datos con: CurrentShift: = TWorkShift.Create (1);
NewSale := TSale.Create;
NewSale.Amount:=100;
NewSale.Save;
CurrentShift.Sales.Add(NewSale);
CurrentShift.TotalSold := CurrentShift.TotalSold + NewSale.Amount;
El problema con este enfoque es que está difícil de probar, porque quiero encapsular la lógica de la suma en algunas de las clases o en algún otro lugar (una nueva clase tal vez?).
Enfoque B:
Mi otro enfoque está incluido el código dentro de la clase en sí Tsalé:
procedure TSale.Save;
begin
SaveToDataBase;
fWorkShift.Sales.Add(Self);
fWorkShift.TotalSold := fWorkShift.TotalSold + Self.Amount;
end;
Este enfoque Creo que viola la Ley de Demeter e Indiferente siente bien para mí .
Quiero encontrar una "forma correcta" de hacerlo maximizando la simplicidad del código y facilitando el mantenimiento en el futuro. Entonces, cualquier sugerencia sería apreciada.
Gracias
Gracias Nick, Bueno, en este caso estoy usando el marco Aurelio ORM, así que tengo una "asociación" con el fin de obtener información tal como: 'Venta: = Manager.Find (1); ShowMessage ('La venta se vendió en el turno de trabajo con ID:' + IntToStr (Sale.Shift.ID)); ' Esto es necesario porque a veces necesito mostrar toda la información sobre una venta, como el turno en el que se vendió, la fecha, el cajero, etc. –
Luis, eso es un problema para la capa de presentación no el BL. La capa de presentación debe reunir toda la información necesaria. Entonces, en su caso podría recuperar el objeto de venta del objeto de turno de trabajo y tener toda la información. – whosrdaddy
Luis: si un ORM le obliga a hacerlo, entonces probablemente deba considerar el uso de un ORM diferente. Eso es un mal diseño: una Venta no debería saber nada sobre el Workshift en el que sucedió. ¿Qué sucede si quiere vender cosas de cualquier Workshift? –