Заздрісні функції (англ. Feature Envy) — один із «запахів коду», тобто код із ознаками проблем в системі. Суть «запаху» полягає у тому, що метод деякого об'єкту звертається до даних іншого об'єкту частіше, ніж до власних даних. Це призводить до надлишкової зв'язаності між класами.
Проблема
Customer втручається в дані Phone, щоб відформатувати число. «Запах» часто проявляється у вигляді недоречної відповідальності (приклад коду на Java):
public class Phone { private final String unformattedNumber; public Phone(String unformattedNumber) { this.unformattedNumber = unformattedNumber; } public String getAreaCode() { return unformattedNumber.substring(0,3); } public String getPrefix() { return unformattedNumber.substring(3,6); } public String getNumber() { return unformattedNumber.substring(6,10); } } public class Customer… private Phone mobilePhone; public String getMobilePhoneNumber() { return "(" + mobilePhone.getAreaCode() + ") " + mobilePhone.getPrefix() + "-" + mobilePhone.getNumber(); }
Лікування
Слід дотримуватися такого правила: те, що змінюється разом, треба зберігати в одному місці. Зазвичай дані і функції, які використовують ці дані, також змінюються разом (хоча бувають виключення).
- Якщо метод явно слід перенести в інше місце, застосуйте переміщення методу.
- Якщо тільки частина методу звертається до даних іншого об'єкту, застосуйте відокремлення методу до цієї частини.
- Якщо метод використовує функції декількох інших класів, треба спочатку визначити, в якому класі знаходиться найбільше даних, що використовуються. Потім слід перемістити метод в цей клас разом з іншими даними. Як альтернатива, за допомогою відокремлення методу метод розбивається на декілька частин, і вони розміщуються в різних частинах інших класів.
Належне лікування для попереднього прикладу:
public class Phone { private final String unformattedNumber; public Phone(String unformattedNumber) { this.unformattedNumber = unformattedNumber; } private String getAreaCode() { return unformattedNumber.substring(0,3); } private String getPrefix() { return unformattedNumber.substring(3,6); } private String getNumber() { return unformattedNumber.substring(6,10); } public String toFormattedString() { return "(" + getAreaCode() + ") " + getPrefix() + "-" + getNumber(); } } public class Customer… private Phone mobilePhone; public String getMobilePhoneNumber() { return mobilePhone.toFormattedString(); }
Переваги
- Зменшення дублювання коду (якщо код обробки даних переїхав в одне загальне місце).
- Поліпшення організації коду (оскільки методи роботи з даними знаходяться біля цих даних).
Випадки, коли застосувати не можна
Бувають випадки, коли поведінка навмисно відділяється від класу, що містить дані. Найчастіше це роблять для того, щоб мати можливість динамічно міняти цю поведінку (патерни Стратегія, Відвідувач і так далі).
Див. також
Посилання
- Заздрісні функції [ 17 грудня 2014 у Wayback Machine.]
- Feature Envy Example [ 13 травня 2021 у Wayback Machine.]
Ця стаття потребує додаткових для поліпшення її . (березень 2017) |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Zazdrisni funkciyi angl Feature Envy odin iz zapahiv kodu tobto kod iz oznakami problem v sistemi Sut zapahu polyagaye u tomu sho metod deyakogo ob yektu zvertayetsya do danih inshogo ob yektu chastishe nizh do vlasnih danih Ce prizvodit do nadlishkovoyi zv yazanosti mizh klasami ProblemaCustomer vtruchayetsya v dani Phone shob vidformatuvati chislo Zapah chasto proyavlyayetsya u viglyadi nedorechnoyi vidpovidalnosti priklad kodu na Java public class Phone private final String unformattedNumber public Phone String unformattedNumber this unformattedNumber unformattedNumber public String getAreaCode return unformattedNumber substring 0 3 public String getPrefix return unformattedNumber substring 3 6 public String getNumber return unformattedNumber substring 6 10 public class Customer private Phone mobilePhone public String getMobilePhoneNumber return mobilePhone getAreaCode mobilePhone getPrefix mobilePhone getNumber LikuvannyaSlid dotrimuvatisya takogo pravila te sho zminyuyetsya razom treba zberigati v odnomu misci Zazvichaj dani i funkciyi yaki vikoristovuyut ci dani takozh zminyuyutsya razom hocha buvayut viklyuchennya Yaksho metod yavno slid perenesti v inshe misce zastosujte peremishennya metodu Yaksho tilki chastina metodu zvertayetsya do danih inshogo ob yektu zastosujte vidokremlennya metodu do ciyeyi chastini Yaksho metod vikoristovuye funkciyi dekilkoh inshih klasiv treba spochatku viznachiti v yakomu klasi znahoditsya najbilshe danih sho vikoristovuyutsya Potim slid peremistiti metod v cej klas razom z inshimi danimi Yak alternativa za dopomogoyu vidokremlennya metodu metod rozbivayetsya na dekilka chastin i voni rozmishuyutsya v riznih chastinah inshih klasiv Nalezhne likuvannya dlya poperednogo prikladu public class Phone private final String unformattedNumber public Phone String unformattedNumber this unformattedNumber unformattedNumber private String getAreaCode return unformattedNumber substring 0 3 private String getPrefix return unformattedNumber substring 3 6 private String getNumber return unformattedNumber substring 6 10 public String toFormattedString return getAreaCode getPrefix getNumber public class Customer private Phone mobilePhone public String getMobilePhoneNumber return mobilePhone toFormattedString PerevagiZmenshennya dublyuvannya kodu yaksho kod obrobki danih pereyihav v odne zagalne misce Polipshennya organizaciyi kodu oskilki metodi roboti z danimi znahodyatsya bilya cih danih Vipadki koli zastosuvati ne mozhnaBuvayut vipadki koli povedinka navmisno viddilyayetsya vid klasu sho mistit dani Najchastishe ce roblyat dlya togo shob mati mozhlivist dinamichno minyati cyu povedinku paterni Strategiya Vidviduvach i tak dali Div takozhNedorechna blizkistPosilannyaZazdrisni funkciyi 17 grudnya 2014 u Wayback Machine Feature Envy Example 13 travnya 2021 u Wayback Machine Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno berezen 2017 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi