Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Перенос инструкций в точку вызова (Move Statements to Callers).md
2026-02-23 19:52:05 +03:00

42 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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 20250131090336.png]]
### **Проблема**
Общее поведение, используемое в нескольких местах, в некоторых вызовах должно меняться
```javascript
emitPhotoData(outStream, person.photo);
function emitPhotoData(outStream, photo) {
outStream.write(`<p>title: ${photo.title}</p>\n`);
outStream.write(`<p>location: ${photo.location}</p>\n`);
}
```
### **Решение**
Переместить изменяющееся поведение из функции в вызывающую ее функцию
```javascript
emitPhotoData(outStream, person.photo);
outStream.write(`<p>location: ${person.photo.location}</p>\n`);
function emitPhotoData(outStream, photo) {
outStream.write(`<p>title: ${photo.title}</p>\n`);
}
```
### **Причины рефакторинга**
Функции являются основными строительными блоками абстракций, которые мы строим как программисты. И, как и в случае любой абстракции, мы не всегда правильно определяем ее границы. По мере того как возможности базы кода изменяются (что естественно для полезного развивающегося программного обеспечения), часто обнаруживается, что меняются и границы абстракций. Для функций это означает, что то, что когда-то было сплоченной, атомарной единицей поведения, может стать смесью двух или более разных поведений.
### **Порядок рефакторинга**
1. В простых ситуациях, когда у вас есть только один или два вызова и простая вызываемая функция, — просто вырежьте первую строку из вызываемой функции и вставьте ее (возможно, с соответствующей подгонкой) в место вызова. Выполните тестирование и на этом завершите рефакторинг.
2. В противном случае примените рефакторинг Извлечение функции ко всем инструкциям, которые вы не хотите перемещать; дайте функции временное имя, которое легко искать.
3. Примените к исходной функции рефакторинг [[Встраивание функции (Inline Function)]]
4. Примените к извлеченной функции рефакторинг [[Изменение объявления функции (Change Function Declaration)]], чтобы вернуть ей ее исходное имя.
### **Обратный рефакторинг**
- [[Перенос инструкций в функцию (Move Statements into Function)]]
### **Ссылки**
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]