Если… остальное неплохо - чрезмерное использование

If… else существует во всех языках программирования. При правильном использовании это неплохая практика. Это простая, понятная и гибкая структура логического управления.

Но на самом деле его часто используют чрезмерно. Плохими они могут быть в следующих случаях:

  • Вложенный if-else или многоуровневое вложение (хуже)
  • Слишком много if-elses вызывают большое количество ветвей условий
  • Оператор сложного условия со смешанными флагами

Чрезмерное использование if… else - это запах кода. Это затрудняет чтение и сопровождение вашей кодовой базы. Есть много способов решить эту проблему.

В этой статье мы рассмотрим четыре различных подхода в контексте TypeScript.

1. Охрана и досрочное возвращение

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

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

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

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

2. Табличный метод

Проблема: приведенный ниже фрагмент кода предназначен для получения количества дней в месяце. Очевидно, что это подвержено ошибкам и трудно изменить. Например, что будет, если нам понадобится поддержка в високосные годы? Это будет кошмар обслуживания.

Решение: мы используем Табличный метод, чтобы улучшить приведенный выше фрагмент кода.

Табличные методы - это схемы, которые позволяют вам искать информацию в таблице, а не использовать логические операторы (то есть case, if). - dev.to

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

3. Извлечь

Проблема: сложные условия не являются проблемой, если они читабельны. В приведенном ниже примере содержится вложенный и сложный оператор условия if. Трудно понять, что это за состояние.

Решение. Мы используем метод extract для рефакторинга приведенного выше примера. Множественные проверки во вложенных if заключены в отдельную функцию с осмысленным именем. Вложенные if заменяются одним if с простой функцией условия.

4. Операторы "Значение по умолчанию" и ||.

Проблема: следующее if..else используется для проверки нуля, код излишне сложен и не очень удобочитаем.

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

В этом примере мы присваиваем статусу значение по умолчанию и используем оператор || для обработки нулевой проверки. Благодаря гибкости JavaScript в результате меньше дублирования кода и код становится более читабельным.

Сосредоточьтесь на первопричине

Чрезмерное использование if… else может быть признаком других проблем. Работая над рефакторингом, мы должны сосредоточиться на основной причине, а не просто на устранении симптома.

Функция состоит из ввода, внутреннего состояния и вывода. Функция принимает входные параметры, выполняет мутацию внутреннего состояния и возвращает выходной результат. Чрезмерное использование if..else может быть результатом:

  • Чрезмерная логика внутреннего состояния: все четыре вышеупомянутых метода могут быть применены для улучшения кода.
  • Сложные входные параметры со смешанными флагами. В этом случае может помочь метод значения по умолчанию. Но основной причиной может быть абстракция интерфейса функции. Возможно, нам потребуется пересмотреть и улучшить абстракцию.
  • Слишком много разных путей возврата и сложный вывод: это признак того, что функция может выполнять слишком много действий. В центре внимания должен быть рефакторинг функции, а не сокращение операторов if..else.

Чтобы провести чистый рефакторинг, мы должны сосредоточиться на формулировке понятного интерфейса, чтобы функция выполняла одну-единственную задачу. (Принцип единственной ответственности).

Резюме

Мы обсудили четыре простых и эффективных способа избавиться от чрезмерного использования if… else. Применение этих методов поможет вам написать более понятный и читаемый код.

Есть и другие подходы к рефакторингу if..else, например, использование шаблона стратегии или цепочки ответственности. В этой статье они не рассматриваются, потому что я хочу сосредоточиться на более простых и практичных решениях.

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

Если вам понравилась эта статья, возможно, вы захотите прочитать еще одну мою статью о TypeScript.



Удачного программирования!