Контроль качества кода: Lint, CS, Exacat

Обо мне

  • Зенько Евгений
  • Tech Lead @ Colours NL
  • Drupal 5-8
  • Футбол, книги, музыка, угар
  • Socials: @zeuty
  • Linkedin: yzenko

Тезисы

  1. Качество - это не переменная

2. Если какая-нибудь неприятность может произойти, то она обязательно произойдёт (Закон Мёрфи)

3. Человек (немножечко) ленив

3. Человек (немножечко) нонконформист

Проблемы

  1. Синтаксические ошибки

2. Несоответствие code standards, best practices, разный подход к форматированию кода в команде

3. Структурные ошибки: небезопасный, непроизводительный, неподдерживаемый код

Ущерб

  1. Психологический

2. Репутационный

3. Затраты времени

Что делать?

Процессы

Инструменты

PHP Lint

Встроенная функциональность

php -l {filename}

Example:
php -l sites/all/modules/custom/with_error.php 
PHP Parse error:  syntax error, unexpected '?>' 
in sites/all/modules/custom/with_error.php on line 4
Errors parsing sites/all/modules/custom/with_error.php

PHP Code Sniffer

Автоматическая проверка кода на предмет нарушения coding standards

  • Из коробки - PSR1, PEAR, PSR2, MySource, Squiz, PHPCS, Zend
  • Доступны - Drupal и DrupalPractice
  • Интегрируется с PHPStorm
  • Возможность создавать свои стандарты

PHP Code Beautifier and Fixer

  • Автоматически генерирует diff между исходным файлом и стандартом

 

  • Автоматически применяет его к исходному файлу

Exakat

  • Статический анализ PHP5.2-7.2
  • Совместимость кода с версией PHP
  • Безопасность
  • Производительность
  • Сложность и поддерживаемость
  • Автоматическое документирование
  • >700 правил, сгрупированных в Recipes: Security, Performances, Dead code, etc.

Да, но...

Сколько людей будет запускать всё это богатство каждый день?

Идея

  • Давайте делать больше код ревью!
  • Давайте сильнее наказывать врагов саботирующих наши договорённости!
  • Давайте просто будем ответственнее!

А может попробуем как-то всё это автоматизировать?

Интеграция с git

  • Используем git hooks
  • В нашей ситуации precommit

Что дальше?

  • Composer package с конфигуратором git hook, и необходимыми зависимостями
  • Стоит ли интегрировать в этот процесс глубокий статический анализ (например, Exakat)?

Вопросы, идеи, предложения?