Применяется подход, я бы его назвал "отбрасывание хвоста", но возможно есть и официальное название. Работает внутри функции в виде досрочного выхода из неё.
При if и if-else нужно как бы помнить все предыдущие if и держать их в голове. При отбрасывании хвоста всё наоборот - разум очищается, отработанные мысли выкидываются, и в голове обычно 1-2 условия нужно держать.
Подход можно применить частично, потому что это может быть не тупая колбаса условий if, а else-ветвистая. Но каждую линейную ветвь точно можно превращать в маленький хвостик, а если рефакторить, то и ветки побольше. Главное, всё время стараться избавиться от лишнего ментального груза. Тогда код превращается в обычную прозу, где инструкции следуют одна за другой (императивно) без сложной многоступенчатой логики, и его становится легко читать и понимать.
Для if:Конструкция
if (condition_A) {
instruction_A;
if (condition_B) {
instruction_B;
if (condition_C) {
instruction_C;
.....
}
}
}
Превращается в (вложенности уходят):
if (!condition_A) return;
instruction_A;
if (!condition_B) return;
instruction_B;
if (!condition_C) return;
instruction_C;
.....
Для if-else:Конструкция
if (condition_A) {
instruction_A;
} else if (condition_B) {
instruction_B;
} else if (condition_C) {
instruction_C;
} else if .....
Превращается в обычный switch, либо снова в отбрасывание хвоста:
if (condition_A) {
instruction_A;
return;
}
if (condition_B) {
instruction_B;
return;
}
if (condition_C) {
instruction_C;
return;
}
if .....
Сложные ветки можно выделять в отдельные функции, это тоже как бы граница логики, перешагивая через которую можно позволить себе забыть часть кода, хоть и временно. Дело в том, что return работает на всю функцию целиком, в этом и есть его сила. Но на отдельную ветку он не применим, пока не выделить её в отдельную функцию, - тогда снова можно применять.
Конечно, если есть повторы в условиях, как у вас, то можно как-то сообразить, как это представить в виде цикла (обхода массива любым способом), или скомбинировать разные ветки условий в одну с помощью
&&
и
||
, или опять-таки выделить в подфункцию. Сообразить = рефакторить. Обработку ошибок можно также оборачивать в try-catch, но это уже другая история.