在上一个(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[]
属性。这会隐藏TObject
和NativeInt
之间的转换。我确定可以添加更多有用的功能。