ひがやすを技術ブログ

電通国際情報サービスのプログラマ

複数種類のエンティティを扱うロジックをどこに書くのか

「複数種類のエンティティを扱うロジックをどこに書くのか」、これは、非常に難しい問題です。エンティティに持たせると、どこのエンティティに持たせるのかを判断するのが難しい。
だから、アクションにもたせるのが良いと書いてきました。
でも、売上金額 = 売上明細.商品.単価 * 売上明細.数量みたいなロジックがあって、JSPに売上金額を表示する場合に、このロジックをアクションにもたせるかというと微妙ですね。
売上金額が1つしかないなら、それでもいいけど、複数あった場合は、うまくいかない。コメントで答えたように、これくらいの計算なら、ELでやっても全然いいんだけど、複雑な計算だとどうするのか。
売上明細エンティティが複数あって、複数の売上金額を表示するなら、売上エンティティで計算したほうが全然楽です。


<c:forEach var="e" items="salesDetailItems">
${e.salesAmount}
</c:forEach>
アクションで計算するとこうなります。って書こうと思ったけど、結構めんどくさい。ViewHelperを使う手もあるけど、これも面倒。
迷ったらシンプルなほうを選んだほうが、正解である確率が高いと思うので、複数種類のエンティティにまたがるロジックも、エンティティに書くほうがよさげです。

それでは、外から呼ばれるロジックをどのエンティティに書いたほうがいいかですが、最も外側のエンティティでしょうね。売上金額の例だと売上明細エンティティ。

追記:外側って言い方だと答えになっていないですね。
複数種類エンティティのプロパティにアクセスするメソッドがある場合、そのメソッドをどのクラスに持たせるのが良いかというと、一般的には、そのメソッドでアクセスするプロパティをもっとも多く所有しているエンティティです。売上金額の例だと、商品エンティティが1つ、売上明細が1つなので、この法則では決まりません。
決まらない場合、そのロジックをxxxのyyyをzzzするという形式で表現してみて、xxxに当てはまるものがあれば、xxxのエンティティにロジックを持たせます。
これが成立しないなら、xxxをyyyすると表現してみてxxxに当てはまるものがあれば、xxxのエンティティにロジックを持たせます。
それでも、成り立たないのなら、その人のフィーリングで決めるしかないでしょうね。
売上金額の例だと、「売上明細の売上金額を計算する」といえるので、売上明細に持たせるのが良いと思います。