Object Oriented Approach

オブジェクト指向とは開発手法の1つ(比較的新しいもの)です。
歴史をたどると、構造化プログラミング、データ中心アプローチ、
そしてオブジェクト指向と歩んで来ています。

オブジェクト指向というと新しくてカッコイイというイメージが
あるため、現在では多くの場面で使われていますが、
オブジェクト指向にも弱点はあり、使い方を誤ると、
かえって開発生産性やメンテナンスビリティが悪くなります。
そしてそうなっているシステムが少なくないと感じられます。

長所1 多機能

オブジェクト指向プログラミングは、その思想によるものだけでなく、
近年のプログラミング技術を数多く取り入れているため、
多機能であり万能であると言えましょう。
・カプセル化
・継承
・ポリモーフィズム
・ダイナミックバインディング

長所2 カプセル化

計算処理などの機能を中心とした構造化プログラミング、
データベース設計を重視するデータ中心アプローチ、
そしてそれらをハイブリッド化したものが、
オブジェクト指向のカプセル化です。
関連する機能とデータをカプセル化して1つのオブジェクト
とすることで、機能のメンテナンス性やデータの完全性を
確保できます。

長所2 クラスとインスタンス

カプセル化技術を使って、関数がクラスへと進化しました。
クラスが真価を発揮するのは、複数のインスタンス(実体)を
イベントドリブンで(実行時のイベントにより)発生させるシステムです。

例えば、マルチタスクOSで新しいウィンドウを開くときなどは、
ウィンドウクラスを使って新たなインスタンスを作成すれば、
簡単かつ安全にマルチウィンドウを実現できます。

クラスの機能がなかった時代は、アプリケーションがシステムコールで
動的(実行時)に、新たなメモリ領域を確保して、それを
新しいウィンドウに割り当てる。そしてウィンドウが閉じられた
ときにはそのメモリ領域を解放する、という複雑な処理が必要で、
メモリリーク(メモリの解放忘れでメモリの空き容量がだんだん
減っていく)や、メモリ例外(まちがったアドレスにアクセスする)
といったバグが発生しやすいものでした。

短所1 複雑なプログラムになりがち

多機能であるがゆえに、不必要にいろいろな機能を使ってしまい、
プログラムが非常に複雑になる可能性があります。
コピペプログラマーの世代が、内容をあまり理解せずに、
他のシステムを真似してプログラミングすると、
非常にわかりにくく、開発生産性の悪いシステムになることが
少なくありません。

短所2 人材確保にコストがかかる

多機能なツールを熟練で優秀な技術者が用いると最高の結果を
得ることが出来ますが、そのような技術者を育てたり外から確保
したりすることは簡単ではありません。

短所3 開発生産性のボトルネックになりやすい

大きなビジネスモデルを1つのオブジェクト(クラス)
で実装してしまうと、ちょっとした機能追加でも、
そのクラスをメンテナンスする必要が出てきて、
複数のメンテナンス要件を並行して
開発することが難しくなってしまいます。
(そのクラスモジュールの開発待ちになる)

使いわけ

社会システムのような大きなシステムで、
機能とデータの完全性が求められるシステムは、
オブジェクト指向でより良い設計をすれば、長年に渡って、
安全性と開発メンテナンスビリティを得られることが出来るでしょう。

しかし、どんなシステムでもオブジェクト指向が向いているとは言えません。
例えばデータを内部に保つ必要のない汎用的な計算機能は、
関数の方が向いているとも言えます。

プログラミング経験が短い若手の開発者がローテーションで
メンテナンスするような社内システムは、あまりオブジェクト指向を
使わないほうが、プログラム構造の理解がわかりやすく、
結果的に開発生産性や品質が向上すると言えます。