在上一个(remove empty strings from list)问题中,我询问了如何从字符串列表中删除空字符串

....
// Clear out the items that are empty
for I := mylist.count - 1 downto 0 do
begin
  if Trim(mylist[I]) = '' then
    mylist.Delete(I);
end;
....


从代码设计和重用方面来看,我现在更喜欢一个更灵活的解决方案,例如:

 MyExtendedStringlist = Class(TStringlist)

 procedure RemoveEmptyStrings;

 end;


问:在这种情况下可以使用班级助手吗?与上面设计一个新类相比,这看起来如何?

最佳答案

在这里,班级助手是个好主意。为了使其更广泛地适用,您应该选择将助手与该助手可以应用的最少派生类相关联。在这种情况下,这表示TStrings

与派生新类相比,最大的优势是您的助手方法可用于您未创建的TStrings实例。明显的示例包括TStrings属性,该属性显示备忘录,列表框等的内容。

我个人将编写一个使用谓词提供更一般删除功能的助手。例如:

type
  TStringsHelper = class helper for TStrings
  public
    procedure RemoveIf(const Predicate: TPredicate<string>);
    procedure RemoveEmptyStrings;
  end;

procedure TStringsHelper.RemoveIf(const Predicate: TPredicate<string>);
var
  Index: Integer;
begin
  for Index := Count-1 downto 0 do
    if Predicate(Self[Index]) then
      Delete(Index);
end;

procedure TStringsHelper.RemoveEmptyStrings;
begin
  RemoveIf(
    function(Item: string): Boolean
    begin
      Result := Item.IsEmpty;
    end;
  );
end;


通常,TStrings是班级帮助者的优秀候选人。它缺少大量有用的功能。我的助手包括:


一个AddFmt方法,可以一次性格式化并添加。
AddStrings方法,可在一个调用中添加多个项目。
一个Contains方法,该方法将IndexOf(...)<>-1包裹起来,并向将来的代码阅读者提供了一个语义上更有意义的方法。
一个Data[]属性,类型为NativeInt,并且匹配AddData方法,该属性包装Objects[]属性。这会隐藏TObjectNativeInt之间的转换。


我确定可以添加更多有用的功能。

07-28 03:27