2011-02-09 8 views
5

私は以下で説明しようとする設計上の問題に挑戦されました。コンストラクタのデザインパターン

クラスAは、複数のパラメータを持つコンストラクタを持っているとします。各インスタンス化でこれらのパラメータをすべて書き込むのは疲れて汚いので、別のクラスを作成してStyleSheetAという名前を付けて、これらのパラメータをすべてカプセル化し、Aのコンストラクタの唯一のパラメータにします。後で使用するStyleSheetAテンプレートを必要に応じて変更できます。

この時点で、私はAを拡張する必要があります.BがAを拡張するとします。Bには独自のスタイルシート、つまりStyleSheetBがあります。 StyleSheetBがStyleSheetAを継承するのが適切だと思います。そのため、BのコンストラクタもスーパークラスAを構築することができます。しかし、このデザインには欠陥がある可能性があります。たとえば、スタイルシートにゲッター/セッターを追加するとどうなりますか?これらの状況をすべて処理する斬新な方法はありますか?私は間違ったやり方でいますか?混乱している人のために、私はここにいくつかのコードを添付:


    class A 
    { 
     StyleSheetA ss; 

     A(StyleSheetA ss) 
     { 
      this.ss = ss; 
      // Do some stuff with ingredients of styleSheet 
     } 
    } 
    class StyleSheetA 
    { 
     int n1; 
     int n2; 
     // : 
     // : 
     int n100; 
    } 

    class B extends A 
    { 
     B(StyleSheetB ss) 
     { 
      super(ss); 
      // Do some stuff with ingredients of styleSheet 
     } 
    } 
    class StyleSheetB extends StyleSheetA 
    { 
     int n101; 
     int n102; 
     // : 
     // : 
     int n200; 
    } 

は、あなたの批評家のいずれかが理解されるであろうにも、任意のヘルプや提案をいただき、ありがとうございます。

編集:ジェネリックスのサポートがないように、私はJavaで開発しています。

+0

どの言語を開発しているのかは明らかではありませんが、通常はジェネリックス/テンプレートがこの問題を解決するのに役立ちます。クラスAをA にすると、コンポジットのタイプ(StyleSheetBなど)をクラスBからA に拡張することができます。このような機能がない場合は、C#;)を試してください。 –

+0

ええ、あなたのソリューションは本当に良いアプローチですが、残念ながら私はJavaで開発していましたが、そこには一般的なサポートはありません。ありがとう。 –

+0

java-meタグを追加する必要があります。 ;) – weltraumpirat

答えて

3

コンストラクタの依存関係を管理するために、StructureMapのようなIoCコンテナを使用することを検討しましたか?そうすれば、このようなことが楽になるかもしれません。

+1

ダウン投票者は何か建設的なものを追加していますか?人々がIoCコンテナを使用する主な理由の1つは、コンストラクタの依存関係を単純化することです。 –

+0

代わりに私からの投票を得ることができます、私はIoCの大きなファンです。この特定の人の問題を解決できない場合もあります;) –

+3

私は@Adamに同意します:それはダウン投票にはいいものではなく、 。答えが役に立たなかった理由を誰も理解できない。 – weltraumpirat

5

Aクラスのパラメータが多すぎるという問題をクラスStyleSheetAに移しているようです。

私の要点を説明するために、この質問を考えてみましょう。StyleSheetAをどのようにインスタンス化しますか?とにかく、これらのパラメータをすべて受け入れるコンストラクタを使用している可能性があります。このデザインがもたらす唯一の利点は、同じセットのパラメータ値が、Aの複数のインスタンス間で再利用するStyleSheetAというオブジェクトでカプセル化されている場合です。その場合は、Aという異なるインスタンスを持つことになりますが、同じパラメータを共有することになるので、良い選択ではありません。

あなたのクラスAをリファクタリングすることをお勧めします。小さなクラスに分割してみてください。 nesseccaryの場合は、条件分岐などを避けるためにサブクラスを作成してみてください。

クラスAはどのように見えますか?そうした場合、複数のクラスがあり、それぞれ独自のセットパラメータのそして、いずれかのパラメータが識別子(クラス "型"を決定することを意味する)であれば、サブクラスを使用するだけでそれを取り除くことができ、組み込み型システムを代わりに使用することができます。ゲッターとセッター問題に

+0

複合クラスを使用して複数の関連パラメータをカプセル化することは良い方法であり、 (まあまあ)。 –

+0

@モートン:もし彼らが本当に関連しているなら、私はあなたに同意します。私は人工コンテナクラスを書くことには、多くの代わりに1つの入力パラメータしか持たないことにちょうど同意しません。 –

+0

@ゴラン:合意しました: –

2

思考:

「B」におけるコンストラクタは追加パラメータ(N101 +は)クラスの動作のために必要であることを意味します。完全なパラメータリストを使ってクラスを拡張しているだけの場合は、Bのn101 ... n200とAのn1 ... n100のgetterとsetterを使用します。これはおそらくStylesheetBStylesheetAを拡張するのではなく、クラスBのコンストラクタをB(StyleSheetA,StyleSheetB)にすることをお勧めします。このようにして、パラメータのクラスAにセッターを持ち、それを継承し、StylesheetBBに入れます。

+0

それはまた動作しますが、追加のネストが必要な場合はすぐに厄介になるかもしれません。 –

関連する問題