オブジェクト指向プログラミングのメリット・デメリット

プログラミングの基礎勉強を終えた方が、次のステップアップとして
「オブジェクト指向」の習得を選択されることがございます。
皆さんの参考になればと思い、数十年前
私がオブジェクト指向プログラミングを学んだ時に感じたことを少し
お話させていただきます。

オブジェクト指向プログラミングのメリット

実装のアイデアがあって、「What」から「How」への変換作業をプログラマーは
コードという形で表現します。
オブジェクト指向の利点で感じたことは「What」から「How」のギャップが非常に少ないと思いました。
「何をしたい」ということを正直に書けば、いつの間にか「How」が作れる感じです。

手続き型言語の場合、「何をしたい」から「どうするか」までがギャップが多く
低レベルの関連の処理が多く混じり、プログラムも長くなります。

オブジェクト指向の場合
『「A」という値を得るために「B」を処理して「C」を処理して「D」を処理して・・・・』
の積み上げが必要なくなります。

コードリーディング時に、深みにはまらなくて済むので楽ですね。

オブジェクト指向ベースで実装を考えるようになってからは、
「なにをやりたい」「どうやりたい」が非常に近くなった気がしました。

クラスの命名規則が順守されているプロジェクトでは
クラスライブラリを駆使することにより、処理の詳細を知らなくても済みます。
つまりプログラムを追いかける際に、処理内部まで『知る必要がない』ことを意味します。
これは、スマフォを使うのに中身の回路図を理解する必要がないのと同等の意味です。

ここは、大変重要なポイントです。

なぜなら、クラスが公開しているメソッドの仕様さえ押させておけば
あとは忘れることができるからです。

人間の脳のワーキングメモリーは大きくありません。
いま現在、我々の世界プログラミングコードは、とてつもなく巨大だからです。

プログラマにとって「パターン認識」と、調査ポイントを絞れることが
とても重要なスキルとなります。

初学者が膨大なソースコードの波に飲まれて挫折してしまう1番のポイントは
汎化させたソースコードの構造パターンに触れる経験が、圧倒的に少ないことが原因の
1つと私は考えます。

つまり、プロとアマの境界線がここにあるとも言えます。

オブジェクト指向プログラミングのデメリット

抽象化を導入すると、「何やっているか」は理解できるのですが「どうやっているか」が分からない
ことが多くなります。

オブジェクト指向の実装は、プログラマーのスキルにもかなり依存します。

様々なプロジェクトで様々な方々と仕事をしてきましたが
オブジェクト指向を使うための前提条件を理解していない人が多いようにも感じます。

仕様書から「C言語」で実装した場合、誰がプログラミングしても大体同じコードになりますが
「java」「c#」「c++」などは人によりコードの内容がかなり異なります。
これは組織にコーディング規約があっても同じことが言えます。

オブジェクト指向が不要なケース

オブジェクト指向の利点として、硬くて柔らかいものを作ることができます。
パーツとして使うだけなら硬さだけがあれば十分なのですが
拡張して機能を追加する場合、柔らかさが必要になります。
極論すれば、今後の改修で硬いものだけを組み合わせる場合は、オブジェクト指向は不要です。

今後改修が入らない場合、例えば使いきりのアプリケーションの場合であったり
保守でお金が取れないケースなどは、コストをかけてオブジェクト指向で実装するメリットが
ありません。