5
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-02-23

「オブジェクト指向」と言うと、「なんでオブジェクト指向を使うの?」という素朴な疑問への答えが、あまりないので書いておく。

さて、

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

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

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

仕事を誰かにしてもらう

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

「クラス」というのは型で「オブジェクト」というのは実体。(オブジェクトは「インスタンス」とも呼ぶ)

  • クラス = 型
  • オブジェクト = 実体

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

  • クラス = 小人
  • オブジェクト = ジョン
  • オブジェクト = ホルヘ

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

  • 小人クラス →【生成】→ ジョン(オブジェクト)
  • 小人クラス →【生成】→ ホルヘ(オブジェクト)
  • 小人クラス →【生成】→ マーク(オブジェクト)

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

  • 店番係の小人クラス →【生成】→ ジョン
  • 仕入れ係の小人クラス →【生成】→ ホルヘ

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

  • 店番係の小人クラス →【生成】→ マーク
  • 店番係の小人クラス →【生成】→ リンダ

継承

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

  • 小人クラス →【継承】→ 店番係の小人クラス
  • 小人クラス →【継承】→ 仕入れ係の小人クラス

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

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

カプセル化

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

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

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

普通はマリアだけが読み書きできよう(private)にする。誰かが勝手に帳簿を書き換えたると困るからね。

「メソッド」

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

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

まとめると

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

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

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

5
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?