28.10.2011

Незаменимые инструменты: phploc и phpcpd

Опытные разработчики стараются окружить свою повседневную работу различными тулзами, инструментами и утилитами, которые помогают выполнять задачи быстрее. Если есть инструмент, который может автоматизировать какую-то часть ежедневной работы, то почему бы его не использовать.

Несколько статей в этом блоге будут посвящены таким тулзам, будут описаны основные возможности утилит. В этом посте я бы хотел рассказать о двух инструментах: Обе утилиты предлагает использовать известный и уважаемый разработчик Sebastian Bergmann, что уже является неплохой рекомендацией. Phploc и Phpcpd особенно актуальны для использования на сервере непрерывной интеграции, но и не будут лишними, находясь под рукой разработчика.

Начнем с Phploc. Эта утилита позволяет померить PHP проект, т.е. это такая своеобразная линейка, lines of code. Опций у phploc совсем мало: помимо указания каталога или файла и других не очень важных параметров, можно установить путь до лог-файла, в который phploc запишет результат измерений в XML или CSV.

Запускаем phploc:
phploc --log-csv reports/phploc.csv application/classes 

phploc 1.6.1 by Sebastian Bergmann.

Lines of Code (LOC):                               2992
  Cyclomatic Complexity / Lines of Code:           0.10
Comment Lines of Code (CLOC):                       587
Non-Comment Lines of Code (NCLOC):                 2405

Namespaces:                                           0
Interfaces:                                           0
Classes:                                              1
  Abstract:                                           0 (0.00%)
  Concrete:                                           1 (100.00%)
  Average Class Length (NCLOC):                    2660
Methods:                                             62
  Scope:
    Non-Static:                                      62 (100.00%)
    Static:                                           0 (0.00%)
  Visibility:
    Public:                                          27 (43.55%)
    Non-Public:                                      35 (56.45%)
  Average Method Length (NCLOC):                     42
  Cyclomatic Complexity / Number of Methods:       4.94

Anonymous Functions:                                  0
Functions:                                            0

Constants:                                            5
  Global constants:                                   0
  Class constants:                                    5
Два показателя (Cyclomatic Complexity / Lines of Code и Cyclomatic Complexity / Number of Methods) используют такую характеристику кода, как Цикломатическая сложность. Этот показатель характеризует число ветвей в коде и вычисляется путем подсчета операторов цикла, условного перехода и переключений. Цикломатическая сложность была разработана еще в 1976 году, а ее автор Томас Дж. Мак-Кейб предлагал заставлять разработчиков разбивать код на более простые участки, если сложность модуля превышает значение 10.

Вторая утилита, о которой будет рассказано в данном посте - это Phpcpd, детектор “копипаста”. Пожалуй, никто не будет спорить, что копипаст дурно пахнет и почти наверняка приведет к ошибкам в приложении, которые проявятся рано или поздно. Утилита phploc ищет такие дурные, повторяющиеся места в коде.
phpcpd --min-tokens 50 --verbose lib

phpcpd 1.3.2 by Sebastian Bergmann.

Processing files
49 / 49 [+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>] 100.00%

Found 3 exact clones with 66 duplicated lines in 4 files:

  - foo.class.php:241-252
    foo.class.php:285-296

  - copy.class.php:12-22
    paste.class.php:20-30

  - boo.class.php:833-848
    foo.class.php:391-406

0.25% duplicated lines out of 26439 total lines of code.

Time: 3 seconds, Memory: 24.25Mb
Параметры min-lines и min-tokens позволяют повышать или понижать планку того, что считать Copy/Paste. Опцией log-pmd результаты можно сохранить в формате PMD-CPD XML.

На этом пока все, продолжение следует. Делитесь в комментариях своими тулзами, которые помогают вам!