🐡
継承のデメリット(PHP)
継承
継承を利用するケースは、大枠の処理は同じだが細部のバリエーションが異なる場合で
同じ処理を「共通化」させたくて利用することが多いと思われます。
(親クラスに処理が入る場合をイメージしています)
この「共通化」を行う場合には下記のようなデメリットがあり拡張に向かない性質があります。
継承のデメリット
継承のデメリットとしては
- 親クラスを意識しないといけない(意識するポイントが増える)
- 親クラスのメソッドを子クラスでオーバーライドしたとき、出力結果が親クラスと同程度、または厳しくなっているかを意識する必要がある(親クラスより緩くなっていると利用側で不具合が起きる可能性がある為):リスコフの置換原則
- 拡張に向かない(複雑化し修正が困難になる)
- 子クラスに対応させるために親クラスの引数・条件分岐が増えてしまう(複雑化)
- 親クラスが「共通化の罠」にかかる為
- https://twitter.com/minodriven/status/1127539251761909760
- 複数の子クラスが出来てしまうと親クラスの修正が難しくなる(複雑化)
- 子クラスに対応させるために親クラスの引数・条件分岐が増えてしまう(複雑化)
継承を利用していい例
下記に当てはまる場合は継承を利用することは問題ないと思いますが
実際そう言い切れることはなかなかないと思うので
「継承は禁止」というのは過激にしても慎重に利用する必要があるとは思います。
- 親クラスが独立している
- 子クラスに影響して親クラスに変更が入らないこと(開発ルールで縛っても人力でのチェックになる為難しいです)
- ex.ライブラリを継承して利用する(ライブラリに依存する為乗り換えるときに剥がしづらい問題はありますが)
- 小規模で使い捨て(拡張しない)のコード
継承の代替
バリエーション部分を別クラスとして切り出し利用する
※abstractメソッドを必ず継承先のクラスで利用する形にしても
やろうとしていることはインタフェースと変わらない為通常はインタフェースで代替した方がよいと思われます(共通処理として利用するためのメソッドをabstractクラスで作れることがメリットですが、結局共通化の罠に陥るので使いづらいです)
Discussion