オブジェクト指向とは何なのか考え抜いてみました。
オブジェクト指向の概要
用語の位置づけ | プログラミング(プログラム設計)の手法 |
用語の意味 | オブジェクトへのメッセージ送信でプログラミング(プログラム設計)を行うこと |
なぜ使われるのか | 1.手続き型プログラミングより自然な考え方になるから 2.プログラミング言語の機能によるサポート次第でより便利になるから 3.設計の工夫で良質なプログラミングが可能になるから |
オブジェクト指向の解説がわかりにくくなっているのは、「オブジェクト指向自体の解説」と「オブジェクト指向をより便利にする言語機能の解説」と「オブジェクト指向でよりよいプログラミングを行うための手法の解説」がごっちゃになって行われているからだと思います。オブジェクト指向自体は「オブジェクトへのメッセージ送信でプログラミング(プログラム設計)を行うこと」でしかありません。
オブジェクト指向の位置づけ
オブジェクト指向の位置づけをまとめてみました。
プログラミングの手法 | |||
---|---|---|---|
命令型プログラミング | 宣言型プログラミング | ||
手続き型プログラミング | 関数型プログラミング | 論理プログラミング | 制約プログラミング |
オブジェクト指向プログラミング |
上から下に派生していると考えてください。 ここで注目すべきは、オブジェクト指向は命令型、そして手続き型の流れを汲んでいるということです。(※宣言型の方はあまり詳しくないので間違っているかもしれません)
命令型から手続き型へ、そしてオブジェクト指向へ
プログラミングの一番シンプルな手法は命令型プログラミングです。命令型プログラミングはプログラムを命令の羅列と捉えます。それを発展させたのが手続き型プログラミングです。手続き型プログラミングの「手続き」とは命令の羅列のかたまりのことです。手続きを呼び出すという手法によってより良質なプログラミングが可能になりました。そしてオブジェクト指向はそれをさらに発展させたものと考えることができます。オブジェクト指向における「メッセージ」は「対象付きの手続き」とと捉えることが出来ます。
オブジェクト指向+αでメリットが出てくる
手続き型プログラミングはそれ自体ではちょっと便利くらいな手法です。しかしそこに構造化プログラミングの考え方を取り入れることでより良質なプログラミングが可能になりました。同じように、オブジェクト指向もそれ自体のメリットはプログラムを人間が理解しやすくなった程度のものです(これだけでも相当大きなメリットですが)。そしてそこにオブジェクト指向を元にしたプログラミング言語の機能や設計手法を取り入れることで、より良質なプログラミングが可能になっていきます。
そして、一般的にオブジェクト指向の解説でよく行われるのはその「オブジェクト指向を元にしたプログラミング言語の機能や設計手法」の部分です。それらは良質なプログラミングに必要なものですが、オブジェクト指向の一部と捉えると混乱してしまうかもしれません。いや、実際にもうそれらは世間一般的にはオブジェクト指向なのかもしれませんが、理解が難しいのであれば一旦それらをオブジェクト指向+αの部分であると意識すると理解しやすくなるかもしれません。
(おまけ)良質なプログラミングとは何か
良質なプログラミングとは、実装、変更、拡張がしやすいプログラムまたは設計のことです(持論です)。実装しやすいというのはバグが生まれにくいというのも含まれます。オブジェクト指向に限らず、プログラミングに関するさまざまな手法や機能などは、この「良質なプログラミング」のために存在しています。よくわからない概念や機能が出てきたときは、それによってどのように「良質なプログラミング」に繋がるのかを考えることと、それらの概念や機能の存在意義を理解することが出来ます。