1

私の同僚と私は、関数で変数を宣言する方法について話し合ってきました。

TStrings という名前のクラス (説明のために Delphi を使用) があり、少なくとも 1 つの抽象メソッドと、明らかに抽象メソッドを実装する TStringList という子孫クラスがあるとします。 TStringList 型の関数変数をどのように宣言しますか?

2 つの例を次に示します。どちらがより良いプラクティスと見なされますか?その理由は?

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;
4

5 に答える 5

1

これは TStringList であるため、TStringList としても宣言する必要があります (最初の例)。他のすべては、後でコードを読むあなたや他の人を混乱させる可能性があります.

于 2008-12-09T11:16:51.477 に答える
0

私の投票は 2 番目の形式です。つまり、TStrings はコントラクト/インターフェイスを定義し、それらにコーディングする方がよいという考えです。

于 2008-12-09T11:16:33.817 に答える
0

TStringList が TStrings を実装する別のものに変更される可能性があるかどうかは、期待するかどうかによって異なります。変更が予想されない場合は、TStringList を使用して、TStringList だけにある特別な機能にアクセスしてください (これは当てはまらないと思います)。変更される可能性があると思われる場合は、TStrings として宣言し、「安全な」メソッドに固執してください。

この特定のケースでは、それは問題ではないと思います。地獄、おそらく変数宣言を変更できますが、とにかく何も変わりません。好みの問題なので、好きな方を使ってください。

于 2008-12-09T11:26:00.367 に答える
0

私はシュナーダーに同意します。

TStringList には、TStrings (抽象クラス) よりも多くのプロパティとメソッドがあります。TStrings 変数を使用すると、キャストを使用しない限り、これらのメンバーの使用が禁止されます。しかし、それは私の意見では事態を悪化させています。

関数の引数で TStrings を使用できます。

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

またはプロパティとして。しかし、ローカル変数とフィールドは、実際の型が宣言されている場合、より用途が広くなります。

于 2008-12-09T11:32:51.693 に答える
0

場合によります...

Java では、一般的にインターフェースに適用されますが、使用可能な最高の抽象化レベルを使用して宣言を行うという推奨事項をよく目にしました。

例えば:

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

など
なぜですか?変更の影響を最小限に抑えることで、実装を変更できます (場合によっては詳細: 一部の実装は一部の用途 (キュー、リンク リスト、スタックなど) により適しているため、主に速度/メモリの問題になる可能性があります)。

もちろん、実装に固有のメソッドを使用する場合は、宣言をより具体的にする必要があります。

もう 1 つの利点: メソッドが Collection パラメーターを予期する場合、ジェネリック メソッドのみを使用する必要がある限り、より広い範囲の入力に対して機能します。

于 2008-12-09T14:06:22.320 に答える