10周年のSPコンテンツ!

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

通貨、国、地域、休日などは多くの業務システムではテーブルでマスターデータとして管理します。だから、形式的にはエンティティに見える。でもこれは本当は値オブジェクトと考えるべきなのでしょうか? 途中からSIerのマスタメンテの話に議論が発展しました。
オブジェクト指向 DDD
6
otsu @k_otomura
「エンタープライズセグメント」って何だ。。?このクラスが持つ属性が全然思いつかない。アナパタを勉強しないといけない?#DDDjp
Ryo Asai @ryoasai74
@k_otomura アナパタ的には企業の情報系のアプリでよく使われる、商品軸、地域軸、期間軸などでカットした情報の値のことと理解しています。たとえば、「東北地区」「関東地区」など。この一個一個の区分がエンタープライズセグメントのインスタンス。わかりにくい訳ですね。#DDDjp
Ryo Asai @ryoasai74
通常エンタープライズセグメントはデータレコードのコード値として表現されると思いますが、DDD的には値オブジェクトの良い例ということかと思います。7章の例の場合、地域区分ごとに扱える貨物の分量が決まっているという話と理解しています。#DDDjp
Shingo Omura @everpeace
@ryoasai74 コード値自身はエンティティへ参照ととらえることはできませんか?DDDで「参照」をどう定義しているかによってきちゃうと思うんですが。。。コードとかは使い回す可能性があったりして、今回の分量ってのはエンティティで、それのIDを持ってるイメージです。#DDDjp
Ryo Asai @ryoasai74
@everpeace 非常に鋭いよい質問ですね。多くの業務システムでは慣習上読み込み専用であっても、コード表の形でテーブルを持つことが多いので、地域コード、通貨コード、郵便番号、休日などの情報はJPAなどでは読みこみ専用エンティティとしてマップされる。#DDDjp
Ryo Asai @ryoasai74
@everpeace これらの「類非エンティティ」は形式的には値でなくてエンティティに見えてしまうし、実際そのように扱われることが多いです。でも、多くの場合本質的にはこれらはシステムメンテ時以外更新されることなく、不変であれば、その同一性が本質的となることはない。#DDDjp
Ryo Asai @ryoasai74
@everpeace むしろ、管理性のためenumなどのflyweightをたまたまテーブルとして実装していると考えれば値オブジェクトと見なすことがモデルとしては自然なのでは。実際、多くの場合enumで十分だけど慣習としてテーブルにマップするようなケースはあると思う。#DDDjp
Shingo Omura @everpeace
@ryoasai74 僕もそう思うんですが、コードに対応している値が、値オブジェクトとってことにすると、値自体がIdentityになりますから、コードっていったいなんなのさ、って疑問がわいてきませんか? #DDDjp
Ryo Asai @ryoasai74
@everpeace ただし、P97の住所は値オブジェクトかという議論にあるように、システムのドメインによってはこれらがエンティティとなることはもちろんあります。通貨コードや国コード管理するアプリケーションであれば、エンティティと見なすのが自然でしょう。#DDDjp
Ryo Asai @ryoasai74
@everpeace コードを値に対するキーと思うとエンティティのように思われるのですが、コードをその他のエンティティを記述する属性と思うと値に見えるということでは。郵便番号や通貨コード、国コードなど。真性エンティティとの違いはコード値自身に業務的な意味があること。#DDDjp
Shingo Omura @everpeace
@ryoasai74 それとも、値オブジェクトは値自体がIdentityなんですけど、Identityの表現がほかにあると思えばいいんですかね。
Shingo Omura @everpeace
@ryoasai74 色って値オブジェクトだと言われることが多いけれど、Identityの表現はたくさんありますよね。RGBだったりCMYK(だっけ?)だったり。 コードというのは、マスターデータという値オブジェクトのIDの別表現ととらえれば矛盾は起きないですね。#DDDjp
Ryo Asai @ryoasai74
@everpeace 通常のER設計ではDDDのように値とエンティティの区別はしないから、微妙なのですよね。これもインピーダンスミスマッチの例ですが。値か参照かの違いはOO固有の概念なので。コードといっても、顧客コードや口座コードは普通値というよりエンティティのキー#DDDjp
Shingo Omura @everpeace
@ryoasai74 コードがさしているものが値オブジェクトの場合にコードは何なの?って疑問があったので自分の中ではなんとなく解決です。あと、参照か値はもっと抽象的な概念で、OO固有じゃないと思います。C言語のポインタって参照ととれますよね? #DDDjp
Ryo Asai @ryoasai74
@everpeace 字数制限の関係で参照と書いたのがいけなかったのですが、DDDのコンテキストでは参照オブジェクト=エンティティです。まあ、ポインタのメカニズムなど形式的にはそうですね。#DDDjp
Shingo Omura @everpeace
@ryoasai74 おっと。そうなんですか。参照されるのはエンティティだけってことは、値オブジェクトを指すコードってのはDDD的には不要な産物ってことになるんでしょうか。でもさっきの色の例のようにIDが複数の表現を持ってもよい場合があるんですがねぇ。#DDDjp
Ryo Asai @ryoasai74
@everpeace ポインタかどうかという点ではJavaのオブジェクトはすべて参照型なのでポインタ的です。DDDでいう値か参照かはそういうのとは次元が違うのでしょう。Stringのようにオブジェクトそのものの属性で等価判断できれば値ということなのでは。#DDDjp
Shingo Omura @everpeace
@ryoasai74 そうですね。値オブジェクトの定義が、属性自体がIdentityってことですから、そうだと思います。でコードに戻るんですが、コードとそれが"指す"値オブジェクトがあった場合、コードは何なんでしょう? #DDDjp
Shingo Omura @everpeace
@ryoasai74 そうですね。値オブジェクトの定義が、属性自体がIdentityってことですから、そうだと思います。でコードに戻るんですが、コードとそれが"指す"値オブジェクトがあった場合、コードは何なんでしょう? #DDDjp
Ryo Asai @ryoasai74
@everpeace Javaなどでは値オブジェクトに対するキーとなる別の値ととらえることもできるし、値そのものの分身、mementoと考えることもできるかな。難しいですね。いずれにしても値がflyweightであることは実装の手段であってモデルの本質ではないので注意#DDDjp
Shingo Omura @everpeace
@ryoasai74 そうですね。ありがとうございます。普段使っている用語だとどうも「参照」を当てたくなるのですが、DDD的に値オブジェクトが参照対象ではないというのがいやはやなんとも、というイメージです。 #DDDjp
Ryo Asai @ryoasai74
7章をよくよく読み返してみたが、図7.7を見ると「位置」「通貨」などはエンティティに分類されている。やはり、読み取り専用であってもマスターデータは普通にエンティティと考えておくのが無難な気がする。#DDDjp
Ryo Asai @ryoasai74
DDD的に値オブジェクトであることを条件を考えると、第一条件:オブジェクトの属性値そのもので等価性が決まり等価性、同一性の区別が重要でないこと。(不変共有か、さもなくば常にクローン)#DDDjp
Ryo Asai @ryoasai74
ただし、これだけの条件だと通貨などのマスターデータは値オブジェクトということになってしまう。そこで、第二条件:値オブジェクトはエンティティの属性(embeddable)かメソッドパラメーター(transient)としてのみ意味がある。というのを加える必要がある。#DDDjp
Ryo Asai @ryoasai74
そもそもマスターデータとして管理するとは独立したライフサイクルの存在を意味し、また、多くの場合日付などによる適用期間の管理も出てくるため、エンティティとして考える必要あるだろう。#DDDjp
残りを読む(58)

コメント

Ryo Asai @ryoasai74 2011年5月4日
ツイートを追加。
Ryo Asai @ryoasai74 2011年5月5日
bohnenさんのコメントを追記しました。
ログインして広告を非表示にする
ログインして広告を非表示にする