Пришла весна! В это время года все тщательно убирают свой дом. Как разработчик, я предлагаю другой подход: Очистите свой код.

Что такое чистый код?

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

Зачем писать чистый код?

Написание чистого кода - необходимый образ мышления. Это очень важно для вас и ваших коллег. Будет проще и быстрее улучшать, поддерживать и тестировать продукт, если каждый понимает код. Это повышает качество продукта и снижает технический долг.

️Как очистить код?

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

Шаг 1. Переименуйте метод

Проблема

Название метода не объясняет, что он делает.

Решение

Переименуйте метод.

Преимущества

Код читабелен и объясняет, что он делает. Позаботьтесь о своих именах и измените их, когда найдете более удачные. Все, кто читает ваш код (включая вас), будут счастливы, если вы это сделаете.

Рабочий процесс

  1. Создайте новый метод с новым именем. Скопируйте на него код старого метода. Замените весь код в старом методе вызовом нового метода.
  2. Найдите все ссылки на старый метод и замените их ссылками на новый.
  3. Удалите старый метод.

Шаг 2. Замените вложенное условное выражение защитными предложениями

Проблема

Группа вложенных условных выражений затрудняет понимание логики кода.

Решение

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

Преимущества

Функция меньше, а список условных операторов плоский. Предохранительные предложения снижают сложность и упрощают понимание логики. Мы можем не читать охранников и быстро увидеть основную цель метода.

Рабочий процесс

  1. Изолируйте все предложения, которые приводят к вызову исключения или немедленному возврату значения из метода.
  2. Поместите эти условия в начало метода, перед основными проверками.

Шаг 3. Замените жестко запрограммированное значение

Проблема

В коде используется жестко запрограммированное значение, которое имеет для него определенное значение.

Решение

Замените это значение константой или параметром конфигурации с понятным для человека именем, объясняющим значение значения.

Преимущества

Упростите изменение значения константы или значения конфигурации, чем поиск этого значения во всей кодовой базе, без риска случайного изменения того же значения, которое используется в другом месте для другой цели.

Рабочий процесс

  1. Объявите константу или создайте параметр конфигурации и присвойте ему значение.
  2. Найдите все упоминания жестко запрограммированного значения.
  3. Для каждого найденного значения замените его константой или значением config. Убедитесь, что это правильное значение для замены.

Шаг 4. Удалите повторяющиеся условные фрагменты

Проблема

Идентичный код можно найти во всех ветвях условного оператора.

Решение

Переместите код за пределы условного.

Преимущества

Дедупликация кода.

Рабочий процесс

  1. Если дублированный код находится в начале условных ветвей, переместите код на место перед условным.
  2. Если код выполняется в конце ветвей, поместите его после условного.
  3. Если повторяющийся код случайно расположен внутри ветвей, сначала попробуйте переместить код в начало или конец ветки, в зависимости от того, меняет ли он результат последующего кода.
  4. Если возможно, и повторяющийся код длиннее одной строки, попробуйте использовать извлеченный метод.

Шаг 5: метод извлечения

Проблема

Фрагменты кода можно сгруппировать.

Решение

Переместите этот код в отдельный новый метод и замените старый код вызовом метода.

Преимущества

Метод меньше по размеру и его легко проверить. Код более читабелен, потому что новый метод имеет имя, описывающее цель метода. Его можно повторно использовать в другом месте программы. Например, функцию можно использовать перед обновлением книги.

Рабочий процесс

  1. Создайте новый метод с понятным именем, объясняющим, что он делает.
  2. Скопируйте соответствующий фрагмент кода в свой новый метод.
  3. Замените фрагмент вызовом нового метода.

Шаг 6: Извлечь переменную

Проблема

Выражение трудно понять.

Решение

Извлеките каждый результат выражения в отдельные переменные.

Преимущества

Сделайте сложное выражение более понятным с помощью переменных с осмысленными именами.

Рабочий процесс

  1. Объявите новую переменную с осмысленным именем для каждого сложного выражения. Присвойте выражение этой переменной.
  2. Замените каждое выражение переменной.

Шаг 7. Объедините параметры с объектом

Проблема

Метод содержит множество параметров.

Решение

Создайте объект, который включает параметры.

Преимущества

Более читабельный. У метода есть объект с понятным именем вместо множества параметров. Добавить новый критерий легко, не меняя сигнатуры метода. Можно использовать валидатор, чтобы убедиться, что объект действителен.

Рабочий процесс

  1. Создайте новый класс, который будет представлять вашу группу параметров.
  2. Замените параметры созданным объектом.
  3. Во всех вызовах метода передайте объект, созданный из параметров старого метода.

Шаг 8: замените массив объектом

Проблема

Массив содержит определенные элементы, означающие разные вещи.

Решение

Замените массив объектом, у которого есть поле для каждого элемента.

Преимущества

Поле класса намного проще документировать, чем элементы массива. Действительно, сложно узнать, какие ключи массива используются для хранения данных, а не класс, который имеет автоматическое завершение, благодаря документации. Также проще тестировать класс, а не массив. У каждого метода доступа класса может быть своя логика.

Рабочий процесс

  1. Создайте новый класс, который будет содержать данные из массива.
  2. Создайте личное поле для каждого элемента массива.
  3. Создайте метод доступа для каждого поля нового класса.
  4. Создайте новый экземпляр класса в том месте, где был инициирован массив данных.
  5. Замените каждый элемент массива методами доступа.

Шаг 9: объедините условное выражение

Проблема

Несколько условий приводят к одному и тому же результату или действию.

Решение

Объедините все условные выражения в одно выражение.

Преимущества

Дедупликация кода. Множественные условные выражения теперь изолированы в новом методе с именем, объясняющим назначение условного выражения. Новый метод легко смоделировать для тестирования кода.

Рабочий процесс

  1. Объедините условные выражения в одно выражение, используя and и or.
  2. Создайте новый метод с понятным именем, объясняющим, что он делает.
  3. Скопируйте выражение в свой новый метод.
  4. Замените выражение вызовом нового метода.

Шаг 10: Извлечь класс

Проблема

Один класс делает все в одном месте.

Решение

Извлеките каждую соответствующую функциональность в отдельный класс.

Преимущества

У класса единственная ответственность, это определение принципа единой ответственности. Код легче тестировать и поддерживать. Это делает каждый класс многоразовым.

Рабочий процесс

  1. Создайте класс для каждой соответствующей функции.
  2. Переместите методы, зависящие от этой функциональности, в новый класс.
  3. Передайте объект в конструктор класса, который зависит от функциональности.
  4. Замените методы, используя зависимость.