Рефакторинг

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Рефакторинг (англ. refactoring) — перетворення програмного коду, зміна внутрішньої структури програмного забезпечення для полегшення розуміння коду і легшого внесення подальших змін без зміни зовнішньої поведінки самої системи[1]. Слово «рефакторинг» пішло від терміну «факторинг» в структурному програмуванні, який означав декомпозицію програми на максимально автономні та елементарні частини.

Причини рефакторингу[ред.ред. код]

Існує міф про те, що правильно організований процес розробки продукту методично дотримується поставлених вимог, визначає однозначний, стабільний список обов’язків програми, і при цьому програмний код може бути написаний майже лінійно — від початку до закінчення, кожна ділянка — один раз написана, відтестована і забута. Згідно з цим міфом, єдиний випадок, коли наявний код може змінюватись, — це в процесі підтримки і адміністрування програми, коли початкова версія продукту уже здана замовнику.

Однак реальність є дещо інакшою. Насправді код еволюціонує в процесі розробки продукту. Як правило, кодування, відлагодження та модульне тестування займають в середньому 30–65% зусиль від загального часу існування проекту (залежно від величини проекту). Навіть на добре організованих проектах вимоги змінюються в середньому на 1–4% за місяць, що неминуче спричиняє зміни до програмного коду — як дрібні, так і досить серйозні.[2]

Також, на відміну від старіших методик розробки програмних продуктів, де основний акцент ставився на мінімізації змін до коду, сучасна методика вбачає великий потенціал у внесенні змін. Вона є більш сфокусованою на коді (code-centered) і під час розробки можна очікувати, що код буде вдосконалюватися більше, ніж зазвичай.

Підстави для проведення рефакторингу[ред.ред. код]

  1. Код дублюється.
    Це нерідко призводить до необхідності вносити паралельні зміни до кількох скопійованих ділянок коду одночасно (що не відповідає принципам «DRY» (Don't Repeat Yourself) та «Copy And Paste is a Design Error»).
  2. Підпрограма занадто довга.
    Хоча питання, яку максимальну довжину може мати підпрограма, є досить суперечливим, однак загальноприйнятим неофіційним стандартом є написання підпрограм довжиною не більше, ніж один екран коду.
  3. Цикл занадто довгий, або рівень вкладеності тіла циклу занадто великий.
  4. Клас має багато обов'язків, слабо пов'язаних між собою.
    В такому випадку краще розділити клас на кілька атомарних класів.
  5. Інтерфейс класу не забезпечує достатній рівень абстракції.
  6. Функція має занадто багато параметрів.
  7. Потрібно одночасно змінювати кілька паралельних ієрархій класів.
    Для вирішення цієї проблеми можна, наприклад, скористатися шаблоном «Міст».
  8. Споріднені дані, які використовуються разом, не організовані в клас.
  9. Клас не виконує ніяку роботу самостійно, а тільки передоручає обов'язки іншим класам.
  10. Назва класу чи методу має ім'я, яке недостатньо точно відповідає змісту.
  11. Клас має занадто багато відкритих (public) членів.
  12. Нестатичний клас складається тільки з даних або тільки з методів.
  13. В ланцюжку викликів методів передається багато зайвих даних.
  14. Занадто поширене використання глобальних змінних.

Прийоми рефакторингу[ред.ред. код]

  1. Прийоми, що дозволяють розбити код на дрібніші, зрозуміліші частини.
  2. Прийоми, що дозволяють забезпечити додаткову абстракцію.
    • Інкапсуляція поля (Encapsulate Field) — замінює прямий доступ до поля на доступ через методи-аксесори (або властивості в C#).
    • Узагальнення типу (Generalize Type) — заміна типів, з якими працює клас, на більш узагальнені.
    • Заміна блоків перевірки типів на шаблони «Стан» (State) або «Стратегія» (Strategy).
    • Заміна умовних операторів поліморфізмом.
    • Створення поля або локальної змінної (Introduce Field/Introduce Local Variable).
  3. Прийоми, що змінюють назви членів та їх розташування.
    • Переміщення методу/поля (Move Method/Field) в інші класи або файли коду.
    • Перейменування члена (Rename) — зміна імені, з автоматичною заміною всіх посилань на старе ім’я в коді.
    • Переміщення члену до базового/дочірнього класу (Pull Up/Push Down).

Автоматизований рефакторинг[ред.ред. код]

На сьогоднішній день багато інтегрованих середовищ розробки містять вбудовані механізми рефакторингу коду. Крім інтегрованої функціональності, існує також багато продуктів сторонніх виробників, які, як правило, реалізовані у вигляді додатків (plugins) до відповідного IDE. Приклади таких пакетів:

Пакет Мова Середовище
Microsoft Visual Studio C# Microsoft Visual Studio (вбудований)
Java Development Tooklit Java Eclipse (вбудований)
IntelliJ IDEA Java IntelliJ IDEA (вбудований)
NetBeans Java NetBeans (вбудований)
Visual Assist C#, C++, VB, VB.NET Microsoft Visual Studio
Photran Fortran Eclipse

Джерела[ред.ред. код]

  1. Martin Fowler, Refactoring: Improving the Design of Existing Code (Addison-Wesley, 1999)
  2. Steve McConnell. Code Complete, 2nd Edition (Redmond, WA: Microsoft Press, 2004).

Посилання[ред.ред. код]

Дивіться також[ред.ред. код]