オブジェクト指向の「わかりやすい」たとえ話

「オブジェクト指向」と言うと、イマドキのITエンジニアの常識ではあるが、「なんでオブジェクト指向を使うの?」という素朴な疑問への答えが、あまりない。

そこで、簡単に説明する。

たとえば、今、あなたは小さな商売(駄菓子屋とか)を始めたとしよう。

初めは一人で全部の仕事をする。 仕入れから店番から帳簿付けまで。

そうするうちに、商売繁盛、ドンドン忙しくなって、24時間働いても、仕事が終わらない・・・。

仕事を誰かにしてもらう

その場合の解決策は、「人を雇う」こと。

普通の人間社会では人を雇うと「お金が掛かる」が、「ここ」は不思議な世界で、人を雇ってもお金が掛からない。

必要な時に「誰か来て!」と言うと、いくらでも来てくれて、不要になるとサッといなくなってくれる、ステキな人たち。

小人(もしくは妖精)とかロボットみたいなものだと考えよう。

「あなた」の仕事は、小人を管理すること

あまりに忙しいので、小人を5人雇ったとしよう。

それぞれ、店番/仕入れ/帳簿/料理/洗濯係だ。

あなたの仕事は小人を管理することだけ。

それぞれの小人に「○○しといてね~」とお願いすれば、「どのように処理されるか」は考えなくて良い。

基本は何もせず、小人たちが何か報告してくれば、それに対応すれば良いわけだ。

「構造化プログラミング」と「オブジェクト指向」

「構造化プログラミング」は、一人で全部やっていた状態。(状態A)

小人の導入は「オブジェクト指向」である。(状態B)

状態Aの場合、あなたの机の上に全ての必要なものが、全部乗っかっている。(帳簿やら、サンプルやら、なにやらで、机の上がゴチャゴチャ)

状態Bでは、小人たちの机の上に、それらの物があるので、あなたの机の上はスッキリ!

小さいシステムの場合、「構造化プログラミング」でもOK。 わざわざ、小人を作る手間が掛かるからね。

でも、ある程度大きいシステムの場合、全部を自分一人でやると、ゴチャゴチャになる。 よって、小人を雇って、それぞれの小人に任せればよい。

小人を使って「オブジェクト指向」を説明する

「クラス」というのは型で「オブジェクト」というのは実体。

小人は「クラス」で、小人のジョンは「オブジェクト」。小人のホルヘも「オブジェクト」。

小人という「クラス」を一回作っておくと、ジョン/ホルヘ/マーク/リンダ・・・、と無限に小人のオブジェクトを作れる。

さて、ジョンは「店番係の小人」、ホルヘは「仕入れ係の小人」だ。 この場合、「小人」のクラスからジョンやホルヘを作るよりも、「店番係の小人」「仕入れ係の小人」というクラスを作って、それからジョンやホルヘを作った方が良い。

どうしてかというと「店番係の小人」がもっと必要になった場合、「店番係の小人」クラスを使って、「店番係」のマークとか「店番係」のリンダがすぐに作れるから。

※ オブジェクト = インスタンス だと思ってよい。

継承

さて、「小人」クラスから、「店番係の小人」クラスや「仕入れ係の小人」クラスを作ることを、「継承」と呼ぶ。

「店番係の小人」「仕入れ係の小人」は、「小人」としての特徴を持つから、まず「小人」クラスを作った方が楽なわけだ。

そして、小人の特徴が変わった場合、たとえば小人が進化して「空を飛べるようになった」場合、 「小人」クラスを変更すると、「店番係の小人」のジョンも空を飛べるようになる。

カプセル化

「帳簿係の小人」マリアに帳簿を渡したため、あなたの机の上はスッキリ。帳簿を読むのはマリアだけだ。

こういう風に、それぞれのオブジェクト(マリアなど)に、データを渡してしまうことを、カプセル化と呼ぶ。

帳簿は誰でも読めるようにしても良いし(public)、マリアだけが読めるようにしても良い。(private)

普通はマリアだけが読めるようにする。(private)

メソッド

マリアに、「今月の売り上げ出して~」とか「四半期の結果を集計して~」とか命令する。 あなたは帳簿を読む必要はない。読んで集計するのは「帳簿係」のマリアの仕事だ。

これをメソッドと呼ぶ。 必要なメソッドは用意しておく。「今月」「四半期」「通期」のボタンがあって押すと結果が出てくるみたいな感じ。

飽きてきたので、まとめる

「オブジェクト指向」は一見難しいが、実は大したことは無い。 人間でも仕事が多いと、多くの人に分担する。

同じように複雑なシステムを「構造化プログラミング」だけで書くと、ゴチャゴチャになってくる。

「オブジェクト指向」は、誰かに任せる(特定のオブジェクトに任せる)ことで、分担しているだけの話。 実際の設計でも「各オブジェクトを小人だ」と思うと、設計しやすいで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA