好的,我已经搜索过并且找不到适合我问题的解决方案,我正在重新设计我们的销售点系统的一部分。假设我们有以下类别:
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;
现在,我面临的问题是试图在不违反Demeter法则的情况下达到最佳效果。我要完成的工作如下:
我尝试了两种不同的方法:
方法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;
这种方法的问题是很难测试,因为我想将总和的逻辑封装在某些类中或其他地方(也许是新类?)。
方法B:
我的另一种方法是将该代码包含在TSale类本身内:
procedure TSale.Save;
begin
SaveToDataBase;
fWorkShift.Sales.Add(Self);
fWorkShift.TotalSold := fWorkShift.TotalSold + Self.Amount;
end;
我认为这种方法违反了Demeter法则,对我来说也不对。
我想找到一种“正确的方法”来做到这一点,以在将来最大程度地简化代码并易于维护。因此,任何建议将不胜感激。
谢谢
最佳答案
如果要向TWorkShift添加销售,则应具有
TWorkShift.AddSale(aSale: TSale);
begin
Sales.Add(aSale);
end;
换句话说,TWorkShift应该“询问”它需要的东西。
另外,我看不出TSale具有TWorkShift字段的任何原因。类次有很多销售,但是为什么销售有类次呢?
关于delphi - 如何设计类依赖关系,以试图避免得墨meter耳定律,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10342782/