オブジェクト指向開発における継承の適切な活用とコンポジションの重要性

こんにちは。ゆうせいです。

新人研修中に受講者から以下の質問をいただきました。

「継承は最後の手段」と言われるのはなぜですか?

今回はこの質問に答えたいと思います。

オブジェクト指向プログラミングを学び始めると、継承という機能に魅力を感じる初心者は少なくありません。既存のプログラムを再利用できる便利な仕組みですが、経験豊富なエンジニアの間では、「継承は最後の手段」であるという格言が共有されています。この記事では、なぜ継承を慎重に扱うべきなのか、その理由と代替案を論理的に解説します。

継承とは何か

継承とは、あるクラスが持っている変数や処理を、別のクラスが引き継ぐ仕組みのことです。

高校生にもわかる比喩で説明すると、継承は親から子への遺伝のようなものです。親が背が高いという特徴を持っていれば、子もその特徴を自動的に受け継ぎます。プログラミングにおいては、車という基本クラスを継承して、パトカーや救急車といった専門的なクラスを作るイメージです。

一見すると効率的に見えますが、この親子関係には強い制約が伴います。

継承が最後の手段とされる理由

継承を多用すると、プログラムの柔軟性が失われ、修正が困難になるリスクが高まります。主な理由は、密結合と呼ばれる状態に陥るためです。

密結合による影響

密結合とは、ある部品を変更した際に、他の部品まで影響を受けてしまう状態を指します。継承を用いた場合、親クラスに加えた変更は、すべての小クラスに強制的に反映されます。

例えば、親クラスである車に空を飛ぶ機能を安易に追加すると、それを継承しているパトカーも救急車も、意図せず空を飛べるようになってしまいます。このように、親の都合が子の振る舞いを勝手に決めてしまうことが、開発の現場では予期せぬ不具合の原因となります。

継承のメリットとデメリット

継承の性質を、客観的な事実に基づいて整理します。

メリット

  • 共通のコードを親クラスにまとめることで、記述量を削減できる。
  • 複数のクラスを、親クラスという共通の型として一括で扱うことができる。

デメリット

  • 親クラスの内部構造を把握しなければ、子クラスを正しく実装できない。
  • 階層が深くなると、どの処理がどこで定義されているか追跡が困難になる。
  • 実行時に親クラスを別のものに差し替えることができない。

代替案としてのコンポジション

継承のデメリットを回避するために推奨されるのが、コンポジション(合成)という手法です。

コンポジションとは、あるクラスの中に、別のクラスのインスタンスを部品として持たせる方法を指します。比喩を用いるなら、継承が遺伝であるのに対し、コンポジションは道具箱を持つことに似ています。

車が必要な機能をすべて自分で受け継ぐのではなく、エンジンという部品を外付けして利用する形です。エンジンが故障したり、別の高性能なエンジンに交換したくなったりしても、車本体の構造を大きく変える必要はありません。必要な時に、必要な部品だけを呼び出すため、各クラスの独立性が保たれます。

実装における判断基準

継承を使うべきかどうか迷った際は、is-a関係が成立しているかを厳密に確認してください。

  • 継承:パトカーは車である(PatrolCar is a Car)。
  • コンポジション:車はエンジンを持っている(Car has a Engine)。

もし、単にコードを使い回したいだけ、あるいは一部の機能だけを利用したいという理由であれば、コンポジションを選択するのが賢明です。

学習のステップ

オブジェクト指向の設計を深く理解するために、以下の順序で学習を進めてみてください。

  1. カプセル化の概念を学び、クラスの内部情報を隠蔽する重要性を理解する。
  2. 継承を使わずに、クラスを組み合わせて新しい機能を作る練習を繰り返す。
  3. ポリモーフィズムを学び、継承ではなくインターフェースを用いた設計手法を習得する。
  4. デザインパターンのうち、特に委譲に関連するパターンを学び、柔軟な構成方法を身につける。

継承は強力な武器ですが、使い所を誤ると自分たちの首を絞めることになります。まずは部品を組み合わせる発想を持ち、どうしても解決できない場合にのみ継承を検討する習慣をつけてください。

グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。