重複したコードを削除する方法(一般的に)?


10

オブジェクト指向言語(たとえば、Javaに限定されません)では、発生の範囲に応じて重複コードをどのように修正しますか?(例えば)から始めます

  • 同じクラス(スコープ)でExtractメソッドのリファクタリングを実行(修正)
  • 同じ階層のクラス(スコープ)でメソッドの抽出とプルアップを実行(修正)
  • ...

この時に同じクラスでDRY原則を(自分自身を繰り返さないでください)実装するための例を見ていgeekswithblogs.net/chrisfalter/archive/2008/03/07/...
NoChance

SOの元の質問(stackoverflow.com/questions/7380946/…)は終了しました。ここに移動しました。
Peter Kofler、2011

回答:


8

最近、ボブおじさんの「クリーンコード」で私の質問に対する良い答えを見つけました。彼は3つのタイプの複製を区別しています

同一のコードの断片は、単一のメソッドで置き換える必要があります。したがって、修正はメソッドを抽出し、一般的な動作に委譲することです。

  • 同じ方法で、ローカル変数の抽出を実行して再利用します。
  • 同じクラスで、Extract Methodリファクタリングを実行します。
  • 同じ階層のクラスでメソッドを抽出して引き上げます。メソッドの場所を見つけるために階層が作成される場合があります。
  • 個別の階層のクラスでは、新しいオブジェクトへの委任を使用します。
  • メソッドが囲み状態を必要としない場合、「lib」パターンが適用される可能性があります(つまり、静的メソッドのコンテナーであり、通常はSthUtilまたはと呼ばれますSthLib)。

switch/caseおよびのケースでは、if/else常に同じ条件のセットがテストされます

  • これらはポリモーフィズムに置き換える必要があります。

同様のアルゴリズムを実装するモジュール。クローン検出器がそれらを見つけることができないため、これらを見つけるのは最も困難です。

  • スコープが大きくなると、デザインパターンが使用されます。テンプレートメソッドの設計パターンは、クラス階層内のアルゴリズムに適用できます。
  • 戦略設計パターンは、さまざまな場所で使用されるすべてのアルゴリズムに適用できます。

異なるバージョンのライブラリを扱うときにOdedが言及した有効な点

  • 単一のバージョンに統合します。ファサードのデザインパターンが役立つ場合があります。

結局、私の質問に答えるのに最適な1つの文は、刺激によるものです。

オブジェクト指向言語で使用されるコード再利用メソッドはオブジェクトです。


5

一般に、重複するコードを1つの場所に統合し、元の複製サイトが統合された場所を呼び出していることを確認します。

あなたの例では、これはクラス内では抽出されたメソッドであり、クラスのセット内では基本クラス内のプルアップメソッドです。

コピーと貼り付けのコードでは、これは重複を削除し、すべてのユーザーが単一のコピーを(これがどのレベルであっても)使用できるようにすることです。

異なるバージョンのライブラリを扱う場合は、単一のバージョンに統合します(可能な場合)。


それが基本クラスにある場合、それは「引き下げられた」メソッドではないでしょうか?基本クラスは、派生クラスの下の物理的なものとして常に想像します。
Dave Nay

リファクタリングブックの正式名称は「プルアップ」です。
Peter Kofler、2011

1

これは自由回答の質問だと思いますが、コードの状態にも依存します。つまり、コンテキストに応じて、重複するコードを少し許容できます。この問題には3のルールが適しています。

3つルール何かを初めて行うときは、それを行うだけです。2度目に似たようなことをすると、複製に失敗しますが、とにかく複製を行います。3回目に同様のことを行うと、リファクタリングします。

これはかなり議論の余地がありますが、この投稿では、重複するコードを許容するケースも考慮しています。


1
「3つのルール」について+1。私はそれがどれほど広く適用できるかにいつも驚いています。
アンディマンゴー2017

1
これはどのように質問に答えません。
Jan Doggen 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.