Хорошо, я искал и не смог найти подходящего решения для моей проблемы, я переделываю часть нашей системы точек продаж. Предположим, у нас есть следующие классы:
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;
Теперь проблема, с которой я столкнулся, состоит в том, чтобы попытаться прийти к лучшей идее, не нарушая Закон Деметры. Я пытаюсь выполнить следующее:
- Каждый раз, когда сохраняется новый TSale, я хочу добавить его в список продаж TWorkShift текущего пользователя, а также я хочу суммировать сумму продажи с «TotalSold» TWorkShift.
Я пробовал два разных подхода:
Подход А:
// Допустим, у нас есть рабочая смена с идентификатором 1 и она загружается из базы данных с помощью: CurrentShift := TWorkShift.Create(1);
NewSale := TSale.Create;
NewSale.Amount:=100;
NewSale.Save;
CurrentShift.Sales.Add(NewSale);
CurrentShift.TotalSold := CurrentShift.TotalSold + NewSale.Amount;
Проблема с этим подходом в том, что его сложно протестировать, потому что я хочу инкапсулировать логику суммы в некоторых классах или где-то еще (может быть, в новом классе?).
Подход Б:
Мой другой подход заключается в том, чтобы включить этот код в сам класс TSale:
procedure TSale.Save;
begin
SaveToDataBase;
fWorkShift.Sales.Add(Self);
fWorkShift.TotalSold := fWorkShift.TotalSold + Self.Amount;
end;
Я думаю, что этот подход нарушает Закон Деметры и не кажется мне правильным.
Я хочу найти «правильный способ» сделать это с максимальной простотой кода и легкостью обслуживания в будущем. Поэтому любые предложения будут оценены.
Спасибо