リファクタリング技法
ここではCode Smellを解消するために参考となるリファクタリング技法や、その他参考になりそうな概念を紹介していこうと思います。
リファクタリングに関してはこの辺りの書籍が参考になると思います。
リファクタリング第2版

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

Dealing with Generalisation
Extract Superclass
Extract Superclass 2つのクラスの共通部分(フィールドやメソッド)をスーパークラスとして再定義しましょう。
※継承は必ずしも最適解ではありません。使いどころを間違えるとクラス設計がいびつなものになってしまいます。 先の項目にも書いた継承を使うべきか委譲(delegate)を使うべきかをきちんと判断した上で継承を使うようにしましょう。
・・・例えば、ゲームのスーパーマリオに出てくるファイアーマリオを実装する場合、普通のマリオをスーパークラスにしてファイアーマリオをそのサブクラスとして実装するのはおそらく違和感ないです。ファイヤーマリオの実装はおそらく「火を吐く」という部分だけを実装すれば済むでしょう。 しかし、クッパを普通のマリオやファイアーマリオのサブクラスとして実装するのはおそらく後々厄介なことになります。 確かにクッパはジャンプをするし、火も吐くのでマリオとの共通部分が多く、もしかしたらマリオを継承することで実装を減らせるかもしれません。 しかし、マリオの実装を変えるとクッパの振る舞いに影響を与えかねません。 スーパークラスとサブクラスは結びつきが強いため、実装を変更するとお互いの振る舞いに影響を与えることがあります。本当に継承を使うのが適切なのかを考えてから継承を使うようにしましょう。
関連するCode Smell