2010-09-23 1 views
12

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

Спасибо.

ответ

13

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

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

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

+2

+1. Я собираюсь повеселиться с инструментами, упомянутыми в этой ссылке !!!! – Spudley

+1

, который выглядит как отличная стартовая точка и действительно удобный инструмент. спасибо – robjmills

+1

+1 отличная ссылка !! – greg0ire

3

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

Он также может вычислить Cyclomatic complexity вашего кода.

Вот скриншот вкладки PMD в phpuc: pmd tab

+0

Cyclomatic Complexity не имеет ничего общего с копированием и вставным кодом. И, глядя на документы для [PMD] (http://phpmd.org/rules/index.html), я бы сказал, что он не может обнаружить такой дубликат кода. Это, без сомнения, хороший инструмент. – Gordon

+0

Я обновил свой пост, я думаю, теперь это яснее. Я также думаю, что phpunit-pmd использует phpcpd, не так ли? Или это другая реализация? – greg0ire

+0

Я тоже посмотрю на это - спасибо – robjmills

0

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

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

+1

thats kinda, что я имел в виду под руководством вручную. спасибо за ввод, хотя – robjmills

2

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

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

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

+0

Остановить распространение FUD. phpcpd сравнивается без учета пробелов. – cweiske

+0

@cweiske: Это означает, что он только находит последовательности токенов, которые являются точно такими же, что и я сказал. Он не найдет параметризованные клоны, которые являются теми, где eh-код был скопирован-скопирован. Он может найти * кусочки * таких клонов, но это намного менее полезно. –

+0

@cweiske: Вы просмотрели отчет Joomla, показанный на веб-сайте? Он показывает параметризованные клоны, о которых я говорю. Запустите PHPCPD на нем и сравните результаты. Я думаю, вы будете удивлены. –