世の中のいわゆるプログラマ、システムエンジニアと呼ばれる人たちのうち、オブジェクト指向を本当に理解して実践できる人はほとんどいません。私のこれまでの経験では5%くらいがいいとこかな、という実感です。要するにプログラマをどっかから20人かき集めてきたら、その中に1人くらいわかってる奴がいればラッキーという事です。もちろんプロの世界での話ですよ。
プロのくせに勉強が足りない!と言ってしまえばそれまでで、実際問題それはその通りだと思います。思いますが、教える側にも問題はあります。きちんと他人に教えられる人があまりに少なすぎるんですよね。
考えてみれば当たり前で、本人がわかってるのと、それを他人にも伝えられるのとは別の話で、わかってる人が5%しかいないなら、その5%のうちの何%が他人にうまく説明できるかって考えれば、全体の1%にも満たないわけですね。
プログラミングの初級〜中級者レベルの人が初めてオブジェクト指向を勉強しようとする時に、大抵の場合まずは「オブジェクト指向入門」とかいうタイトルの本やサイトなどを探す訳ですが、このレベルの人に理解できるようにオブジェクト指向をやさしく解説している記事はほとんど見たことがありません。
オブジェクト指向とは、現実世界の物理的あるいは抽象的なモノや事象を、属性と操作の集合としてモデリングすることです。
オブジェクト指向ではオブジェクトの振る舞いをメソッドとして定義し、オブジェクト同士が相互にメッセージを交換する事によりシステム全体の振る舞いを決めていきます。
はぁ?
こういう文章を書く人は、入門レベルの人間がこれを読んで「なるほど!」と納得できると、本気で思ってるんでしょうか。
難しい事を難しく説明するのは、実はそれほど大変なことではありません。難しいことを如何に易しくわかりやすく説明するかの方が、よっぽど大変で頭を使います。さらに言うと、オブジェクト指向はここまで難解な日本語を使わないと説明できないほど難しい概念ではありません。
結局こういうのは簡単な事をわざわざ難しく説明しているだけで、こんな説明をいきなりされるもんだから、オブジェクト指向はきっと物凄く難しくて特殊な考え方なんだろう、と勘違いしてしまう人が多いのだと思います。そして中途半端にわかったようなわからないような(結局のところ本質は何もわかってない)状態にさせられるプログラマのなんと多いことか。
でそのまま実際のオブジェクト指向言語での開発現場に突っ込まれてソース修正とかやらされる訳ですよ。ところがソースを見てみると思ったよりどうって事もなく、それまでのプログラミング知識で別にどうにかなりそうだなって感じで、わかった気になってそのまま数年経ったら・・・はい、ヘボプログラマがまた一人生産されましたっていう結末です。
プロジェクトに放り込まれた時にあなたが見たそのソースは、今のあなたと同じようなヘボい先輩方が書いたもんだから、それをお手本にしちゃったあなたもヘボくなってしまい、そんなあなたの書いたソースをお手本にしている新人君は未来のヘボプログラマ候補で・・・というように、ヘボプログラマ量産スパイラルが出来上がってしまっているのが現状ではないでしょうか。
そこで普段初心者の方を相手にプログラミングを教えている経験から、『要するにこういうこと』っていうオブジェクト指向の考え方を、なるべくわかりやすい日本語で説明してみたいと思います。
オブジェクト指向設計をああだこうだと深く議論していくと、手段と目的がわかんなくなっちゃう人が時々います。
『こういう場合はAdapterパターンを使って、このクラスをこういう風に継承させて、コイツはこのインターフェースを使うようにして、そんでもってホレホレ・・・』と複雑怪奇なクラス図を描きだします。
どちらかというと勉強熱心でなおかつ自分はイケてるエンジニアだと思ってる人に多いですね。確かにある点では優れている部分もあるし全くダメダメではないんだけど、それにしても、ねぇ・・・ちょっと難しすぎんだよなぁ。そこまでこねくり回さなくても、もっとシンプルにできるじゃん。
というような事を言うと『お前はデザインパターンも知らんのか』などとバカにしてきたりして。
これってあんたの自己満足が8割だろ?て感じで、クラス設計そのものが目的になっちゃうパターンにはまる事があるんですよね。
オブジェクト指向の目的は、同じ処理を複数の箇所に分散させない、処理する範囲を明確に切り分ける、などにより結局のところバグや仕様変更に強い、メンテナンス性の高いシステムを作るためのものであって、オブジェクト指向そのものは単なる手段でしかありません。
そんなわけで基本中の基本となる概念の部分を中心に説明します。実はその部分こそがオブジェクト指向の超チョ〜大事なところで、そこがわかってないで、アクセス制御だとかインターフェースだとかの文法的な知識だけなもんだから、オブジェクト指向の本質がわからない人ばっかりなのだと思うのです。