このような状況でどのようなパターンや特定の言語技術が使用されているのかわかりません。
したがって、質問自体は、OOPをサポートしている言語で、クラス階層内で拡大するパラメータリストを管理する方法ですか?つまり、階層構造のルートクラスの場合は、3つまたは4つのパラメータを指定し、基本コンストラクタを呼び出して、オブジェクトの派生部分の追加パラメータなどを渡す必要がある派生クラスなどです。パラメータリストは次のようになります。あなたが2つ以上の相続の深さを持っていても、巨大です。
多くのSOwersがこの問題に直面していることは間違いありません。そして私はそれを解決する方法に興味があります。事前に多くの感謝。
クラス階層で成長するパラメータリストとはどのように戦いますか?
答えて
長いパラメータリストを持つコンストラクタは、クラスがあまりにも多くを実行しようとしていることを示しています。その問題を解決する1つのアプローチは、それを分解し、 "コーディネーター"クラスを使用してその部分を管理することです。スーパークラスとは大幅に異なるコンストラクタパラメータリストを持つサブクラスは、クラスのもう1つの例です。本当にサブクラスが-のスーパークラスである場合、そのジョブを実行するためにはるかに多くのデータを必要とすべきではありません。
しかし、クラスが多数の関連オブジェクトを処理する必要があることがあります。このような状況では、関連するパラメータを保持する新しいオブジェクトを作成します。
代替:代わりコンストラクタ注入
- 使用セッタ注入別個の容器クラスのパラメータをカプセル化し、その代わりにコンストラクタ間ことを渡します。
私はあなたの最初の点に同意しますが、2番目の点はありません。他の場所で単に問題をシフトさせるパラメータをカプセル化していますか?これを行う際にどのような価値が追加されますか? – Adamski
階層内のすべてのクラスでコンストラクタシグネチャを更新する必要がないためです。 – skaffman
また、パラメータクラスを作成するときには、実際にオブジェクトがその背後に隠れているものでオブジェクトを初期化する(抽象化を意味する)ことがわかります。ログイン、パスワード、ポート、そしてCredentialsクラスでラップすることを決めたものをinitializeftpクラスに追加すれば、ログイン、パスワード、ポートなどの資格情報が必要であることを閲覧者に知らせることができます。 –
可能性:彼らはアップフロントに提供するためにそんなに状態が必要な場合
- おそらく、あなたのクラス(ES)はあまりやっていますか? Single Responsibility Principleを遵守してください。
- おそらく、これらのパラメータの一部は、それ自体がパラメータとして渡される独自のvalue objectに論理的に存在する必要がありますか?
- 実際に複雑なクラスの場合は、builderまたはfactoryパターンを使用して、これらのオブジェクトを読み込み可能な方法でインスタンス化することを検討します。メソッド名と異なり、コンストラクタパラメータには自己文書化機能がありません。
コンストラクタを使用してオブジェクト全体を一度に初期化しないでください。 (1)オブジェクトの存在に絶対に必要なものと、(2)作成時に直ちに行わなければならないものを初期化するだけです。これにより、渡す必要のあるパラメータの数が大幅に削減されます(ゼロになる可能性が高い)。
SalariedEmployee >> Employee >> Person
などの一般的な階層では、オブジェクトのさまざまなプロパティを取得および変更するゲッターおよびセッターが必要です。私は解決策を提案役立つだろうコードを見て
..
しかし long parameter listsは、コードのにおいですので、私はこれを必要とする設計で慎重に見てみたいです。あなたは絶対にこれと長い継承チェーンが必要であることを発見した場合、これはある対抗する提案リファクタリングはしかし、のような物体のようなハッシュ/プロパティバッグを使用することを検討してください単独のパラメータ
public MyClass(PropertyBag configSettings)
{
// each class extracts properties it needs and applies them
m_Setting1 = configSettings["Setting1"];
}
もう1つのヒント:クラス階層を浅く保ち、構成をinheriにするテンス。そうすれば、コンストラクタのパラメータリストは短くなります。
- 1. 階層クラスの権限クラスをPersonクラスに格納するにはどうすればよいですか?
- 2. クラス内にメソッドの階層を作成していますか?
- 3. どのようにマルチレベルのカテゴリ階層(カテゴリツリー)を作成する -
- 4. どのように私のような私は階層が外部表に定義されている階層ディメンションを定義したい階層
- 5. は、私がiOSのビュー階層は次のように配置されている広すぎる成長
- 6. クラスとオブジェクトの階層
- 7. Pythonのクラス階層を調べるにはどうすればよいですか?
- 8. C++クラスの設計と私はこのようになりますクラス階層を持っている価値
- 9. 日付階層コンパクション戦略の空きディスク容量はどれですか?
- 10. RestSharpを使用してクラス階層を逆シリアル化するにはどうすればよいですか?
- 11. 弾性検索で階層データのインデックスを作成するにはどうすればよいですか?
- 12. Rails 3.1で無限階層のhtmlツリーを作成するにはどうすればよいですか?
- 13. どのように階層的なデータバインディングを達成するには?
- 14. クラス階層C++
- 15. 自己参照データ階層用のグラフ・スキーマを作成するにはどうすればよいですか?
- 16. メッセージデータの階層を作成するにはどうすればよいですか?
- 17. GNURadio Companionで階層ブロックを作成するにはどうすればよいですか?
- 18. Clonableクラス階層とunique_ptr
- 19. Amazon DynamoDBとクラス階層
- 20. 色のクラス階層
- 21. どのように私は次のように単一継承のクラス階層が定義されている
- 22. ツリービューを使用して階層データテンプレートを作成するにはどうすればよいですか?
- 23. 階層型AWSセキュリティグループを作成するにはどうすればよいですか?
- 24. クラス階層を構成する最善の方法は?
- 25. Pythonでクラス階層を拡張する
- 26. 階層データを保存するにはどうしたらいいですか?
- 27. Javaの階層アルゴリズムはどのように機能しますか?
- 28. パブリック属性を持たないクラス階層を作成する
- 29. は、私はこのようなクラス階層を持ってJSON.NET
- 30. C++ Polymorphism-は、次のように私はクラスの階層を持つ派生クラス
これは、http://stackoverflow.com/questions/730201/constructor-parameters-rule-of-thumbに非常に近いです。 – kdgregory