皆さんこんにちは。
うらです。

世の中には今、オブジェクト指向についての書籍が数えきれないほど出ていたり、ネットで検索しても数多くの解説サイトがヒットしたりするように、様々な方向からの説明が試みられています。
それだけ「オブジェクト指向」という考え方は難しいものだとも言えますし、概念をはっきりとつかみきれなくて解説を求める人も多いということなのだと思います。

また本やサイトによってそれぞれ説明の仕方も色々ですし、あれこれと読んだ挙句、結局あやふやなままでよく分からなかった、という初心者の方も多いのではないでしょうか。

その原因はいくつかあるでしょうが、1つには「説明する時に、比喩をやたらと使いすぎる」ということがあるように私は思います。

例えば、私が以前読んだある参考書には、「クラス」の概念について 『たい焼きの金型=クラス、焼きあがった各々のたい焼き=インスタンス』 のように書かれていたことがありました。別にこの説明も間違ってはいないと思いますが、この説明で完全に理解できる人はどのくらいいるでしょう?
そもそもこれは「構造体」の説明にも当てはまることですし、プログラムをちょっとかじったことのある人は逆に混乱してしまうかもしれません。

また「継承」や「汎化」の概念を説明しようとして、『猫』や『犬』、『ライオン』といったクラスから『動物』のようなスーパークラスを置いて、そこから各々のサブクラスに継承させると便利、というような説明もあちこちでよく見かけます。
ですが、実際に私たちがシステムを構築する際に、このように綺麗に継承関係を作れるケースはめったにないですし、そもそも『動物』なんていうクラスがシステム上で本当に必要かどうか、これだけだとよく分からないのではないでしょうか?
※例えば、『動物園シミュレーション』を作る場合なら実際に「ライオン」や「キリン」などのオブジェクトは登場するだろうと思われますが、逆にこれらの動物以外のオブジェクトはほとんど登場しないことも予想がつくので、わざわざ「動物」などというスーパークラスを作るメリットはあまりないだろうと思われます。。


また、別の原因としては「JavaやC++、PHPといった、オブジェクト指向言語に偏った説明をしてしまう」ということもありそうです。

上で挙げた「継承」の概念や、あるいは「ポリモーフィズム(多様性)」などのテクニックは、本やサイトによってはあたかも「オブジェクト指向の特徴」などと解説されていますが、実際には使いこなせば便利な『言語の機能』ではあってもオブジェクト指向の本質、必須事項ではありません。(これらを使っていなくても「オブジェクト指向に沿った」システムは普通に作れます)


こういったことは、実は「プログラミング」の側からオブジェクト指向という概念にアプローチしているために起こりがちな、回り道のようなものだと思います。オブジェクト指向は初めに書いたように面倒で取っ付きにくいものですし、じゃあなぜわざわざ難しい考え方を持ち込むのかというと、それは『分析や仕様検討、基本設計がやりやすくなるから』なのですね。つまり、プログラミングよりもむしろ「分析、設計のために便利な考え方」なのです。


オブジェクト指向とは何か、ということを言葉で表すと、結局は「システムや物事をオブジェクト本位で考える」ということになります。じゃあオブジェクトって何よ?といえば、これは「データや手続き(処理)を1まとめにしてくるんだもの」です。

この、データと処理をまとめた固まりをオブジェクトとして、システムは「オブジェクトがいくつも組み合わさって出来上がったもの」と考えると、システムの大まかな設計を考える時に、それぞれのオブジェクトは『個別の小さな部品』になるので、部品ごとに別々に検討したり作ったり、ということがやりやすくなるわけです。

また、あるオブジェクトに注目している時には、別のオブジェクトについては「期待したように動いてくれる(はずの)他所の部品」として考え、他所のことにはあまり深く首を突っ込まないようにするのがオブジェクト指向でシステムを考える時の原則です。(参考書などでは「カプセル化」という言葉で説明されています)

全体を一度に考えようとすると、話が広がりすぎて収拾がつかなくなったり、注意が散漫になってあちこちで矛盾が起きたりすることが多いので、部品ごとに分けて個別で考えた方が整理がしやすいのですね。


ということで、オブジェクト指向についての概要を、システム設計の観点から説明してみました。
次回はもう少し具体的な例を挙げながら、オブジェクト志向で行くとどんな良いことがあるのか、を見て行きたいと思います。