オブジェクト指向を考える──普遍の知識オブジェクト指向の世界(25)(1/2 ページ)

オブジェクト指向を語るうえでポイントとなるのは、「ものの本質」に関する考え方だ。今回はプラトンとアリストテレスの思想を引き合いに「ものの本質」を考えてみよう。

» 2008年08月22日 12時00分 公開
[河合昭男,(有)オブジェクトデザイン研究所]

 前回「UML2メタモデルを読む − 知識とは何か?(2)」まで、UML2メタモデルを題材にして「知識」とは何かについて考えてきました。UML2仕様で定義されるモデル要素の語彙(ごい)の幅と深さを段階的に拡大していく仕組みは、次の2つでした。

継承および多重継承の仕組みを用いて親の特性を引き継いで、名前の異なる新たな要素を追加して語彙の幅を広げていく

パッケージのマージを用いて、同じ名前の要素の意味付けを拡張し、語彙を深めていく

 この方法は、われわれ人間がそうとは意識せずに自分の知識を広め、深める方法を暗示させるものです。

 今回は、オブジェクト指向とは何であるかについて、あらためてじっくりと考えてみたいと思います。そこには、何か普遍の知識があるはずです。

前提知識の積み上げ

[登場人物]

  • ソクラテス
  • ソクラテスの弟子筋の某
  • UMLの勉強を始めた開発者
  • 司会

司会 UML2の仕様書を読み始めたのですが、かなり難解です。

開発者 なぜこんなに複雑なんでしょう。もっと簡単明瞭にできないものでしょうか?

 言葉の厳密な定義というものは、とても難しい。厳密性と分かりやすさはトレードオフだ。厳密性を追究するなら、数学のように議論のベースとなる定義からスタートしなければならない。仕様書は、分かりやすさよりも厳密性を採る。UMLもそれを目指しているが、やはり前提知識を仮定せざるを得ない。

司会 オブジェクト指向にとって最も基本概念である「クラス定義」について、UML2のメタモデルをもう1度見てみましょう。“Class”は、UML2仕様書の中で何カ所も定義されています。その中でも最も基本的であり、最もシンプルな構造となっている“InfrastructureLibrary”の“Core”の“Basic”パッケージを見てみましょう。ここではまだ“Classifier”は定義されていません。

ALT 図1 Infrastructure::Core::Basicより

開発者 「クラス」とは何かと調べると、「クラスはインスタンスとしてオブジェクトを持つタイプ(の一種)※1である」(Infrastructure version 2.1.1 "10.2.1 Class")とあります。では、その「タイプ」とは何か。「タイプ付き要素のタイプとして使用される名前付き要素(の一種)※1である」(Infrastructure version 2.1.1 "10.1.4 Type")とあります。「名前付き要素」とは「名前を持つ要素(の一種)※1である」(Infrastructure version 2.1.1 "10.1.3 NamedElement")とあります。最後に、「要素」とは「モデルの構成要素である」(Infrastructure version 2.1.1 "10.1.2 Element")とあります。


※1(の一種)は汎化関係であることを強調するために筆者が追加したものです。


司会 このように、継承の仕組みを用いて新たな要素を付加していく仕組みは確かにシンプルで厳密なのですが、人間が理解するのは大変です。前提知識をすべて理解していないと、次に進めません。

 「何々の一種です」といわれても、その「何々」を知らなければ理解できない。それが延々と続けばまったくお手上げだ。

司会 実に知識とは積み上げだということですね。


参考文献(UML 2.1.1仕様書)

オブジェクト指向とは

ソクラテス さて、今回はオブジェクト指向について説明してもらいたい。“object oriented”とは、一体何なのか?

開発者 オブジェクト指向という言葉は、プログラミング技術から始まりました。かつてプログラムは、一連の手続きとして書かれていました。そこから1歩進んで、関数の集まりとしてプログラムが書かれるようになり、さらに進んでオブジェクトの集まりとしてプログラムを作成する技法が編み出されました。これがオブジェクト指向と呼ばれるものです。

司会 もともとは、プログラミング技法なのです。

開発者 プログラマにとって身近なのは、JavaとかC++などのオブジェクト指向プログラミング言語です。仕様書の記述法として使われるUMLも、オブジェクト指向モデリング言語です。

司会 これらの共通点は何でしょう?

開発者 オブジェクト指向でない従来の開発ツールと比べて一番大きな相違点は、クラスという概念が表現できることです。例えば、C言語は関数の集まりとしてプログラムを構築しますが、JavaやC++はクラスの集まりとしてプログラムを構築します。従って、設計書もそのように記述しなければならないので、UMLが必要になってきます。

ソクラテス そのクラスとやらは、どんなものか?

開発者 クラスは、インスタンス生成のテンプレートです。1つのクラスから、インスタンスという実体はいくつでも生成できます。それらはすべて、クラスに定義されている共通の特性を持っています。

ソクラテス それは面白い。つまり、クラスこそが本質的存在で、インスタンスという実体はその影というわけだ。

 私が補足しよう。クラスの発想は、プラトンが唱えた「イデア」の考えに似ている。この地上世界(感覚で知ることのできる世界)は、どこかにあるイデア界(感覚で知ることのできない世界)の投影にすぎない。実体の本質はイデアにある。

司会 つまりオブジェクト指向に当てはめると、クラスをイデアと考えれば、インスタンスはイデアの影。プログラマはクラス=イデアを作り、プログラムを実行するとそのイデアの写し絵として、インスタンス=実体が生成される──。

ソクラテス オブジェクト指向のベースは、クラスに始まると分かった。それは、その後どのように発展してきたのか?

司会 プログラマにとってのオブジェクト指向の特徴は、カプセル化、継承、多態性などにありますが、テクニカルな話はちょっと置いておき、モデリングのレベルで考えましょう。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