キーワード†
- 集約
- コレクション
- 配列
- リスト
何か†
取り纏め役
配列やリストなど、コレクションによる集約を1級のクラスにします。
たとえば伝票「Slip」と明細「Detail」があるとき、複数の「Detail」を扱うための「Details」を設け、「Slip」、「Details」、「Detail」の関係を設計します。
なぜか†
配列やリストなどであるオブジェクトのコレクションをもつとき、そのコレクションを繰り返しなどで処理することがあります。たとえば、明細の合計金額を計算するなどです。このようなコレクションに対する処理は複雑で冗長になりがちです。また、コレクションに対する処理は形式的で処理内容の意図が読み取りにくいという難点があります。
- 複雑
- 冗長
- 見通しが悪い
コレクションに対する処理を集約する側に寄せると(上記の例で言えば明細「Slip」)、集約する側をこれら問題のたまり場にしてしまいます。そこでコレクションに対する処理をするためだけのクラスを設けることを考えます。
どのように†
配列やリストなどのコレクション属性をひとつだけもつクラスを設けます。
たとえば、次のように考えた伝票と明細の関係について。
Slip { List<Detail> details; // return sum of details sum() { sum = 0; for (detail: details) { sum += detail.amount; } return sum; } }
Listとして集約しているDetailをDetailsとして独立させます。
Slip { Details details; // return sum of details sum() { return details.sum(); } }
Details { List<Detail> collection; sum() { sum = 0; for (detail: details) { sum += detail.amount; } return sum; } }
このときのDetailsはひとつのList<Detail>だけを属性にします。