Микро-рефакторинг, о котором мы так часто забываем

от автора

Введение

Со временем код становится все запутаннее, сложнее. Изящные, в былое время, методы превращаются в «спагетти» код из тысяч строк. Конечно, до какого-то момента проще просто добавить в метод новое условие или цикл. Но когда количество строк в методе переваливает за сотню и при этом это единый блок условий и циклов невероятной вложенности, то понять его уже гораздо сложнее.

Проблема

Метод увеличивается в размерах и значительно усложняется его сопровождение. При этом, структура метода, не позволяет провести прозрачный рефакторинг, не нарушая логику кода.

Код

Имеем продолжительный код вида:

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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *