Выявление повторяющегося кода в проекте PHP - PullRequest
12 голосов
/ 23 сентября 2010

У меня есть один PHP-файл в унаследованном проекте длиной не менее нескольких тысяч строк.Он преимущественно разделен на несколько различных условных блоков с помощью оператора switch с примерно 10 случаями.В каждом случае есть то, что кажется очень похожим - если не точным дубликатом - блоком кода.Какие методы доступны для меня, чтобы идентифицировать эти блоки кода как одинаковые или близкие к одному, чтобы я мог абстрагировать этот код и начать рефакторинг всего файла?Я знаю, что это возможно в очень ручных терминах (разделите каждое выражение case в коде на отдельные файлы и Diff), но мне интересно, какие инструменты я мог бы использовать для ускорения этого процесса.1003 *

Ответы [ 4 ]

13 голосов
/ 23 сентября 2010

Вы можете использовать phpcpd .

phpcpd - детектор копирования / вставки (CPD) для кода PHP.Он сканирует проект PHP на наличие дублированного кода.

Дополнительные ресурсы:

3 голосов
/ 23 сентября 2010

Вы можете использовать phpunit PMD (Project Mess Detector) для обнаружения дублированных блоков кода.

Он также может вычислять цикломатическую сложность вашего кода.

Здесьэто скриншот вкладки pmd в phpuc: pmd tab

2 голосов
/ 24 октября 2010

См. Наш PHP Clone Detector инструмент.

Находит как точные копии, так и ошибки, несмотря на переформатирование, вставку / удаление комментариев, замену имен переменных, добавление / заменусубблоков и т. д.

PHPCPD, насколько я могу судить, находит только (токен) последовательности, которые в точности совпадают.Это пропускает много клонов, так как наиболее распространенной операцией после копирования-вставки является редактирование для настройки.Так что он будет скучать по тем клонам, которые ОП пытается найти.

0 голосов
/ 23 сентября 2010

Вы можете поместить блоки в отдельные файлы и просто запустить diff для них?

Тем не менее, я думаю, что в конечном итоге вам все равно придется все делать вручную, так как, похоже, этот код требует многорефакторинга, и даже если есть различия, вам, вероятно, потребуется оценить, является ли это преднамеренным или ошибкой.

...