1

Projectant から UML ダイアグラムを取得し、エンティティに getTotalPrice() メソッドを取得しました

これが私のクラスです:

public class UOrder {

   @OneToMany
   private List<Product> products;

   ....
   public BigDecimal getTotalPrice(){
   BigDecimal b = new BigDecimal(0.0);
   for(Product p : products){
   b.add(p.getPrice());
   }
   return b;

 }

}

そのようにするのは良い考えですか?エンティティへの論理ビジネス? フィールド totalPrice などではなく、uml ダイアグラムに関数しかないので、そのようなものでなければならないことがわかりました...

4

3 に答える 3

1

それは好みの問題のようなものです。たとえば、ドメイン駆動設計UOrderの哲学が好きな場合は、合計価格がクラスに属しているため、非常に良い考えです.

于 2012-09-20T21:20:25.077 に答える
0

悪くないと思いますが、(疑似コード)のほうが好きです:

public class UOrder {
    ...
    public BigDecimal getTotalPrice() {
        return PriceUtil.getTotalPrice(products);
    }
}

public class PriceUtil {
    public static BigDecimal getTotalPrice(List<Product> products) {
        return sum-of-products;
    }
    ... other userful and fancy price functions ...
}

通常、次のものが必要なためです。

  • 付加価値税の計算または
  • 製品としての他のクラスの価格または
  • UOrder などの他のクラスの価格
  • 等々。
于 2012-09-20T21:19:47.380 に答える
0

別の見方として (アクティブなレコード スタイルのデータ マッピング オブジェクトは、便利な形式で永続化されたデータ、つまり値オブジェクトです)、次のように考えています。

メソッドがビジネスロジックであると言ったこと、および@Antonが話しているよく知られているドメインを考えると、それは悪い考えです。それがビジネス ロジックであると言わなかったとしたら、アプリケーションでその合計を気にする理由を疑問に思ったでしょう。

実験として、マッピングされたクラス UOrderData の名前を変更し、それを値オブジェクトとして扱い、アプリケーション レベルでビジネス ロジックを実装する UOrder クラスを用意することを検討してください。

于 2012-09-20T23:06:30.747 に答える