我在Delphi 10中有一个三角形网格结构。

出于性能原因,我将网格的顶点,三角形面等数据存储在TList的后代中。

我让TLists为列表中的每个成员进行计算。对于这些计算,我需要访问TMesh结构的某些字段。因此,在创建TMesh以及随后创建列表的过程中,我将父TMesh分配给列表。我使用TMesh的前向声明来这样做。请参见以下代码:

type
  {forward declaration}
  TMesh=class;

  TVertex=record
    Point: TPoint3D;
    //other fields
  end;

  TVertices=class(TList<TVertex>)
    Mesh: TMesh;
    procedure DoSomethingWithAllVertices; //uses some fields of TMesh
    constructor Create(const AMesh: TMesh);
    //other methods
  end;

  TTriangleFace=record
    Vertices: Array[0..2] of Integer;
    //other fields
  end;

  TTriangleFaces=class(TList<TTriangleFace>)
    Mesh: TMesh;
    procedure DoSomethingWithAllTriangleFaces; //uses some fields of TMesh
    constructor Create(const AMesh: TMesh);
    //other methods
  end;

  TMesh=class(TComponent)
    Vertices: TVertices;
    TriangleFaces: TTriangleFaces;
    constructor Create(AOwner: TComponent);
    //other fields & methods
  end;

implementation

constructor TMesh.Create(AOwner: TComponent);
begin
  inherited;
  Vertices:=TVertices.Create(Self);
  TriangleFaces:=TTriangleFaces.Create(Self);
end;

constructor TVertices.Create(const AMesh: TMesh);
begin
  Mesh:=AMesh;
end;

这很好。

但是,由于我的项目不断增长,所以我获得了越来越多的代码,并且希望将列表类分配到单独的单元中。这导致循环单位引用的问题。

循环单位引用的问题似乎是众所周知的。我检查了可能的解决方案,但找不到适合我的问题的解决方案。有人说,如果遇到循环单位引用,则代码设计不当。

如何改善设计并同时保持较高的计算性能?

还有其他解决问题的可能性吗?

非常感谢你!

最佳答案

您当前的解决方案已经是解决问题的最佳方法。将这些类型分成单独的单元会造成很大的障碍,并会导致代码笨拙。

虽然我可以理解您将这些类型分开的愿望,但您必须在这种愿望与结果代码的清晰度之间取得平衡。在这种情况下,分散的负面后果会影响积极的方面。保持原样的代码。

10-04 18:15