合理化实际上非常相似的不同实现
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 不同(例如:TStringList 的 TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
或 TMyStringList 的 TMyStringListSortCompare = function(List: TMyStringList; Index1, Index2: Integer): Integer;
。因此SCompare params 我的代码中有很多 copy/past QuickSort 函数,如果我需要更新一个,我需要复制所有函数中的修改(例如 delphi 源代码中的相同,看 TStringList.quicksort 和 TwideStringList.quicksort).
我正在寻找使我的 QuickSort 函数成为全局函数并使所有 TStringList.QuickSort
、TMyStringList.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
方法。
我有几个这样的函数:
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 不同(例如:TStringList 的 TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
或 TMyStringList 的 TMyStringListSortCompare = function(List: TMyStringList; Index1, Index2: Integer): Integer;
。因此SCompare params 我的代码中有很多 copy/past QuickSort 函数,如果我需要更新一个,我需要复制所有函数中的修改(例如 delphi 源代码中的相同,看 TStringList.quicksort 和 TwideStringList.quicksort).
我正在寻找使我的 QuickSort 函数成为全局函数并使所有 TStringList.QuickSort
、TMyStringList.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
方法。