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