Введение
Со временем код становится все запутаннее, сложнее. Изящные, в былое время, методы превращаются в «спагетти» код из тысяч строк. Конечно, до какого-то момента проще просто добавить в метод новое условие или цикл. Но когда количество строк в методе переваливает за сотню и при этом это единый блок условий и циклов невероятной вложенности, то понять его уже гораздо сложнее.
Проблема
Метод увеличивается в размерах и значительно усложняется его сопровождение. При этом, структура метода, не позволяет провести прозрачный рефакторинг, не нарушая логику кода.
Код
Имеем продолжительный код вида:
public void process() {
if (condition1) {
...
if (condition2) {
...
for (condition3) {
...
if (condition4) {
...
}
}
} else if (condition5) {
...
} else if (condition6) {
...
}
} else {
...
}
}
Этот код сопровождать невозможно. Делать рефакторинг трудно. Гораздо проще добавить еще одно ветвление и забыть. Уровень вложенности конструкций тоже высок.
Рефакторинг
Если на месте "..." будет объемный код, то метод запросто может достигать размера в несколько тысяч строк. Два рефакторинга, которые исправляют ситуацию:
Выделение метода
Объемные участки кода выделяем в отдельные методы. Сложность методов будет гораздо ниже. Не надо бояться, что ваши методы используются всего в одном месте. Если кому-то в будущем потребуется отдельный метод, то он уже не будет дублировать код или делать сложный рефакторинг, а просто использует необходимый метод.
Замена вложенных условных операторов граничным оператором
За мудреным названием скрывается простой return. Вот какой код получится после рефакторинга:
public void process() {
if (!condition1) {
...
return;
}
...
if (condition2) {
...
loopByCondition();
return;
}
if (condition5) {
...
return;
}
if (condition6) {
...
}
}
private void loopByCondition() {
for (condition3) {
...
if (condition4) {
...
}
}
}
Как видите, код стал линейным и более простым. Такой код сопровождать гораздо проще.
Выводы
Эти простые и понятные рефакторинги сделают ваш код лучше. О них не стоит забывать. Более системно о рефакторингах стоит почитать у Фаулера. А современные IDE позволяют делать рефакторинг более комфортно в несколько кликов.
Указанный в последнем примере код можно писать и сразу. Это будет более прозрачный, понятный и сопровождаемый продукт. Главное придерживаться подхода писать линейный код с малой вложенностью. Для этого не забывать про оператор return и возможность вынести сложный блок в отдельный метод.
От кода в стиле «дамп потока сознания» надо избавляться сразу после создания на этапе ревью кода.