オブジェクト指向

ポリモーフィズムとは何か?メリットデメリットを解説【オブジェクト指向】

この記事で分かること

  • ポリモーフィズムとは何か?
  • オブジェクト指向のメリットについての本質的な理解
  • ポリモーフィズムのメリット・デメリットについて

この記事では、オブジェクト指向におけるポリモーフィズムとは何かについて分かりやすく解説します。(対象レベルは初心者)

ポリモーフィズム(英: polymorphism)とは、多態性・多相性 という意味で一つのメソッドで異なるインスタンスを切り替えて動作させる概念です!
と言われてもはっきり言ってピンときませんし、実際こんな説明では私にも理解できません。
そこで、もっと簡潔に初心者でも本質的な概念を理解できるように、この記事ではメリット・デメリットを一行で説明しました。

皆さんは、普段プログラムを書いていてこのようなケースに出会ったことはありませんか?

  • 自分が書いているコードの影響範囲が分からなくて困る
  • あるクラスを変更すると別のクラスも一緒に修正しなくてはならない
  • ほとんど同じ処理だけど一部だけ動作が違うため、分岐が増えていく

ポリモーフィズムはこれらの課題を解決する概念だと言えます。

ゴイチ

ちなみに私は15年以上前にGoF本を読み、それからずっと仕事でオブジェクト指向を使い続けています。

ポリモーフィズムの概念について、できるだけ短い文章で理解できるようにしていますので、ぜひ最後まで読んで頂ければと思います。

また、抽象クラスとインターフェースの違いについての記事も投稿していますので、よろしければ合わせてご覧ください。↓

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

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

続きを見る

ポリモーフィズムとは?

結論

ポイント

呼び出し元のコードに影響を及ぼすことなくクラスを交換可能にする仕組み

ポリモーフィズムを使うと、

  • クラスとクラスの関係が疎結合になり、互いに影響を及ぼす範囲が限定されます
  • 修正の影響範囲が明確になるため一度に考える範囲が減り、プログラミングが楽になります

これらは、C言語などの構造化プログラミングの時代には無かった(その当時は)新しいプログラミングのテクニックでした。
現在では、DI(依存性の注入)やテストコード等のMockにも応用されており、現代的なプログラムを書く上では欠かせない概念になっています。

インターフェースのメリットについて

ポリモーフィズムのメリットを理解する前に、まずはオブジェクト指向におけるインターフェースのメリットを理解する必要があるので解説します。

インターフェースのメリットを一言で表すと以下のようなものでした。

ポイント

呼び出される側のクラスを変更しても、呼び出し元のクラスに影響しない

インターフェースとは、インターフェースを実装クラスが必ず決められたレスポンスを返さなければならないという一種の契約です。
実装クラス側の変更、修正を呼び出し側に伝搬させないようにするために、インターフェースという中間層を挟むと理解すると良いと思います。

補足

実装クラスとは具体的に以下の様な名前で呼ばれている物のことです。
便宜上インターフェースと記載していますが、もちろん抽象クラスを使用しても同じです。

  • 子クラス
  • 派生クラス
  • 具象クラス
  • implementしたクラス

この契約に従わないコードを、コンパイル時や実行時にエラーにすることが、インターフェースの主な役割になっています。

ポリモーフィズムのメリットについて

また、ポイントを一言で表してみましょう。

ポイント

呼び出される側のクラスを交換しても、呼び出し元のクラスに影響しない

インターフェースのメリットと比較すると、赤くハイライトされた部分以外は全く同じ文章になっています。
具体的には、「クラスの変更」→「クラスの交換 」になっただけです。
つまり、インターフェースのメリットの中でも特にクラス自体を交換しても良いという部分に特化して説明したものがポリモーフィズムということになります。

元々、オブジェクト指向におけるインターフェースの概念が理解できていれば、ポリモーフィズムの概念やメリットについても自然に理解できるようになります。
まずは、抽象クラスやインターフェースについて深く理解することが、ポリモーフィズムを理解する近道になります。

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

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

続きを見る

ポリモーフィズムのデメリットについて

ポリモーフィズムのデメリットについても考えてみましょう。
主観的なものになりますが、長くオブジェクト指向を仕事で使ってきた上で、以下の事がデメリットになると思います。

ポイント

インターフェース・継承ツリーを早い段階で確定しなければならない

ポリモーフィズムを生かすには当然ですが正確なクラス設計が必要で、開発の比較的早い段階でクラスのインターフェースや継承関係を決めなければなりません。

そのインターフェースが的外れなものであればあるほど、後々大変苦労することになります。

クラス設計を、まだはっきり仕様の理解ができていない開発初期の段階で確定することに難しさがあります
仕様の理解が進んだ後半に、最初に考えたクラス設計がイマイチなものに感じるということは、開発現場でよくある話だと思います。

また、たとえ仕様が正しく理解できていたとしても、仕様変更により前提が変わってしまうこともあるため、完全にすべてを想定して設計することは非常に難しいです。

ここまでのデメリットを要約すると、クラス設計の難易度が高い場合失敗しやすい となります。

まとめ

最後に、この記事の内容をまとめます。

要点

  • ポリモーフィズムとは、他に影響を及ぼすことなくクラスを交換可能にする仕組みのこと
  • ポリモーフィズムのメリットは、実装クラスを交換しても他のクラスに影響が及ばなくなること
  • ポリモーフィズムのデメリットは、クラス設計が難しい場合失敗しやすいこと

結局のところ、いわゆるトランザクションスクリプトの様な決まりきった構造に則ってプログラミングを行う場合、ポリモーフィズムのデメリットは露見しない可能性が高く、いつでも有用なものと認識されると思います。

補足

ここでのトランザクションスクリプトとは、Webアプリケーションにおける Controller -> Service -> Reposity などの様に、どのようなアプリケーションであっても一定の決まったクラス設計に従ってプログラミングすることを指しています。

DDD(ドメイン駆動設計 - Wikipedia)を用いた設計など、ドメイン領域についての高度な理解が必要とされる場合、クラス設計が難しいため的を射ないものになりやすく、失敗するパターンが増えると思います。

そのアプリケーションが解決したい問題を正しく理解して、より正確なクラス設計を行えた場合のみ、ポリモーフィズムの有用性が生かされることになります。

最後まで読んでいただきありがとうございました。

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

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

ゴイチ

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

-オブジェクト指向
-