我在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;
这很好。
但是,由于我的项目不断增长,所以我获得了越来越多的代码,并且希望将列表类分配到单独的单元中。这导致循环单位引用的问题。
循环单位引用的问题似乎是众所周知的。我检查了可能的解决方案,但找不到适合我的问题的解决方案。有人说,如果遇到循环单位引用,则代码设计不当。
如何改善设计并同时保持较高的计算性能?
还有其他解决问题的可能性吗?
非常感谢你!
最佳答案
您当前的解决方案已经是解决问题的最佳方法。将这些类型分成单独的单元会造成很大的障碍,并会导致代码笨拙。
虽然我可以理解您将这些类型分开的愿望,但您必须在这种愿望与结果代码的清晰度之间取得平衡。在这种情况下,分散的负面后果会影响积极的方面。保持原样的代码。