地域、通貨は値オブジェクトかエンティティか?

通貨、国、地域、休日などは多くの業務システムではテーブルでマスターデータとして管理します。だから、形式的にはエンティティに見える。でもこれは本当は値オブジェクトと考えるべきなのでしょうか? 途中からSIerのマスタメンテの話に議論が発展しました。
6
Ryo Asai @ryoasai74

@koichik そうですね。ERでいうところのドメインやチェック制約は埋め込み値オブジェクトに近いとも言えます。でも、多くの場合、そういう使われ方をされていないとは思いますが。

2011-05-04 20:52:20
koichik @koichik

@ryoasai74 それは真剣に ER やってる人達から見ると「RDB 使ってるだけ」で ER でも何でもない代物なのでは? 「Java 使ってるだけ」で OO じゃない多くのコードと同じように.多くの場合の使われ方なんて,きっとそう.

2011-05-04 20:59:11
Ryo Asai @ryoasai74

@kimukou_26 @shuji_w6e 私もやったけれど、これぞまさしくAOPの活躍するところだったりするわけですけれどね。after throwingアドバイスを使い、少なくともアプリ層やドメイン層からは意識させないのがレイヤ化されたきれいな設計ですね。

2011-05-04 21:47:15
bohnen(草食系DevRel) @bohnen

@ryoasai74 んー、ちょっと勘違いがある気が。図7.7 は、インフラストラクチャ駆動のパッケージングが持つ問題を表す例(筆者がおすすめしない例)です。QT ツイートを追加。 http://togetter.com/li/131453

2011-05-05 05:42:42
bohnen(草食系DevRel) @bohnen

@ryoasai74 金融システムがなぜ通貨、国をマスタデータとして持つかというと、これらは単なるコード値ではないからです。通貨に関わる属性(小数点以下桁数などの取引に関わる属性)や、国に関する属性を保持するため。RDBを使っているのは運用上のメリットのためですね

2011-05-05 05:47:28
bohnen(草食系DevRel) @bohnen

@ryoasai74 そしてこれらは金融ドメインの根幹に関わるものなので、それなりの関連を持ちます。運用上のメリットの為と書きましたが、モデリング上国や通貨への関連は山ほどできるので、O/Rマッピング上はエンティティとして扱った方が都合がよいことは確かです。

2011-05-05 05:51:26
bohnen(草食系DevRel) @bohnen

@ryoasai74 しかしモデリング上はこれらは値オブジェクトであることが多いです(私が知らないだけかもしれませんが、エンティティにしている例を見ない)。AさんBさんの取引は別ですが、それらが参照しているUSD, JPYといったコードで代表される通貨は同一です。

2011-05-05 05:55:44
bohnen(草食系DevRel) @bohnen

@ryoasai74 コードは特定の値オブジェクトを指し示すボキャブラリーですが、実装上の識別子とはまた別であることに注意する必要があります。ドルを示すのにUSDを用いないケース(一意に決めた番号を使うケース)もあります。

2011-05-05 06:02:08
bohnen(草食系DevRel) @bohnen

@ryoasai74 DDDのP.328でフライウェイトをドメインモデリングのパターンとしては適合するものがないことが述べられていますが、ここの記述も参考になると思います。

2011-05-05 06:07:42
bohnen(草食系DevRel) @bohnen

@ryoasai74 私としてはマスタデータは値オブジェクトと考えますが、実装上エンティティにするという実装方針はOKです。ただ、それはその方が効率的だからという意味で、ドメインモデル的なエンティティと値オブジェクトの区別を曲げるものではないと思っています(終)

2011-05-05 06:15:25
Ryo Asai @ryoasai74

@bohnen 金融システムのエキスパートからアドバイスをいただき、ありがとうございます。これこそ、もともと議論したかったことですね。マスメンの話ではなくて。w

2011-05-05 10:26:48
Ryo Asai @ryoasai74

@bohnen 図7.7がアンチパターンということは理解しているのですが、7.8の図だとどれに分離しているからがわからないので、あえて7.7に言及したのですよね。これらがパッケージ以外一応対応づくという前提でどれをどのクラスに分離しているかが推測できるかと。#DDDjp

