42 lines
3.3 KiB
Markdown
42 lines
3.3 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[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]] |