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

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

コメント

カテゴリーからまとめを探す

「マネー」に関連するカテゴリー

ログインして広告を非表示にする
ログインして広告を非表示にする