gpt4 book ai didi

delphi - 如何设计类依赖以避免德米特定律

转载 作者:行者123 更新时间:2023-12-03 15:13:00 24 4
gpt4 key购买 nike

好的,我已经搜索但找不到适合我的问题的解决方案,我正在重新设计我们销售点系统的一部分。假设我们有以下类:

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 的销售列表中,并且还希望将销售金额添加到 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;

这种方法的问题在于它很难测试,因为我想将求和的逻辑封装在某些类或其他地方(也许是一个新类?)。

方法B:

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

procedure TSale.Save;
begin
SaveToDataBase;

fWorkShift.Sales.Add(Self);
fWorkShift.TotalSold := fWorkShift.TotalSold + Self.Amount;
end;

我认为这种方法违反了德墨忒尔法则,而且我觉得不正确。

我想找到一种“正确的方法”来最大限度地提高代码的简单性和将来的维护方便性。因此,任何建议将不胜感激。

谢谢

最佳答案

如果您想向 TWorkShift 添加销售,那么您应该具有

TWorkShift.AddSale(aSale: TSale);
begin
Sales.Add(aSale);
end;

换句话说,TWorkShift 应该“询问”它需要的东西。

此外,我不认为 TSale 会有 TWorkShift 字段。轮类有很多销售,但为什么销售会有轮类?

关于delphi - 如何设计类依赖以避免德米特定律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com