2012-01-09 3 views
3

私はJavaで大きなコンストラクターを分割する方法についてthis questionを読んでいます。しかし私は私の場合に何をすべきかは十分にはわかりません。この質問は、ビルダーパターンがより良い方法であることを示唆しているが、同時にいくつかのサブ文中のある人物は「いくつかのパラメータがオプションである場合のみ」と述べている。すべてのパラメータが必須であるため、ビルダーパターンの利点はありません。私は、重要な情報の平和を忘れることを忘れてしまうでしょう。したがって、論理的にグループ化された新しいオブジェクトを作成する唯一の選択肢ですか、ビルダーパターンに重要な事実がありませんか?ビルダーは物事が欠落している場合のみ良いと思われる?Java:ビルダーパターンと論理的にグループ化されたオブジェクト

+1

私はあなたがすでにそれを持っていると思う... – Steven

答えて

2

"論理的にグループ化された新しいオブジェクトを作成するのは私の唯一の選択ですか、それともビルダーパターンに重要な事実がありませんか?"

私の意見は:

はいです。この場合、Builderを使用すると、抽象化で必要とされる作業の量に比べて追加の利点はありません。

コメントにも記載されています。オブジェクトのパラメータが多すぎると、オブジェクトが多すぎる可能性があります。

+0

+1 "多分オブジェクトはあまりにもやっている"。 – toto2

0

は、すべてのパラメータが必須であっても、Builderパターンは、まだいくつかの利点があります。

  1. それより読みやすいです。あなたのコンストラクタが10個のパラメータを持っている場合、どちらが何であるかを覚えておくのは難しいです。特に が0またはnullです。

  2. ビルダーはいくつかの異なる方法に渡すことができ、必要なデータを蓄積することができます。 これは、そのデータの一部があるクラスに存在し、別のクラスに存在する場合に便利です。

  3. リストまたはその他のコレクションで、コンストラクタに渡される前に をアセンブルする必要がある場合は、 ビルダーが内部的に世話をすることができます。彼らはまた、 防御的なコピーの必要性のいくつかを除去することができます。なぜなら、建築家は がそれらのオブジェクトを漏らないことを知っているからです。

  4. ビルダーはあなたにシリアライズされたフォームまたはお オブジェクトのJAXBのXML形式をより細かく制御 を与えて、シリアル化のプロキシとして機能することができます。

    私のアプローチは、常にそのコンストラクタを呼び出すと、あなたのコード内で混乱の多くを引き起こし、ビルダーによって追加の余分な透明性が十分にあるされている場合にのみ、プレーンコンストラクタで始まり、そしてビルダーを導入するだろう、と述べた

まったく新しいクラスを追加することを正当化する。

0

コンストラクタへの多くのパラメータは、クラスが扱っている懸念が多すぎることの兆候かもしれません。ビルダーは、カスケードされたケースがあるときにのみ意味をなさない。男の子は無礼な言語セクションを追加し、女の子は買い物リストを追加する。

懸念を分割することは、継承、一般的なパラメータ化クラス、委任クラス、および重い論理グループ化オブジェクトに依存します。

テストケースを作成できるかどうかを検討してください。テスト駆動開発はここで役立ちます。パラメータクラスをモックする必要がある場合、「依存性注入」にはより抽象的なパラメータクラスが必要です。

関連する問題