Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Удаление управляющего флага.

Проблема

У вас есть булевская переменная, которая играет роль управляющего флага для нескольких булевских выражений.

Решение

Используйте break, continue и return вместо этой переменной.

##Пример

До
void checkSecurity(String[] people) {
  boolean found = false;
  for (int i = 0; i < people.length; i++) {
    if (!found) {
      if (people[i].equals("Don")) {
        sendAlert();
        found = true;
      }
      if (people[i].equals("John")) {
        sendAlert();
        found = true;
      }
    }
  }
}
После
void checkSecurity(String[] people) {
  for (String person : people) {
    if (person.equals("Don") || person.equals("John")) {
      sendAlert();
      return;
    }
  }
}

##Зачем делать рефакторинг

Управляющие флаги пришли к нам из тех «бородатых» дней, когда хорошим стилем программирования считалось иметь в функции одну входную точку (строку объявления функции) и одну выходную точку (в самом конце функции).

В современных языках программирования этот подход устарел, так как у нас появились специальные операторы для управления ходом программы в циклах и других сложных конструкциях:

  • break: останавливает выполнение цикла;

  • continue: останавливает выполнение текущего витка цикла и переходит к проверке условия цикла и следующей итерации;

  • return: останавливает выполнение всей функции и возвращает её результат, если он подан в этом операторе.

##Преимущества

  • Код с управляющим флагом зачастую получается значительно более запутанным, чем при использовании операторов управления выполнением.

##Как делать рефакторинг

  1. Найдите присваивание значения управляющему флагу, которое приводит к выходу из цикла или текущей итерации.

  2. Замените его на break, если это выход из цикла, или continue, если это выход из итерации, или return, если нужно вернуть это значение из функции.

  3. Уберите весь остальной код и проверки, связанные с управляющим флагом.