我的同事和我一直在讨论如何在功能声明变量。

让我们说你有一类叫字符串列表(采用Delphi为便于说明),其具有至少一个抽象方法,并呼吁的TStringList子类中,这显然实现了抽象方法,但它引入了没有别的你需要的不是在祖先中已经实现,你会怎么声明类型的TStringList的函数变量?

下面是两个例子。这被认为是更好的做法,为什么?

procedure AddElements;
var
  aList: TStringList;
begin
  aList := TStringList.Create;
  try
    aList.Add('Apple');
    aList.Add('Pear');
  finally
    aList.free;
  end;
end;

procedure AddElementsII;
var
  aList: TStrings;
begin
  aList := TStringList.Create;
  try
    aList.Add('Apple');
    aList.Add('Pear');
  finally
    aList.free;
  end;
end;
有帮助吗?

解决方案

这是一个的TStringList,所以还应该声明为的TStringList(第一实例)。其他一切可能混淆你或其他人稍后阅读的代码。

其他提示

我的投票是第二形式 - 想法是,字符串列表限定了合同/接口和其更好地编码它们

我会说,这取决于你是否想到,如果TStringList中可能会更改为别的东西,实现字符串列表与否。如果你不希望它发生变化,使用的TStringList并获得特殊的功能,仅仅是在TStringList中(想这是不是这样)。如果你希望它可能会改变声明为字符串列表,并坚持以“安全”的方法。

在这种特殊情况下我会说没关系。该死的,你很可能改变的变量声明,没有什么会改变反正。因此,无论使用何种你最喜欢的 - 它是偏好的问题

我同意Schnaader。

的TStringList具有更多的属性和方法字符串列表(它是一个抽象类)。使用字符串列表变量禁止使用这些成员unles您使用的铸件。但是,在我看来是使事情变得更糟。

可以在一个函数的参数使用字符串列表。

procedure TMyClass.MyMethod(const AList: TStrings);
begin
end;

或者作为一个属性。但如果是decalared其真正的类型局部变量和领域将更加全面。

这取决于...

在Java中,我经常看见使用最高抽象层次是可用使声明的建议,虽然它一般适用于接口。

例如:

Collection list = new ArrayList();
[loop] list.add(someItem); [end loop]

等。结果 为什么?它允许修改设计(一个细节有些情况是:一些实现更适合于一些使用(队列,链表,栈...),所以它可能是大部分的速度/内存的关注),通过最小化变化的影响。

当然,如果你使用特定的方法来实现,你必须在声明中更具体。

另一个优点:当一个方法期望集合参数,它可以在更广泛的范围的输入的工作,只要其需要使用仅通用方法

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top