表1 解説する主なプログラミング・テクニック
表1 解説する主なプログラミング・テクニック
[画像のクリックで拡大表示]
図1 操作対象となる3つの箱<BR>
図1 操作対象となる3つの箱<BR>
[画像のクリックで拡大表示]

いかに書くか

 プログラムの記述方法であるプログラミング言語に対して,「いかに書くか」というのがプログラミング・テクニックです。本連載では,表1に示すさまざまな領域のプログラミング・テクニックに踏み込みます。

 表1にあるコーディング・スタイルは,プログラムの書き方の細かい部分,例えば変数名の選び方や,関数の書き方などを含みます。
 アルゴリズムは問題を解決する手順のことです。世の中にはさまざまなアルゴリズムが知られています。プログラムはアルゴリズムの具体化と言っても過言ではありません。

 いくつかのアルゴリズムは,自分の力だけで考え出すのは 困難です。例えば,配列要素を大きさの順に並べ替えるソートのアルゴリズムは数多く知られていますが,既存のアルゴリズムを全く知らなければ高速なソートは実現できないでしょう。アルゴリズムはしばしば特定のデータ構造を伴います。かつて「プログラミングとはアルゴリズム+データ構造である」と断言した偉い人もいるほどです*3

 デザイン・パターンとは,ソフトウエア設計に際して利用できるデータ構造などの設計ノウハウに名前を付けて,カタログ化したものです。アルゴリズムやデータ構造も広い意味ではデザイン・パターンに分類できます。有名なものが23個あります*4

 開発手法は,プログラムを開発する時の設計方法,開発プロジェクトの運用方法なども含むプログラム開発プロセス全体を指します。小規模な開発時にはあまり意識に上ることはありません。しかし,開発するプログラムの規模が大きくなり,関連する人員が増加すると,なんらかの開発手法の導入が必要になります。

オブジェクト指向プログラミング

 次に,Rubyの基本原理である「オブジェクト指向プログラミング」について考えてみましょう。オブジェクト指向は「オブジェクトをベースとした考え方」を指す用語で,1960年代後半にスウェーデンで開発されたSimulaというプログラミング言語が発祥だとされています。Simulaはシミュレーション用のプログラミング言語で,シミュレーションに登場する「もの」を表現するためにオブジェクトという考え方を導入しました。例えば交通シミュレーションでは,車や信号がオブジェクトになります。これらの,いわば「登場人物」の振る舞いを定義できるよう,個々の登場人物を「オブジェクト」,登場人物の種類を「クラス」として表現するという現在のオブジェクト指向の基礎となる概念が登場しました。

 その後,1970年代から1980年代前半にかけて,米Xerox社のパロアルト研究所(PARC)でSmalltalkという名前の言語が開発されます。Smalltalk-72,Smalltalk-78を経て,Smalltalk-80に至ってSmalltalkは一応の完成を見ました。このSmalltalkが現在のほとんどのオブジェクト指向言語に大きな影響を与えており,オブジェクト指向言語の母と呼んでもさしつかえないと思います。

 それから,Simulaからの直接の影響が色濃いC++,「より良いC++」という性質も持つJavaなどが登場し,現在広く使われているプログラミング言語の大半がなんらかの形でオブジェクト指向機能を持つようになっています。

 いまやオブジェクト指向はプログラミングにおける常識になりつつあり,今後その重要性が下がることはちょっと考えられないと思います。プログラミングを学ぶにあたって,オブジェクト指向という考え方を理解することは大変重要なのです。

 しかしながら,プログラマを目指す人々の中には,「オブジェクト指向は難しい」とか,「なかなか分からない分からない」という印象を持つ人が多いようです。そこで今回から数回かけて,オブジェクト指向という考え方,オブジェクト指向プログラミングというプログラミング・テクニックについて,丁寧に解説してみようと思います。

オブジェクト指向の難しさ

 オブジェクト指向の難しさはどこにあるかというと,「イメージがつかみにくい」という点と「例を挙げて説明されると,分かった気になる。しかし,実際に使おうとするとどうしたらよいのか分からない」という点にあるような気がします。

 前者は「オブジェクト指向」というのが考え方を表現する単語で,非常に抽象的であるためでしょう。人間は概念が抽象的になればなるほど理解するのが難しくなりますから,抽象的な「オブジェクト指向」という概念を把握するのが困難なのでしょう。しかも,「オブジェクト指向」という概念は人によって微妙に定義が異なっており,厳密な定義がないのも問題です。

 今回は,「オブジェクト指向」の概念全体の解説は後回しにして,まず「オブジェクト指向プログラミング」に集中することで,この点を避けたいと考えています。

 「説明を分かった気になっても使えない」という点に関しては,平易なたとえと実際のプログラミングとの間の差が大きすぎるのが原因ではないでしょうか。今回は,Rubyという簡単にオブジェクト指向プログラミングを実践できる言語を選択することで,たとえと実例の間を埋めようと考えています。

 もう一つ重要な点は,「オブジェクト指向プログラミング」と一言で表しても,実際には複数のプログラミング・テクニックが集まっていることです。複数のテクニックをいっぺんに理解しようとすると,なかなか難しいので,一つひとつ分解して考えてみましょう。

 個人的な意見ではオブジェクト指向プログラミングを構成するテクニックの中で最も重要なテクニックは「ポリモーフィズム」あるいは「多態」と呼ばれるものです。今月はまずポリモーフィズムから解説します。