2010-09-23 4 views
12

Ich habe eine einzige PHP-Datei in einem Legacy-Projekt, das mindestens ein paar tausend Zeilen lang ist. Es wird überwiegend durch eine switch-Anweisung mit ca. 10 Fällen in eine Anzahl verschiedener bedingter Blöcke aufgeteilt. In jedem Fall gibt es einen Code, der sehr ähnlich, wenn nicht exakt, ist. Welche Methoden stehen mir zur Verfügung, um diese Codeblöcke als identisch oder fast identisch zu identifizieren, damit ich diesen Code abstrahieren und die gesamte Datei umgestalten kann? Ich weiß, dass dies in sehr manueller Hinsicht möglich ist (trennen Sie jede Case-Anweisung im Code in einzelne Dateien und Diff), aber ich bin daran interessiert, welche Tools ich verwenden könnte, um diesen Prozess zu beschleunigen.Identifizieren wiederholten Code innerhalb PHP-Projekt

Danke.

Antwort

3

Sie können phpunit PMD (Project Mess Detector) verwenden, um doppelte Code-Blöcke zu erkennen.

Es kann auch die Cyclomatic complexity Ihres Codes berechnen.

Hier ist ein Screenshot der pmd Registerkarte in phpuc: pmd tab

+0

Cyclomatic Complexity hat nichts mit Kopieren und Einfügen von Code zu tun. Und wenn ich mir die Dokumente für [PMD] (http://phpmd.org/rules/index.html) anschaue, würde ich sagen, dass sie einen solchen doppelten Code nicht erkennen kann. Es ist jedoch ohne Zweifel ein gutes Werkzeug. – Gordon

+0

Ich habe meinen Beitrag aktualisiert, ich denke, es ist jetzt klarer. Ich denke auch, dass phpunit-pmd phpcpd verwendet, nicht wahr? Oder ist es eine andere Implementierung? – greg0ire

+0

Ich werde mir das auch ansehen - danke – robjmills

0

Sie die Blöcke in separaten Dateien setzen könnte und nur diff auf ihnen laufen?

Aber ich denke, am Ende müssen Sie alles manuell durchgehen, da es klingt, als ob dieser Code eine Menge Refactoring erfordert, und selbst wenn es Unterschiede gibt, müssen Sie wahrscheinlich evaluieren, ob dies beabsichtigt ist oder ein Käfer.

+1

das ist irgendwie was ich mit einer manuellen Methode meinte. Danke für die Eingabe aber – robjmills

2

Siehe unsere PHP Clone Detector Werkzeug.

Diese beiden exakte Kopien und Beinaheunfälle findet, trotz der Neuformatierung, Einfügen/Löschen von Kommentaren, Austausch von Variablennamen, Addition/replacments von Unterblöcken usw.

PHPCPD soweit ich nur Funde erzählen kann (Token) Sequenzen, die genau gleich sind. Das vermisst viele Klone, da die am häufigsten vorkommende Operation nach dem Kopieren-Einfügen-Bearbeiten-Anpassen ist. Es würde also genau die Klone vermissen, die der OP zu finden versucht.

+0

Stoppen Sie die Verbreitung von FUD. phpcpd vergleicht, ohne Leerräume zu berücksichtigen. – cweiske

+0

@cweiske: Das heißt, es findet nur Token-Sequenzen, die genau die gleichen sind, was ich gesagt habe. Es findet keine parametrisierten Klone, bei denen der Code copy-paste-editiert wurde. Es kann * Stücke * solcher Klone finden, aber das ist viel weniger hilfreich. –

+0

@cweiske: Haben Sie den auf der Website gezeigten Joomla-Bericht geprüft? Es zeigt die parametrisierten Klone, über die ich spreche. Führen Sie PHPCPD darauf aus und vergleichen Sie die Ergebnisse. Ich denke, du wirst überrascht sein. –