【发布时间】:2012-10-01 09:53:46
【问题描述】:
我有一个对节点树中的节点进行排序的过程 (VirtualTreeView) 从 FMM4 报告中提取的所有内存泄漏都存储在 TMemoryLeakList 类的对象中(这些是我要排序的列表),这些对象存储在名为 TGroupedMemoryLeakList 的列表列表中,并且 TMLL 和 TGMLL 都扩展了 TObjectList。如果我想保持能够在升序和降序排序之间进行选择以及在四种不同数据类型中的一种排序之间进行选择的功能,我“必须”实现八种不同的比较方法(4 种排序类型 * 2 种排序方向)我继续使用主要的排序方法,因为我的 TMLL 列表扩展了 TObjectList。主要排序方式类似于this。
fSortType 和 fSortDirection 字段的值是从 GUI 组合框中获取的。 这八个通用比较函数之一看起来像this。 剩下的七个是这个的复制/粘贴变体。
有没有什么合理的方法可以重构大量的复制粘贴代码,同时仍然保留选择特定排序类型和方向的功能?
【问题讨论】:
-
在现代 Delphi 中,您可以调用
SortList而不是Sort并传入reference to比较函数。这将接受对象的方法或匿名过程。这样你就可以把你的状态带入比较功能。不想使用全局变量。或者您可以使用TObjectList<TMemoryLeak>并将IComparer<TMemoryLeak>传递给Sort函数。您可以再次传递状态。您的目标是什么 Delphi?在我看来,这些解决方案中的任何一个都比使用Contnrs.TObjectList的任何解决方案都要好。 -
我使用的是 rad studio 2007,所以我真的不知道它是否符合现代 Delphi 的要求。一旦我理解它,我会尝试你的建议:)
-
不,那是古老的德尔福。这种方式没有骰子。类助手可以让生活更轻松,但你现在可能已经得到了你需要的东西。
-
我建议同时使用 SortList 与 Sort,在我的测试中它似乎快了 3 倍。
标签: delphi sorting refactoring