2009-08-18 3 views
2

このような状況でどのようなパターンや特定の言語技術が使用されているのかわかりません。
したがって、質問自体は、OOPをサポートしている言語で、クラス階層内で拡大するパラメータリストを管理する方法ですか?つまり、階層構造のルートクラスの場合は、3つまたは4つのパラメータを指定し、基本コンストラクタを呼び出して、オブジェクトの派生部分の追加パラメータなどを渡す必要がある派生クラスなどです。パラメータリストは次のようになります。あなたが2つ以上の相続の深さを持っていても、巨大です。
多くのSOwersがこの問題に直面していることは間違いありません。そして私はそれを解決する方法に興味があります。事前に多くの感謝。
クラス階層で成長するパラメータリストとはどのように戦いますか?

+1

これは、http://stackoverflow.com/questions/730201/constructor-parameters-rule-of-thumbに非常に近いです。 – kdgregory

答えて

4

長いパラメータリストを持つコンストラクタは、クラスがあまりにも多くを実行しようとしていることを示しています。その問題を解決する1つのアプローチは、それを分解し、 "コーディネーター"クラスを使用してその部分を管理することです。スーパークラスとは大幅に異なるコンストラクタパラメータリストを持つサブクラスは、クラスのもう1つの例です。本当にサブクラスが-のスーパークラスである場合、そのジョブを実行するためにはるかに多くのデータを必要とすべきではありません。

しかし、クラスが多数の関連オブジェクトを処理する必要があることがあります。このような状況では、関連するパラメータを保持する新しいオブジェクトを作成します。

2

代替:代わりコンストラクタ注入

    • 使用セッタ注入別個の容器クラスのパラメータをカプセル化し、その代わりにコンストラクタ間ことを渡します。
  • +0

    私はあなたの最初の点に同意しますが、2番目の点はありません。他の場所で単に問題をシフトさせるパラメータをカプセル化していますか?これを行う際にどのような価値が追加されますか? – Adamski

    +0

    階層内のすべてのクラスでコンストラクタシグネチャを更新する必要がないためです。 – skaffman

    +0

    また、パラメータクラスを作成するときには、実際にオブジェクトがその背後に隠れているものでオブジェクトを初期化する(抽象化を意味する)ことがわかります。ログイン、パスワード、ポート、そしてCredentialsクラスでラップすることを決めたものをinitializeftpクラスに追加すれば、ログイン、パスワード、ポートなどの資格情報が必要であることを閲覧者に知らせることができます。 –

    1

    可能性:彼らはアップフロントに提供するためにそんなに状態が必要な場合

    • おそらく、あなたのクラス(ES)はあまりやっていますか? Single Responsibility Principleを遵守してください。
    • おそらく、これらのパラメータの一部は、それ自体がパラメータとして渡される独自のvalue objectに論理的に存在する必要がありますか?
    • 実際に複雑なクラスの場合は、builderまたはfactoryパターンを使用して、これらのオブジェクトを読み込み可能な方法でインスタンス化することを検討します。メソッド名と異なり、コンストラクタパラメータには自己文書化機能がありません。
    1

    コンストラクタを使用してオブジェクト全体を一度に初期化しないでください。 (1)オブジェクトの存在に絶対に必要なものと、(2)作成時に直ちに行わなければならないものを初期化するだけです。これにより、渡す必要のあるパラメータの数が大幅に削減されます(ゼロになる可能性が高い)。

    SalariedEmployee >> Employee >> Personなどの一般的な階層では、オブジェクトのさまざまなプロパティを取得および変更するゲッターおよびセッターが必要です。私は解決策を提案役立つだろうコードを見て

    1

    ..

    しかし long parameter listsは、コードのにおいですので、私はこれを必要とする設計で慎重に見てみたいです。あなたは絶対にこれと長い継承チェーンが必要であることを発見した場合、これは

    ある対抗する提案リファクタリングはしかし、のような物体のようなハッシュ/プロパティバッグを使用することを検討してください単独のパラメータ

    public MyClass(PropertyBag configSettings) 
    { 
        // each class extracts properties it needs and applies them 
        m_Setting1 = configSettings["Setting1"]; 
    } 
    
    0

    もう1つのヒント:クラス階層を浅く保ち、構成をinheriにするテンス。そうすれば、コンストラクタのパラメータリストは短くなります。

    関連する問題