Если… остальное неплохо - чрезмерное использование
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.
Удачного программирования!