本題
オブジェクト指向は、以下前半の理念に従って、後半のメリットを享受することを目指します。
1. オブジェクト自身に関して「抽象化」した操作のみを「定義」し、具体的な挙動を変更したときの影響を最小限に抑える。
2. 「責務」に従って「適切」にオブジェクトを分割し、それらを組み合わせて大きな機能を容易に作る。
基本的にこれだけです。
前説
やたら「クラスが〜」、「継承が〜」といった説明からされるオブジェクト指向ですが、本質的にクラスや継承は無関係です。
「犬が〜」「猫が〜」「動物が〜」といった説明もよく使われますが、これもオブジェクト指向の本質を説明するのには無ていません。
それよりも目指す方向を覚えたほうが理解しやすいと思うので、この説明を書きました。
1に関して分かった気になれるイメージ
「道端に人が倒れている」とき、どのようなことをするでしょうか。
多くの人は消防署に電話をかけると思います。
オブジェクト指向でいうと、「消防署」がオブジェクトにあたり、「電話を受ける」が抽象的な操作にあたります。
では、抽象に対する具象はどのようなものでしょうか?
例えば、「佐藤さんが電話を受ける」がこれに該当するでしょう。
逆の話として、「佐藤さんを指名しないと救急車が呼べない」のであればどうでしょうか。
- 電話を掛ける人は救急担当が佐藤さんだと知っていなければならない
- 佐藤さんが退職されて鈴木さんになる場合、知っている人全員に告知して回らなければならない
ことになり、電話を掛ける人も消防署も手間がかかることが容易に想像できると思います。
オブジェクト指向が抽象的な定義を要求するのは、ここに理由があります。
内部の事情を外部が知らなくても利用でき、また内部の都合で挙動を変えられるように 「可能な限り振る舞いを隠蔽する」ことがオブジェクト指向の本質その1です。
2に関して分かった気になれるイメージ
(消防署のイメージを引き続き用います。)
消防署はより小さな「部署」に分割され、部署は「人」に分割することが可能です。
部署もまた、「電話を受ける部署」「救急担当の部署」「消防担当の部署」等があり、電話を受けたときに適切に連絡を回してくれるはずです。
このように、「適切に分割された」オブジェクトを組み合わせることでで大きな「消防署」というオブジェクトを実現しているのです。
消防署もまた、「警察」「病院」などと組み合わせることで、より大きな「社会」を実現しています。
逆の話として、分割されていない場合はどうなるでしょうか?
署内の全員が「電話」「救急」「消防」全てを担当すると、覚えることが非常に多くなり、責務が大きすぎて誰がどう動くか混乱してしまうでしょう。
新しい業務を足すときにも、何をすべきか確認するのも一々大変です。
個々は各々の役割に集中できるようにし、「組み合わせてより大きなことを実現する」ことがオブジェクト指向の本質その2です。
総括
この2つは独立したものではなく、
- 適切に分割されている結果、振る舞いを隠蔽することが容易
- 抽象的な操作が定義されている結果、組み合わせることが容易
というように、密接に絡んできます。
設計するときにも同様に、「オブジェクトがどのような責務を持てば容易に組み合わせられるか」といった観点で考えると、再利用性・整備性がともに高いコードになると思います。
補足
じゃあクラスとか継承とか諸々は何なの?って話ですが、上を実現するとき便利なよう、そういう手段が用意されています(なので、言語によってあったりなかったり、別な方向でアプローチしてたり)。
目的ではなく手段から説明されるので、オブジェクト指向が分かりづらい要因になっていると思います。