3.3 KiB
3.3 KiB
#рефакторинг #методы_рефакторинга
Проблема
Общее поведение, используемое в нескольких местах, в некоторых вызовах должно меняться
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`);
}
Причины рефакторинга
Функции являются основными строительными блоками абстракций, которые мы строим как программисты. И, как и в случае любой абстракции, мы не всегда правильно определяем ее границы. По мере того как возможности базы кода изменяются (что естественно для полезного развивающегося программного обеспечения), часто обнаруживается, что меняются и границы абстракций. Для функций это означает, что то, что когда-то было сплоченной, атомарной единицей поведения, может стать смесью двух или более разных поведений.
Порядок рефакторинга
- В простых ситуациях, когда у вас есть только один или два вызова и простая вызываемая функция, — просто вырежьте первую строку из вызываемой функции и вставьте ее (возможно, с соответствующей подгонкой) в место вызова. Выполните тестирование и на этом завершите рефакторинг.
- В противном случае примените рефакторинг Извлечение функции ко всем инструкциям, которые вы не хотите перемещать; дайте функции временное имя, которое легко искать.
- Примените к исходной функции рефакторинг Встраивание функции (Inline Function)
- Примените к извлеченной функции рефакторинг Изменение объявления функции (Change Function Declaration), чтобы вернуть ей ее исходное имя.
