Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Чистый код в коммерческой разработке | Юрий Ковалёв | AzovDevMeetup 2017

Чистый код в коммерческой разработке | Юрий Ковалёв | AzovDevMeetup 2017

Данный доклад предлагает взглянуть на проблему искоренения грязного кода при разработке и поддержке крупных коммерческих проектов.
• Рассмотрим знаменитое правило бойскаута на конкретных примерах из жизни.
• Попробуем определить, какие правила рефакторинга неоднократно окупятся в дальнейшем, а какие не настолько важны, чтобы из-за них тормозить процесс разработки.
• И наконец, посмотрим, как очистить очень грязный и сложный код с минимальными усилиями, не срывая сроки разработки.

JSC “Arcadia Inc.”

December 19, 2017
Tweet

More Decks by JSC “Arcadia Inc.”

Other Decks in Programming

Transcript

  1. 2017 2017 Чистый код в коммерческой разработке Есть ли предел

    совершенству? Юрий Ковалёв, «Аркадия»
  2. 2017 О себе 2 Юрий Ковалёв Аркадия [email protected] Full-stack программист

    с многолетним стажем коммерческой разработки на PHP, JS, TypeScript, Angular, C++, Delphi. Неоднократно участвовал в разработке крупных web-приложений международного уровня. Опыт работы в IT сфере – более 10 лет.
  3. 2017 Что такое чистый код? Чистота кода – величина, равная

    количеству ругательств за единицу времени во время код-ревью. 3 (c) 2008 Focus Shift/OSNews/Thom Holwerda http://www.osnews.com/comics
  4. 2017 Главные признаки чистого кода 4 Удобочитаемость ✓ Единые и

    логичные правила форматирования ✓ Ясные и ёмкие имена ✓ Лаконичность Лёгкость внесения изменений ✓ SOLID ✓ Паттерны проектирования ✓ Удобочитаемость ✓ Тестируемость
  5. 2017 Главные признаки грязного кода 5 ✓ На понимание кода

    тратится очень много времени ✓ Для анализа тела функции требуется вертикальный скроллинг ✓ Строки кода широки и требуют горизонтального скроллинга ✓ Код требует обильных комментариев ✓ Высокая связность кода между компонентами системы, затрудняющая понимание происходяшего ✓ Множество флагов и других вспомогательных переменных Чтобы перекрасить кнопку в другой цвет, нужно 2 часа
  6. 2017 Причины грязного кода 6 ➢ Спешка, горящие сроки. ➢

    Нежелание тратить время «впустую», когда задача уже «выполнена» ➢ Усталость после тяжёлого дебаггинга ➢ По неопытности и незнанию ➢ Плохая архитектура ➢ Давление заказчика Image credit: Sybren Stüvel | flickr.com CC BY-NC-ND 2.0
  7. 2017 Яркие примеры из жизни 7 function resolve_action($action) { return

    $action; } $TEST->id = $tempSurveyId; $TEST->qt_load_db(); if ($TEST->show_all_replies) { $TEST->id = $surveyid; $TEST->qt_load_db(); } if (indeterminate === true) { indeterminate = true; } else { indeterminate = false; } function dummy_users_callback($a,$b) { $a = $a; $b = $b; return array(); } Поспешишь - людей насмешишь!
  8. 2017 Lifecycle чистого и грязного кода 8 Проектирование и разработка

    Поддержка Развитие Зависимость времени разработки от качества кода Грязный код Чистый код * Субъективная оценка в условных единицах на базе личного накопленного опыта
  9. 2017 Практическая сторона вопроса 9 /** * Verify * @access

    public */ function verify_answer($answer) { if ($this->type == MATCH ) { return $this->question_object->validateAnswer( $answer ); } else if ($this->mandatory) { if (is_array($answer)) { if (count($answer)==0) { return 1; } } elseif ($this->type == DROPDOWN ) { if($answer==-1) { //not selected return 1; } } else { if (trim($answer) == '' ) return 1; } } return 0; }
  10. 2017 11 public function verify_answer($answer) { if ($this->type == MATCH)

    { return $this->question_object->validateAnswer($answer); } else if ($this->mandatory) { if (is_array($answer)) { if (count($answer) == 0) { return 1; } } else if ($this->type == DROPDOWN) { if ($answer == -1) { //not selected return 1; } } else if (trim($answer) == '') { return 1; } } return 0; } Эффект 5-10% Применимо всегда Трудоёмкость 1-5 мин. Бойскаут за работой Шаг 1. Приведение к единому стилю форматирования
  11. 2017 12 public function verify_answer($answer) { if ($this->type == MATCH)

    { return $this->question_object->validateAnswer($answer); } if ($this->mandatory && ( (is_array($answer) && (count($answer) == 0)) || (is_string($answer) && (trim($answer) == '')) || (($this->type == DROPDOWN) && ($answer == -1)) ) { return 1; } return 0; } Эффект 1-15% Применимо часто Трудоёмкость 2-10 мин. Бойскаут за работой Шаг 2. Повышение выразительности кода
  12. 2017 13 public function isAnswerInvalid($answer) { if ($this->type == MATCH)

    { return $this->question_object->isAnswerInvalid($answer); } $hasNoAnswer = (is_array($answer) && (count($answer) == 0)) || (is_string($answer) && (trim($answer) == '')) || (($this->type == DROPDOWN) && ($answer == NO_ANSWER)); return ($this->mandatory && $hasNoAnswer) ? 1 : 0; } Эффект 15-25% Применимо всегда Трудоёмкость 5-20 мин. Бойскаут за работой Шаг 3. Присвоение хороших имён
  13. 2017 14 class DropdownQuestion extends Question { ... public function

    isAnswerInvalid($answer) { $hasNoAnswer = ($answer == NO_ANSWER); return ($this->mandatory && $hasNoAnswer); } ... } class MatchQuestion extends Question { ... public function isAnswerInvalid($answer) { return $this->question_object->isAnswerInvalid($answer); } ... } ... Эффект 20-50% Трудоёмкость 15-30 мин. Бойскаут за работой Шаг 4. Улучшение архитектуры Применимо редко
  14. 2017 15 Бойскаут за работой Тесты Преимущества ✓ Упрощают проведение

    масштабного рефакторинга ✓ Позволяют глубже понять требования к системе ✓ Защищают код от ошибок Недостатки ✓ Трудозатратно ✓ Замедляется процесс разработки ✓ Полное покрытие тестами не всегда достижимо
  15. 2017 17 Подведём итоги Эффект 5-10% Применимо всегда Трудоёмкость низкая

    Приведение кода к единому стилю форматирования Повышение выразительности кода Присвоение хороших имён Улучшение архитектуры приложения Эффект 1-15% Применимо часто Трудоёмкость низкая Эффект 15-25% Применимо всегда Трудоёмкость средняя Эффект 20-50% Трудоёмкость высокая Применимо редко