4

私は約60の属性を持つドメインオブジェクトInvoiceを持っています。いくつかは必須で、いくつかはオプションです。このInvoiceクラスは、アプリケーション層クラス(DBに格納されている単純な整数の場合はEnum、doubleの場合はCurrencyなど)でラップされた特定の列値を持つ、基になるDBテーブルのレコードの表現です。

このInvoiceクラスは現在、次のように定義されています。

  • パブリック全引数コンストラクター。
  • パブリックゲッター。
  • 保護されたセッター。

現在、Invoiceオブジェクトを作成するこのクラスのクライアントを怖がらせて、60個の奇数属性すべてをコンストラクターに渡します。私は明白な理由でセッターを公開することに固執しています。

この請求書オブジェクトの作成/変更を許可するためのより良い方法を提案していただけますか?詳細が必要な場合はお知らせください。

4

4 に答える 4

18

Builderパターンの使用

JoshuaBlochが著書EffectiveJava2ndEditionで説明しているビルダーパターンを使用してください。同じ例がhttp://www.javaspecialists.eu/archive/Issue163.htmlにあります。

次の行に特に注意してください。

NutritionFacts locoCola = new NutritionFacts.Builder(240, 8) // Mandatory
                          .sodium(30) // Optional
                          .carbohydrate(28) // Optional
                          .build();


使用する BeansUtils.populate

もう1つの方法は、ApacheCommonsBeansUtilsorg.apache.commons.beanutils.BeanUtils.populate(Object, Map)のメソッドを使用することです。この場合、オブジェクトのプロパティを格納するためのマップが必要です。

コード

public static void main(String[] args) throws Exception {

    Map<String, Object> map = new HashMap<>();
    map.put("servingSize", 10);
    map.put("servings", 2);
    map.put("calories", 1000);
    map.put("fat", 1);

    // Create the object
    NutritionFacts bean = new NutritionFacts();

    // Populate with the map properties
    BeanUtils.populate(bean, map);

    System.out.println(ToStringBuilder.reflectionToString(bean,
            ToStringStyle.MULTI_LINE_STYLE));

}

出力

NutritionFacts@188d2ae[
  servingSize=10
  servings=2
  calories=1000
  fat=1
  sodium=<null>
  carbohydrate=<null>
]
于 2012-09-17T05:23:07.350 に答える
4

あなたができることは多分あなたのオブジェクトをより小さなものに分解することでしょう。上記のコメントのように、ユーザーにこれらの新しいオブジェクトの作成を要求する場合がありますが、データベースの設計によっては、主キーまたは外部キーをクラスに渡すだけでよい場合があります。

その場合、クラスはデータベースから関連データを探す動作をします。これにより、データベースサーバーの負荷が明らかに増加する可能性がありますが、クラスの複雑さは軽減されます(ただし、量は多くなります)。複雑さが軽減されると、コードの再利用の可能性が高まり、メンテナンスが容易になります。

于 2012-09-17T05:24:41.227 に答える
0

@Jake Kingが示唆しているように、より小さなデータオブジェクトに合成するには、常に60の属性を使用することをお勧めします。

その際、1つの側面を検討します。可能な組み合わせはオプションであり、そのように構成します。たとえば、クライアントがクリックして現在のアドレスと郵送先住所を使用すると言う場合、郵送先住所はオプションです。

これらの構成されたオブジェクトの周りにコンストラクターを構築すると、クラスを簡単かつ効率的に管理/維持するのに役立ちます。

于 2012-09-18T11:19:00.863 に答える
-3

請求書オブジェクトに60個の属性があり、それらの一部を必要としないことが確実な場合は、それらの属性にゲッターとセッターを作成する必要はありません。コードで必要な属性のゲッターセッターを作成することを常にお勧めします。ただし、省略されたフィールドがデータベースでnull制約を許可する必要があることを確認する必要があります。

それ以外の場合、コードで60の属性すべてが必要な場合は、クライアントの要求に応じて異なるコンストラクターを作成します。クライアントが4つだけを渡す必要がある場合は、4つのパラメーターを受け入れるコンストラクターを作成し、値がないデータベース内の属性のデフォルト値を設定できます。クライアントによって渡されます。

于 2012-09-17T06:37:32.897 に答える