突っ走り書き

見せるほどのものでは..

【暫定版】「オブジェクト指向とは何か?」

2012年の11月頃からJavaを勉強し始めたので,気付けば2年が過ぎてました.
Javaを触ると避けて通れないのが,「オブジェクト指向」です.
2年前に使えたのはC言語だけだったので,

という疑問が生まれていろいろ調べるわけですが,しっくりくる答えが見つからなかったのを覚えています.
2年が経って,オブジェクト指向に関する知識が少しずつ増えてきました.
ここで一度,「オブジェクト指向とはなにか?」に対する意見をまとめておこうと思います.

まずは,オブジェクト指向ではないもの

オブジェクト指向を説明するのはとても難しいですが,

を挙げることは比較的簡単です.

デザインパターン

Javaオブジェクト指向と言ったら,デザインパターンもセットで付いてきます.
ただ,「デザインパターン=オブジェクト指向」は間違いです.
デザインパターンオブジェクト指向がもたらした成果です.
よって,デザインパターンオブジェクト指向そのものではありません.

モノ=オブジェクト/操作=メソッド

オブジェクト指向は次のように説明されることがあります.

  • 現実世界の「モノ」をプログラム上の「オブジェクト」に
  • 現実世界の「操作」をプログラム上の「メソッド」に

これは間違いではありませんが,オブジェクト指向のすべてを説明していません.
例えば,デザインパターンにおける Strategy パターンは,問題解決の戦略(≠モノ)をオブジェクトにしています.
オブジェクト指向では,「オブジェクト」にできるものは「モノ」に制限されません.

(現時点での)オブジェクト指向とは

で,ここからが本番です.
現時点では,「オブジェクト指向」を次のように理解しています.

  • 変化しにくいものに依存すること

だいぶ抽象的な表現ですが,むしろ抽象的な意味付けがオブジェクト指向の適用範囲の広さを示しています.

先の Strategy パターンで言えば,

  • 「ある問題を解決をする」ということは変わりにくい
  • ただ,「問題解決の仕方(=戦略)」は変わりやすい

と分析して,プログラムを設計していると言えます.

変化しにくいものに依存するために

プログラムの中に「変化しないもの」は存在しません.
要件は常に変わるものだからです.
よって,オブジェクト指向を用いたコードを書くには,

  • プログラム中で「変化しにくそうなもの」は何か

を「予想」しなければいけません.
これをオブジェクト指向分析(OOA: Object Oriented Analysis)と言います.
個人的には,オブジェクト指向よりもオブジェクト指向分析の方が大事なものだと思います.
「やり方」より「考え方」のほうが大事ってヤツです.

若干話が発散気味ですが,これが現時点でオブジェクト指向に対して思うところです.
何か新たな発見があったときは,また書きたいと思います.