devpoint 2016: Признаки плохого кода и как с ним бороться в php...
TRANSCRIPT
![Page 1: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/1.jpg)
![Page 2: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/2.jpg)
Признаки плохого кода и как с ним бороться в PHP проектах
class Speaker extends DevPointSpeaker{
private $_name = “Панаскин Денис”;private $_company = “Varteq”;private $_position = “Directory of Technology”;private $_site = “http://varteq.com”;private $_email = “[email protected]”;
}
$currentSpeaker = new Speaker();try {
$currentSpeaker.start();} catch (SpeakerException $exp) {
Logger.error(“Shit happens”, $exp);}
![Page 3: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/3.jpg)
Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку.
- Мартин Фаулер
![Page 4: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/4.jpg)
Бывает ли идеальный код?
![Page 5: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/5.jpg)
КОНЕЧНО!!!
![Page 6: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/6.jpg)
НЕТ :)
![Page 7: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/7.jpg)
Когда и как наносятся удары по качеству кода?
![Page 8: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/8.jpg)
*
![Page 9: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/9.jpg)
*
![Page 10: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/10.jpg)
*
![Page 11: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/11.jpg)
*
![Page 12: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/12.jpg)
*
![Page 13: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/13.jpg)
*
![Page 14: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/14.jpg)
*
![Page 15: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/15.jpg)
*
![Page 16: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/16.jpg)
*
![Page 17: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/17.jpg)
*
![Page 18: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/18.jpg)
Когда хардкод оправдан?
![Page 19: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/19.jpg)
![Page 20: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/20.jpg)
Хардкод “по-модному”: Ad-hoc решение
![Page 21: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/21.jpg)
Ad-hoc решение‣ Принять факт что хардкод неизбежен
![Page 22: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/22.jpg)
‣ Принять факт что хардкод неизбежен‣ Хорошо документировать костыли
Ad-hoc решение
![Page 23: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/23.jpg)
‣ Принять факт что хардкод неизбежен‣ Хорошо документировать костыли ‣ Комментарии к Ad-hoc коду должны отвечать на вопрос
“почему” и “зачем”, а не что делает код!
Ad-hoc решение
![Page 24: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/24.jpg)
Часто встречающиеся проблемы в коде
![Page 25: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/25.jpg)
SQL в бизнес логике
![Page 26: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/26.jpg)
HTML в коде
![Page 27: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/27.jpg)
Запросы в циклах
![Page 28: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/28.jpg)
Наличие цифр в именах переменных, классов и ключах
$slide1 = ‘’;$slide2 = ‘’;$customer1 = ‘’;
*
![Page 29: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/29.jpg)
Большое количество статических методов и их вызовов
![Page 30: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/30.jpg)
Если префиксы и постфиксы в именах классов “прыгают”
ProductItemItemProduct
*
![Page 31: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/31.jpg)
Злоупотребление паттернами
![Page 32: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/32.jpg)
Большие классы и длинные методы
![Page 33: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/33.jpg)
Copy - Past кода
![Page 34: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/34.jpg)
Большое количество вложенных циклов и if’ов
if (condition1) { ... if (condition2) { ... for ($i = 0; $i < 10; $i++) { ... if (condition4) {
if (condition5) { foreach ($products as $product) { …}
} ... } return; } } } }
![Page 35: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/35.jpg)
Сокращения имен переменных, методов, классов и т.д
$c = $this->getCBD();$i = $c->getСI();
*
![Page 36: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/36.jpg)
Отсутствие код стайла
PEAR (http://pear.php.net/manual/en/standards.php)PSR-1 и PSR-2 (http://www.php-fig.org/)Symfony2 (http://symfony.com/doc/current/contributing/code/standards.html)Zend (http://framework.zend.com/manual/en/coding-standard.coding-style.html)WordPress (http://make.wordpress.org/core/handbook/coding-standards/php/)Drupal (http://drupal.org/coding-standards)
![Page 37: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/37.jpg)
Критерии оценки качества кода
![Page 38: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/38.jpg)
Понятность (Understandability)public function hasPermission() {
start:if ($this->user && $this->user->role > 5) {
return true;} else if ($this->user) {
if ($this->user->role == 2 && $this->product[‘qty’] < 0 || $this->page == ‘catalog’) { return false;
} else { return true; }
} else {$this->page = ‘product’;goto start;
} return false;
}
![Page 39: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/39.jpg)
Читабельность (Readability)class user{
public $id;private $role, $_lastSignin, $list_props, $currentData, $session;
public function sign($l, $p) {if (!$l || $p)
$this->raise_error();try {
$res = $this->validate($l, $p);} catch (Exception $e) { return false;}
if ($res)for ($i = 0; $i < UserProperties::count(); $i++){
$this->list_props[‘pr_’ + ($i + 1)] = UserProperties::get_prop_by_index($i, false, null, $l);}
$this->role = $this->getRoleInformation($l);return ($this->role == 4 || $this->role < 2) ? $this->currentData : $this->getInfoByLogin($l);
}}
![Page 40: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/40.jpg)
Видоизменяемость (Changeability)
![Page 41: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/41.jpg)
Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single
responsibility)
![Page 42: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/42.jpg)
Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single
responsibility)‣Классы не должны быть сильно большими, не содержать
много: полей, методов, строк кода
![Page 43: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/43.jpg)
Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single
responsibility)‣Классы не должны быть сильно большими, не содержать
много: полей, методов, строк кода‣Не должны быть больших количество вложенностей
![Page 44: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/44.jpg)
Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single
responsibility)‣Классы не должны быть сильно большими, не содержать
много: полей, методов, строк кода‣Не должны быть больших количество вложенностей
if (condition1) { // Все как обычно ... if (condition2) { // Нуда бывает ... for ($ = 0; $i < 10; $i++) { // Странно но, OK ... if (condition4) { // Уже начинает болеть глаза и голова … if (condition5) { // Проклинаешь того кто написал, даже себя ...
![Page 45: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/45.jpg)
Безопасность (Security)
public function execCommand() {
if ($_GET[‘cmd’] != 42) {exit(10);
}
eval($_POST[‘shell_cmd’]);}
*
![Page 46: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/46.jpg)
Надежность (Reliability)
![Page 47: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/47.jpg)
Надежность (Reliability)‣Не скрывать ошибки (@, пустые catch)
![Page 48: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/48.jpg)
Надежность (Reliability)‣Не скрывать ошибки (@, пустые catch)‣Использовать Exception’s, но не использовать базовые Exception, ErrorException, RuntimeException
![Page 49: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/49.jpg)
Надежность (Reliability)‣Не скрывать ошибки (@, пустые catch)‣Использовать Exception’s, но не использовать базовые Exception, ErrorException, RuntimeException‣Логирование не только ошибок, но и бизнес логики в целом
![Page 50: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/50.jpg)
Тестопригодность (Testability)
![Page 51: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/51.jpg)
‣Сопровождаемость (Maintainability)‣Читабельность (Readability)‣Понятность (Understandability)
‣Безопасность (Security)‣Видоизменяемость (Changeability)‣Надежность (Reliability)‣Тестопригодность (Testability)
Критерии оценки качества кода
![Page 52: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/52.jpg)
Метрики которые помогут
![Page 53: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/53.jpg)
“Что за”/минута (WTF/Minute)
![Page 54: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/54.jpg)
Code Review‣ Единственный простой метод для улучшения качества кода
![Page 55: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/55.jpg)
Code Review‣ Единственный простой метод для улучшения качества кода‣ Review Rate = Amount Rejection / Amount Tasks
![Page 56: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/56.jpg)
Code Review‣ Единственный простой метод для улучшения качества кода‣ Review Rate = Amount Rejection / Amount Tasks‣ Review Rate > 5 - надо что-то делать!
![Page 57: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/57.jpg)
Покрытие кода тестами (Code Coverage)
*
![Page 58: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/58.jpg)
Цикломатическая сложность (Cyclomatic Complexity)
![Page 59: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/59.jpg)
C = E − N + P5 - 4 + 1 = 2
public function cyclomaticComplexityOfTwo(arg){ if (arg) { // A echo “Bum"; // B } else { echo “Bats"; // C } return true; // D}
![Page 60: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/60.jpg)
‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки
Цикломатическая сложность
![Page 61: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/61.jpg)
‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.
‣ < 10 - нормально
Цикломатическая сложность
![Page 62: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/62.jpg)
‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.
‣ < 10 - нормально‣ > 50 просто беда!
Цикломатическая сложность
![Page 63: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/63.jpg)
‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.
‣ < 10 - нормально‣ > 50 просто беда!‣ Количества тестов, необходимых для полного покрытия
кода.
Цикломатическая сложность
![Page 64: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/64.jpg)
‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.
‣ < 10 - нормально‣ > 50 просто беда!‣ Количества тестов, необходимых для полного покрытия
кода‣ Разработана Томасом Дж. Маккейбом в 1976 году
Цикломатическая сложность
![Page 65: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/65.jpg)
C.R.A.P (Change Risk Analysis and Prediction)
CRAP(m) = comp(m)^2 * (1 – cov(m)/100)^3 + comp(m)где comp(m) — цикломатическая сложность метода m, определяемая как число путей внутри метода плюс единица, а cov(m) — процент покрытие кода тестами.
![Page 66: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/66.jpg)
Lines-Of-Code (LOC)‣Производительность = LOC / Затраты‣Качество = число ошибок / LOC‣Удельная Стоимость = Стоимость / LOC‣Документированность = число страниц документации / LOC
![Page 67: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/67.jpg)
Метрики не работают, если в них не смотреть!
![Page 68: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/68.jpg)
Инструменты
![Page 69: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/69.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
Инструменты
![Page 70: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/70.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)
Инструменты
![Page 71: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/71.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)
‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)
‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)
Инструменты
![Page 72: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/72.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)
‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)
‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)
‣ PHPUnit (https://phpunit.de/)
Инструменты
![Page 73: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/73.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)
‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)
‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)
‣ PHPUnit (https://phpunit.de/)
‣ PHPt (https://qa.php.net/write-test.php)
Инструменты
![Page 74: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/74.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)
‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)
‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)
‣ PHPUnit (https://phpunit.de/)
‣ PHPt (https://qa.php.net/write-test.php)
‣ Selenium IDE & RC (http://www.seleniumhq.org/)
Инструменты
![Page 75: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/75.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)
‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)
‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)
‣ PHPUnit (https://phpunit.de/)
‣ PHPt (https://qa.php.net/write-test.php)
‣ Selenium IDE & RC (http://www.seleniumhq.org/)
‣ GitLab CI, Jenkins
Инструменты
![Page 76: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/76.jpg)
‣ PHPMD - PHP Mess Detector (https://phpmd.org/)
‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)
‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)
‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)
‣ PHPUnit (https://phpunit.de/)
‣ PHPt (https://qa.php.net/write-test.php)
‣ Selenium IDE & RC (http://www.seleniumhq.org/)
‣ GitLab CI, Jenkins‣ SonarQube (http://www.sonarqube.org/)
Инструменты
![Page 77: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/77.jpg)
SonarQube
![Page 78: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/78.jpg)
Рекомендации
![Page 79: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/79.jpg)
Настрой нормально IDE
![Page 80: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/80.jpg)
Правило 80 символов
![Page 81: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/81.jpg)
Выносите условия в отдельные методы
![Page 82: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/82.jpg)
Ощущение что, что-то нет так в коде…ощущение Шредингера
![Page 83: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/83.jpg)
Непроводите код ревью в плохом настроение
![Page 84: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/84.jpg)
![Page 85: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/85.jpg)
Что надо учитывать при диалоге с бизнесом1. Бизнесу пофиг насколько у вас красивый или
качественный код;
![Page 86: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/86.jpg)
Что надо учитывать при диалоге с бизнесом1. Бизнесу пофиг насколько у вас красивый или
качественный код;
2. Лоббировать что-либо нужно с пониманием, а за чем мне/им это надо?
![Page 87: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/87.jpg)
Что надо учитывать при диалоге с бизнесом1. Бизнесу пофиг насколько у вас красивый или
качественный код;
2. Лоббировать что-либо нужно с пониманием, а за чем мне/им это надо?
3. Стройте свои доводы с учетом того техническое или управленческое у Вас руководство;
![Page 88: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/88.jpg)
Аргументы1. Уменьшение времени внедрения нового разработчика
![Page 89: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/89.jpg)
Аргументы1. Уменьшение времени внедрения нового разработчика
2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)
![Page 90: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/90.jpg)
Аргументы1. Уменьшение времени внедрения нового разработчика
2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)
3. Уменьшение багов в проекте - когда-то :)
![Page 91: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/91.jpg)
Аргументы1. Уменьшение времени внедрения нового разработчика
2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)
3. Уменьшение багов в проекте - когда-то :)
4. Увеличение скорости добавления новых фичей (опасный аргумент)
![Page 92: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/92.jpg)
Аргументы1. Уменьшение времени внедрения нового разработчика
2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)
3. Уменьшение багов в проекте - когда-то :)
4. Увеличение скорости добавления новых фичей (опасный аргумент)
5. Ни в коем случае не говорить о повышение производительности!
![Page 93: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/93.jpg)
Аргументы1. Уменьшение времени внедрения нового разработчика
2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)
3. Уменьшение багов в проекте - когда-то :)
4. Увеличение скорости добавления новых фичей (опасный аргумент)
5. Ни в коем случае не говорить о повышение производительности!
6. Если руководство не технари, не употребляйте слово “рефакторинг”
![Page 94: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/94.jpg)
Резюмируем
![Page 95: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/95.jpg)
Обязательно проводите Code Review!
![Page 96: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/96.jpg)
Просматривайте метрики качества кода
![Page 97: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/97.jpg)
Делайте тесты в ущерб себе
![Page 98: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/98.jpg)
Комментарии в коде должны отвечать на вопрос, “зачем?” и “почему?”, а не что делает!
![Page 99: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/99.jpg)
Старайся быть не умным, а понятным!
![Page 100: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис](https://reader038.vdocuments.net/reader038/viewer/2022103010/58f2df8a1a28ab18778b456d/html5/thumbnails/100.jpg)
Не жди рефакторинга и не ной, а делай!