Глубоко вложенные операторы - неприятный запах кода. ИНАЧЕ «отступ хадоукен».

Вот пример глубокой вложенности: (т.е. много уровней или вложенность одним методом):

Обратите внимание на запах еще одного ключевого кода: нарушение принципа единой ответственности (метод запуска автомобиля, работающий как с МКПП, так и с АКПП). Сложный поток завершился множеством глубоких блоков кода с операторами if. Много надоедливой горизонтальной прокрутки. Множество отслеживания блоков else и отслеживания того, какие условия позволяют вам попасть в конкретный блок. Можем ли мы сделать лучше? Да, черт возьми!!!!!!

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

Связь с длинным запахом метода и рефакторингом метода извлечения.

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

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

Как исправить вложенность?

Итак, какие рефакторинги были применены в приведенном выше примере с автомобилем? Позвольте мне познакомить вас с очень удобным рефакторингом… «инвертировать, если»…

Рефакторинг «Инвертировать, если»

«Инвертировать, если» - один из самых удобных и распространенных элементов каталога рефакторинга. Многие инструменты IDE, такие как Visual studio, visual code, resharper, будут иметь инструменты, которые автоматически сделают это за вас, вплоть до того, что предложат их вам.

Советы по использованию этой техники

  • сначала разберитесь с «исключительными» или несчастливыми путями (или нестандартными путями).
  • обратите внимание на «ранние выходы» / «короткие замыкания»

Заменить вложенные условные проверки операторами Guard

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

Заявления охранника могут быть предложены вам как первоклассному гражданину на этом языке (например, в swift).

Для других языков, таких как C #, могут быть доступны сторонние библиотеки защиты (например, Dawn Guard или Guard.NET). Или вы можете использовать свой собственный, если вас утомляют зависимости как это сделал XUnit.