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

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

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

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

Avatar for JSC “Arcadia Inc.”

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% Трудоёмкость высокая Применимо редко