Ok, ich habe gesucht und konnte keine passende Lösung für mein Problem finden, ich bin dabei, einen Teil unseres Kassensystems neu zu gestalten. Nehmen wir an, wir haben die folgenden Klassen:
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;
Das Problem, vor dem ich stehe, ist, die beste Idee zu finden, ohne gegen das Gesetz der Demeter zu verstoßen. Was ich zu erreichen versuche, ist Folgendes:
- Jedes Mal, wenn ein neuer TSale gespeichert wird, möchte ich ihn zur Verkaufsliste der TWorkShift des aktuellen Benutzers hinzufügen, und außerdem möchte ich den Betrag des Verkaufs zum "TotalSold" der TWorkShift addieren.
Ich habe zwei verschiedene Ansätze ausprobiert:
Ansatz A:
// Nehmen wir an, wir haben eine Arbeitsschicht mit der ID 1 und wird aus der Datenbank geladen mit: CurrentShift := TWorkShift.Create(1);
NewSale := TSale.Create;
NewSale.Amount:=100;
NewSale.Save;
CurrentShift.Sales.Add(NewSale);
CurrentShift.TotalSold := CurrentShift.TotalSold + NewSale.Amount;
Das Problem bei diesem Ansatz ist, dass es schwierig ist, zu testen, weil ich die Logik der Summe in einigen der Klassen oder irgendwo anders (eine neue Klasse vielleicht?) kapseln möchte.
Ansatz B:
Mein anderer Ansatz ist, diesen Code in die TSale-Klasse selbst aufzunehmen:
procedure TSale.Save;
begin
SaveToDataBase;
fWorkShift.Sales.Add(Self);
fWorkShift.TotalSold := fWorkShift.TotalSold + Self.Amount;
end;
Dieser Ansatz verstößt meiner Meinung nach gegen das Gesetz der Demeter und fühlt sich für mich nicht richtig an.
Ich möchte einen "richtigen Weg" finden, um es zu tun Maximierung Code Einfachheit und einfache Wartung in der Zukunft. Also jede Anregung würde geschätzt werden.
Danke