「オブジェクトを指向してみる/何故インスタンスを作るの?」の続き、ってことで。
元ネタのみながわさんのコラムでは、次のように書かれています。これを考察してみましょう。
実はオブジェクト指向ってしっくりこないんです!(システムエンジニア 生き残りの極意)より:
オブジェクト指向は、結局のところホントにモノ(オブジェクト)に使われている記法、例えばGUI コンポーネント、データベース、ファイルなどであって、プログラムのアルゴリズムとは無関係のものである。
ふむ。確かに、「オブジェクト」って、なんでしょう?
引用したところには、「例えば GUI コンポーネント、データベース、ファイルなどであって、プログラムのアルゴリズムとは無関係
」と書かれています。これ、「プログラムのアルゴリズムとは無関係」に、強く、興味を持ちました。はたして、無関係なのでしょうか。
とりあえず、この時点では、無関係ではないと思います。
では、“アルゴリズム”って、なんでしょうか。ここから始めましょう。「アルゴリズム:プログラムを作るときに用いる、問題を解決するための手順・計算方法。◇アラビアの数学者アル=フワリズミにちなむ。もと、算用数字を用いた筆算の意。(明鏡国語辞典)」だそうです。さて、オブジェクト志向は「プログラムの手順」とは関係がないのでしょうか。関係がないとすると、どの様に関係がないのでしょう。
その為にはまず、「オブジェクト志向言語」において、「オブジェクト」とされる物は、いったいなんでしょうか。
私は、「データと、それを扱うための手続きを組み合わせたもの」だと思います。
我々は、現実に発生している問題を解決するために、コンピューターの中に問題を投影し、プログラミング言語等を用いて問題を解決する方法を組み立てます。つまり、「会員名簿の管理」であったり、「勤怠情報の管理」であったり、「写真に写っている人を判別する」であったり、「宇宙船の姿勢を制御する」であったりという問題を解決するためにコンピューターを使います。そこには、「処理するべき情報」が存在しています。そしてその情報には、「処理されるべき手順」が存在しています。この、「処理すべき情報」に対して「処理すべき手順」を見つけ出し、ひとまとまり(パッケージ)にして扱うことが、「オブジェクト指向処理」(勝手用語)だと考えます。
「オブジェクト志向プログラミング」と、「プロセス志向プログラミング」の違いは、何に志向するか、意識や思考を向ける対象にあるのではないでしょうか。プロセス志向では、「為すべきこと」を為す手順に志向します。オブジェクト志向では、「為すべきこと」に関係するオブジェクトに志向します。従って、プロセスに志向しながら、オブジェクトを使うことはできないのではないでしょうか。ただし、オブジェクト志向では、「情報と、その操作手順」がオブジェクトですから、最終的には、プロセスにも志向しなければなりません。
では、なぜ、オブジェクトに志向する、すなわち、情報と、その操作手順をパッケージするのでしょうか。
私が最初にオブジェクト志向言語に触れたのは、当時在籍していた課でオブジェクト志向言語を扱う最初、または2番目の事案でした。そして課長が、こう尋ねました。「オブジェクト志向って、どんなもん?」。まだ触って間もないので、「どう?」と聞かれて困ったのですが、こう返答しました。「メンテナンスがし易いようにするためのものだと思います。最初に時間をかけて設計して、後のメンテナンスが楽になるようにするものだと思います」。この感想は、今でも変わっていません。オブジェクト志向が、情報と情報を扱う手順をパッケージするのは、プログラム(あるいはシステム)のメンテナンスをし易くするためと考えます。
プログラム(あるいはシステム)の「メンテナンス期間」とは、なんでしょうか。ここでは、「最初のリリースが終わってから、プログラム(あるいはシステム)が破棄されるまで」とします。あるいは、「最初のビルドが終わってから…」でも良いかもしれません。
つまり、オブジェクト志向ナントカとは、一度動くようになってから後の仕様変更に対して、如何に対応し易くするかを考えたナントカである、と考えます。
では、どうして、パッケージ化すると、仕様変更に対して対応しやすくなるのでしょうか。
たいていの場合、仕様変更は、扱う情報の変更を伴います。オブジェクト志向分析がなされ、オブジェクト志向設計がなされているなら、変更が起こった情報を特定しやすくなります。また、その情報を扱う方法は、他の情報からは独立しているはずですから、情報処理手順の変更による影響を、他の情報へ伝播させにくくなります。他の情報や、情報処理方法が、他の情報を変更したことによる影響を受けないのなら、修正の範囲は小さくなり、テストの範囲も小さくて済みます。これらの範囲が小さいと言うことは、工数の減少にも繋がります。
実際に、このような設計を行うには、かなりの経験が必要だと思います。しかし、特に Java や .NET Framework では、用意されているフレームワークにあるクラスが、高度に抽象化されています。これによって、使う人がオブジェクトに志向しなくても、オブジェクト志向言語を使ったプログラミングができてしまいます。
「オブジェクト志向言語を使ったプロセス志向プログラミング」と、「オブジェクト志向プログラミング」。この二つは、混同してはいけないと思います。
投稿日時 : 2010年6月19日 22:29