15

少なくとも数千行の長さのレガシー プロジェクト内に 1 つの PHP ファイルがあります。これは主に、約 10 ケースの switch ステートメントによって、いくつかの異なる条件ブロックに分割されます。それぞれのケース内に、完全に重複していなくても、非常によく似たコード ブロックのように見えるものがあります。これらのコード ブロックが同一またはほぼ同一であることを識別して、そのコードを抽象化し、ファイル全体のリファクタリングを開始するには、どのような方法を使用できますか? 私はこれが非常に手作業で可能であることを知っています (コード内の各 case ステートメントを個々のファイルと Diff に分けます) が、このプロセスを高速化するために使用できるツールに興味があります。

ありがとう。

4

4 に答える 4

14

phpcpdを使用できます。

phpcpd は、PHP コードのコピー/貼り付け検出器 (CPD) です。PHP プロジェクトをスキャンして、重複したコードを探します。

その他のリソース:

于 2010-09-23T13:29:01.150 に答える
4

phpunit PMD (Project Mess Detector) を使用して、コードの重複ブロックを検出できます。

また、コードの循環的複雑度を計算することもできます。

以下は、phpuc の pmd タブのスクリーンショットです。pmd タブ

于 2010-09-23T13:25:37.350 に答える
2

PHP Clone Detectorツールを参照してください。

これは、再フォーマット、コメントの挿入/削除、変数名の置換、サブブロックの追加/置換などにもかかわらず、正確なコピーとニアミスの両方を見つけます。

私が知る限り、PHPCPD はまったく同じ (トークン) シーケンスのみを検出します。コピーと貼り付けの後の最も一般的な操作は編集してカスタマイズするため、多くのクローンが失われます。そのため、OP が見つけようとしているまさにそのクローンを見逃すことになります。

于 2010-10-24T18:19:17.637 に答える
0

ブロックを別々のファイルに入れて、それらに対して diff を実行できますか?

ただし、このコードには多くのリファクタリングが必要なように思われるため、最終的には手動ですべてを実行する必要があると思います。違いがある場合でも、これが意図的なものなのかバグなのかを評価する必要があるでしょう。

于 2010-09-23T13:26:33.933 に答える