TOP

このエントリーをはてなブックマークに追加

Refused Bequest

Refused Bequest(接続拒否)

兆候と症状
サブクラスがその親から継承したメソッドとプロパティの一部のみを使う場合、クラス階層は歪んでいます。不要なメソッドは単純に未使用になるか、再定義されて例外が発生します。

問題の理由
コードを再利用したいというだけの理由でスーパークラスを作成した場合にこのCode Smellが発生します。スーパークラスとサブクラスの間には何の関連性もありません。

対処
継承に意味がなく、サブクラスにスーパークラスとの共通点がまったくない場合は、継承を削除して、「Replace Inheritance with Delegation」の技術を用います。 継承が適切な場合は、サブクラスの不要なフィールドとメソッドを取り除きます。サブクラスに必要なすべてのフィールドとメソッドを親クラスから抽出し、それらを新しいサブクラスに入れ、両方のクラスをそれから継承するように設定します(Extract Superclass)。

※参考:リスコフの置換原則

効果
コードが明確になり、クラス設計を改善します。 DogクラスがChairクラスから継承される理由を不思議に思う必要はもうありません(両方とも4本の脚を持っていますが)。

dog_chair



書籍としてはこの辺りが参考になると思います。

リファクタリング第2版
refactoring

レガシーコード改善ガイド
legacy_code