開発者 モデルを作成する際の第1ステップは、クラス抽出です。第2ステップは、クラスに責務(responsibility)を割り当てることです。
司会 責務というものにオブジェクト指向の重要な考え方が入っています。
ソクラテス ものの本質とは何かという議論で、アリストテレスは4つの原因説を唱えた。それまで万物の根源は何であるか、いい換えれば“what”に注目していたが、彼はなぜそれが存在するのか、つまり“why”を考えた。そこで「目的因」、つまりすべてのものには存在目的があるという考え方に到達した。
某 そうすると、オブジェクトは責務を持つという考え方は個々のオブジェクトの目的、つまり存在理由になり、アリストテレスの考えに近づいたわけだね。
開発者 開発技法として責務の発見方法はさまざまです。一般的なオブジェクト指向開発プロセスでは、システムの要求をユースケース・モデルで表します。ユースケースというのは、システムが利用者に提供するひとまとまりのサービスです。システムの利用者の立場で、システムをこういうふうに利用したいということを詳細化していきます。そのサービス提供のために必要なクラスを抽出し、そこに責務を割り振っていきます。
某 そのサービスを提供するというコンテキストの中で、それぞれのクラスの役割、つまり存在理由があるわけだ。
開発者 クラスに属性と責務が一体化され、従ってそこから生成される個々のインスタンスは具体的属性値を持ち、クラスの責務を分け持つのです。
ソクラテス すると、イデアの影も責務を分け持つということも考えられる……。この議論は、また別の機会にしよう。
司会 ここでまとめると、オブジェクト指向の発想の最も基本的なものは2点あります。
具体的オブジェクトをクラスとして抽象概念化する。クラスをテンプレートとして、そこからインスタンスを生成する。個々のインスタンスはそれぞれ固有の属性値を持つ。
クラスにはその存在目的として責務が割り振られている。
ソクラテス クラスに責務を割り当てた。オブジェクト指向という考え方は、その次にはどのように発展していったのだろう。
開発者 オブジェクトは複数が集まって、お互いに協力し合いながら全体として1つの仕事をします。そのために責務があるのです。オブジェクトから別のオブジェクトへの仕事の依頼を「メッセージ」と呼びます。メッセージを通して協力し合うのです。
某 責務を持ったオブジェクトが集まって、グループとしてより大きな責務を果たす。さらにそれらのグループが集まって、さらに大きな責務を果たす。このような拡張性のあるモデルになっているようだね。
司会 このようなモデルを「自律分散協調モデル」あるいは「コラボレーション・モデル」と呼びます。
某 人間1人1人をオブジェクトと考えれば、部/課/グループといった会社組織などもこのモデルで表せるな。
開発者 次にオブジェクト指向の特徴として挙げられるのが、分類と分解の仕組みです。まず、分類の仕組みから説明します。これは、クラスをオブジェクトの集合と考えるなら、その中からある共通点を持った部分集合を取り出して、それを1つのクラスにすることもできるというものです。この部分集合は、元の集合としての特徴も併せ持っています。このクラスを元のクラスの「サブクラス」と呼びます。サブクラスのインスタンスは、元のクラス(スーパークラス)のインスタンスでもあります。
司会 つまり、部分集合の要素は元の集合の要素でもあるということですね。
某 “人”というクラスを考えた場合、“男性”“女性”というクラスは、“人”のサブクラスになる。“女性”のインスタンスは“人”のインスタンスでもある。クラスを集合と考えたら分かりやすい。
開発者 “人”の責務は“男性”“女性”の責務として継承されます。逆に“男性”の責務を新たに追加しても、これは“人”の責務には反映されません。
司会 この関係を「汎化関係」と呼び、汎化関係によりサブクラスはスーパークラスの特性を継承します。
某 継承の概念はクラスを集合と考え、インスタンスを集合の要素と考えたら自然に導き出されるわけだね。
開発者 継承は何階層でも考えられます。
某 ツリー構造かね?
開発者 ツリーではありません。ツリー構造は下から上の関係は1つに限定されますが、汎化関係は下から上に複数の関係があり得ます。すなわち、多重継承があり得るわけです。これは、UMLメタモデルにも用いられています。
司会 集合で考えれば、2つの部分集合が共通部分を持つ場合ですね。下図のように考えれば分かりやすいでしょう(図3)。
司会 クラスを集合として考えれば分かりやすい。汎化関係は集合の包含関係に対応します。上図の例では、以下のような汎化関係が存在しています。
※ 「A⊃B」は集合Bは集合Aの部分集合であることを表し、「A∩B」は集合Aと集合Bの共通部分を表す。 |
開発者 さて、第2は分解の仕組みです。あるオブジェクトが複数の部品となるオブジェクトで構成されているという見方ができる場合があります。
某 部品ということは、部分集合だろうか?
開発者 いいえ。別集合です。
司会 例えば携帯電話を分解すると、図のようにディスプレイ、ボタン、マイク、スピーカーという部品に分かれます。これらは、それぞれがまったく別のクラスだと考えられます。汎化関係ではありません。
司会 まとめると、オブジェクト指向は分類と分解の仕組みをモデリングできるということですね。
これは、クラスを集合ととらえれば包含関係として自然に導かれる。
クラスの分類構造は特性の継承を伴う。
オブジェクトを部品オブジェクトに分解してとらえることができる。
司会 今回は、オブジェクト指向とは何であるかについて、あらためて考えてみました。最も重要なのは
クラスをテンプレートとし、そこから同じ特性を併せ持つインスタンスを生成できる。
責務を持ったオブジェクトがメッセージを通じて協調し合い、より大きな責務を果たす。
の2点です。さらにそこから自然と導かれる2つの仕組み
を合わせた4点が、オブジェクト指向という考え方の基本です。
ソクラテス 今回は「ものの本質とは何か」「それはどこに存在するのか」という議論や、「ものには存在目的や理由がある」ということを考えるのに、また1ついいヒントを得た。
某 2000年以上前にギリシャのアカデメイア※2で議論されていたプラトンのイデア論とアリストテレスの4原因説の思想が、形を変えて現代のソフトウェア技術であるオブジェクト指向にも知らずに引き継がれている。オブジェクト指向は、普遍な知識の大きな潮流の中にある。
司会 どうもありがとうございました。また次回が楽しみです。よろしくお願いします。
河合 昭男(かわい あきお)
大阪大学理学部数学科卒業、日本ユニシス株式会社にてメインフレームのOS保守、性能評価の後、PCのGUI系基本ソフト開発、クライアント/サーバシステム開発を通してオブジェクト指向分析・設計に携わる。
オブジェクト指向の本質を追究すべく1998年に独立後、有限会社オブジェクトデザイン研究所設立。 OO/UML関連の教育コース講師・教材開発、Rational University認定講師、東京国際大学非常勤講師。
ホームページ:「オブジェクト指向と哲学」
Copyright © ITmedia, Inc. All Rights Reserved.