継承についての小話

f:id:cacapon:20220210175129j:plain

バナナを欲したものの、手に入ったのはバナナを手にしたゴリラと、
まるごとのジャングルだった
▶ジョー・アームストロング
オーム社 達人プログラマー第2版 David Thomas・Andrew Hunt 著 より引用

オブジェクト指向でプログラミングをするとき、

継承をつかって実装していたとしたら、こういうことがままあります。

ほしいのはバナナだけのはずなんですけどね…


どうすればゴリラをなだめてバナナを食べられるかを考える前に

ゴリラとジャングルがついてくるとなんでまずいかを考えてみましょう。


一番の問題は「関係」が増えるからです。それも数珠つなぎで。

プログラマーとして聞き馴染みがある言い方とすると「結合」でしょうか。


継承をつかうと継承元だけでなく、その継承元のさらにその元...

というふうに全て「結合」します。

今日はせっかくうまくゴリラをなだめてバナナにありつけたとしても、

明日にはゴリラをなだめてもバナナをくれないということが日常茶判事になります。


そして、明日もバナナを食べたいあなたは

なぜゴリラがなだめてもくれないのか考えたり、

ジャングルの気温や湿度がかわったせいなのかといった、

本来考えなくてもいいことを考える必要が出てくるでしょう。


では、どうすればバナナについてだけ考えられるようになるのでしょうか?

継承を使わなければいいのです。


わたしの愛読書によると継承の代わりに3つの解決策があるようです。

  • インターフェースとプロトコル
  • 委譲
  • 既存のものと新たなものを持つ機能をマージする*1

このあたりの理解はまだまだ未熟ですので、ここでは載せません。


覚えておきたいのは「継承するとセットで余計なモノがついてくる」

「余計なモノがついてくるなら、その余計なモノまで考える必要がある」

「継承の代わりの解決策はすでにある。=>継承つかわなくてもOK」というところでしょうか。


わたしのブログでは答えにはなっていないでしょうが、

あなたがゴリラを気にせずバナナを食べられるようになることを祈っています。

それではまた。

参考文献というか最近の愛読書

*1:愛読書ではmixinと名付けていました