ホーム < ゲームつくろー! < オブジェクト指向設計編 <オブジェクト指向って何だ?

その1 オブジェクト指向って何だ?


 そうなんです。多分昨今のプログラマのほぼ全員が「オブジェクト指向って何だ」?っと思う時期があるのです。今更感は拭い切れないのですが、それがもやもやとしているので自分がその考え方でプログラムしているかどうかも良くわからない。そこでオブジェクト指向設計編第1回は、オブジェクト指向そのものについて見ていくことにします。



@ 比較検討で定義するオブジェクト指向

 そもそも論で恐縮ですが、「指向 (orientation)」って何でしょうか?

大辞泉 : ある方向・目的に向かうこと。また、方向や目的を指示してその方に向かわせること。志向。
大辞林 : ある目的を目指して向かうこと。志向。

 「指向」とは「何らかの指針を示してそこへ向かわせる」という意味合いのようです。これを踏まえてデジタル辞典を見てみます。

 オブジェクト指向をアスキーデジタル辞典で調べると、

ソフトウェア開発の考え方のひとつ。データ定義と処理内容を1つのオブジェクトとして収め、ソフトウェアはオブジェクトに処理ルーチンを呼び起こすメッセージを送る形で記述する。(Macintosh用語辞典)

とありました。また、

プログラムコードとそれに付随するデータをひとまとまりの単位として管理し、プログラムの論理的な構造化を図るプログラミング技法の1つ。(Glossary Help)

というのも載っていました。IT用語辞典e-Wordsでは、

ソフトウェアの設計や開発において、操作手順よりも操作対象に重点を置く考え方。
 関連するデータの集合と、それに対する手続き(メソッド)を「オブジェクト」と呼ばれる一つのまとまりとして管理し、その組み合わせによってソフトウェアを構築する。
 すでに存在するオブジェクトについては、利用に際してその内部構造や動作原理の詳細を知る必要はなく、外部からメッセージを送れば機能するため、特に大規模なソフトウェア開発において有効な考え方であるとされている。
 データやその集合を現実世界の「モノ」になぞらえた考え方であることから、「オブジェクト」指向と呼ばれる。

とありました。

 これら説明に共通する言葉(意味合い)がいくつか出てきています。

・ ソフトウェア開発・設計・プログラミング技法の考え方の1つである
・ 関連のあるデータとそれに対する処理(手続き、プログラムコード)を一まとまりとして管理する。それを「オブジェクト」と呼ぶ
・ メッセージを送ることでオブジェクトの処理ルーチンを呼び出す。その形式でソフトウェアを記述・構築する。

これらのことから、オブジェクト指向とは?の答えはこうなりそうです。


Q: オブジェクト指向とは?
A:
「データ」と「処理」を一まとめにした「オブジェクト」同士がメッセージを送って相手の処理ルーチンを呼び出す形式でソフトウェアの開発を行っていく方法論及び考え方




A オブジェクト指向の主体は「名詞」!

 オブジェクト指向とそうでない従来の構造化プログラミングとでは何がどう違うのか?これはわりと明確で、構造化プログラミングが「機能(動詞)」を作るのに対して、オブジェクト指向プログラミングが「機能のある物(名詞)」を作ります。「歩け」を作るのではなくて、「歩く物」を作り、歩く機能を持たせる。これがオブジェクト指向です。

 1つ例を考えてみました。

「身長160cmの人の歩幅を得る」

 これを実現する従来の構造化プログラミングとオブジェクト指向プログラミングの比較をしてみました。各行で作業を対応させています。

構造化プログラミング オブジェクト指向プログラミング
・ 行動モジュールに歩幅を計算させるWalkLength関数を作る 人を表すPersonクラスを作り、Personオブジェクトを生成する
・ WalkLength関数が要求する身長を含めた人を表すデータを用意する。 ・ PersonクラスのSetLength関数で身長を160cmと設定する
WalkLength関数に人のデータを渡す PersonオブジェクトのWalkLength関数呼び出す
・ 関数内で引数の情報から歩く歩幅が計算される ・ 関数内で保持しているデータから歩く歩幅が計算される
・ 一歩進んだ時の歩幅が返される ・ 一歩進んだ時の歩幅が返される

 両方の方法で同じ結果を求めることは可能です。まず、構造化プログラミングでは、最初に歩幅を計算させるWalkLength関数を生成しています。そして、関数が要求するデータ(身長を含め計算に必要なデータ)を全てそろえ、関数の引数にそれを渡します。関数は引数の情報を元に歩幅を計算して答えを返します。

 一方オブジェクト指向プログラミングの方は、最初に人を表すPersonクラスというオブジェクトの設計図を作っています。次に、そのクラスを基にして人オブジェクト(インスタンス)を生成します。オブジェクトはすでに初期値を持っているのですが、SetLength関数を使って身長を160cmに設定し直します。次にPersonクラスで定義されているWalkLength関数を呼び出します。関数の内部では保持されているデータから歩幅が計算され返されます。

 両者の違いは2点あります。1つ目の違いは、前者がデータを外から与えるのに対して、後者は内部のデータを利用するという点です。これはデータの持ち主の違いを表しています。構造化の方が「関数を呼ぶ側」がデータを持っており、オブジェクト指向は呼ばれたオブジェクトがデータを持っています。2つ目の違いは、ユーザが生成するものの違いです。構造化プログラミングでは「関数」を生成しますが、オブジェクト指向プログラミングでは「クラス」を生成します。関数と言うのは「○○する」という機能を持ったものですから、これは動詞的なものを作る方法論であるのに対し、クラスは「物の設計図」であり、物という名詞的な物を作る方法論です。

 名詞である物を作り、それを関連させていくというのがオブジェクト指向の基本であり真髄です。頭を名詞的に切り替える。この感覚がとても大切なのです!!



