条項38:has-aまたはis-implemented-in-terms-ofを集約して設計する
3721 ワード
≪集約|Aggregate|emdw≫:タイプ間の関係です.タイプ内に別のタイプの変数が含まれていることです.
has-a:
説明:Personには名前、住所、携帯電話番号が含まれており、典型的なhas-a関係である.
is-implemented-in-terms-of(あるタイプに応じて別のタイプを実現):
チェーンリストで集合Setを実装する[具体的にどのように実装するかは『アルゴリズムの精解:C言語記述7章』を参照してください]が、リストに重複する要素が含まれていてsetが重複できないことを知っているので、setはリストではなく、public継承によって要求を満たすことができない.もちろんsetを再設計することもできますが、setのほとんどの操作はListと同様であるため、ソフトウェア再利用の考え方に基づいて、setは以下のように定義できます.
まとめ:
has-aは、1つのタイプが別のタイプの補完であることを意味する.is-implemented-in-terms-ofは、あるタイプが別のタイプで実現されることを意味する.
has-a:
1 class Address
2 {
3
4 };
5
6 class PhoneNumber
7 {
8
9 };
10
11 class Person
12 {
13 public:
14
15 private:
16 std::string name; 17 Address address; 18 PhoneNumber cellphone; 19 };
説明:Personには名前、住所、携帯電話番号が含まれており、典型的なhas-a関係である.
is-implemented-in-terms-of(あるタイプに応じて別のタイプを実現):
チェーンリストで集合Setを実装する[具体的にどのように実装するかは『アルゴリズムの精解:C言語記述7章』を参照してください]が、リストに重複する要素が含まれていてsetが重複できないことを知っているので、setはリストではなく、public継承によって要求を満たすことができない.もちろんsetを再設計することもできますが、setのほとんどの操作はListと同様であるため、ソフトウェア再利用の考え方に基づいて、setは以下のように定義できます.
1 template<typename T>
2 class Set
3 {
4 public:
5 bool member(const T& item) const;
6 void insert(const T& item);
7 void remove(const T& item);
8 std::size_t size() const;
9
10 private:
11 std::list<T> rep;
12 };
まとめ:
has-aは、1つのタイプが別のタイプの補完であることを意味する.is-implemented-in-terms-ofは、あるタイプが別のタイプで実現されることを意味する.