「オブジェクト指向」と言うと、「なんでオブジェクト指向を使うの?」という素朴な疑問への答えが、あまりないので書いておく。
さて、
たとえば、今、あなたは小さな商売(駄菓子屋とか)を始めたとしよう。
初めは一人で全部の仕事をする。 仕入れから店番から帳簿付けまで。
そうするうちに、商売繁盛、ドンドン忙しくなって、24時間働いても、仕事が終わらない・・・。
仕事を誰かにしてもらう
その場合の解決策は、「人を雇う」こと。
普通の人間社会では人を雇うと「お金が掛かる」が、「ここ」は不思議な世界で、人を雇ってもお金が掛からない。
必要な時に「誰か来て!」と言うと、いくらでも来てくれて、不要になるとサッといなくなってくれる、ステキな人たち。
小人(もしくは妖精)とかロボットみたいなものだと考えよう。
「あなた」の仕事は、小人を管理すること
あまりに忙しいので、小人を5人雇ったとしよう。
それぞれ、店番/仕入れ/帳簿/料理/洗濯係だ。
あなたの仕事は「小人を管理すること」だけ。
それぞれの小人に「○○しといてね~」とお願いすれば、「どのように処理されるか」は考えなくて良い。
基本は何もせず、小人たちが何か報告してくれば、それに対応すれば良いわけだ。
「構造化プログラミング」と「オブジェクト指向」
「構造化プログラミング」は、一人で全部やっていた状態。(状態A)
小人の導入は「オブジェクト指向」である。(状態B)
状態Aの場合、あなたの机の上に全ての必要なものが、全部乗っかっている。(帳簿やら、サンプルやら、なにやらで、机の上がゴチャゴチャ)
状態Bでは小人たちの机の上に、それらの物があるので、あなたの机の上はスッキリ!
小さいシステムの場合、「構造化プログラミング」でもOK。 わざわざ、小人を作る手間が掛かるからね。
でも、ある程度大きいシステムの場合、全部を自分一人でやると、ゴチャゴチャになる。 よって、小人を雇って、それぞれの小人に任せればよい。
小人を使って「オブジェクト指向」を説明する
「クラス」というのは型で「オブジェクト」というのは実体。(オブジェクトは「インスタンス」とも呼ぶ)
- クラス = 型
- オブジェクト = 実体
小人は「クラス」で、小人のジョンは「オブジェクト」。小人のホルヘも「オブジェクト」。
- クラス = 小人
- オブジェクト = ジョン
- オブジェクト = ホルヘ
小人という「クラス」を一回作っておくと、ジョン/ホルヘ/マーク/リンダ・・・、と無限に小人のオブジェクトを作れる。
- 小人クラス →【生成】→ ジョン(オブジェクト)
- 小人クラス →【生成】→ ホルヘ(オブジェクト)
- 小人クラス →【生成】→ マーク(オブジェクト)
さて、ジョンは「店番係の小人」、ホルヘは「仕入れ係の小人」だ。 この場合、「小人」のクラスからジョンやホルヘを作るよりも、「店番係の小人」「仕入れ係の小人」というクラスを作って、それからジョンやホルヘを作った方が良い。
- 店番係の小人クラス →【生成】→ ジョン
- 仕入れ係の小人クラス →【生成】→ ホルヘ
どうしてかというと「店番係の小人」がもっと必要になった場合、「店番係の小人」クラスを使って、「店番係」のマークとか「店番係」のリンダがすぐに作れるから。
- 店番係の小人クラス →【生成】→ マーク
- 店番係の小人クラス →【生成】→ リンダ
継承
「小人」クラスから、「店番係の小人」クラスや「仕入れ係の小人」クラスを作ることを、「継承」と呼ぶ。
- 小人クラス →【継承】→ 店番係の小人クラス
- 小人クラス →【継承】→ 仕入れ係の小人クラス
「店番係の小人」「仕入れ係の小人」は、「小人」としての特徴を持つから、まず「小人」クラスを作った方が楽なわけだ。
そして、小人の特徴が変わった場合、たとえば小人が進化して「空を飛べるようになった」場合、 「小人」クラスを変更すると、「店番係の小人」のジョンも空を飛べるようになる。
カプセル化
「帳簿係の小人」マリアに帳簿を渡したため、あなたの机の上はスッキリ。帳簿を読むのはマリアだけだ。
こういう風に、それぞれのオブジェクト(マリアなど)に、データを渡してしまうことを、カプセル化と呼ぶ。
帳簿は誰でも読み書きできるよう(public)にしても良いし、マリアだけが読み書きできるよう(private)にしても良い。
普通はマリアだけが読み書きできよう(private)にする。誰かが勝手に帳簿を書き換えたると困るからね。
「メソッド」
マリアに、「今月の売り上げ出して~」とか「四半期の結果を集計して~」とか命令する。 あなたは帳簿を読む必要はない。読んで集計するのは「帳簿係」のマリアの仕事だ。
これをメソッドと呼ぶ。 必要なメソッドは用意しておく。「今月」「四半期」「通期」のボタンがあって押すと結果が出てくるみたいな感じ。
まとめると
「オブジェクト指向」は一見難しいが、実は大したことは無い。 人間でも仕事が多いと、多くの人に分担する。
同じように複雑なシステムを「構造化プログラミング」だけで書くと、ゴチャゴチャになってくる。
「オブジェクト指向」は、誰かに任せる(特定のオブジェクトに任せる)ことで、分担しているだけの話。 実際の設計でも「各オブジェクトを小人だ」と思うと、設計しやすい。