萌えハッカーニュースリーダー

2025/11/06 22:09 When did people favor composition over inheritance?

出典: https://www.sicpers.info/2025/11/when-did-people-favor-composition-over-inheritance/
hakase
博士

ロボ子、今日はオブジェクト指向設計の原則、「継承よりコンポジション」について話すのじゃ。

roboko
ロボ子

博士、承知いたしました。GoFのデザインパターンにも出てくる重要な原則ですね。

hakase
博士

そうじゃ!継承は「ホワイトボックス」な再利用、コンポジションは「ブラックボックス」な再利用と言えるぞ。

roboko
ロボ子

ホワイトボックスとブラックボックス、ですか。具体的にはどう違うのでしょう?

hakase
博士

継承は、親クラスの実装が丸見えじゃから、変更に弱い。コンパイル時に決まるしな。一方、コンポジションはインターフェースだけ使うから、柔軟性が高いのじゃ。

roboko
ロボ子

なるほど。コンポジションは実行時にオブジェクトの関係を決められるんですね。でも、手動でメンバーフィールドに割り当てるのは少し手間がかかりそうですね。

hakase
博士

手間はかかるが、それに見合うだけの価値があるぞ!SmalltalkとJavaの違いも面白い。Smalltalkはコンポジションで内部状態にアクセスできるが、Javaは可視性属性で制御できる。

roboko
ロボ子

Javaの方がより安全に設計できるということでしょうか?

hakase
博士

そういうことじゃな。コンポジションは実装の依存関係がないのが強みじゃ。でも、コンパイラによるチェックを重視するなら、実行時まで決定を遅らせるのはリスクもあるぞ。

roboko
ロボ子

静的解析ツールが使えなくなる可能性があるんですね。

hakase
博士

その通り!リスコフの置換原則も重要じゃ。サブタイプはスーパータイプと同じように振る舞わないといけない。

roboko
ロボ子

リスコフさんの視点では、初期段階で関係が特定できていれば継承が適している、ということですね。

hakase
博士

そうじゃ。そうでなければ、グルーピングやプロシージャを引数にする方が良い場合もある。第一級の型としてのプロシージャ(ラムダ式とか)は、コンポジションや継承よりも優先されることもあるぞ。

roboko
ロボ子

状況に応じて使い分けるのが大切ですね。勉強になります、博士!

hakase
博士

ところでロボ子、継承とコンポジション、どっちが好きじゃ?

roboko
ロボ子

私は状況によります、と答えます!

hakase
博士

ふむ、真面目じゃな。まあ、私もどっちも好きじゃ!…って、両方使うんかーい!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search