Проверки условий в коде создают уровни вложенности. Вложенность усложняет работу с кодом: приходится держать в голове все условия и текущий уровень вложенности. Легко запутаться, пропустить «дыры» в логике и сценариях.
Чтобы избавиться от вложенности, инвертируйте проверки. Вместо проверки выполнения условия, проверяйте невыполнение. Если условие не выполнено, сразу выходите из функции или пускайте программу по более короткому пути.
Былоfunction render(data) { if (data.isChanged) { … … … if (data.count) { … … … } } else { this.sync() } }
Сталоfunction render(data) { if (!data.isChanged) { this.sync() return } … … … if (!data.count) return … … … }
Сложность кода серьёзно уменьшилась. Во время чтения больше не нужно держать в голове все условия.
Приём называется Guard Clause. А мне нравится называть его «вышибалой». Типа, «не прошли фейс‑контроль — дальше не пущу» :‑)
Не могу придумать ситуацию, когда использование Guard Clause повредит коду. Приём, кажется, беспроигрышный. Знаете, когда Guard Clause повредит? Напишите в коментах.