Введение
Со временем код становится все запутаннее, сложнее. Изящные, в былое время, методы превращаются в «спагетти» код из тысяч строк. Конечно, до какого-то момента проще просто добавить в метод новое условие или цикл. Но когда количество строк в методе переваливает за сотню и при этом это единый блок условий и циклов невероятной вложенности, то понять его уже гораздо сложнее.
Проблема
Метод увеличивается в размерах и значительно усложняется его сопровождение. При этом, структура метода, не позволяет провести прозрачный рефакторинг, не нарушая логику кода.
Код
Имеем продолжительный код вида:
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 и возможность вынести сложный блок в отдельный метод.
От кода в стиле «дамп потока сознания» надо избавляться сразу после создания на этапе ревью кода.
ссылка на оригинал статьи http://habrahabr.ru/post/171261/
Добавить комментарий