Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Извлечение переменной (Extract Variable).md
2026-02-23 19:52:05 +03:00

4.9 KiB
Raw Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20241115072019.png

Проблема

У вас есть сложное для понимания выражение.

renderBanner(): void {
  if ((platform.toUpperCase().indexOf("MAC") > -1) &&
       (browser.toUpperCase().indexOf("IE") > -1) &&
        wasInitialized() && resize > 0 )
  {
    // do something
  }
}

Решение

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

renderBanner(): void {
  const isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
  const isIE = browser.toUpperCase().indexOf("IE") > -1;
  const wasResized = resize > 0;

  if (isMacOs && isIE && wasInitialized() && wasResized) {
    // do something
  }
}

Причины рефакторинга

Выражения могут быть очень сложными и трудными для чтения. В таких слу­чаях имеет смысл с помощью локальных переменных превратить выражение в нечто, лучше поддающееся пониманию и управлению. В частности, локальные переменные дают возможность именовать часть более сложной части логики, что позволяет лучше понять цель происходящего. Такие переменные также удобны для отладки, поскольку обеспечивают простоту просмотра в отладчике или при отладочном выводе. Главная мотивация этого рефакторинга — сделать более понятным сложное выражение, разбив его на промежуточные части. Это может быть:

  • Условие оператора if() или части оператора ?: в C-подобных языках
  • Длинное арифметическое выражение без промежуточных результатов
  • Длинное склеивание строк

Достоинства

  • Улучшает читабельность кода. Постарайтесь дать выделенным переменным хорошие названия, которые будут отражать точно суть выражения. Так вы сделаете код читабельным и сумеете избавиться от лишних комментариев. Например, customerTaxValuecityUnemploymentRateclientSalutationString и т. д.

Недостатки

  • Появляются дополнительные переменные. Но этот минус компенсируется простотой чтения кода.
  • При рефакторинге выражений условных операторов помните о том, что программа обычно оптимизирует выполнение условных выражений и не выполняет дальнейшие проверки, если уже понятен финальный результат выражения. Например, если в выражении if (a() || b()) ... метод a вернет true, то программа не станет выполнять b — что бы он ни вернул, результирующее выражение всё равно будет истинным.
    Однако, после извлечения частей этого выражения в переменные, оба метода будут вызываться постоянно, что может негативно сказаться на производительности, особенно если эти методы выполняют какую-то ресурсоёмкую работу.

Порядок рефакторинга

  1. Вставьте новую строку перед интересующим вас выражением и объявите там новую переменную. Присвойте этой переменной часть сложного выражения
  2. Замените часть вынесенного выражения новой переменной
  3. Повторите это для всех сложных частей выражения

Борется с запахом

Обратный рефакторинг

Ссылки