オブジェクト指向

オブジェクト指向のメリットを会話形式で理解する!

この記事で分かること

  • オブジェクト指向のメリットについて
  • オブジェクト指向用語の解説
  • オブジェクト指向をどのような時に使うかのイメージができるようになる

こんにちは、ゴイチです!

今回の記事はいつもと趣向を変えて、会話形式でオブジェクト指向のメリットを解説する内容になります。

オブジェクト指向のメリットを現実世界のメリットで説明していて、内容は先生と生徒役のAさんが車に乗ることを例に話をしています

この話が、少しでもオブジェクト指向の理解の助けになればと思います。

それでは行きましょう!

オブジェクト指向のメリットを車に例えてみる

登場人物

ゴイチ

プログラミングを教える先生。ソフトウェアエンジニア歴は20年以上

初心者のAさん

プログラミング初心者の新人Aさん

本編

ゴイチ

こんにちはAさん! 早速ですが、オブジェクト指向のメリットって何だと思いますか?

こんにちは先生、今日もよろしくお願いします! オブジェクト指向ですか?えーと、名前ぐらいは聞いたことがあるのですが...

初心者のAさん
ゴイチ

今日はプログラミング初心者にも分かるように、オブジェクト指向のメリットについてをお話しようと思います。車を例にした身近な話なので理解しやすいと思いますよ

はい、よろしくお願いします!

初心者のAさん
ゴイチ

唐突ですが、Aさんは車の免許を持っていますか?

はい、一応持っていますよ。学生の頃に取ったっきりで一度も乗ってないペーパードライバーなんですが

初心者のAさん
ゴイチ

Aさんの免許証は、どんな車に乗れるものですか?

えーと、いわゆる普通免許というやつなので・・
厳密な定義は忘れましたが、普通程度の形・大きさの車に乗れるのだと思いますが・・

初心者のAさん
ゴイチ

普通の車ということですが、普通とはどういった物を想像しますか?

そうですね・・
タイヤが4つあって、エンジンの力で走る。右足でアクセルとブレーキを操作して発進・停止をする。ハンドルで向きを調整する。
といったあたりでしょうか?

初心者のAさん
ゴイチ

そうですね、そのような感じだと思います。
例えば、Aさんが今度新しく車を買うとして、車を変えるたびに新しく免許を取り直す必要がありますか?

まさか!そんな面倒なことをする訳がないですよ!

初心者のAさん
ゴイチ

なぜでしょうか?車種によって微妙に操作が違っていると思いますが?場合によっては、右ハンドルが左ハンドルになったりもしますね。

その程度の違いは、乗りながら慣れていけば良い範囲ではないでしょうか?
自動車なんてものは、大抵どの車も同じような操作方法になっているんですから!

初心者のAさん
ゴイチ

つまり、一回免許を取れば同じような操作方法の車には乗れるということですよね?

そういうことですね

初心者のAさん
ゴイチ

実は、これがまさにオブジェクト指向のメリットなんですよ!

へ?

初心者のAさん
ゴイチ

車種が変わっても免許を取り直す必要がないことは、Aさんにとってのメリットですよね?

間違いなくそうだと思います

初心者のAさん
ゴイチ

車種の変更ごとに免許を取り直さなくてよい仕組みというのは、車を操作するための共通の方法を決めて、その統一した仕組みに従いましょうということを、各自動車メーカーが守っているからなんです

なるほど・・あまり考えたことはなかったですが、そう言われるとそうなのかも知れません

初心者のAさん
ゴイチ

各自動車メーカーが統一した仕組みを守ることで、Aさんはどの車にも免許の更新なしで乗ることが出来るんですね

はい、確かにそうですね

初心者のAさん
ゴイチ

このメリットをプログラミングの世界に持ってきたのが、オブジェクト指向という考え方なのですよ

えぇっ!?

初心者のAさん
ゴイチ

Aさんと車の関係についてですが、Aさんは車を操作する側、車は操作される側になりますよね?

はい

初心者のAさん
ゴイチ

オブジェクト指向の考え方とは、操作される側(車)の変更に対して、操作する側(Aさん)が影響を受けない
つまり、操作される側の変更に左右されない変更に強い構造を作ることが出来ます。

はぁ・・(あまりピンと来てない)

初心者のAさん
ゴイチ

それを実現するために、抽象クラス、インターフェースというものがあるのです!

(何言ってんだこいつ・・)

初心者のAさん
ゴイチ

今回の例で言えば、抽象クラスやインターフェース車の操作方法を定義しておく訳です。
例えば、
アクセルを踏む(進む)
ブレーキを踏む(止まる)
ハンドルを切る(曲がる)
などです。
車に共通した仕組みを定義するとも言えますね

