オブジェクト指向プログラミングを理解するためのちょっとした知識について
「オブジェクト指向プログラミング」は大切な概念ではあるが、今ひとつ理解にしにくい概念である。なぜ理解し難いかといえば、「オブジェクト指向プログラミング」と言う言葉は殆どの場合、「手続き指向プログラミング」との対比において、初めて意味を持つからである。
よって、「オブジェクト指向プログラミング」そのものを単体で勉強しても今ひとつピンと来ない。多くのテキストや教本は、「手続き指向プログラミング」との対比をすっ飛ばし、「オブジェクト指向とは何か」から勉強するので分かりにくいのである。
勉強しなければならないのは、2つの指向のちがいである。
それでは、2つを対比してみよう。
純粋なオブジェクト指向 | 純粋な手続き型 |
---|---|
メソッド | 関数(サブルーチン) |
オブジェクト | モジュール |
メッセージ | 呼び出し |
メンバ | 変数 |
(出典:Wikipedia)
これを見ると、プログラム上、どちらかだけにあるというものはない。オブジェクト指向プログラミングと、手続き指向プログラミングは、見た目においてはあまり変わらないのである。
では、この2つの間の決定的なちがいは何か。
一言で言えば、「オブジェクト指向」は、オブジェクトの中身を、その外から触ることが出来ず、「手続き指向」は、モジュールの中身を外から触ることができる、というちがいである。
実際、「オブジェクト指向」と言う概念は、「プログラムの中身を外から触ることができないようにするために生まれた」のである。
例えばあるオブジェクト Hogehoge を作ったとする。オブジェクト指向ではオブジェクトの中に入っているメンバやメソッドは外部から守られる。メンバが持つ値は、特定のインターフェースを通じてのみ行われ、勝手に値を変えられたりすることはない。
しかし、手続き指向プログラミングにおいてあるモジュール Hogehoge を作った時、手続き指向では内部の変数や関数は守られない。どこかで同じ名前を持つ変数が定義されたり、勝手に外部の関数が、内部の値を書き換えてしまうかもしれない。
そのため、手続き指向は、大きなサイズのプログラムになればなるほど、どこでバグが発生するか、わからなくなってしまいがちである。「こんなところからアクセスされていた、気付かなかった」ということが、内部の変数や関数を守れない以上、ありえるのだ。
Javaなどで、グローバル変数、すなわちpublicかつ、staticな変数を作ってはいけない、と教えられるが、要はこのような変数を使うと、「オブジェクト指向プログラミング」の意味が無いからなのである。
この点を理解していると、オブジェクト指向プログラミングにおける、ポリモーフィズムやオーバーライドなどの考え方も、すんなり理解できるようになる。