2011-08-29 9 views
8

多くの場合、コンフィグレーション可能なオブジェクトをエンジニアリングする必要があります。機能。Java設定/パラメータ渡しデザイン

例として、DateIteratorを作成しているとします。構成可能なオプションは、閉じた間隔を反復するかどうかである。[start, end]またはオープンエンドの間隔[start, end)


  • (1)、私の意見では、無様な解決策 - 一つだけ真/偽設定オプションに限定
new DateIterator(boolean openInterval); 
  • (2)タイプセーフな列挙方法 - 一般的にビットかさばる
new DateIterator(Interval.OPEN_END); 
  • (3)unconv entionalしよう - 素敵ではなく、あまりにもまっすぐ
new DateIterator().openEnd(); 
  • (4)相続のアプローチ - 多くの場合、オーバーエンジニアリングこれは私が悪い検討し、いくつかの選択肢が来るへ
new OpenEndedDateIterator(); 

整数ベースの設定new DateIterator(Interval.OPEN_END);やプロパティベースの設定などです。

他の方法はありますか?どのアプローチが好きですか?

答えて

6

私はビルダーパターンがここに理にかなっていると言うだろう:

DateIterator di = 
    DateIterator.builder() 
       .withStartDate(new Date()) 
       .withOpenEnd() 
       .build(); 

その方法DateIterator.builder()によって返されたビルダーは、構成作業を行いながら、実際DateIteratorは、不変することができます。

1

そこには良い答えはありません、それは主に好みの問題ですが、私は工学上回避するために、例外のための大きな空間で、親指の次のルールに従ってください:

  1. あなたが持っている唯一の構成の場合1つの "パラメータ"であり、固定されたセットをとり、(あなたの例のような)動作を変更し、サブクラスを使用します。あなたのクラスの多くのメソッドが "if(this.parameter == x)... else if(this.parameter == y).."で始まると、コードが読めなくなります。
  2. パラメータが固定セットではなく文字列または数値であり、クラスが正しく動作する必要がある場合はコンストラクタに入れてください。必須ではない場合はソリューションナンバー(3)と同じように、 )
  3. 固定セット(START_OPEN_ENDEDやSTOP_OPEN_ENDEDなど)に複数のパラメータがある場合、サブクラスを作成すると、各置換のサブクラスを作成することができます。その場合、カプセル化を検討してください。たとえば、(この特定の場合はおそらく、それは良い例ですが)、終わりのためのサブクラスを持つ単一クラスのDateComparatorを作成し、開始のためのDateComparatorと終わりのためのDateComparatorをカプセル化します。 DateIterator。

また、これらは私が使用するものであり、決して義務的ではなく、しばしば自分自身を逐語的に尊重しないと感じる。

関連する問題