3

重複は悪であり、避けるべきであることに全員が同意します (同じことを繰り返すなという原則)。そのためには、Simian (多言語) やClone Detective (Visual Studio アドイン) などの静的解析コードを使用する必要があります。

Ayende の神戸に関する投稿を読んだところ、彼は次のように言っています。

神戸の8.5%はコピペコード。これは、感度を高く設定した場合です。しきい値を 3 に設定すると、私がよく行うように、12.5% まで上がります。

閾値としての 3 は非常に低いと思います。私の会社では、高品質のコード分析をサービスとして提供しています。重複のデフォルトのしきい値は 20 に設定されており、多くの重複があります。3にしてしまうと、お客様が修正など考えられないなんて想像もできません。

Kobe に関する Ayende の意見は理解できます。これは公式のサンプルであり、「Web 2.0 アプリケーションおよびサービスの計画、設計、および実装をガイドすることを目的としている」として販売されています。そのため、品質への期待は高いです。

しかし、あなたのプロジェクトでは、重複のためにどのような最小しきい値を使用していますか?

関連する質問 :コードの重複をどれだけ熱心に排除しますか?

4

6 に答える 6

4

経験則としては 3 が適切ですが、場合によって異なります。重複を排除するためのリファクタリングでは、多くの場合、コードベースと API の概念的な単純さを、誰かが理解すればより保守しやすい小さなコードベースと交換する必要があります。私は通常、この観点から物事を評価します。

極端な例として、重複を修正することでコードが読みやすくなり、コードの概念的な複雑さがほとんど、またはまったく増加しない場合、重複は受け入れられません。この例は、複製されたコードが、説明と名前付けが簡単な何かを行う単純な参照透過関数にきちんと分解される場合です。

メタプログラミングや OO デザイン パターンなど、より複雑で重いソリューションが必要な場合は、特に複製されたスニペットが小さい場合は、4 つまたは 5 つのインスタンスを許可することがあります。これらのケースでは、ソリューションの概念的な複雑さが、実際に多くのインスタンスが存在するまで、治療を病気よりも悪化させると感じています.

最も極端なケースでは、私が取り組んでいるコードベースが非常に急速に進化しているプロトタイプであり、プロジェクトがどの方向に進化する可能性があるかについて十分にわかっていないため、合理的に単純で合理的に将来性のある抽象化の線を引くことができません。私はただあきらめます。このようなコードベースでは、同じコードが 20 回複製されたとしても、優れた設計よりも便宜と物事を成し遂げることに集中する方が良いと思います。多くの場合、すべての重複を作成しているプロトタイプの部分は、とにかく比較的すぐに破棄される部分であり、プロトタイプのどの部分が保持されるかがわかれば、いつでもこれらをリファクタリングできます。破棄されるパーツによって作成される追加の制約がなければ、多くの場合、この段階でのリファクタリングはより簡単です。

于 2009-06-16T19:53:32.527 に答える
3

そのための良い「指標」が何であるかはわかりませんが、私が通常努力していることは

  • 2 つの場所に同じコードがある場合、および
  • コードが意図的に同じである (単なる偶然の一致ではなく)

次にリファクタリングして重複を取り除きます。すべての重複は悪いです。コードを 2 つの場所に配置することはめったにありません。

于 2009-04-17T09:10:45.003 に答える
1

私は個人的にそれについてかなり狂信的です。コードの重複を避けるようにプロジェクトを設計しようとしています。1 桁下のしきい値を達成するという目標はありますが、そこに到達できない場合は、設計が不十分であることを意味し、最初からやり直すか、リファクタリングする必要があります。

于 2009-04-17T09:07:47.163 に答える
1

組み合わせる必要があると思います

  • 重複している行数
  • 複製がコピーされた回数
  • 重複が互いにどの程度「近い」か、
    たとえば、たまたま同じソース コード管理システムに存在する異なる製品が存在する場合、それらが同じ方法に存在する場合とは大きく異なります。
  • 重複コードを含むいずれかのメソッドが変更されてからの時間。

重複を削除することのコストと利益の間の適切なトレードオフを得るために。

于 2010-03-11T14:17:05.027 に答える
1

プログラミング言語に依存します。(「クローン探偵」の男はこれを認識しているようです。「プログラミング言語の制約」は、彼の最初のプレゼンテーションのボックスの 1 つです。)

Lisp プログラムでは重複した式は簡単にリファクタリングの対象になります。これをしきい値 2 と呼んでいると思います。すべてが式で構成されており、式を変換するマクロがあるため、何かを一度でも複製する言い訳はほとんどありません。(抽出するのが難しいと私が考えることができる唯一のものは、LOOP 句のようなものであり、実際、多くの人がまさにその理由で LOOP を避けることを提唱しています。)

他の多くの言語では、プログラムはステートメントを持つメソッドを持つクラスで構成されているため、式を取り出して 2 つの異なるファイルで使用するのは困難です。多くの場合、抽出する際に構造を変更することを意味します。多くの場合、タイプ セーフの要件もあり、制限される可能性があります (エスケープするために常に大量のリフレクション コードを記述したい場合を除きますが、そうする場合は、静的言語を使用するべきではありません)。現在の静的に型付けされたプログラムを完全に DRY にすると、短くも保守も簡単にはなりません。

その結果、私たちが本当に求めているのは「メンテナンスが容易」ということだと思います。場合によっては、一部の言語では、「コピーしたものとその理由を説明するコメントをここに置く」という意味になります。DRY は、保守可能なコードの良い指標です。何度も繰り返している場合、それは良い兆候ではありません。しかし、単一の統計を追跡することも悪い傾向があります。そうでなければ、単に統計を最適化するだけですべての問題を解決できます。

于 2010-01-20T16:53:47.117 に答える
0

私たちのCloneDRは、大規模なソースシステム全体で、言語構文によってパラメーター化された重複コード(正確なコピーとニアミスの両方)を検出します。Java、C#、COBOL、C ++、PHPおよび他の多くの言語をサポートします。

これは、「クローンとは何ですか?」を定義するためのいくつかのパラメーターを受け入れます。これには、次のものが含まれます。サイズ(3が適切な選択になる傾向があります)c)パラメーターの数(テキストへの明確な変更; 5が適切な選択になる傾向があります)これらの設定では、処理するほぼすべてのコードで10〜15%の冗長コードが見つかる傾向があります。

于 2009-08-23T05:56:20.010 に答える