ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

複雑な構造のオブジェクト

導入

複雑なオブジェクトは、見方によってはひとつのシステムです。その内部構造は、より単純なオブジェクトの組み合わせになっています。

用語
このトピックでは次の用語を覚えます:
  • コンポジション (composition)
  • Has-A, Part-Of
解説

開発しようとしているシステムをオブジェクトの集まりとみなしたとき、それぞれのオブジェクトが十分な小ささでなければ現実的ではありません。プログラムは人間が作るものなので、実現可能な大きさには限度があるのです。

しかし実際に、大きなオブジェクトというのは存在します。どうしたら良いのでしょうか?そういう場合は、大きなオブジェクトをより小さなオブジェクトに分割するのです。

大きく複雑なオブジェクトは、それ自体が1つのシステムでもあります。たとえば「人間」クラスに属するインスタンスは非常に複雑な構造の個体です。骨・筋肉・臓器・血管・脳・神経・白血球や赤血球などが非常に複雑にからみあって動作しています。しかしそれぞれの(骨・筋肉・・・などの)部品はもっと単純な構造をしています。単純なものが寄り集まって、より複雑なものを形作るのです。

結局、どのようなシステムでも小さなオブジェクトの集まりと見なすことができます。これが、オブジェクト指向のパワーのひとつです!

オブジェクトをいくつかのオブジェクトの組み合わせとして実現したり、あるオブジェクトの一部を別のオブジェクトで構成したりする方法をコンポジションと呼びます。そして、構成要素のオブジェクトとそれらを組み合わせてできたオブジェクトとの関係を、Has-A 関係とか Part-Of 関係と呼びます(呼び方が違うだけで、どちらも同じ意味です)。

Has-A 関係:
コンポジションによってできたオブジェクトは、その内部に構成要素のオブジェクトを「持っている」ように見えます。たとえば「人間」オブジェクトの場合は、"A Human object Has-A Brain object." という関係ですね。

Part-Of 関係:
構成要素のオブジェクトは、その集合体であるオブジェクトの「一部」です。たとえば「人間」オブジェクトの場合は、"A Brain object is a Part-Of a Human object." という関係ですね。

コンポジションという考え方は、本来非常に「普通の」発想だという点に注意してください。身の回りのオブジェクトを見渡してみましょう。洋服は布とボタンと糸でできています。本は紙とインクと背の部分をくっつける糊でできているし、アナログ時計は文字盤と針と歯車でできています。テレビも、食器棚も、靴も、傘も、窓ガラスも、みんなコンポジションでしょう!!

しかしソフトウェア開発の世界では、オブジェクト指向が発見されるまでずっと長い間、コンポジションが使われていなかったのです。コンピューターの世界は最先端のように見えますが、実際のところまったく普通の考え方にさえ追いついていなかったのです。しかし、今はもう、追いつきました。良かったね。

コンポジションだけではすべての問題は解決しません。いくらシステムを単純な構成要素に分解できて、実際に作れそうな望みがわいてきたとしても、構成要素のオブジェクトが1000万個もあったら時間がいくらあっても足りません。

どこに無駄があるのでしょうか?

たくさんオブジェクトがあれば、中には似たようなものがいくつもあるはずです。しかしそれらはやはり違うオブジェクトで、まったく同じというわけではないのです。これが無駄に時間がかかる理由です。なんとかして、似たようなオブジェクトを効率よく作らなければなりません。

そのためには、まずオブジェクトを分類する必要があります。昔から多くの学者が分類によって成果を上げてきたことに学んで、オブジェクトを分類してみることにしましょう。そうすれば、オブジェクトが「似ている」とはどういうことなのか、わかるはずです。

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)