C#で名前のエイリアスの代わりに継承を使用するのは正しいですか?
-
02-07-2019 - |
質問
つまり、使用するのは正しいですか:
public class CustomerList : System.Collections.Generic.List<Customer>
{
/// supposed to be empty
}
代わりに:
using CustomerList = System.Collections.Generic.List<Customer>
CustomerListを一度定義するだけなので、最初のアプローチを使用します。顧客リストが必要になるたびに、常に同じタイプを使用します。一方、名前エイリアスのアプローチを使用すると、どこでもそれを再定義する必要があるだけでなく、誰かがそれを使用したいたびに別のエイリアスを与えることができます(大きなチームを考えてください)読みにくくしてください。
この場合の意図は、クラスを拡張することではなく、エイリアスを作成することだけであることに注意してください。
解決
しないでください。人が読むとき:
List<Customer>
すぐに理解します。読むとき:
CustomerList
CustomerListが何であるかを把握する必要があるため、コードが読みにくくなります。コードベースで作業しているのが自分だけでない限り、読み取り可能なコードを作成することをお勧めします。
他のヒント
まあ、基本クラスに機能を追加しない限り、ラッパーオブジェクトを作成しても意味がありません。本当に必要な場合は2番になりますが、なぜ変数を作成しないのですか?
List<Customer> customerList = new List<Customer>();
その方法でエイリアスを使用しない ことに同意します。チーム内の誰も、提示された方法でエイリアスを使用しないでください。エイリアシングが提供された理由ではありません。さらに、ジェネリックの動作方法から、使用する場所の数に関係なく、Listクラスは1つしかありません。
List<Customer>
を宣言して使用するだけでなく、最終的にそのリストを他の何かに渡したいと思うでしょう。具体的なIList<Customer>
を渡すのを避け、代わりにICollection<Customer>
または<=>を渡します。これにより、これらのメソッドの復元力が高まり、プログラミングが容易になります。
将来、CustomerListコレクションクラスが本当に必要な場合は、そのクラスに<=>または<=>を実装し、それらを変更したり、さらによく知らなくてもそれらのメソッドに渡し続けることができます。
実際には、どちらも使用すべきではありません。 フレームワーク設計ガイドラインによる正しいアプローチは、使用するか、パブリックAPIのSystem.Collections.ObjectModel.Collection <!> lt; T <!> gt; を継承します(List <!> lt; T <!> gt;は内部実装にのみ使用する必要があります)。
ただし、ネーミングの特定の問題に関しては、コレクションに機能を追加する必要がない限り、エイリアスなしで直接ジェネリック型名を使用することをお勧めします。
コレクションを返します<!> lt; T <!> gt;オブジェクトから 標準プレーンを提供するモデル バニラコレクションAPI。
Collection <!> lt; T <!> gt;のサブクラスを返します オブジェクトモデルから提供する 高レベルのコレクションAPI。
継承を使用してエイリアス/タイプ定義を行うには、関連するコンストラクタを再定義する必要があるという問題があります。
あちこちでそれを行うのはすぐに不合理になるので、おそらく一貫性のために避けるのが最善です。
これは「依存する」質問の1つです。
必要なものが、他の要件に加えて顧客のリストとして動作する新しいクラスである場合、継承が道です。
顧客のリストのみを使用する場合は、変数を使用します。
入力を保存するだけの場合は、後者を使用します。そのような奇妙な継承の問題に遭遇することはありません。
実際に論理的に異なるコレクションタイプを公開したい場合は、前者を使用します-戻ってそこに何かを追加できます。
個人的には、単にList<Customer>
を使用して1日呼び出します。
私は本質的にエドに同意します。ジェネリックリストコンストラクトの機能を実際に拡張する必要がない場合は、ジェネリックリストを使用します。
List<Customer> customerList = new List<Customer>();
機能を拡張する必要がある場合、通常は継承を検討します。
3番目の可能性は、汎用リスト構造から大幅に変更された機能が必要な場合です。この場合、IEnumerableから単純に継承することができます。そうすることで、クラスを列挙可能な操作(<!> quot; foreach <!> quot;など)で使用できるようになりますが、すべてのクラスの動作を完全に定義できます。
あるプログラマーがタイピングを節約することは、次のプログラマーのメンテナンスの悪夢である可能性が非常に高いです。ここで多くの人が言っているように、ジェネリックを正しくタイプするだけだと思います。コードの意図がわかりやすく、より正確に記述され、メンテナンスプログラマーの助けになります。 (6か月後、4つの新しいプロジェクトが進行中です!)