Pull to refresh

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

Reading time2 min
Views12K

Введение


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

Проблема


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

Код


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

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 и возможность вынести сложный блок в отдельный метод.

От кода в стиле «дамп потока сознания» надо избавляться сразу после создания на этапе ревью кода.
Tags:
Hubs:
-3
Comments55

Articles

Change theme settings