OOPのメリット

昨日の日記でOOPのメリットを説明している記事を見かけたことないと書いたが、少し考えてみて思い出した。
私が良く見るサイト掲示板で、OOPのメリットは、以下の2つであると書かれていたのを思い出した。


マルチプルインスタンスとは、k.maebashiさんの造語であるが、あるクラスを定義すれば、いくらでもインスタンスを簡単に増やせるとか、インスタンスごとに状態を表すデータ(インスタンスデータ)を持てるということだと思う。
これは、OOPのメリットとして十分説得力のあるものだと思う。ここでは、少しそのことについて考えてみる。


C言語オブジェクト指向言語を比較してみよう。汎用的な処理を書くときに、ユーザが定義したデータをどう扱えばよいのかを考えてみる。昨日の「ユーザデータを伴うライブラリ的(サプライヤ側)処理」の部分だ。


通常、Cでは、処理を抽象化するには、関数化して、データを引数で受け取ることにより行う。しかし、2つの異なるデータ(構造体のデータ)を引数で受け取るときに、2つを同一扱いすることはできない。工夫すれば確かにできるが、それはあくまでも通常の方法ではない。すると、データを抽象化できるOOPというのは、明らかに大きなメリットである。上記の「ユーザデータを伴うライブラリ的(サプライヤ側)処理」が1つのデータではなく、複数のデータに対応(つまり、あるインタフェースを実装したデータに対応)できる。これは明らかに大きなメリットだ。


マルチプルインスタンスに関しては、通常の方法でもCでも実現できなくはないが、OOPの方が書き方が楽である。また重要なのは、複数のインスタンスを作れるということよりもメモリ管理(GC)の方である気もするのだが、もちろん重要でない訳ではない。ただ、私はCとの違いを理解していない。書きやすさを除いて、機能的にはCでも普通に実現できるので。但し、コンストラクタやデストラクタの存在は大きいと思うのだが。


コンストラクタもそうだが、私は個人的には、データのリストがあった時に、複数のデータを扱う処理よりも、1つのデータを扱う処理を複数回適用するのが可読性も高いし、再利用性も増すと思う。しかし、この方法のデメリットは、例えば、後者の処理の塊を関数化すると、関数呼び出しのオーバーヘッドが大きくなることである。C++のインライン化で回避できるかもしれないが、他の言語では通常は回避できないことが多い。
これは、最近個人的にPythonでも色々テストしているのであるが、やはり前者の方法(単純にforでまわす)方がパフォーマンスは良い。


結論としては、OOPのメリットは抽象化が非常に多きいと思う。それ以外でもこまごまとしたところは色々あると思うが、本質的には、OOPの良いところは、データの抽象化のみではないかと思う。
しかし、動的言語になるとデータの抽象化はもっと進むので、普通に処理(関数)を書くだけで、OOP的なプログラムを書いているということになる。