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

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法则的情况下达到最佳效果。我要完成的工作如下:
  • 每次保存新的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;
    

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

    方法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/

    10-09 03:32