第9回(分析手法のキホン:「分解と分類」)は認識対象を理解するために行う分析の2つの技法「分類と分解」について考えてみました。日常生活でも、あるいはシステム開発で行うモデリング作業にも、この類似した2つの概念が表れ混乱することがありますね。どのように違うのでしょうか?
分類は“is-a”関係と呼ばれ、UMLでは汎化関係で表現できる。分解は“has-a”関係と呼ばれ、UMLでは集約関係で表現できる。
分解による方法は、複雑な対象を単純で理解しやすい小さな部分に細分化するという発想ですが、全体としてこそ保有されるべき性質が分解により失われ、分解された部分の性質の総和が全体にならないという問題があります。「木を見て森を見ず」になります。分類による方法は、全体としての基本的な性質を消さないようにしつつその性質を細部にまで追求する方法であるということができます。
世界の森羅万象について、その本質は何かを考えるのが古来ギリシャ時代以来の哲学者の仕事です。古代ギリシャ時代の哲学を集大成したのがプラトンとアリストテレスです。彼らの深遠な哲学体系のほんの一部ですが、オブジェクト指向との接点についてこれから考えてみたいと思います。今回のテーマは、まずプラトンのイデア論を中心にして、ものの本質はどこに存在するかについて考えてみたいと思います。
さて、本連載第1回は「流れ去るものと不変なもの」というテーマで、ものの本質をどのようにとらえるかについて、オブジェクト指向の視点から考えました。オブジェクト指向の最も基本的な概念は「クラス」と「インスタンス」です。個々のインスタンスは、あるとき生成され、時間とともに状態が変化してゆき、最後には消滅し流れ去るものです。一方クラスはインスタンスの本質として不変なものです。
クラスはインスタンスの鋳型です。たい焼きはたい焼きの鋳型に中身を詰めて焼き上げます。できたたい焼きはどれも同じ形をしています。材料があれば、1つの鋳型からいくつでもできます。たい焼きの鋳型がクラスであり、中身を詰めて焼く作業がインスタンス生成、焼き上がった個々のたい焼きはインスタンスです(図1)。
たい焼きの具は通常、あんこです。クリームを入れればクリームたい焼きができます。どちらも同じ鋳型からできたたい焼きであることには違いはありません。中身や焼け具合など個々のインスタンスの状態は少しずつ違いますが、すべてたい焼きという同じクラスのインスタンスです。少し乱暴かもしれませんが、例えばこれをjavaスタイルで記述するなら次のようになります。
class Taiyaki{ // たい焼きの鋳型となるクラス Syurui syurui; // (1)具の種類 Taiyaki(Syurui gu){ // (2)コンストラクタ syurui = gu; } ・・・ } class xxx{ // たい焼きを作るクラス ・・・ Taiyaki t1 = new Taiyaki(anko); // (3) Taiyaki t2 = new Taiyaki(cream); // (3) ・・・ }
たい焼きの鋳型に当たるクラス。
(1) Syuruiを属性として持つ。ここにはあんこやクリームなど具の種類を保持します
(2) 具の種類をパラメータに持つコンストラクタ
鋳型に材料を詰めて焼き上げる側のクラス。
(3) 具の材料をパラメータとしてコンストラクタにnew演算子を実行します。
この結果、鋳型へパラメータに指定された具を入れて、鋳型どおりのたい焼きt1とt2が焼き上がるわけです。
この考え方からプラトンのイデア論を連想されるのは筆者のみではないでしょう。プラトンのイデア論の説明として「洞窟の比喩」が分かりやすいと思います。
プラトンがイデア論を説明するために考えたちょっと極端なたとえ話です。人間は地下の洞窟に住んでいて、入り口に背を向けて、首と両足をしっかり縛られている。生まれたときからずっとこんな状態だから、洞窟の奥の壁しか見えないし、外の世界は見たことがない。
「奇妙な情景の例え、奇妙な囚人たちのお話ですね」
「われわれ自身によく似た囚人たちのね」
洞窟の住人には後ろから照らされた人形か何かの影しか見ることができない。その影が、住人の後ろに存在する実体の影にすぎないということが分からないわけです(図2)。
あるとき1人の住人がとらわれの身から解放され、後ろを振り返り、いままで実体と信じていたものが影にすぎないことに気付きます。「お前が以前見ていたのは、愚にもつかぬものだった。しかしいまは、お前は以前よりも実物に近づいて、もっと実存性のあるものの方へ向かっているのだ。前よりも正しく、ものを見ているのだ」。次に洞窟の外に出ますが、最初はまぶしくて何も見えません。そのうちに目が慣れてくると地上世界が見えてきます。本物の動物や植物を目にし、その美しさに感動します。いままで見ていた黒い影が世界のすべてだと思っていたのに、こんなにカラフルで生き生きした別の世界が本当はあったのだと気付きます。
けれども、その次に彼は疑問を抱きます。「この動物や花はどこから来たのだろう」彼は、空の太陽を仰いで、洞窟では火が影絵を見せていたように、太陽が花や動物に命を与えているのだと考えます(図3)。
現実世界にあるものはすべてイデア世界にその原型があり、人間が見ているものはすべてその一種の影みたいなものにすぎないと、プラトンは考えました(【参考文献】プラトン「国家」藤沢令夫訳、岩波書店)。
洞窟の比喩をオブジェクト指向で考えてみましょう。
(a) 洞窟内のモデル→(図2)
人形=クラス、影=インスタンスです。ここで影を生成するのは人形の後ろにある火です。Javaスタイルで考えるなら、クラスのコンストラクタにnew演算子を施すとインスタンスができるわけですから、火の光がnew演算子に当たるわけです。
インスタンス = new コンストラクタ
人形の影 = 火の光 人形のコンストラクタ
(b) 洞窟外のモデル→(図3)
モデル(a)から類推します。動物や花=インスタンスです。動物や花を生成するのは太陽です。動物や花のクラスに該当する何かがイデア界に存在するはずだという考え方です。
動物や植物など = 太陽の光 動物や植物などのコンストラクタ
このコンストラクタがないと、つまりクラスがないと地上の万物の存在はないという考え方です。
影は完全なものではない。形もさまざま。でも何かの共通点があるならその元となる型があるはず。洞窟の内と外2つのモデルのメタモデルとでもいうべきモデルは、影と型、流れ去るものと不変なものとの関係といってもよいと思います。
クラスが先かインスタンスが先かという鶏と卵の議論ですが、ここでは問題を(1)人間の認識論、(2)世界観の2つに分けて考えてみましょう。
(1)人間の認識論
人間は何か具体的なもので初めて見るものは何とか理解してからそれを一般化、抽象化するのが普通です。個々の具体的なものはオブジェクトで、それを抽象化したものがクラスです。つまり認識の順序としてオブジェクトが先でクラスは後というのが自然です。
いったんクラスのイメージ出来上がると、認識は楽です。具体的なオブジェクトを見て、自分が持っているクラス・ライブラリと照らし合わせれば、そのインスタンスとして理解できます。生まれて初めて見たものに対してはクラス・ライブラリがないわけですから理解は簡単ではありません。理解できれば新たなクラスとして自分のクラス・ライブラリに追加されます。
(2)世界観
プラトンのイデア論による世界観はクラスが先に存在するというものです。オブジェクトが存在するためには、それをインスタンスとするクラスが存在しなければならないという考え方です。人間の認識論がオブジェクトが先でクラスは後だからといって、世界もそのようになっている必要はありません。イデア論では、鶏がこの世に存在するということはイデア界に鶏のイデアが存在しなければならないわけです(図4)。
今回はまずプラトンのイデア論について、オブジェクト指向の視点から考えてみました。次回はアリストテレス編の予定です。アリストテレスは師であるプラトンのイデア論を認めようとしませんでした。鶏は卵から生まれるものであり、鶏のイデアから生まれるなどということはとうてい認められません。ものの本質は目に見えないイデアの世界にあるのではなく、そのものの中にこそ存在するという考え方です。続きは次回。
河合昭男(かわいあきお)
大阪大学理学部数学科卒業、日本ユニシス株式会社にてメインフレームのOS保守、性能評価の後、PCのGUI系基本ソフト開発、クライアント/サーバシステム開発を通してオブジェクト指向分析・設計に携わる。
オブジェクト指向の本質を追究すべく1998年に独立後、有限会社オブジェクトデザイン研究所設立、理論と実践を目指し現在に至る。ビジネスモデリング、パターン言語の学習と普及を行うコミュニティ活動に参画。ホームページ「オブジェクト指向と哲学」 。
『JavaデベロッパーのためのUML入門』(監修)。著書は『まるごと図解 最新オブジェクト指向がわかる』『まるごと図解 最新UMLがわかる』(共に技術評論社)、『明解UML−オブジェクト指向&モデリング入門』(秀和システム)。
Copyright © ITmedia, Inc. All Rights Reserved.