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

62 lines
4.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[Pasted image 20241115072019.png]]
### **Проблема**
У вас есть сложное для понимания выражение.
```typescript
renderBanner(): void {
if ((platform.toUpperCase().indexOf("MAC") > -1) &&
(browser.toUpperCase().indexOf("IE") > -1) &&
wasInitialized() && resize > 0 )
{
// do something
}
}
```
### **Решение**
Поместите результат выражения или его части в отдельные переменные, поясняющие суть выражения.
```typescript
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-подобных языках
- Длинное арифметическое выражение без промежуточных результатов
- Длинное склеивание строк
### **Достоинства**
- Улучшает читабельность кода. Постарайтесь дать выделенным переменным хорошие названия, которые будут отражать точно суть выражения. Так вы сделаете код читабельным и сумеете избавиться от лишних комментариев. Например, `customerTaxValue`, `cityUnemploymentRate`, `clientSalutationString` и т. д.
### **Недостатки**
- Появляются дополнительные переменные. Но этот минус компенсируется простотой чтения кода.
- При рефакторинге выражений условных операторов помните о том, что программа обычно оптимизирует выполнение условных выражений и не выполняет дальнейшие проверки, если уже понятен финальный результат выражения. Например, если в выражении `if (a() || b()) ...` метод `a` вернет `true`, то программа не станет выполнять `b` — что бы он ни вернул, результирующее выражение всё равно будет истинным.
Однако, после извлечения частей этого выражения в переменные, оба метода будут вызываться постоянно, что может негативно сказаться на производительности, особенно если эти методы выполняют какую-то ресурсоёмкую работу.
### **Порядок рефакторинга**
1. Вставьте новую строку перед интересующим вас выражением и объявите там новую переменную. Присвойте этой переменной часть сложного выражения
2. Замените часть вынесенного выражения новой переменной
3. Повторите это для всех сложных частей выражения
### **Борется с запахом**
- [[Комментарии]]
### **Обратный рефакторинг**
- [[Встраивание переменной (Inline Variable)]]
### **Ссылки**
- https://refactoring.guru/ru/extract-variable
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]