継承の履歴
継承は悪
http://www.berniecode.com/writing/inheritance/
ボールを描くクラスがあって、それぞれボールを継承した上下移動するボールクラスとフェイドするボールクラスを作った。
しばらくして上下しつつフェイドするボールクラスが作りたくなった。上下クラスを継承して上下フェイドクラスを作る?でもそれだとフェイドの機能が点在してしまう。
この問題を解決するのが委譲という方法だ。まずボールクラスに動作を直接書くのではなくて「上下」や「フェイド」そのものをクラス化する。後はボールクラスからそれぞれの動作を委譲して処理を呼び出す。
このように動作自体と対象を分離することはGoFのデザインパターンのひとつでStrategy Patternと呼ばれている。
これを利用すれば上下する人とかフェイドする家とかも動作するコードを書かずに使うことができる。
EventListenerとかHandlerという単語が出てきたらだいたいこのパターン?継承よく使ってたけど最近はこの方が良いということがよくわかってきた。では、どういう場合に継承使えばいいんだろう?めんどくさいとき?
結合度・凝集度
http://www.bizlogic.co.jp/techinfo/reconsider/inherit.htm
http://www.objectclub.jp/ml-arch/magazine/82.html
高結合、低凝集になりやすい。
スーパークラスとサブクラスはかなり結合度が高い。スーパークラスの変更がもろにサブクラスに影響を与えてしまう。
前のボールクラスの例で機能が点在してしまうことや、それに継承することで不必要な機能まで使えてしまうことは凝集度が低いといえる。