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

3.3 KiB
Raw Blame History

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

!Pasted image 20250131090336.png

Проблема

Общее поведение, используемое в нескольких местах, в некоторых вызовах должно меняться

emitPhotoData(outStream, person.photo);

function emitPhotoData(outStream, photo) {
  outStream.write(`<p>title: ${photo.title}</p>\n`);
  outStream.write(`<p>location: ${photo.location}</p>\n`);
}

Решение

Переместить изменяющееся поведение из функции в вызывающую ее функцию

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), чтобы вернуть ей ее исходное имя.

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

Ссылки