Код із запашком (код з душком, код, що погано пахне англ. code smell) — термін, що позначає код з ознаками (запахами) проблем в системі. Був введений Кентом Беком і використаний Мартіном Фаулером в його книзі «Рефакторинг. Поліпшення існуючого коду», з тих пір активно використовується розробниками ПЗ.
Запахи коду — це ключові ознаки необхідності рефакторингу. Існують запахи, специфічні як для парадигм програмування, так і для конкретних мов. Основною проблемою, з якою стикаються розробники при боротьбі з запахами коду, є те, що критерії своєчасності рефакторингу неможливо чітко формалізувати без апеляції до естетики і умовного почуття прекрасного. Запахи коду — це не набір чітких правил, а опис місць, на які потрібно звертати увагу при рефакторингу. Вони легко виявляються, але при цьому не у всіх випадках свідчать про проблеми.
Код із запашком веде до розпаду коду, розробники повинні прагнути до усунення запашку шляхом застосування одноразового або багаторазового рефакторинга. У процесі рефакторингу відбувається позбавлення від запахів коду, що забезпечує можливість подальшого розвитку додатків з тією ж або більшою швидкістю. Відсутність регулярного рефакторинга з плином часу здатна повністю паралізувати проект, тому запахи коду необхідно усувати на ранніх стадіях. Існують інструменти пошуку та виправлення запахів коду, проте досвід показує, що ніякі системи показників не можуть змагатися з людською інтуїцією, основаною на інформації.
Часто глибша проблема, вказана запахом коду, може бути розкрита, коли код піддається короткому циклу зворотного зв'язку, де вона перетворена в невеликі, керовані кроки, і отримана конструкція перевіряється, щоб побачити будь-які запахи коду, які можуть вказувати на необхідність більшого рефакторингу. З точки зору програміста, якому доручено виконувати рефакторинг, запах коду це евристичний алгоритм, який вказує, коли відбувався рефакторинг і які конкретні методи рефакторингу використовували. Таким чином, запах коду це наслідок рефакторингу. Але чому це відбувається?
Дослідження 2015 року з використанням автоматизованого аналізу півмільйона комітів і ручного обстеження 9,164 комітів встановило, що:
- Існує емпіричне підтвердження наслідків «технічного боргу», але існує лише непідтверджена інформація про те, як, коли і чому це відбувається.
- «Здоровий глузд підказує, що невідкладні заходи з технічного обслуговування і тиск, а також встановлення пріоритетів на ринку для створення більш якісного коду — є причинами таких запахів».
Запахи коду
Загальні запахи об'єктно-орієнтованого коду
Дублювання коду
Дублювання коду — це використання однакових структур коду в декількох місцях. Об'єднання цих структур дозволить поліпшити програмний код.
Приклади дублювання і методи їх усунення:
- Один і той самий вираз, що присутній в двох методах одного і того ж класу, то необхідно застосувати «Відокремлення методу» (Extract Method) і викликати код створеного методу з обох точок;
- Один і той самий вираз є в двох підкласах, що знаходяться на одному рівні: необхідно застосувати «Виділення методу» (Extract Method) для обох класів з подальшим «Підйомом поля» (Pull Up Field) або «Формуванням шаблону методу» (Form Template Method), якщо код схожий, але не збігається повністю. Якщо обидва методи роблять одне і те ж за допомогою різних алгоритмів, можна вибрати більш чіткий з цих алгоритмів і застосувати «Заміщення алгоритму» (Substitute Algorithm);
- Дублювання коду знаходиться в двох різних класах: необхідно застосувати «Виділення класу» (Extract Class) в одному класі, а потім використовувати новий компонент в іншому.
Довгий метод
Серед об'єктних програм найдовше живуть програми з короткими методами. Чим довша процедура, тим важче її зрозуміти. Якщо у методу гарна назва, то не потрібно дивитися його тіло.
Слід дотримуватися евристичного правила: якщо відчувається необхідність щось прокоментувати, потрібно написати метод. Навіть один рядок має сенс виділити в метод, якщо він потребує роз'яснень.
- Для скорочення методу досить застосувати «Виділення методу» (Extract Method);
- Якщо локальні змінні і параметри перешкоджають виділенню методу, можна застосувати «Заміну тимчасової змінної викликом методу» (Replace Temp with Query), «Введення граничного об'єкту» (Introduce Parametr Object) і «Збереження всього об'єкта» (Preserve Whole Object);
- Умовні оператори і цикли свідчать про можливість виділення в окремий метод. Для роботи з умовними виразами підходить «Декомпозиція умовних операторів» (Decompose Conditional). Для роботи з циклом — «Виділення методу» (Extract Method).
Великий клас
Коли клас реалізує занадто велику функціональність, варто подумати про винесення деякої частини коду в підклас. Це позбавить розробників від надмірної кількості наявних у класу атрибутів і дублювання коду.
- Для зменшення класу використовується «Виділення класу» (Extract Class) або «Виділення підкласу» (Extract Subclass). При цьому слід звертати увагу на спільність у назві атрибутів і на те, чи використовує клас їх всі одночасно;
- Якщо великий клас є класом GUI, може знадобитися переміщення його даних і поведінку в окремий об'єкт предметної області. При цьому може виявитися необхідним зберігати копії деяких даних у двох місцях і забезпечити їх узгодженість. «Дублювання видимих даних» (Duplicate Observed Data) пропонує шлях, яким можна це здійснити.
Довгий список параметрів
У довгих списках параметрів важко розбиратися, вони стають суперечливими і складними у використанні. Використання об'єктів дозволяє, в разі зміни переданих даних, модифікувати тільки сам об'єкт. Працюючи з об'єктами, слід передавати рівно стільки, щоб метод міг отримати необхідні йому дані.
- «Заміна параметра викликом методу» (Replace Parameter with Method) застосовується, коли можна отримати дані шляхом виклику методу об'єкта. Цей об'єкт може бути полем або іншим параметром.
- «Збереження всього об'єкта» (Preserve Whole Object) дозволяє взяти групу даних, отриманих від об'єкта, і замінити їх цим об'єктом.
- «Введення граничного об'єкта» (Introduce Parameter Object) застосовується, якщо є кілька елементів даних без логічного об'єкта.
Розбіжні модифікації
Проблема виникає, коли при модифікації в системі неможливо виділити певне місце, яке потрібно змінити. Це є наслідком поганої структурованості ПЗ або програмування методом копіювання-вставлення.
- Якщо набір методів необхідно змінювати кожного разу при внесенні певних модифікацій в код, то застосовується «Виділення класу» (Extract Class) (Наприклад, три методи змінюються кожного разу коли підключається нова база даних, а чотири — при додаванні фінансового інструменту).
Стрільба дробом
При виконанні будь-яких модифікацій доводиться вносити безліч дрібних змін у велике число класів. «Стрільба дробом» схожа на «Розбіжну модифікацію», але є її протилежністю. «Розбіжна модифікація» має сенс, коли є один клас, в якому проводиться багато різних змін, а «Стрільба дробом» — це одна зміна, що зачіпає багато класів.
- Винести всі зміни в один клас дозволять «Переміщення методу» (Move Method) і «Переміщення поля» (Move Field);
- Якщо немає відповідного класу, то слід створити новий клас;
- Якщо це необхідно, слід скористатися «Вбудовуванням класу» (Inline Class).
Заздрісні функції
Метод звертається до даних іншого об'єкта частіше, ніж до власних даних.
- «Переміщення методу» (Move Method) застосовується, якщо метод явно слід перевести в інше місце;
- «Виділення методу» (Extract Method) застосовується до частини методу, якщо тільки ця частина звертається до даних іншого об'єкта;
- Метод використовує функції декількох класів: визначається, в якому класі знаходиться найбільше даних, і метод поміщається в клас разом з цими даними, або за допомогою «Виділення методу» (Extract Method) метод розбивається на кілька частин і вони поміщаються в різні місця.
Фундаментальне практичне правило говорить: «Те, що змінюється одночасно, треба зберігати в одному місці». Дані та функції, що використовують ці дані, які зазвичай змінюються разом, але бувають винятки.
Групи даних
Групи даних, що зустрічаються спільно, потрібно перетворювати в самостійний клас.
- «Виділення методу» (Extract Method) використовується для полів;
- «Введення граничного об'єкту» (Introduce Parameter Object) або «Збереження всього об'єкта» (Preserve Whole Object) для параметрів методів.
Хороша перевірка: видалити одне із значень даних і перевірити, чи збереже сенс решта. Якщо ні, то це вірна ознака того, що дані напрошуються на об'єднання їх в об'єкт.
Одержимість елементарними типами
Проблема пов'язана з використанням елементарних типів замість маленьких об'єктів для невеликих завдань, таких як валюта, діапазони, спеціальні рядки для телефонних номерів тощо
- «Заміна значення даних об'єктом» (Replace Data Value with Object);
- «Заміна масиву об'єктом» (Replace Array with Object);
- Якщо це код типу, то використовуйте «Заміну коду типу класом» (Replace Type Code with Class), «Заміну коду типу підкласами» (Replace Type Code with Subclasses) або «Заміну коду типу станом / стратегією» (Replace Type Code with State / Strategy).
Оператори типу switch
Одним з очевидних ознак об'єктно-орієнтованого коду служить порівняно рідкісне використання операторів типу switch (або case). Часто один і той же блок switch виявляється розкиданим по різних місцях програми. При додаванні в перемикач нового варіанту доводиться шукати всі ці блоки switch і модифікувати їх. Як правило, помітивши блок switch, слід подумати про поліморфізм.
- Якщо switch перемикається по коду типу, то слід використовувати «Заміну коду типу підкласами» (Replace Type Code with Subclasses) або «Заміну коду типу станом / стратегією» (Replace Type Code with State / Strategy);
- Може знадобитися «Виділення методу» (Extract Method) і «Переміщення методу» (Move Method) щоб ізолювати switch і помістити його в потрібний клас;
- Після налаштування структури спадкування слід використовувати («Заміну умовного оператора поліморфізмом» (Replace Conditional with Polymorphism)).
Паралельні ієрархії успадкування
У коді з таким запашком щоразу при породженні підкласу, одного з класів, доводиться створювати підклас іншого класу.
- Загальна стратегія усунення дублювання полягає в тому, щоб змусити екземпляри однієї ієрархії посилатися на екземпляри іншого ієрархії, а потім прибрати ієрархію в класі за допомогою «Переміщення методу» (Move Method) і «Переміщення поля» (Move Field).
Лінивий клас
Клас, витрати на існування якого не окупаються виконуваними ним функціями, повинен бути ліквідований.
- При наявності підкласів з недостатніми функціями спробуйте «Згортання ієрархії» (Collapse Hierarchy);
- Майже даремні компоненти повинні підлягати «Вбудовуванню класу» (Inline Class).
Теоретична спільність
Цей випадок виникає, коли на певному етапі існування програми забезпечується набір механізмів, який, можливо, буде потрібен для деякої майбутньої функціональності. У підсумку програму стає важче розуміти і супроводжувати.
- Для незадіяних абстрактних класів використовуйте «Згортання ієрархії» (Collapse Hierarhy);
- Непотрібна делегація може бути вилучена за допомогою «Вбудовування класу» (Inline Class);
- Методи з невикористовуваними параметрами повинні підлягати «Видаленню параметрів» (Remove Parameter).
Тимчасове поле
Тимчасові поля — це поля, які потрібні об'єкту лише за певних обставин. Такий стан речей важкий для розуміння, так як очікується, що об'єкту потрібні всі його поля.
- Тимчасові поля і весь код, який працює з ними, слід помістити в окремий клас за допомогою «Виділення класу» (Extract Class);
- Видалити умовно код, що використовується, можна за допомогою «Введення об'єкта Null» (Introduce Null Object) для створення альтернативного компонента.
Ланцюжок викликів
Ланцюжок викликів з'являється тоді, коли клієнт запитує у одного об'єкта інший об'єкт, інший об'єкт запитує ще один об'єкт і т. д. Такі послідовності викликів означають, що клієнт пов'язаний з навігацією за структурою класів. Будь-які зміни проміжних зв'язків означають необхідність модифікації клієнта.
- Для видалення ланцюжка викликів застосовується прийом «Приховування делегування» (Hide Delegate).
Посередник
Надмірне використання делегування може призвести до появи класів, у яких більшість методів складаються тільки з виклику методу іншого класу.
- Якщо велику частину методів клас делегує іншого класу, потрібно скористатися «Видаленням посередника» (Remove Middle Man).
Недоречна близькість
«Недоречна близькість» виникає тоді, коли класи частіше, ніж варто було б, занурені в закриті частини один одного.
- Позбутися «недоречної близькості» можна за допомогою «Переміщення методу» (Move Method) й «Переміщення поля» (Move Field);
- За можливістю слід вдатися до «Заміни двобічного зв'язку односпрямованим» (Change Bidirectional Association to Unidirectional), «Виділення класу» (Extract Class) або скористатися «Приховуванням делегування» (Hide Delegate).
Альтернативні класи з різними інтерфейсами
Два класи, в яких частина функціональності загальна, але методи, що реалізують її, мають різні параметри.
- Застосовуйте «Перейменування методу» (Rename Method) до всіх методів, які виконують однакові дії, але з різними (сигнатурами).
Неповнота бібліотечного класу
Бібліотеки через деякий час перестають задовольняти вимогам користувачів. Природне рішення — змінити дещо в бібліотеках, але бібліотечні класи не змінювати. Слід використовувати методи рефакторінга, спеціально призначені для цієї мети.
- Якщо треба додати пару методів, використовується «Запровадження зовнішнього методу» (Introduce Foreign Method);
- Якщо треба серйозно поміняти поведінку класу, використовується «Введення локального розширення» (Introduce Local Extension).
Класи даних
Класи даних — це класи, які містять тільки поля і методи для доступу до них, це просто контейнери для даних, що використовуються іншими класами.
- Слід застосувати «Інкапсуляцію поля» (Encapsulate Field) й «Інкапсуляцію колекції» (Encapsulate Collection).
Відмова від наслідування
Якщо спадкоємець використовує лише малу частину успадкованих методів і властивостей батька — це є ознакою неправильної ієрархії.
- Необхідно створити новий клас на одному рівні з нащадком, і за допомогою «Спуска метода» (Push Down Method) і «Спуска поля» (Push Down Field) виштовхнути в нього всі недіючі методи. Завдяки цьому в батьківському класі буде міститися тільки те, що використовується спільно.
Коментарі
Часто коментарі грають роль «дезодоранту» коду, який з'являється в ньому лише тому, що код поганий. Відчувши потребу написати коментар, спробуйте змінити структуру коду так, щоб будь-які коментарі стали зайвими.
- Якщо для пояснення дій блоку все ж потрібен коментар, спробуйте застосувати «Виділення методу» (Extract Method);
- Якщо метод вже виділений, але як і раніше потрібен коментар для пояснення його дії, скористайтеся «Перейменування методу» (Rename Method);
- Якщо потрібно викласти деякі правила, що стосуються необхідного стану системи, застосуйте «Введення затвердження» (Introduce Assertion).
Див. також
Примітки
- Martin Fowler_CodeSmell.
- Martin Fowler_Refactoring.
- Програміст про програмування.
- Vigorous Hive_CodeSmell.
- Зле пахне код.
- Counsell_Code Smells, 2010.
- devconf.
- Мартін Фаулер_Рефакторинг, 2003, с. 54.
- Мартін Фаулер_Рефакторінг, 2003, с. 54.
- Мартін Фаулер_Рефакторінг, 2003, с. 55.
- Мартін Фаулер_Рефакторінг, 2003, с. 56.
- Мартін Фаулер_Рефакторінг, 2003, с. 56—57.
- Мартін Фаулер_Рефакторінг, 2003, с. 57.
- Зле пахне код, с. 57.
- Мартін Фаулер_Рефакторінг, 2003, с. 58.
- Мартін Фаулер_Рефакторінг, 2003, с. 59.
- Тимчасове поле.
- Мартін Фаулер_Рефакторінг, 2003, с. 60.
- Рефакторинг коду.
- Мартін Фаулер_Рефакторінг, 2003, с. 61.
Література
- Martin Fowler. Refactoring. Improving the Design of Existing Code // Addison-Wesley : журнал. — 1999.
- Mantyla M. V., Vanhanen J., Lassenius C. Bad smells-humans as code critics // Software Maintenance, 2004. Proceedings. 20th IEEE International Conference on : журнал. — 2004. — P. 399—408. — ISSN 1063-6773.
- S. Counsell, R. M. Hierons, H. Hamza, S. Black, and M. Durrand. Exploring the Eradication of Code Smells: An Empirical and Theoretical Perspective // Advances in Software Engineering Volume 2010 : журнал. — 2010.
Посилання
- . refactoring.guru. Архів оригіналу за 10 вересня 2016. Процитовано 28 липня 2016.
- . refactoring.guru. Архів оригіналу за 11 вересня 2016. Процитовано 28 липня 2016.
- . Martinfowler.com. Архів оригіналу за 18 квітня 2015. Процитовано 13 жовтня 2013.
- . Vihv.org. Архів оригіналу за 9 грудня 2013. Процитовано 13 жовтня 2013.
- . Cunningham & Cunningham, Inc. (c2.com). Архів оригіналу за 2 грудня 2013. Процитовано 23 листопада 2013.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Kod iz zapashkom kod z dushkom kod sho pogano pahne angl code smell termin sho poznachaye kod z oznakami zapahami problem v sistemi Buv vvedenij Kentom Bekom i vikoristanij Martinom Faulerom v jogo knizi Refaktoring Polipshennya isnuyuchogo kodu z tih pir aktivno vikoristovuyetsya rozrobnikami PZ Zapahi kodu ce klyuchovi oznaki neobhidnosti refaktoringu Isnuyut zapahi specifichni yak dlya paradigm programuvannya tak i dlya konkretnih mov Osnovnoyu problemoyu z yakoyu stikayutsya rozrobniki pri borotbi z zapahami kodu ye te sho kriteriyi svoyechasnosti refaktoringu nemozhlivo chitko formalizuvati bez apelyaciyi do estetiki i umovnogo pochuttya prekrasnogo Zapahi kodu ce ne nabir chitkih pravil a opis misc na yaki potribno zvertati uvagu pri refaktoringu Voni legko viyavlyayutsya ale pri comu ne u vsih vipadkah svidchat pro problemi Kod iz zapashkom vede do rozpadu kodu rozrobniki povinni pragnuti do usunennya zapashku shlyahom zastosuvannya odnorazovogo abo bagatorazovogo refaktoringa U procesi refaktoringu vidbuvayetsya pozbavlennya vid zapahiv kodu sho zabezpechuye mozhlivist podalshogo rozvitku dodatkiv z tiyeyu zh abo bilshoyu shvidkistyu Vidsutnist regulyarnogo refaktoringa z plinom chasu zdatna povnistyu paralizuvati proekt tomu zapahi kodu neobhidno usuvati na rannih stadiyah Isnuyut instrumenti poshuku ta vipravlennya zapahiv kodu prote dosvid pokazuye sho niyaki sistemi pokaznikiv ne mozhut zmagatisya z lyudskoyu intuyiciyeyu osnovanoyu na informaciyi Chasto glibsha problema vkazana zapahom kodu mozhe buti rozkrita koli kod piddayetsya korotkomu ciklu zvorotnogo zv yazku de vona peretvorena v neveliki kerovani kroki i otrimana konstrukciya pereviryayetsya shob pobachiti bud yaki zapahi kodu yaki mozhut vkazuvati na neobhidnist bilshogo refaktoringu Z tochki zoru programista yakomu dorucheno vikonuvati refaktoring zapah kodu ce evristichnij algoritm yakij vkazuye koli vidbuvavsya refaktoring i yaki konkretni metodi refaktoringu vikoristovuvali Takim chinom zapah kodu ce naslidok refaktoringu Ale chomu ce vidbuvayetsya Doslidzhennya 2015 roku z vikoristannyam avtomatizovanogo analizu pivmiljona komitiv i ruchnogo obstezhennya 9 164 komitiv vstanovilo sho Isnuye empirichne pidtverdzhennya naslidkiv tehnichnogo borgu ale isnuye lishe nepidtverdzhena informaciya pro te yak koli i chomu ce vidbuvayetsya Zdorovij gluzd pidkazuye sho nevidkladni zahodi z tehnichnogo obslugovuvannya i tisk a takozh vstanovlennya prioritetiv na rinku dlya stvorennya bilsh yakisnogo kodu ye prichinami takih zapahiv Zapahi koduZagalni zapahi ob yektno oriyentovanogo kodu Dublyuvannya kodu Priklad trirazovogo dublyuvannya kodu ta pozbavlennya vid cogo zapashku za dopomogoyu vidilennya metodu i nastupnih viklikiv kodu stvorenogo metodu Dokladnishe Dublyuvannya kodu Dublyuvannya kodu ce vikoristannya odnakovih struktur kodu v dekilkoh miscyah Ob yednannya cih struktur dozvolit polipshiti programnij kod Prikladi dublyuvannya i metodi yih usunennya Odin i toj samij viraz sho prisutnij v dvoh metodah odnogo i togo zh klasu to neobhidno zastosuvati Vidokremlennya metodu Extract Method i viklikati kod stvorenogo metodu z oboh tochok Odin i toj samij viraz ye v dvoh pidklasah sho znahodyatsya na odnomu rivni neobhidno zastosuvati Vidilennya metodu Extract Method dlya oboh klasiv z podalshim Pidjomom polya Pull Up Field abo Formuvannyam shablonu metodu Form Template Method yaksho kod shozhij ale ne zbigayetsya povnistyu Yaksho obidva metodi roblyat odne i te zh za dopomogoyu riznih algoritmiv mozhna vibrati bilsh chitkij z cih algoritmiv i zastosuvati Zamishennya algoritmu Substitute Algorithm Dublyuvannya kodu znahoditsya v dvoh riznih klasah neobhidno zastosuvati Vidilennya klasu Extract Class v odnomu klasi a potim vikoristovuvati novij komponent v inshomu Dovgij metod Sered ob yektnih program najdovshe zhivut programi z korotkimi metodami Chim dovsha procedura tim vazhche yiyi zrozumiti Yaksho u metodu garna nazva to ne potribno divitisya jogo tilo Slid dotrimuvatisya evristichnogo pravila yaksho vidchuvayetsya neobhidnist shos prokomentuvati potribno napisati metod Navit odin ryadok maye sens vidiliti v metod yaksho vin potrebuye roz yasnen Dlya skorochennya metodu dosit zastosuvati Vidilennya metodu Extract Method Yaksho lokalni zminni i parametri pereshkodzhayut vidilennyu metodu mozhna zastosuvati Zaminu timchasovoyi zminnoyi viklikom metodu Replace Temp with Query Vvedennya granichnogo ob yektu Introduce Parametr Object i Zberezhennya vsogo ob yekta Preserve Whole Object Umovni operatori i cikli svidchat pro mozhlivist vidilennya v okremij metod Dlya roboti z umovnimi virazami pidhodit Dekompoziciya umovnih operatoriv Decompose Conditional Dlya roboti z ciklom Vidilennya metodu Extract Method Velikij klas Koli klas realizuye zanadto veliku funkcionalnist varto podumati pro vinesennya deyakoyi chastini kodu v pidklas Ce pozbavit rozrobnikiv vid nadmirnoyi kilkosti nayavnih u klasu atributiv i dublyuvannya kodu Dlya zmenshennya klasu vikoristovuyetsya Vidilennya klasu Extract Class abo Vidilennya pidklasu Extract Subclass Pri comu slid zvertati uvagu na spilnist u nazvi atributiv i na te chi vikoristovuye klas yih vsi odnochasno Yaksho velikij klas ye klasom GUI mozhe znadobitisya peremishennya jogo danih i povedinku v okremij ob yekt predmetnoyi oblasti Pri comu mozhe viyavitisya neobhidnim zberigati kopiyi deyakih danih u dvoh miscyah i zabezpechiti yih uzgodzhenist Dublyuvannya vidimih danih Duplicate Observed Data proponuye shlyah yakim mozhna ce zdijsniti Dovgij spisok parametriv U dovgih spiskah parametriv vazhko rozbiratisya voni stayut superechlivimi i skladnimi u vikoristanni Vikoristannya ob yektiv dozvolyaye v razi zmini peredanih danih modifikuvati tilki sam ob yekt Pracyuyuchi z ob yektami slid peredavati rivno stilki shob metod mig otrimati neobhidni jomu dani Zamina parametra viklikom metodu Replace Parameter with Method zastosovuyetsya koli mozhna otrimati dani shlyahom vikliku metodu ob yekta Cej ob yekt mozhe buti polem abo inshim parametrom Zberezhennya vsogo ob yekta Preserve Whole Object dozvolyaye vzyati grupu danih otrimanih vid ob yekta i zaminiti yih cim ob yektom Vvedennya granichnogo ob yekta Introduce Parameter Object zastosovuyetsya yaksho ye kilka elementiv danih bez logichnogo ob yekta Rozbizhni modifikaciyi Problema vinikaye koli pri modifikaciyi v sistemi nemozhlivo vidiliti pevne misce yake potribno zminiti Ce ye naslidkom poganoyi strukturovanosti PZ abo programuvannya metodom kopiyuvannya vstavlennya Yaksho nabir metodiv neobhidno zminyuvati kozhnogo razu pri vnesenni pevnih modifikacij v kod to zastosovuyetsya Vidilennya klasu Extract Class Napriklad tri metodi zminyuyutsya kozhnogo razu koli pidklyuchayetsya nova baza danih a chotiri pri dodavanni finansovogo instrumentu Strilba drobom Pri vikonanni bud yakih modifikacij dovoditsya vnositi bezlich dribnih zmin u velike chislo klasiv Strilba drobom shozha na Rozbizhnu modifikaciyu ale ye yiyi protilezhnistyu Rozbizhna modifikaciya maye sens koli ye odin klas v yakomu provoditsya bagato riznih zmin a Strilba drobom ce odna zmina sho zachipaye bagato klasiv Vinesti vsi zmini v odin klas dozvolyat Peremishennya metodu Move Method i Peremishennya polya Move Field Yaksho nemaye vidpovidnogo klasu to slid stvoriti novij klas Yaksho ce neobhidno slid skoristatisya Vbudovuvannyam klasu Inline Class Zazdrisni funkciyi Metod zvertayetsya do danih inshogo ob yekta chastishe nizh do vlasnih danih Peremishennya metodu Move Method zastosovuyetsya yaksho metod yavno slid perevesti v inshe misce Vidilennya metodu Extract Method zastosovuyetsya do chastini metodu yaksho tilki cya chastina zvertayetsya do danih inshogo ob yekta Metod vikoristovuye funkciyi dekilkoh klasiv viznachayetsya v yakomu klasi znahoditsya najbilshe danih i metod pomishayetsya v klas razom z cimi danimi abo za dopomogoyu Vidilennya metodu Extract Method metod rozbivayetsya na kilka chastin i voni pomishayutsya v rizni miscya Fundamentalne praktichne pravilo govorit Te sho zminyuyetsya odnochasno treba zberigati v odnomu misci Dani ta funkciyi sho vikoristovuyut ci dani yaki zazvichaj zminyuyutsya razom ale buvayut vinyatki Grupi danih Grupi danih sho zustrichayutsya spilno potribno peretvoryuvati v samostijnij klas Vidilennya metodu Extract Method vikoristovuyetsya dlya poliv Vvedennya granichnogo ob yektu Introduce Parameter Object abo Zberezhennya vsogo ob yekta Preserve Whole Object dlya parametriv metodiv Horosha perevirka vidaliti odne iz znachen danih i pereviriti chi zberezhe sens reshta Yaksho ni to ce virna oznaka togo sho dani naproshuyutsya na ob yednannya yih v ob yekt Oderzhimist elementarnimi tipami Problema pov yazana z vikoristannyam elementarnih tipiv zamist malenkih ob yektiv dlya nevelikih zavdan takih yak valyuta diapazoni specialni ryadki dlya telefonnih nomeriv tosho Zamina znachennya danih ob yektom Replace Data Value with Object Zamina masivu ob yektom Replace Array with Object Yaksho ce kod tipu to vikoristovujte Zaminu kodu tipu klasom Replace Type Code with Class Zaminu kodu tipu pidklasami Replace Type Code with Subclasses abo Zaminu kodu tipu stanom strategiyeyu Replace Type Code with State Strategy Operatori tipu switch Odnim z ochevidnih oznak ob yektno oriyentovanogo kodu sluzhit porivnyano ridkisne vikoristannya operatoriv tipu switch abo case Chasto odin i toj zhe blok switch viyavlyayetsya rozkidanim po riznih miscyah programi Pri dodavanni v peremikach novogo variantu dovoditsya shukati vsi ci bloki switch i modifikuvati yih Yak pravilo pomitivshi blok switch slid podumati pro polimorfizm Yaksho switch peremikayetsya po kodu tipu to slid vikoristovuvati Zaminu kodu tipu pidklasami Replace Type Code with Subclasses abo Zaminu kodu tipu stanom strategiyeyu Replace Type Code with State Strategy Mozhe znadobitisya Vidilennya metodu Extract Method i Peremishennya metodu Move Method shob izolyuvati switch i pomistiti jogo v potribnij klas Pislya nalashtuvannya strukturi spadkuvannya slid vikoristovuvati Zaminu umovnogo operatora polimorfizmom Replace Conditional with Polymorphism Paralelni iyerarhiyi uspadkuvannya U kodi z takim zapashkom shorazu pri porodzhenni pidklasu odnogo z klasiv dovoditsya stvoryuvati pidklas inshogo klasu Zagalna strategiya usunennya dublyuvannya polyagaye v tomu shob zmusiti ekzemplyari odniyeyi iyerarhiyi posilatisya na ekzemplyari inshogo iyerarhiyi a potim pribrati iyerarhiyu v klasi za dopomogoyu Peremishennya metodu Move Method i Peremishennya polya Move Field Linivij klas Klas vitrati na isnuvannya yakogo ne okupayutsya vikonuvanimi nim funkciyami povinen buti likvidovanij Pri nayavnosti pidklasiv z nedostatnimi funkciyami sprobujte Zgortannya iyerarhiyi Collapse Hierarchy Majzhe daremni komponenti povinni pidlyagati Vbudovuvannyu klasu Inline Class Teoretichna spilnist Cej vipadok vinikaye koli na pevnomu etapi isnuvannya programi zabezpechuyetsya nabir mehanizmiv yakij mozhlivo bude potriben dlya deyakoyi majbutnoyi funkcionalnosti U pidsumku programu staye vazhche rozumiti i suprovodzhuvati Dlya nezadiyanih abstraktnih klasiv vikoristovujte Zgortannya iyerarhiyi Collapse Hierarhy Nepotribna delegaciya mozhe buti viluchena za dopomogoyu Vbudovuvannya klasu Inline Class Metodi z nevikoristovuvanimi parametrami povinni pidlyagati Vidalennyu parametriv Remove Parameter Timchasove pole Timchasovi polya ce polya yaki potribni ob yektu lishe za pevnih obstavin Takij stan rechej vazhkij dlya rozuminnya tak yak ochikuyetsya sho ob yektu potribni vsi jogo polya Timchasovi polya i ves kod yakij pracyuye z nimi slid pomistiti v okremij klas za dopomogoyu Vidilennya klasu Extract Class Vidaliti umovno kod sho vikoristovuyetsya mozhna za dopomogoyu Vvedennya ob yekta Null Introduce Null Object dlya stvorennya alternativnogo komponenta Lancyuzhok viklikiv Lancyuzhok viklikiv z yavlyayetsya todi koli kliyent zapituye u odnogo ob yekta inshij ob yekt inshij ob yekt zapituye she odin ob yekt i t d Taki poslidovnosti viklikiv oznachayut sho kliyent pov yazanij z navigaciyeyu za strukturoyu klasiv Bud yaki zmini promizhnih zv yazkiv oznachayut neobhidnist modifikaciyi kliyenta Dlya vidalennya lancyuzhka viklikiv zastosovuyetsya prijom Prihovuvannya deleguvannya Hide Delegate Poserednik Nadmirne vikoristannya deleguvannya mozhe prizvesti do poyavi klasiv u yakih bilshist metodiv skladayutsya tilki z vikliku metodu inshogo klasu Yaksho veliku chastinu metodiv klas deleguye inshogo klasu potribno skoristatisya Vidalennyam poserednika Remove Middle Man Nedorechna blizkist Dokladnishe Nedorechna blizkist Nedorechna blizkist vinikaye todi koli klasi chastishe nizh varto bulo b zanureni v zakriti chastini odin odnogo Pozbutisya nedorechnoyi blizkosti mozhna za dopomogoyu Peremishennya metodu Move Method j Peremishennya polya Move Field Za mozhlivistyu slid vdatisya do Zamini dvobichnogo zv yazku odnospryamovanim Change Bidirectional Association to Unidirectional Vidilennya klasu Extract Class abo skoristatisya Prihovuvannyam deleguvannya Hide Delegate Alternativni klasi z riznimi interfejsami Dva klasi v yakih chastina funkcionalnosti zagalna ale metodi sho realizuyut yiyi mayut rizni parametri Zastosovujte Perejmenuvannya metodu Rename Method do vsih metodiv yaki vikonuyut odnakovi diyi ale z riznimi signaturami Nepovnota bibliotechnogo klasu Biblioteki cherez deyakij chas perestayut zadovolnyati vimogam koristuvachiv Prirodne rishennya zminiti desho v bibliotekah ale bibliotechni klasi ne zminyuvati Slid vikoristovuvati metodi refaktoringa specialno priznacheni dlya ciyeyi meti Yaksho treba dodati paru metodiv vikoristovuyetsya Zaprovadzhennya zovnishnogo metodu Introduce Foreign Method Yaksho treba serjozno pominyati povedinku klasu vikoristovuyetsya Vvedennya lokalnogo rozshirennya Introduce Local Extension Klasi danih Klasi danih ce klasi yaki mistyat tilki polya i metodi dlya dostupu do nih ce prosto kontejneri dlya danih sho vikoristovuyutsya inshimi klasami Slid zastosuvati Inkapsulyaciyu polya Encapsulate Field j Inkapsulyaciyu kolekciyi Encapsulate Collection Vidmova vid nasliduvannya Yaksho spadkoyemec vikoristovuye lishe malu chastinu uspadkovanih metodiv i vlastivostej batka ce ye oznakoyu nepravilnoyi iyerarhiyi Neobhidno stvoriti novij klas na odnomu rivni z nashadkom i za dopomogoyu Spuska metoda Push Down Method i Spuska polya Push Down Field vishtovhnuti v nogo vsi nediyuchi metodi Zavdyaki comu v batkivskomu klasi bude mistitisya tilki te sho vikoristovuyetsya spilno Komentari Chasto komentari grayut rol dezodorantu kodu yakij z yavlyayetsya v nomu lishe tomu sho kod poganij Vidchuvshi potrebu napisati komentar sprobujte zminiti strukturu kodu tak shob bud yaki komentari stali zajvimi Yaksho dlya poyasnennya dij bloku vse zh potriben komentar sprobujte zastosuvati Vidilennya metodu Extract Method Yaksho metod vzhe vidilenij ale yak i ranishe potriben komentar dlya poyasnennya jogo diyi skoristajtesya Perejmenuvannya metodu Rename Method Yaksho potribno viklasti deyaki pravila sho stosuyutsya neobhidnogo stanu sistemi zastosujte Vvedennya zatverdzhennya Introduce Assertion Div takozhAntipatern Statichnij analiz kodu en PrimitkiMartin Fowler CodeSmell Martin Fowler Refactoring Programist pro programuvannya Vigorous Hive CodeSmell Zle pahne kod Counsell Code Smells 2010 devconf Martin Fauler Refaktoring 2003 s 54 Martin Fauler Refaktoring 2003 s 54 Martin Fauler Refaktoring 2003 s 55 Martin Fauler Refaktoring 2003 s 56 Martin Fauler Refaktoring 2003 s 56 57 Martin Fauler Refaktoring 2003 s 57 Zle pahne kod s 57 Martin Fauler Refaktoring 2003 s 58 Martin Fauler Refaktoring 2003 s 59 Timchasove pole Martin Fauler Refaktoring 2003 s 60 Refaktoring kodu Martin Fauler Refaktoring 2003 s 61 LiteraturaMartin Fowler Refactoring Improving the Design of Existing Code Addison Wesley zhurnal 1999 Mantyla M V Vanhanen J Lassenius C Bad smells humans as code critics Software Maintenance 2004 Proceedings 20th IEEE International Conference on zhurnal 2004 P 399 408 ISSN 1063 6773 S Counsell R M Hierons H Hamza S Black and M Durrand Exploring the Eradication of Code Smells An Empirical and Theoretical Perspective Advances in Software Engineering Volume 2010 zhurnal 2010 Posilannya refactoring guru Arhiv originalu za 10 veresnya 2016 Procitovano 28 lipnya 2016 refactoring guru Arhiv originalu za 11 veresnya 2016 Procitovano 28 lipnya 2016 Martinfowler com Arhiv originalu za 18 kvitnya 2015 Procitovano 13 zhovtnya 2013 Vihv org Arhiv originalu za 9 grudnya 2013 Procitovano 13 zhovtnya 2013 Cunningham amp Cunningham Inc c2 com Arhiv originalu za 2 grudnya 2013 Procitovano 23 listopada 2013