オブジェクト脳

こんにちは

ついこないだまで、オブジェクト指向プログラミングなんてイラナイ、構造化プログラミングで十分と思っていたが、オブジェクト指向プログラミングになれるにつれ、構造化プログラミングには戻れなくなってしまった。

構造化プログラミングは、入力・加工・出力を処理として行うモジュールというものを組み合わせてプログラムを構成するという考え方にマッチしている。だから、その考え方のままオブジェクト指向を考えると、なにやらややこしい気がしてしまう。その上、本などで猫だの犬だの動物だのをオブジェクトの例えとして考えるから、なにやら全く異質なものと感じてしまう。

オブジェクト指向では、入力・加工・出力というモジュールを組み合わせるという考え方ではなく、処理も入力・加工・出力という流れになっていない。入力だけ、出力だけ、加工だけ、がバラバラになっている。しかも、データを入力してデータを出力するというのではなく、データはオブジェクト自体が持っていて、そのデータを必要な部分だけ外部から変更したり、取り出し足りといったことしかしない。

それは何を意味しているか。従来の構造化プログラミングは、工場のラインで、データを製品のようにどんどん加工していって、工場に運び込んだ原料を製品化していくような流れで考えられていた。すなわち原材料は次々と加工され、別の部品と組み合わさり、最終的な製品となっていく。処理は、道具に過ぎず、自分で道具を使って加工していく様に似ている。かなづちやドリルだけでなく、車を運転したり、パワーショベルを使ったりといったものを使うようなものだ。

一方、オブジェクト指向はそういう考え方ではない。オブジェクト指向とは、サービス指向とでも言った方が分かりやすい。要するに、サービスを組み合わせて何かを成し遂げるという考え方だ。自動販売機でジュースを買ったり、電車やバスに乗ったり、ATMを利用したり、デジカメで撮った写真をデジカメプリントの機械で出力したり。実体はそこにあり、自分にはない。自分は何かのリクエストをし、そのサービスを受けるに過ぎない。サービスを組み合わせて1つの何かを成し遂げる。

オブジェクト指向の何がよいのか。構造化プログラミングは、オブジェクト指向のサービス主義に対して、自前主義だ。何もかも自分でやろうとすると、その操作を知らなければならない。操作は複雑になり、さまざまなテクニックも要求される。だが、サービスを受けるだけなら、たいした知識は必要ない。世の中の構造的にも、何もかも自前でやるというのは、あまり現実的ではなく、現代では人はサービスを受けるのに慣れている。

例えば、構造化プログラミングとオブジェクト指向プログラミングを比較するなら、車で目的地まで行くのと、電車を使って目的地まで行くのとの違いが言える。自分で運転するなら、どの道を通るべきか事前にルートを知っておかなければならず、自分で運転しなければならない。電車で移動するなら、乗り換えポイントを知っていればいいし、電車を自ら運転する必要がない。もちろん車の人は電車じゃ遠回りだとでも言うかもしれない。場合によっては電車の方が遠回りになる。オブジェクト指向でもだいたい処理効率は落ちるし、無駄も多い。だが、電車は子供でも乗れるが車は大人しか乗れないように、そこには要求される知識が大きく違う。さらに、車だけでなく、飛行機やクルーザーも必要ならどうだろう?自分で、飛行機やクルーザーを運転するのはたやすいものではない。だが、乗せてもらえばそれは難しくはない。

オブジェクト指向とは、サービスを作りあげ、それを利用したり、自らもサービスを作ったりして、出来ること出来ないこと、面倒なことをお互いに分担し合って処理していく方法論である。現代の人々の暮らしが豊かになったのは、サービスが充実しそれを容易に利用出来るようになったからに他ならない。何でも自前でやろうとするのは、無人島で自給自足で暮らすようなものだ。

もちろん、オブジェクト指向は万能の杖ではない。使い方を誤れば、作るのに難しいだけでなく、システムは複雑化しメンテナンス不能にもなる。また、オブジェクト指向で作れば何でも良くなるわけでもなく、例えば、Javaのプログラムでは、オブジェクト指向でプログラムされていてもフタをあけてみたら、構造化プログラムを無理矢理組み込んだケースもある。また、使う場所も選ばなければならない。場合によっては、構造化プログラミングの方が優れているケースも多々あるのだ。何であれ大事なのは正しく使うことであることは言うまでもない。

ではまた