#рефакторинг #методы_рефакторинга ![[Pasted image 20250131090336.png]] ### **Проблема** Общее поведение, используемое в нескольких местах, в некоторых вызовах должно меняться ```javascript emitPhotoData(outStream, person.photo); function emitPhotoData(outStream, photo) { outStream.write(`

title: ${photo.title}

\n`); outStream.write(`

location: ${photo.location}

\n`); } ``` ### **Решение** Переместить изменяющееся поведение из функции в вызывающую ее функцию ```javascript emitPhotoData(outStream, person.photo); outStream.write(`

location: ${person.photo.location}

\n`); function emitPhotoData(outStream, photo) { outStream.write(`

title: ${photo.title}

\n`); } ``` ### **Причины рефакторинга** Функции являются основными строительными блоками абстракций, которые мы строим как программисты. И, как и в случае любой абстракции, мы не всегда правильно определяем ее границы. По мере того как возможности базы кода изменяются (что естественно для полезного развивающегося программного обеспечения), часто обнаруживается, что меняются и границы абстракций. Для функций это означает, что то, что когда-то было сплоченной, атомарной единицей поведения, может стать смесью двух или более разных поведений. ### **Порядок рефакторинга** 1. В простых ситуациях, когда у вас есть только один или два вызова и простая вызываемая функция, — просто вырежьте первую строку из вызываемой функции и вставьте ее (возможно, с соответствующей подгонкой) в место вызова. Выполните тестирование и на этом завершите рефакторинг. 2. В противном случае примените рефакторинг Извлечение функции ко всем инструкциям, которые вы не хотите перемещать; дайте функции временное имя, которое легко искать. 3. Примените к исходной функции рефакторинг [[Встраивание функции (Inline Function)]] 4. Примените к извлеченной функции рефакторинг [[Изменение объявления функции (Change Function Declaration)]], чтобы вернуть ей ее исходное имя. ### **Обратный рефакторинг** - [[Перенос инструкций в функцию (Move Statements into Function)]] ### **Ссылки** - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]