2011-05-05 10:30:40
Ryo Asai @ryoasai74

@bohnen たしかに外貨の扱いが重要になる金融ドメインでは通貨は単なる記号ではないということですね。ただ、ここがよく理解できていないところなのですが、通貨属性というのはけっこう頻繁に変更されるもので、本当にDB上でメンテできる方が運用上メリットがあるかというところですね。

2011-05-05 10:34:47
bohnen(草食系DevRel) @bohnen

@ryoasai74 私も以前悩んだことがあるのですが、通貨だけ取ればファイルでもなんでも、追加を準即時で反映できれば良いです。ただ先に述べたように関連が多いので、アドホッククエリや、実装での取り回しの良さを考えるとRDBが便利ではないでしょうか。

2011-05-05 10:36:45
Ryo Asai @ryoasai74

@bohnen つまり、これらの属性が値オブジェクトに定数やロジックとしてハードコードされていたり、DIされるというのでは不都合なのかという点を知りたいです。

2011-05-05 10:36:49
bohnen(草食系DevRel) @bohnen

@ryoasai74 アドホッククエリがなければそれでもOKだと思います。結構ありますよね、オンラインはJavaで、バッチはSQL+ストアドって

2011-05-05 10:37:45
Ryo Asai @ryoasai74

@bohnen 確かにルールを外部化するという考えは運用上大切で、複雑なロジックではルールベースなどというのもありますね。ただ、PGの発想ではきちんとDDDして値オブジェクトにや設定ファイルにカプセル化しておけば十分と思える時もありますね。

2011-05-05 10:39:53
Ryo Asai @ryoasai74

@bohnen あと、もう一点ポイントは金融システムといっても実は一括りにできなくて、ユースケースによっては通貨が単なる記号でしかないシステムもあるのではということ。システムによってはエンティティになったり値になったりするというのがDDD的な考え方なのかなと思いますね。

2011-05-05 10:41:40
bohnen(草食系DevRel) @bohnen

@ryoasai74 ですね。通貨や国もISOで決まっているすべてを取り込んでいるシステムというのはまず無くて、システムが興味のある範囲だけです。属性もシステムによってまちまち。だからこそ実装はフリーハンドで考えたいですね。

2011-05-05 10:43:39
Ryo Asai @ryoasai74

それから、値オブジェクトは振る舞いや関連をもってはならないと勘違いしている人もいるかもしれませんが、少なくともDDD的には関連も振る舞いも持てますし、JPA2のembeddableもそう拡張された。ただし共有される場合は状態を可変にできないというところはある。#DDDjp

2011-05-05 10:46:34
Ryo Asai @ryoasai74

まあ、でも実際時々値かエンティティかの分類がわからなくなることはよくありますね。全部オブジェクトではだめなのと開き直ってみたり。#DDDjp

2011-05-05 10:48:41
Ryo Asai @ryoasai74

@bohnen P328の記述は誤訳に近いと理解しています。原文は「Why Not Flyweight」ですが、これは反語であり、訳としては「Flyweightを使ったらどうですか?」くらいの意味ですね。以下を参照 #DDDjp http://bit.ly/lXyoXq

2011-05-05 11:11:30
bohnen(草食系DevRel) @bohnen

@ryoasai74 あれ。原書もあるので(←3年ほど積ん読)読んでみます!

2011-05-05 11:12:25
Ryo Asai @ryoasai74

@bohnen つまり、ドメインモデルとしては直接一致するものがなくても値オブジェクトの実装方式としては有効な場合があるという説明がされています。原文を読むとちょっとニュアンスが違うような気がするのですよね。訳だと、完全否定しているように誤解されかねないですが。#DDDjp

2011-05-05 11:15:09
Ryo Asai @ryoasai74

でも、Flyweightが実装方式として有効でもドメインモデルに現れるドメインパターンという意味では結局否定しているということか。もともとこのパターンは実装イディオムに近いですから。#DDDjp

2011-05-05 11:21:58