●集約とコンポジション
以下は、会社、部、課が集約関係にあるとして、お読みください。
00522一部/00522 VFF15672 T's-Neko 集約されたオブジェクト(子)のIDと処理
( 7) 97/09/27 16:04 00506へのコメント
katana さん、こんばんは。T's-Neko です。(^o^)o
【集約されたオブジェクト(子)のID】
>この点については、「一般的に「集約(a part of)」という概念では、親(部門)
>がなければ、子(課以下)は存在できないため、各インスタンスはポインタではな
>く実体で持つことが基本(DDJ誌Tucker!さんの憂オブより(^^; )である」ことを
>念頭に、親側は子のインスタンスを実体で所有する形にしようと考えていました。
>で、親はRef(int id)などのメソッドにより、実体(子)への参照 or コピーを返
>します。
そうですね。課の実体を部の中に置いてもいいと思います。
(これをコンポジションという)
アプリケーション(表示)の要求に応じてその ID(参照)を渡せば、
コピーしなくていいですし。
しかし、部が複数あるので、部が違っても同じ ID の課が
可能ですが、それはなるべく避けた方がいいでしょう。
たとえば、配列を使うなら、
class 部 {
課 ka[100]; // 部は課を最大 100 持てる
};
部 a, b; // 部は a と b がある
となり、配列番号を ID に使えますが、特定の課にアクセスする
には、部が a か b かということも特定する必要があります。
部が変わると a.ka[32] から b.ka[16] とか変わりますよね。
それとは別に、その課に普遍な ID を与えてるとよいでしょう。
class 課 {
int id; // 課の普遍の ID
};
また、そのインデックスを作ってもいいでしょう。
全ての課の配列[id] = { { &a, 32 }, { &b, 10 }, ... };
しかし、この場合、集約だけど実体を部の外においた方がいいと
思います。
課 all_ka[id]; // すべての課のテーブル(実体の配列)
とグローバルにおいて、
class 部 {
int ka_id[100]; // 部は課の ID を最大 100 持てる
};
というわけです。すべての課がまとまっていますね。
リレーショナル・データベースなら、このような構造になるでしょう。
僕の指針としては、集約の子が公開(public)なら、
実体を持つより ID(参照)を持った方がいいと思います。
一方、親のために機能を提供するだけの子なら、実体を
持った方がいいと思います。
--- Neko.
This text was copyed from Niftyserve Programer's Forum Pro.