B なぜオブジェクト指向なのか?

 オブジェクト指向というのはプログラミングの方法論の1つですから、別に何でもオブジェクト指向にする必要はありません。実際科学計算では、目的が限定的であり、また速度を重視する目的から今でも構造化プログラミングが活躍しています。しかし、世の中オブジェクト指向が主流です。これは何故なのでしょうか?

 これは色々な見方があるので確定した正解は無いと思うのですが、私が思うに「目の前の複雑な問題を混乱せずに解決しやすく、変更に強い」からかもしれません。一般に、複雑な問題を解決するプログラムと言うのは大規模になります。ゲームは超がつく大規模プログラミングと言ってよいでしょう。そういうプログラムで大切なのは「わかりやすさ」です。キャラクタをプレイヤーの指示通りに歩かせる場合、キャラクタデータをすべてそろえてWalk関数に渡すのと、オブジェクトに対して「歩け」と命令するのと、どちらが楽かは言うまでも無いでしょう。3人のキャラクタがモンスターに向かって戦いを挑むときに、それぞれのキャラクタに相手となるモンスターオブジェクトと攻撃方法を設定して「攻撃」といえばそこに勝手に向かって戦ってくれる。これをプレイヤー側が全てのキャラクタのデータと敵キャラクタの情報を集めてFightToMonster関数に渡すのは、もう大変でしょうね。シミュレーションゲームとなると、時に数千のキャラクタ1つ1つの情報を管理する必要があります。各キャラクタのヒットポイントや攻撃力、守備力などをグローバルな領域に配列として定義するのと、キャラクタオブジェクト1つ1つに設定するのと、どちらが安全で扱いやすく感じますでしょうか。このように、オブジェクト指向は「データ」と「処理」を一まとめにするという発想により、プログラムを非常にわかりやすいものに変えてくれました。また「物」という塊の関連性を記述することでシステムを構築することができるようになったので、その管理とともに拡張性・柔軟性も高めてくれます。

 間違ってはいけないのは、オブジェクト指向で無いと出来ないプログラムはありません。構造化言語でも、アセンブラでもマシン語でも、同じ動きをさせることは可能です(コンパイラを通れば最終的にはすべてマシン語です)。つまり、C++やJavaなどのオブジェクト指向を組める言語の「技術」がすぐれているのではなくて、その「考え方」そのものが優れているのです。ですから、オブジェクト指向をやるんだと意気込んで、クラス、継承、多態性など言語の使い方をマスターしてその気になっていてはいけません。正直、そんなものはその気になれば1週間で覚えられます。本当に優れたプログラミング能力というのは、オブジェクト指向の考え方にそって目の前の問題を解決できる能力です。つまり、沢山の問題に触れて、オブジェクト指向でそれを解決して、実際に動くプログラムを作る。これを繰り返すことが、素晴らしいプログラマになる必須事項なんだと思うわけです。



C 問題解決の方法が満載された書物が欲しい!

 オブジェクト指向の書籍は沢山あります。しかし、私が持っている書籍は、どれも方法論や記述論の説明にページを割いているために、ケーススタディーが少ないように思えます。オブジェクト指向について私たちが本当に知りたいことは、「こういう問題はこう解決する」という「例」ではないでしょうか?方法論の知識を学んでも、目の前に問題があると私たちは絶対に悩んで足踏みします。実学の無い知識はあっさりと破綻するもんです。その時、もし師匠がいて、素晴らしい解決方法を見せてくれれば、弟子は感動してそれを真似し、そしていつの間にか自分の力としてオブジェクト指向を応用できるようになっていくはずです。そう、書籍は師匠たるべきなんです!

 もし、オブジェクト指向による問題解決を中心とした書物をご存知の方がおられましたら、是非紹介して頂きたく思います。○×でも「オブジェクト指向設計編」において様々な問題を定義し、それを解決する筋道を立てながら、ケーススタディーを膨らませて行きたいと思います。もちろん、私もプロではありませんので、間違った設計をすることもあるかと思いますが、その時はどうぞやさしくご指摘下さい(^-^;

 次回はケーススタディその1として、超有名なプログラム「Hallo World !」の表示をオブジェクト指向で設計してみます。