Рефакторинг (англ. refactoring) — процес редагування програмного коду, внутрішньої структури програмного забезпечення для полегшення розуміння коду та внесення подальших правок без зміни зовнішньої поведінки самої системи. Слово «рефакторинг» пішло від терміну «факторинг» в структурному програмуванні; цей термін означав декомпозицію програми на максимально автономні та елементарні частини.
Причини рефакторингу
Ця стаття містить текст, що не відповідає . (липень 2016) |
Існує міф про те, що при правильно організованому процесі розробки продукту, треба методично дотримуватися поставлених вимог, визначати однозначний, стабільний список обов’язків програми, і при цьому програмний код може бути написаний майже лінійно: від початку до закінчення, кожна ділянка — написана, відтестована і забута один раз. Посилаючись на цей міф, єдиний випадок, коли наявний код може змінюватись, — це в процесі підтримки і адміністрування програми, коли початкова версія продукту уже здана замовнику.
Однак реальність є дещо інакшою. Насправді код еволюціонує в процесі розробки продукту. Як правило, кодування, дебагінг (відлагодження) та модульне тестування займають в середньому 30–65% зусиль від загального часу існування проекту (залежно від величини проекту). Навіть на добре організованих проектах вимоги змінюються в середньому на 1–4% за місяць, що неминуче спричиняє зміни в програмному коді — як дрібні, так і досить серйозні.
Також, на відміну від старіших методик розробки програмних продуктів, де основний акцент ставився на мінімізації змін до коду, сучасна методика вбачає великий потенціал у внесенні змін. Вона є більш сфокусованою на коді (code-centered) і під час розробки можна очікувати, що код буде вдосконалюватися більше, ніж зазвичай.
Підстави для проведення рефакторингу
- Код дублюється («Copy And Paste is a Design Error»).
- Це нерідко призводить до необхідності вносити однакові зміни до кількох скопійованих ділянок коду, що не відповідає принципам «DRY» (Don't Repeat Yourself).
- Підпрограма занадто довга.
- Хоча питання, яку максимальну довжину може мати підпрограма, є досить суперечливим, однак загальноприйнятим неофіційним стандартом є написання підпрограм довжиною не більше, ніж один екран коду.
- Тіло циклу занадто довге або рівень вкладеності циклів занадто великий.
- Клас має багато обов'язків, слабко пов'язаних між собою, що порушує принцип єдиного обов'язку (Single responsibility principle).
- У такому разі краще розділити клас на кілька атомарних.
- Інтерфейс класу не забезпечує достатній рівень абстракції.
- Назва класу чи методу недостатньо точно відповідає його змісту.
- Пов'язані дані, які використовуються разом, не організовані в клас.
- Функція має занадто багато параметрів.
- У ланцюжку виклику методів передається багато зайвих даних.
- Потрібно одночасно змінювати кілька паралельних ієрархій класів.
- Для вирішення цієї проблеми можна, наприклад, скористатися шаблоном «Міст».
- Клас не виконує ніякої роботи самостійно, а тільки передоручає її іншим класам.
- Клас має занадто багато відкритих (public) членів.
- Нестатичний клас складається тільки з даних або тільки з методів.
- Занадто широке застосування глобальних змінних.
Прийоми рефакторингу
- Прийоми, що дозволяють розбити код на дрібніші, зрозуміліші частини.
- Відокремлення методу (Extract Method).
- Відокремлення базового класу (Extract Superclass).
- Прийоми, що дозволяють забезпечити додаткову абстракцію.
- Інкапсуляція поля (Encapsulate Field) — замінює прямий доступ до поля на доступ через методи-аксесори (або властивості в C#).
- Узагальнення типу (Generalize Type) — заміна типів, з якими працює клас, на загальніші.
- Заміна блоків перевірки типу на шаблони «Стан» (State) або «Стратегія» (Strategy).
- Заміна умовних операторів поліморфізмом.
- Створення поля або локальної змінної (Introduce Field/Introduce Local Variable).
- Дублювання видимих даних
- Прийоми, що змінюють назви членів та їх розташування.
- Переміщення методу (Move Method) або переміщення поля в інші класи або файли коду.
- Перейменування члена (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, PHP | NetBeans (вбудований) |
C#, , VB, VB.NET | Microsoft Visual Studio | |
Fortran | Eclipse |
Примітки
- Martin Fowler, Refactoring: Improving the Design of Existing Code (Addison-Wesley, 1999)
- Steve McConnell. Code Complete, 2nd Edition (Redmond, WA: Microsoft Press, 2004).
Посилання
- Рефакторинг (укр.)
- refactoring.com
Див. також
![]() | Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Refaktoring angl refactoring proces redaguvannya programnogo kodu vnutrishnoyi strukturi programnogo zabezpechennya dlya polegshennya rozuminnya kodu ta vnesennya podalshih pravok bez zmini zovnishnoyi povedinki samoyi sistemi Slovo refaktoring pishlo vid terminu faktoring v strukturnomu programuvanni cej termin oznachav dekompoziciyu programi na maksimalno avtonomni ta elementarni chastini Prichini refaktoringuCya stattya mistit tekst sho ne vidpovidaye enciklopedichnomu stilyu Bud laska dopomozhit udoskonaliti cyu stattyu pogodivshi stil vikladu zi stilistichnimi pravilami Vikipediyi Mozhlivo storinka obgovorennya mistit zauvazhennya shodo potribnih zmin lipen 2016 Isnuye mif pro te sho pri pravilno organizovanomu procesi rozrobki produktu treba metodichno dotrimuvatisya postavlenih vimog viznachati odnoznachnij stabilnij spisok obov yazkiv programi i pri comu programnij kod mozhe buti napisanij majzhe linijno vid pochatku do zakinchennya kozhna dilyanka napisana vidtestovana i zabuta odin raz Posilayuchis na cej mif yedinij vipadok koli nayavnij kod mozhe zminyuvatis ce v procesi pidtrimki i administruvannya programi koli pochatkova versiya produktu uzhe zdana zamovniku Odnak realnist ye desho inakshoyu Naspravdi kod evolyucionuye v procesi rozrobki produktu Yak pravilo koduvannya debaging vidlagodzhennya ta modulne testuvannya zajmayut v serednomu 30 65 zusil vid zagalnogo chasu isnuvannya proektu zalezhno vid velichini proektu Navit na dobre organizovanih proektah vimogi zminyuyutsya v serednomu na 1 4 za misyac sho neminuche sprichinyaye zmini v programnomu kodi yak dribni tak i dosit serjozni Takozh na vidminu vid starishih metodik rozrobki programnih produktiv de osnovnij akcent stavivsya na minimizaciyi zmin do kodu suchasna metodika vbachaye velikij potencial u vnesenni zmin Vona ye bilsh sfokusovanoyu na kodi code centered i pid chas rozrobki mozhna ochikuvati sho kod bude vdoskonalyuvatisya bilshe nizh zazvichaj Pidstavi dlya provedennya refaktoringuKod dublyuyetsya Copy And Paste is a Design Error Ce neridko prizvodit do neobhidnosti vnositi odnakovi zmini do kilkoh skopijovanih dilyanok kodu sho ne vidpovidaye principam DRY Don t Repeat Yourself Pidprograma zanadto dovga Hocha pitannya yaku maksimalnu dovzhinu mozhe mati pidprograma ye dosit superechlivim odnak zagalnoprijnyatim neoficijnim standartom ye napisannya pidprogram dovzhinoyu ne bilshe nizh odin ekran kodu Tilo ciklu zanadto dovge abo riven vkladenosti cikliv zanadto velikij Klas maye bagato obov yazkiv slabko pov yazanih mizh soboyu sho porushuye princip yedinogo obov yazku Single responsibility principle U takomu razi krashe rozdiliti klas na kilka atomarnih Interfejs klasu ne zabezpechuye dostatnij riven abstrakciyi Nazva klasu chi metodu nedostatno tochno vidpovidaye jogo zmistu Pov yazani dani yaki vikoristovuyutsya razom ne organizovani v klas Funkciya maye zanadto bagato parametriv U lancyuzhku vikliku metodiv peredayetsya bagato zajvih danih Potribno odnochasno zminyuvati kilka paralelnih iyerarhij klasiv Dlya virishennya ciyeyi problemi mozhna napriklad skoristatisya shablonom Mist Klas ne vikonuye niyakoyi roboti samostijno a tilki peredoruchaye yiyi inshim klasam Klas maye zanadto bagato vidkritih public chleniv Nestatichnij klas skladayetsya tilki z danih abo tilki z metodiv Zanadto shiroke zastosuvannya globalnih zminnih Prijomi refaktoringuPrijomi sho dozvolyayut rozbiti kod na dribnishi zrozumilishi chastini Vidokremlennya metodu Extract Method Vidokremlennya bazovogo klasu Extract Superclass Prijomi sho dozvolyayut zabezpechiti dodatkovu abstrakciyu Inkapsulyaciya polya Encapsulate Field zaminyuye pryamij dostup do polya na dostup cherez metodi aksesori abo vlastivosti v C Uzagalnennya tipu Generalize Type zamina tipiv z yakimi pracyuye klas na zagalnishi Zamina blokiv perevirki tipu na shabloni Stan State abo Strategiya Strategy Zamina umovnih operatoriv polimorfizmom Stvorennya polya abo lokalnoyi zminnoyi Introduce Field Introduce Local Variable Dublyuvannya vidimih danih Prijomi sho zminyuyut nazvi chleniv ta yih roztashuvannya Peremishennya metodu Move Method abo peremishennya polya v inshi klasi abo fajli kodu Perejmenuvannya chlena Rename zmina nazvi z avtomatichnoyu zaminoyu vsih posilan na staru nazvu v kodi Peremishennya chlenu do bazovogo dochirnogo klasu Pull Up Push Down Rozsheplennya zminnoyiAvtomatizovanij refaktoringBagato integrovanih seredovish rozrobki mistyat vbudovani mehanizmi refaktoringu kodu Krim integrovanoyi funkcionalnosti isnuye takozh bagato produktiv storonnih virobnikiv yaki yak pravilo realizovani u viglyadi dodatkiv plugins do vidpovidnogo IDE Prikladi takih paketiv Paket Mova SeredovisheMicrosoft Visual Studio C Microsoft Visual Studio vbudovanij Java Development Tooklit Java Eclipse vbudovanij IntelliJ IDEA Java IntelliJ IDEA vbudovanij NetBeans Java PHP NetBeans vbudovanij C C VB VB NET Microsoft Visual StudioFortran EclipsePrimitkiMartin Fowler Refactoring Improving the Design of Existing Code Addison Wesley 1999 Steve McConnell Code Complete 2nd Edition Redmond WA Microsoft Press 2004 PosilannyaRefaktoring ukr refactoring comDiv takozhShabloni proektuvannya programnogo zabezpechennya Recenzuvannya Princip YAGNI Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi