合理化实际上非常相似的不同实现

Rationalisation of different implementations that are in fact very similar

我有几个这样的函数:

TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;

procedure TStringList.QuickSort(L, R: Integer; SCompare: TStringListSortCompare);
begin
  ..
  SCompare(Self, I, P);
  ... 
end;

TMyStringListSortCompare = function(List: TMyStringList; Index1, Index2: Integer): Integer;

procedure TMyStringList.QuickSort(L, R: Integer; SCompare: TMyStringListSortCompare);
begin
  ..
  SCompare(Self, I, P);
  ... 
end;

等...

所有这些快速排序实现完全相同。只有参数 SCompare 不同(例如:TStringListTStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;TMyStringListTMyStringListSortCompare = function(List: TMyStringList; Index1, Index2: Integer): Integer;。因此SCompare params 我的代码中有很多 copy/past QuickSort 函数,如果我需要更新一个,我需要复制所有函数中的修改(例如 delphi 源代码中的相同,看 TStringList.quicksort 和 TwideStringList.quicksort).

我正在寻找使我的 QuickSort 函数成为全局函数并使所有 TStringList.QuickSortTMyStringList.QuickSort 等都将调用此全局 QuickSort 函数(或继承)的“技巧”。

我认为不牺牲简单性和速度是不可能的,但我更愿意询问以防万一我遗漏了什么。

注意:一切从阅读这个错误报告开始:https://quality.embarcadero.com/browse/RSP-19551

如果 class 具有相同的祖先 (TStringList),您可以使用基数 class 进行比较。

否则你可以像那样使用泛型,并做不同的实现:

TCustomQuickSort<T> = class
  class function Sort(L, R: integer): integer;
end;

并称​​它为:

TCustomQuickSort<TMyStringListSortCompare>.Sort(i, j);

为了让您的代码接近修改但开放扩展,您可以使用工厂设计模式来获取您需要的排序对象。如果明天你有一个TSuperListSortCompare,你只需要添加它。

您也可以使用接口,将您的 SCompare 替换为 ISortableObject 类型,然后您可以调用自定义 Sort 方法。