ベスト プラクティスを念頭に置いて、オプションのパラメーターをコンストラクター シグネチャに追加するための推奨される方法は何ですか? コア パラメーターのみを一覧表示し、オプションではないプロパティの初期化子に依存する必要がありますか? 私には最も賢明なアプローチのようです!
4 に答える
特に、オブジェクト初期化子を使用してプロパティ値を割り当てる機能により、コンストラクターの複数のオーバーロードは、以前よりもはるかに役に立ちません。以前は、コードをコンパクトにするために変更可能なプロパティを設定するのに主に役立ちました。
今、人は書くことができます
MyClass my = new MyClass() { PropA = 1, PropB = 2 };
ほぼ同じくらいコンパクト
MyClass my = new MyClass(1, 2);
より表現力豊かに。
ただし、オブジェクトの性質により、オーバーロードがオブジェクト コンシューマに意味のあるコントラクトを提供することが必要になる場合があります。たとえば、長さと幅を受け入れるRectangleクラスにオーバーロードを提供することは、不合理ではありません (コード レビューでそれを指摘するつもりはありません)。個人的には、オブジェクト初期化子の構文はより表現力があり、「それは Rectangle(int length, int width) または Rectangle(int width, int length) でしたか?」などの質問を回避するため、オーバーロードを提供しません。コードを読んでいる間 (インテリセンスはコードを書いているときに役立ちます)。
これは素晴らしいアプローチだと思います。通常、ユーザーはオプションのパラメーターにプロパティを使用します。しかし、これはオブジェクトを変更可能にします。オプションのコンストラクター引数/ctor オーバーロードを使用することは、オブジェクトを不変に保つための優れたアプローチです。
経験則として、有効で機能するオブジェクトを作成するために必要なパラメーターのみをコンストラクターに追加します。オブジェクト初期化構文の出現により、クライアントが必要なその他のパラメーターを構成することがはるかに簡単になりました。
ただし、このルールには多くの例外が必要だと思います。多くの場合、オーバーロードを提供して、開発者がオブジェクトに関して何を変更できると期待できるかを簡単かつ明確にすることができます。
複数のコンストラクターではなく、サブクラス化を検討してください。
理由: 多くの場合、2 つの異なるコンストラクターは、2 つの異なる動作が必要であることを示します。異なる nehaviors は、異なるクラスで実装する必要があります。
サブクラスには、それが基本クラスの特殊化されたバージョンであることを示す名前と、この種のオブジェクトが有効な状態でのみ作成できることを保証するコンストラクターの両方が含まれます。