リファクタリングについての良い質問ですが、おそらくあなたが探している答えは嫌いです。数行のコードや追加のルーチンを追加しても問題はありません。特に後者の場合、ネーミングは読みやすさを積極的に支援します。
私のアドバイスは次のとおりです。デザインはそのままにして、コードを短くします。
function CompareSizeAsc(Item1, Item2: Pointer): Integer;
begin
Result := TMemoryLeak(Item2).Size - TMemoryLeak(Item1).Size;
end;
function CompareSizeDesc(Item1, Item2: Pointer): Integer;
begin
Result := TMemoryLeak(Item1).Size - TMemoryLeak(Item2).Size;
end;
function CompareClassNameAsc(Item1, Item2: Pointer): Integer;
begin
Result := CompareStr(TMemoryLeak(Item1).ClassName,
TMemoryLeak(Item2).ClassName);
end;
procedure TMemoryLeakList.Sort;
begin
case FSortDirection of
sdAsc:
case FSortType of
stSize: inherited Sort(CompareSizeAsc);
stClassName: inherited Sort(CompareClassNameAsc);
stCallStackSize: inherited Sort(CompareCallStackSizeAsc);
stId: inherited Sort(CompareIdAsc);
end;
sdDesc:
case FSortType of
stSize: inherited Sort(CompareSizeDesc);
stClassName: inherited Sort(CompareClassNameDesc);
stCallStackSize: inherited Sort(CompareCallStackSizeDesc);
stId: inherited Sort(CompareIdDesc);
end;
end;
end;
これよりもはるかに小さくして、同じレベルの読みやすさを維持することはできません。
もちろん、Arioch 'TheSort
が提案するようにルーチンを書き直すこともできます。
procedure TMemoryLeakList.Sort;
const
Compares: array[TSortDirection, TSortType] of TListSortCompare =
((CompareSizeAsc, CompareClassNameAsc, CompareCallStackSizeAsc,
CompareIdAsc), (CompareSizeDesc, CompareClassNameDesc,
CompareCallStackSizeDesc, CompareIdDesc));
begin
inherited Sort(Compares[FSortDirection, FSortType]);
end;
しかし、別の比較ルーチンの必要性をなくすために、QuickSort ルーチンを書き直してはどうでしょうか?
または、TMemoryLeak に所有権を追加することもできます。この場合、単一の比較ルーチン内で使用するために、所有リストとその並べ替え方向および並べ替えタイプへの参照があります。