Що таке рефакторинг коду і навіщо він потрібний
![]()
Ви можете написати програму у будь-який зручний спосіб так, щоб вона працювала. Але в будь-якому випадку доведеться упорядкувати вихідний код, тобто провести рефакторинг.
Навіщо ж потрібна ця процедура, якщо вона не вносить корективи в додаток і не змінює його функціонал? У цій статті ми якраз і поговоримо про цю тему.
Навіщо потрібний рефакторинг
Почнемо з того, що таке рефакторинг (refactoring). Це процедура, яка передбачає переробку вихідного коду програми так, щоб він став більш простим та зрозумілим. При цьому нові функції не додаються, а старі зберігаються.
Справа в тому, що розробники у процесі своєї роботи, як правило, поспішають, додають нові функції або виправляють існуючі баги. Все це призводить до того, що код стає безладним і незрозумілим. А щоб він мав більш адекватний вигляд, рекомендується проводити рефакторинг.
Загалом ця процедура спрямована:
- збереження архітектури проекту, без втрати структурованості;
- на спрощення життя розробників, роблячи код прозорим та зрозумілим для всіх членів команди;
- на прискорення процесу пошуку помилок.
Також варто розуміти, що мова програмування вдосконалюється: з’являються нові функції, бібліотеки, тобто те, що робить код простішим і зрозумілішим. Навіть ідеальна програма, написана рік/два тому, згодом потребує нового рефакторингу. Завдання процесу – оновити ділянки застарілого коду.
Іншими словами можна сказати, що refactoring – упорядкування робочого місця. Це грубий приклад, але всім зрозумілий.
Чим рефакторинг відрізняється від оптимізації
Часто рефакторинг плутають із оптимізацією, оскільки ці два процеси, найчастіше, проводять одночасно. Але насправді це два різні поняття, що мають різні цілі:
- оптимізація – покращує продуктивність програми;
- рефакторинг – покращує зрозумілість коду.
До речі, після оптимізації вихідний код ускладнюється і тому після нього рекомендують провести чищення коду.
Що не є рефакторингом?
Багато хто вважає, що рефакторинг це:
- переписування коду;
- покращення функціональної складової ПЗ;
- оптимізація;
- дебаггінг.
Говорячи про перший пункт, то він має сенс при створенні нового програмного забезпечення.
Другий передбачає поліпшення ПЗ з погляду користувача, а не з погляду розробника.
Оптимізація передбачає поліпшення продуктивності програми, при цьому код може стати ще складнішим. Як правило, оптимізацію та refactoring проводять паралельно.
І насамкінець, четвертий пункт – пошук помилок та їх усунення, при цьому код може стати як простіше, так і складніше. Суть та мета дебаггінгу – змусити ПЗ працювати коректно.
Всі ці пункти не є рефакторингом і часто кожен виконується окремо.
Як роблять рефакторинг
Рефакторинг виконується послідовно, крок за кроком. Безперечно, чистити можна все. Однак насамперед рекомендується знайти такі проблеми:
- Мертвий код — це параметр, змінна, метод або клас, який більше не використовується. Такі ділянки потрібно видалити.
- Дублювання – той самий код виконує одну й ту саму дію в кількох місцях програми.
- Імена класів, функцій, змінних не передають їх значення.
- Занадто довгі функції, методи, класи та списки параметрів функцій. Якщо їхня довжина виходить за оптимальне значення, необхідно розбити їх на маленькі складові.
- Велика кількість коментарів, які захаращують програму.
Як правило, код чистять на етапі тестування, коли все вже готове та перевіряється працездатність програми.
Коли ви підчищаєте одну частину коду, зверніть увагу на сусідні ділянки, можливо, вони теж вимагають поліпшення. Але при цьому важливо пам’ятати, що в цій справі прагнення до досконалості ні до чого. Тобто перетрушувати всю програму в пошуках того, що можна почистити – схоже на фанатизм.
Коли потрібно терміново покращувати код
Існує певний перелік ознак, який свідчить про те, що коду потрібен терміновий рефакторинг. Розглянемо ці ознаки докладніше.
Засмічувачі
Сюди входять ті ділянки коду, видаливши які функціонал програми не буде зачеплений:
- дублі;
- мертвий код;
- надлишок коментарів;
- ліниві класи (ділянки, що виконують маловажливі завдання);
- класи даних (містять у собі поля та найпримітивніші методи).
Якщо регулярно підчищати код від засмічувачів, то він буде більш зрозумілим як самому автору, так і іншим учасникам команди.
Роздмухувачі
Ця категорія складається з елементів коду, які в процесі розробки ПЗ збільшилися до таких розмірів, що коректно з ними працювати неможливо. Наприклад:
- використання елементарних складових замість дрібних об’єктів;
- великий клас, що містить багато методів рядків коду та полів;
- довгий метод, що складається з 10 рядків та більше;
- дублі з однаковими змінними у різних частинах коду;
- довгі списки параметрів
Важливо стежити за цією категорією, оскільки вона проявляється не відразу, а в процесі еволюції програми.
Порушники ООП
ООП – об’єктно-орієнтоване програмування. Якщо розробник неправильно використовує його можливості, можуть виникнути такі проблемы:
- наявність полів, які не містять дані;
- використання в коді оператора “switch” та послідовність з кількох “if”;
- кілька класів, які виконують аналогічні функції, але при цьому наділені різними методами.
Ускладнювачі змін
Сюди входять проблеми, які неможливо змінити, не виправивши при цьому інші ділянки коду. Наприклад:
- Паралельне успадкування Створення підкласу для одного класу, яке потребує виконання аналогічної операції із пов’язаним класом.
- Стрілянина дробом. Модифікації коду, які змушують розробника редагувати більшість класів.
- Розбіжні модифікації. Редагування класу неможливе без зміни різних методів.
Інші ознаки
Також є й інші ситуації, коли необхідний рефакторинг:
- один клас, оперує методами та службовими полями іншого (недоречна близькість);
- клас виконує одну дію – передає роботу іншому класу;
- метод звертається до даних, що належать до іншого об’єкта набагато частіше, ніж до своїх.
Методики рефакторингу
Методів проведення рефакторингу також багато, як і приводів щодо його проведення. Основне завдання – провести ревізію програми, визначити проблемну зону та усунути її. Все просто. Розглянемо три основні методи.
Складання методів
Основне завдання – зменшити довжину методів, усунути дублі коду, полегшивши роботу з ним. Насамперед необхідно провести роботу зі змінними:
- Розщеплення – використання різних змінних для різних даних, де кожен контейнер відповідає за конкретне завдання.
- Вилучення. Якщо код має складний вираз, необхідно його результат помістити у окремі змінні.
Організація даних
Суть полягає у заміні примітивних типів на класи з більшою функціональністю. Є такі методи:
- Значення замість посилання. Якщо є велика кількість однакових частин коду, які належать до одного класу, їх замінюють єдиним об’єктом-посиланням.
- Заміна зв’язків. Якщо потрібно використовувати можливості двох класів, то додається недостатній зв’язок класів.
- Самоінкапсуляція поля. Цей процес передбачає формування сеттер та геттер для поля.
Спрощення умов
Рефакторинг спрямовано на мінімізацію умовних операторів у коді.
Варіанти:
- замінити прапор для булевських виразів функціями «break», «continue» та «return»;
- розбити складний оператор на частини за допомогою функцій “then” та “else”;
- об’єднання однакових умов, що призводять до єдиного результату.
У чому небезпека рефакторингу
Як не крути, змінювати код – це небезпечно, адже навіть дрібні зміни можуть зламати програму. Тому важливо після кожної зміни тестувати програму. Деякі горе-програмісти переписують цілі класи, а потім не можуть включити програмне забезпечення.
А щоб уникнути цього, можна скористатися такими рекомендаціями від розробників:
- Проводити рефакторинг регулярно, але потроху.
- Не робити з рефакторингу церемонію, тобто не потрібно залишати важливі завдання щодо опрацювання ПЗ (наприклад, впровадження нового функціоналу).
- Не нехтуйте рефакторингом, навіть якщо ви працюєте над цим проектом самостійно.
Питання та відповіді
Які вигоди рефакторинг приносить як розробникам, так і проєктам?
Рефакторинг має такі переваги: поліпшення якості коду, збільшення супроводжуваності та розширюваності проєкту, зниження витрат на обслуговування та усунення багів у майбутньому.
Як часто слід проводити рефакторинг коду?
Рефакторинг коду – це безперервний процес, і його частота може залежати від конкретних вимог проєкту та його стану. Однак регулярний рефакторинг, проведений всередині розроблення нових функцій або виправлення багів, може допомогти підтримувати високу якість коду.







