WisdomSoft - for your serial experiences.

1.2 オブジェクト指向

オブジェクト指向の概念的な考え方と Java との関係について説明します。

1.2.1 オブジェクトの役割

一般的に、高水準言語は手続き型言語と非手続き型言語に分類されます。

手続き型言語は、命令手順を記述して問題を解決するというアプローチを取ります。C 言語や Pascal、FORTRAN など、多くの開発現場で使われているプログラミング言語は手続き型です。

非手続き型言語は、手順ではなく必要な情報を与えることによって問題を解決しようというアプローチです。人工知能の分野などで用いられる LISP 言語(関数型言語)や、推論機能を持つ Prolog 言語(論理型言語)などがあります。

Java 言語は、非手続き型に属するオブジェクト指向型と呼ばれる言語に分類されます。オブジェクト指向は、非手続き型言語の中では最も有名で、世界中で普及しています。特に、大規模なシステムの開発に適した優れた言語です。オブジェクト指向型の言語は、Java のほかに C++、C#、Smalltalk などが存在します。さらに面白いことに、これらのオブジェクト指向言語すべてが、仮想マシンのアプリケーション開発に利用されている点も注目できます。オブジェクト指向はシステムの抽象化にも優れた威力を発揮しているのです。

オブジェクト指向の特徴は、プログラムの流れではなく、オブジェクトの役割に注目しているところです。オブジェクトは何らかの役割を持つ論理的な存在として考えられ、色、フォント、座標、などの抽象的なものや、ウィンドウ、ボタン、といったユーザーインターフェイスなど、様々な対象を役割ごとに分類し、それらのオブジェクトの関係や動作、属性などを記述します。こうすることで、巨大なプログラムの設計も容易になり、保守や整合性も大幅に向上します。システムは役割ごとに分類して記述されているため、一部の仕様変更が他のコードに与える影響は最小限ですむのです。

継承と抽象化

これまでの時代のプログラマは、プログラムを組む時に流れを意識しました。順番に命令が実行される逐次、条件によって命令が選択される分岐、条件が満たされるまで繰り返す反復、これらがプログラムの最も基本的な考え方で、CPU はこれらの計算を永遠と繰り返しているのです。ところが、オブジェクト指向は、このような流れよりも、プログラムを部品化して独立させることに注目します。

正しく部品化されたプログラムは、他のプログラムコードの影響を受けません。このような状態をプログラムの独立性として評価されます。独立しているプログラムは、他のコードの影響を受けないため、異なる開発で使いまわすことができるようになります。十分にデバッグされたコードを使いまわすことは、ソフトウェアの完成度や生産性に貢献してくれます。年々、コンピュータの発展と共に開発するソフトウェアの規模が大きくなっています。開発者にとって、大規模なプログラムを安全に、しかもすばやく作ることは重要な課題なのです。

オブジェクト指向プログラミングでは、プログラムの部品をオブジェクト(物)として考えます。実行手順ではなく、役割を与えられたオブジェクトを部品として開発し、最終的にオブジェクトを結びつけ、それぞれのオブジェクトが関係しあうことによって目的が達成されます。

オブジェクト指向プログラミングでは、継承、多様性、カプセル化を柱としています。オブジェクト指向を名乗るプログラミング言語であれば、構文や概念に多少の差異があれども、基本的な部分はこれらの概念によって成り立っています。

継承とは既存プログラムが提供する機能を引き継ぎ、拡張することができる機能を指します。これによって、抽象的な特徴から具体的な実装という流れでプログラムを設計することができます。多様性は、目的を達成するための方法にバラエティを持たせる手段です。そして、カプセル化とはプログラムのオペレーションを規制することです。外部に公開する必要のない内部事情のコードを隠蔽し、プログラムを利用する人間に必要なコードだけを公開することができます。

図01 継承と抽象化
継承と抽象化

実世界では猫や犬は哺乳類として分類されています。つまり、これらの生物は哺乳類として定義される性質を継承していると考えることができます。オブジェクト指向では、この実世界の関係のように、猫や犬を哺乳類として抽象化することができるのです。こうすれば、哺乳類を制御するプログラムは相手が猫でも犬でも同じ操作方法で制御することができるようになるのです。

具体的にオブジェクト指向を理解するには、本書を読み進めて Java 言語を学習すれば良いでしょう。実際にオブジェクト指向言語に触れれば、ほとんどの人は本能的にオブジェクト指向の基本概念を理解することができます。