2006年11月29日水曜日

オブジェクト指向の真価とは

現在、開発によく使われる言語としては、Javaや.Netが代表的なものとしてあります。
これらに特徴的なのは、オブジェクト指向ということです。

その昔、システム開発に使用されていた言語はCOBOLやCでした。Javaや.Netはこれにとってかわったわけですが、1つには、オブジェクト指向というものが、それまでのプロセス指向の開発言語よりも優れていると理由付けされることが多いです。
オブジェクト指向は、生産性やメンテナンス容易性の面で、それまでの言語よりも優れているそうです。

ところで、これは本当にそうなのでしょうか?開発言語がオブジェクト指向になることでどこまで開発生産性が向上しているのかなどのデータってどこかにあるのでしょうか?

実際この比較は難しいかもしれません。というのも、言語としてJavaを使用しているがとてもオブジェクト指向とは呼べないつくりのものもあれば、C言語でうまく設計され生産性や再利用性の高いプログラムもあるからです。

言うまでもないことですが、どんな言語を使うにしろ、生産性や再利用性を高めるためにはそれを意識した設計が重要です。
しかし、そういった大事なことが無視されてJavaや.Netなどの言語が使用されているのを見かけることがあるのは残念です。

オブジェクト指向の真価については、たとえば、小飼弾さんのブログに解説があります。

オブジェクトは難しくない。難しいのはクラス
Typeとは俺のことかとClass言い

自分なりに理解すると、、、

プロセス指向言語では"関数"を中心に設計された。言語と比較して言うならば、オブジェクトは名詞であり、関数は動詞である。日常使う言語では、名詞はものの数だけ存在するが、動詞はけっこう共通化して使っている。たとえば、犬も"走"れば人も"走"る。この2つは主語となっている名詞は明らかに違うものを指すし、現象を自然現象として見てもかなり違うにもかかわらず、人間の認識=言語化としては"走る"で共通である。
プログラム言語においても動詞(=関数)は共通化したい意識が働く。つまり、生産性を高めるために共通関数を作りたくなる。ところが、関数は引数にとるデータの型(や構造体)によって処理が異なるため違う名前の関数を作らざるをえない。違う名前の関数ということはすなわち異なる関数であり、共通化できていないことになる。データの型(や構造体)ごとに関数を作っていると生産性や再利用性は低下してしまう。
オブジェクト指向であれば、名詞の数だけオブジェクト(を抽象化したクラス)を作ることは人間の感覚として自然である。その上で動詞に当たるメソッドはポリモーフィズムで共通化できる。"走る"の例で言えば、"犬.走る"も"人.走る"も可能でありかつ処理内容は異なることが可能である。これがプロセス指向言語だと、犬というデータ型に対して"犬走る"、人というデータ型に対して"人走る"という関数を個別に作らないといけなかった。
データやデータの集合に対してその操作(動作)もセットに考えることは普通であり、オブジェクト指向ではそれが可能である。かつ、そのことよりも、うまくクラス、親クラスと抽象化(=汎化)することで、メソッド(=動詞)を共通化させ、長大な名前の関数が氾濫するような生産性の低い設計が抑えられることが重要である。

などなど。

もちろん、エントリの中でも指摘されているように、なにより便利で汎用的なクラス群がたくさん提供されていて、それをオブジェクトとして利用できることが最大のメリットではあります。

こうした便利なクラス群を積極的に活用することが重要ですし、汎化を使ったきちんとしたクラス設計ができていることがなにより重要です。
逆に言えば、そのような設計が活きないようなアプリケーション、たとえば共通の関数(=サブルーチン)をひたすら呼び出して処理するだけのようなアプリケーションでは、オブジェクト指向設計はあまり意味がないとも言えるかもしれません。

何度も言うようですが、生産性の高い設計が目指すべき目標であり、オブジェクト指向はそのための1つの手法でしかありません。ましてや、Javaや.Netは、さらにその手法を実現する1つの手法でしかありません。生産性を高めるために必要であればオブジェクト指向の考え方が取り込まれるべきで、すべてオブジェクト指向でいくべきかとか、Javaで開発するかどうかうんぬんということは二の次のはずです。
もちろん、プロジェクトとしてはスキル要員確保のために、どうしても言語は1種類で済ませたいという重要な要求はあるわけで、それには従うべきですが。

実際、日本に多いカスタムSIのアプリケーションがオブジェクト指向で開発されるとき、どこまでオブジェクト指向が意識されているでしょうか?単に関数呼び出しの感覚でクラスやメソッドを使用していないでしょうか。
Web2.0的世界に生きる優秀なプログラマーには意外かもしれませんが、大手SIerの優秀といわれるエンジニアが企業のアプリケーションを開発するとき、まったくオブジェクト指向の真価を無視した設計がなされていることがけっこうある気がします。もしそうなら残念なことですね。

ところで、オブジェクト指向で生産性を高めるためには、なにもJavaや.Netでなくても、RubyやPerl、PHP、JavaScript (ActionScript)のようなLightweightLangageでも可能です。これからはそういった選択肢も考える必要があるのではないでしょうか?

また、あきらかにオブジェクト指向が適さないアプリケーションも存在しうると思います。たとえば、何万件ものレコード同士をがちゃがちゃ組み合わせて処理をするようなアプリケーションなどでは、SQLでの処理が適していると思います。オブジェクトを何十万〜何百万個も作成して何十分〜何時間も処理を行うのは耐障害性の観点から言ってもあまりよい設計とは言えないでしょう(もっとも、最近はJavaでもJavaバッチという仕組みが考えられたりしているようですが)。

0 コメント:

 
Clicky Web Analytics