はい

初心者のAさん
ゴイチ

この仕組みに従ってプログラミングをすれば、操作する側のソースコードは一切変更する必要がないようにすることが出来ます。これがオブジェクト指向の最大のメリット になります。

な、なるほど!プログラムとしてどう実現されるのかはまだ実感としてはないですが、車の例は分かった気がします

初心者のAさん
ゴイチ

あるクラスの変更が他のクラスに影響してしまうようなクラス構成は良くないのです。
変更は最小限(出来れば1クラス内)に留める方が良いクラス設計になります。

はい!

初心者のAさん
ゴイチ

それを実現するのが、オブジェクト指向の数々の概念です。
以下にまとめておいたので、今回の話と合わせて勉強してみてくださいね。

今日は、ありがとうございました!!

初心者のAさん

オブジェクト指向用語の説明

先生とAさんの会話の内容をオブジェクト指向の用語に当てはめて説明します。

抽象クラス/インターフェース

アクセル、ブレーキ、ハンドルで操作できるという特徴を定義するためのもの。
抽象クラスとインターフェースで実現できることは同じですが、使い分けるにはニュアンスの違いを理解する必要があります。
抽象クラスは概念としてモノがイメージできるものでなければなりませんが、インターフェースはモノではなく機能/操作/振る舞いだけを定義するものです

抽象クラスとインターフェースの違いについて詳しく知りたい方は、以下の関連記事もご覧ください。

抽象クラスとインターフェース 概念の違いについて【オブジェクト指向】

この記事では、オブジェクト指向における抽象クラスとインターフェースの概念的な違いをできるだけ分かりやすく解説します。 プログラミング初心者にとって、オブジェクト指向を完全に理解したと言えるまでにはかな ...

続きを見る

今回の車の例で言うと、

  • 抽象クラス
    車というモノ
    車に共通する特徴を持つクラス
    実際に実在する車のことではないので抽象概念となる
  • インターフェース
    アクセル、ブレーキ、ハンドルで操作できる何かという感じ

を表します。
よく分からなければ、まずは同じようなものだと理解しておいても良いと思います。

具象クラス

アクセル、ブレーキ、ハンドルで操作できる実際のモノを定義するためのもの。
具象クラスとは、抽象クラスから派生したクラス、またはインターフェースを実装したクラスを指します。

今回の車の例で言うと、
プリウス、スカイライン、インプレッサなど実際の車種を表します。

継承

抽象クラス/インターフェースと具象クラスの関係性を定義するためのもの。
継承している関係が、親子関係に似ているので、親クラス-子クラスと言われたり、基本クラス-派生クラスと言われたりします。
親クラス/基本クラスは抽象クラスじゃない場合もあるので、厳密には少しニュアンスが違います。

車の例で言うと、
車という概念と、プリウス、スカイライン、インプレッサという実際の車種の関係性を表します。

ポリモーフィズム

車種が変わろうとも免許があれば運転できるという車の操作手順(インターフェース)を定義するためのもの。
車種ごとの微妙な違いを上手く隠してくれる仕組みとも言えます。
具象クラスの違い(多様性、多態性)を他のクラスへ伝搬させないようにするオブジェクト指向の仕組み。

車の例で言うと、
プリウス、スカイライン、インプレッサと乗る車種が変わっても、運転手は免許を取り直す必要がないということを表します。

まとめ

要点まとめ

車の免許を一度取れば、車種を変えても免許を取り直す必要はない

抽象クラス/インターフェースを定義すれば、具象クラスが変わったとしても呼び出し側を修正する必要はない

変更に強いプログラムになる

プログラムの規模が大きくなればなるほど、抽象クラス/インターフェースで厳密にクラスの境界を定めていることのありがたみが増してきます。

ゴイチ

抽象クラス/インターフェースを総称して、私は単にインターフェースと呼ぶことが多いです

インターフェースを定めていれば、コードを書く時に一度に考えなければならない量が減ります。

オブジェクト指向において、クラスの責任ということを意識してクラス設計をしていきますが、インターフェースはクラスの責任範囲を明確にする役割があります。

とりあえず、インターフェースの先で行われている処理は自分の責任の範囲外ということにして、自分の実装するクラスの責任だけに注力することができます。

それでは、また他の記事でお会いしましょう!

(注)この記事はQiitaに投稿した過去の記事を再構成したものです

この記事は役に立ちましたか?

  • この記事を書いた人
アバター画像

ゴイチ

ソフトウェアエンジニア歴20年。 C/C++, C#, Java, Kotlinが得意で、組込系・スマホ・大規模なWebサービスなど幅広いプログラミング経験があります。 現在は某SNSの会社でWebエンジニアをしています。

-オブジェクト指向
-