TOP

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

Duplicate Code

Duplicate Code(重複コード)

兆候と症状
ほとんど同じようなコードが見られる場合

問題の理由
通常、コードの重複は、複数のプログラマーが同じプログラムの異なる部分を同時に操作しているときに発生します。彼らはさまざまなタスクに取り組んでいるので、同僚が似たようなコードを書いていることに気付いていない可能性があります。

コードの特定の部分が異なって見えるが実際には同じジョブを実行する場合のように、より微妙な重複もあります。このような重複は、見つけて修正するのが難しい場合があります。

意図的に重複させている場合もあります。納期に追われているようなときで、既存のコードが”ほぼ正しく”要件を満たせる場合、初心者のプログラマーは、関連するコードをコピーして貼り付ける誘惑に抵抗できないかもしれません。また、場合によっては、単にプログラマーが整理するのをさぼるようなこともあります。

対処
同じクラスの2つ以上のメソッドで重複コードが見つかった場合、「Extract Method」を使って新しいメソッドを作成し、両方の場所でその新しいメソッドを呼び出します。

  • 2つの同階層のサブクラスで重複コードを見つけた場合:
    両方のクラスに「Extract Method」を用いて、抽出したメソッドに対して「Pull Up Field」で使用されているフィールドを抽出します。
  • 重複コードがコンストラクタの内部に存在する場合、「Pull Up Constructor Body」を適用します。
  • 重複コードが似ているが完全には一致しない場合、「Form Template Method」を適用します。
  • 2つのメソッドが同じことを別のアルゴリズムで実現している場合、最適なアルゴリズムを選択し、「Substitute Algorithm」を適用します。
  • 重複コードが異なる二つのクラスで見つかった場合:
    対象のクラスが階層の一部ではない場合、「Extract Superclass」を適用して新しいスーパークラスを一つ作り、そのスーパークラスに重複コードを持たせます。
  • スーパークラスを作るのが難しい場合は、一方のクラスから「Extract Class」を使ってクラスを抽出し、もう一方のクラスは抽出したコンポーネントを使います。
  • 多数の条件式が存在し、同じコードを実行する(条件のみが異なる)場合は、「Consolidate Conditional Expression」を使ってこれらの演算子を単一の条件にマージし、「Extract Method」を使って、条件を簡単な別のメソッドに配置し、分かりやすいメソッド名を付けます。
  • 条件式のすべての分岐で同じコードが実行される場合:「Consolidate Duplicate Conditional Fragments」を使って、条件ツリーの外側に同じコードを配置します。

効果

  • 重複コードをマージすることでコードの構造が簡潔になり、コードを短くすることができる。
  • 簡潔さ+短さ=単純化が容易で、サポートが安価なコード。


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

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

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