オブジェクト間に集約関係(aggregation)を作る時、
プログラミング学習シリーズ VisualC++ (山本 信雄著)
では、クラスのメンバとして他のクラスを宣言する方法が紹介されていました。本の中ではこれ
を「メンバオブジェクト」と読んでいると思います。ここでの宣言はクラスのポインタではな
く、クラスそれ自身を宣言するようです。
この本をはじめに読んで以来、私も同様に、クラスをそのまま宣言するようにしていたのです
が、
憂鬱なプログラマのためのオブジェクト指向開発講座 (Tucker!著)
では、実際にはクラスのメンバに他のクラスを持たせることはあまりしない、むしろ、クラスの
属性となりうるのは、数値などの基本的なデータなどで、複数のクラス同士は基本的には対等な
関係にする。その代わり、関連などをクラス間に持たせる場合は、そのクラスのポインタを宣言
して、ポインタで参照すると紹介されていました。
オブジェクト指向における再利用のためのデザインパターン(Erich Gamma/Richard
Helm/Ralph Johnson/John Vissides 著 本位田 真一/吉田 和樹 監訳)
でも、同様にインスタンスのポインタあるいは参照として定義する方がC++では一般的であると
紹介されていました。
皆さんは、このようなクラス関連を作る時、
1.クラスの属性としてクラスをそのまま宣言する
2.クラスの属性としてクラスのポインタを宣言する
のどちらを多く使用していますか。お聞かせください。
case-by-caseです。
オブジェクト(クラス)に主従関係があるとき、
両者のライフタイムが一致するか否かが判断
基準となります(多くの場合)。
>むしろ、クラスの属性となりうるのは、数値などの基本的なデータなどで、
>複数のクラス同士は基本的には対等な関係にする。
基本的なデータというのは、言語に用意されたプリミティブ型や
標準ライブラリのクラスに限定される物ではないと思います。
自分で用意したclass Fooが、これを利用するclass Barにとって
基本的なデータ型と呼べるものであれば、FooをBarに含めて良いと思います。
>1.クラスの属性としてクラスをそのまま宣言する
>2.クラスの属性としてクラスのポインタを宣言する
これは、包含されるオブジェクトのメモリ上の配置を
どうするかという実装上の問題とも考えられます。
クラスの関係を抽象的に考える場合には、どちらであるかを
気にすることはないのではないでしょうか。
(Javaのように参照しかない言語もある)
私自身は、可能な限り1にしています。
メンバオブジェクトの寿命の面倒を見なくて良いですし。
επιστημηさん、はじめまして。よろしくお願いします。
dairygoodsさん、お久しぶりです。その節は大変お世話になりました。今回も、お返事、あり
がとうございます。
すみません、私が、完全に読み間違えていました。今、改めて、
憂鬱なプログラマのためのオブジェクト指向開発講座 (Tucker!著)
をチェックしていたのですが、集約の部分の後半にεπιστημηさん、dairygoodsさんがご指摘
していたことが書いてありました。関連の部分の説明で、
>クラスの属性となりうるのは、数値などの基本的なデータなどで
とあったので、てっきりメンバオブジェクトのような宣言は駄目なのかと思っていたのですが、
集約の部分の説明で、
「それに対して集約の実装は、メンバにクラスの実体を持ちます。」
とありました。これで、謎が解けてすっきりしました。実は、後半の2つの書籍でこのようにあ
ったので、今書いてあるコードのメンバオブジェクトの部分をポインタとして持つ方へ全面的に
変えようかと思っていたところでした。
「デザインパターン・・・」の方では、集約でもポインタとして持つ方を奨励しているようです
が、「憂鬱なプログラマ・・・」で指摘してあったように、この集約の考え方自体が、概念的に
はまだ、あいまいな部分が多いらしいですね。これらはアプリケーションの仕様に大きく依存す
るらしいです。これは、επιστημηさんの「case-by-case」と同じですね。
とても勉強になりました。ありがとうございました。
>「憂鬱なプログラマ・・・」で指摘してあったように、この集約の考え方自体が、概念的に
はまだ、あいまいな部分が多いらしいですね。
'あいまい'なんじゃなく、バリエーションが多いんですよ。