Как спроектировать зависимость от класса, пытаясь избежать закона Деметры

Хорошо, я искал и не смог найти подходящего решения для моей проблемы, я переделываю часть нашего система торговых точек. Предположим, у нас есть следующие классы.:

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;

Теперь проблема, с которой я столкнулся, состоит в том, чтобы попытаться прийти к наилучшей идее, не нарушая Закон Деметры. Я пытаюсь выполнить следующее:

  1. Каждый раз, когда сохраняется новый TSale, я хочу добавить его в список продаж TWorkShift текущего пользователя, а также я хочу суммировать сумму продажи с " TotalSold" TWorkShift.

Я пробовал два разных подхода:

Подход 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;

Этот подход, я думаю, нарушает Закон Деметры и не кажется мне правильным.

Я хочу найти "правильный способ" сделать это с максимальной простотой кода и легкостью сопровождения в будущем. Поэтому любые предложения будут оценены.

Спасибо

5
задан Luis Carrasco 26 April 2012 в 23:23
поделиться