小编Lui*_*sco的帖子

如何设计类依赖试图避免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;
Run Code Online (Sandbox Code Playgroud)

现在,我面临的问题是在不违反得墨忒耳法的情况下试图找到最好的想法.我想要完成的是以下内容:

  1. 每次保存新TSale时,我都想将其添加到当前用户的TWorkShift的Sales列表中,并且我还想将销售额加到TWorkShift的"TotalSold"中.

我尝试了两种不同的方法:

方法A:

//假设我们有一个ID为1的工作班次,并从数据库加载:CurrentShift:= TWorkShift.Create(1);

NewSale := TSale.Create;
NewSale.Amount:=100;
NewSale.Save;

CurrentShift.Sales.Add(NewSale);
CurrentShift.TotalSold := CurrentShift.TotalSold + NewSale.Amount;
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于难以测试,因为我想在一些类或其他地方封装总和的逻辑(可能是一个新类?).

方法B:

我的另一种方法是将代码包含在TSale类本身中:

procedure TSale.Save;
begin
    SaveToDataBase; 

    fWorkShift.Sales.Add(Self);
    fWorkShift.TotalSold := fWorkShift.TotalSold + Self.Amount;
end;
Run Code Online (Sandbox Code Playgroud)

我认为这种做法违反了得墨忒耳法,对我来说并不合适.

我希望找到一种"正确的方法",以便在将来最大限度地提高代码简单性并易于维护.所以任何建议将不胜感激.

谢谢

delphi law-of-demeter

5
推荐指数
1
解决办法
315
查看次数

标签 统计

delphi ×1

law-of-demeter ×1