home wiki.fukuchiharuki.me
Menu

キーワード

  • 集約
  • コレクション
    • 配列
    • リスト

何か

中間管理職

配列やリスト(コレクション)によって集約するクラスをひとつのクラスとして独立させます。たとえば、伝票(Slip)と明細(Detail)を考える場合Slip、Details、Detailの関係を設計します。

first-collection.png

なぜか

コレクションにてあるオブジェクトを集約する場合、そのコレクション全体を取り扱う処理が考えられます。たとえば、明細の合計金額を計算するなどがそれにあたります。このようなコレクションに対する処理は複雑で(集約する側において)冗長になりがちです。また、コレクションに対する処理は形式的で処理内容の意図が読み取りにくいものです。

  • 複雑
  • 冗長
  • 見通しが悪い

コレクションに対する処理を集約する側に寄せると、集約する側をこれら問題のたまり場にしてしまいます。そこでコレクションに対する処理をするためだけのクラスを独立させ、これら問題にあたらせます。

どのように

配列やリストによって集約する属性をひとつのクラスとして独立させます。

たとえば、次のように考えた伝票と明細の関係について。

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>だけを属性にします。

参考