Цю статтю треба для відповідності Вікіпедії. (березень 2015) |
Відокрéмлення клáсу (англ. Extract class) — прийом рефакторингу, що полягає в розділенні класу та виділенні полів і методів, що підтримують окремий функціонал, у новостворений клас з метою полегшення роботи з даними.
Причини рефакторингу
У ході написання програми класи можуть отримати масу додаткових обов'язків.
Переваги здійснення відокремлення класу
- Функція такого рефакторингу — сприяння дотримання принципу єдиного обов'язку класу. В результаті код класів стає більш чистим і зрозумілим.
- Класи з єдиним обов'язком більш стійкі до змін. Наприклад, якщо є клас, який відповідає за 10 різних речей, і до нього потрібно внести певні зміни, то змінюючи один елемент є ризик пошкодити інші.
Недоліки
Якщо часто проводити такий рефакторинг, потрібно буде вдаватися до антирефакторингу — вбудовування класу.
Порядок рефакторингу
- Створити новий клас, який міститиме виділену функціональність.
- Створити зв'язок між старим і новим класом. Найкраще, якщо цей зв'язок буде одностороннім; при цьому другий клас можна буде без проблем використати повторно. З іншого боку, за необхідністю, завжди можна створити двосторонній зв'язок.
- Використати переміщення поля і переміщення методу для кожного поля і методу, які потрібно перенести в новий клас. Для методів слід розпочинати з приватних, таким чином знижуючи імовірність допустити масу помилок. Задля полегшення процесу виправлення помилок потрібно проводити тестування після кожного переміщення, аби не отримати багато помилок в кінці роботи.
- Після переміщення потрібно подивитись на отримані класи. Можливо, класи потрібно буде перейменувати, зважаючи на їх нові обов'язки. Також варто перевірити, чи можна позбавитися від двостороннього зв'язку між класами, якщо він з'явився.
- Важливим моментом є доступність класу ззовні: можна повністю сховати клас, зробивши приватним, і в той же час управляти його полями із старого класу, або зробити публічним, надавши клієнтові можливість безпосередньо міняти значення. Рішення залежить від того, наскільки безпечні для поведінки старого класу будуть несподівані прямі зміни значень в новому класі.
Приклад
Початковий клас
C#:
class Person { public string getName() { return _name; } public string GetTelephoneNumber() { return ("(" + _officeAreaCode + ") " + _officeNumber); } string getOfficeAreaCode() { return _officeAreaCode; } void GetOfficeAreaCode(string arg) { _officeAreaCode = arg; } string getOfficeNumber() { return _officeNumber; } void SetOfficeNumber(string arg) { _officeNumber = arg; } private string _name; private string _officeAreaCode; private string _officeNumber;
У такому випадку власника телефонного номера можна виділити в окремий клас
C#:
class TelephoneNumber { }
Потім потрібно зробити посилання з персони до телефонного номера
C#:
class Person { ... private TelephoneNumber _officeTelephone = new TelephoneNumber(); ... }
Тепер потрібно виконати переміщення поля
C#:
class TelephoneNumber { string getAreaCode() { return _areaCode; } void setAreaCode(string arg) { _areaCode = arg; } private string _areaCode; } class Person { public string GetTelephoneNumber() { return ("(" + getOfficeAreaCode() + ") " + _officeNumber); } string getOfficeAreaCode() { return _officeTelephone.getAreaCode(); } void setOfficeAreaCode(string arg) { _officeTelephone.setAreaCode(arg); } }
Та переміщення методу
C#:
class Person { public string getName() { return _name; } public string getTelephoneNumber() { return _officeTelephone.getTelephoneNumber(); } TelephoneNumber getOfficeTelephone() { return _officeTelephone; } private String _name; private TelephoneNumber _officeTelephone = new TelephoneNumber(); } class TelephoneNumber { public string GetTelephoneNumber() { return ("(" + _areaCode + ") " + _number); } string getAreaCode() { return _areaCode; } void SetAreaCode(string arg) { _areaCode = arg; } string getNumber() { return _number; } void SetNumber(string arg) { _number = arg; } private string _number; private string _areaCode; }
Антирефакторинг
- Вбудовування класу
Схожі рефакторинги
- Витягання підкласу
- Заміна простого поля об'єктом
Бореться з запахом
- (Дублювання коду)
- (Занадто великий клас)
- (Розбіжні модифікації)
- (Групи даних)
- (Одержимість елементарними типами)
- (Тимчасове поле)
- Недоречна близькість
Посилання
- Відокремлення класу — Рефакторинг [ 23 лютого 2015 у Wayback Machine.]
- Extract Class — Refactoring [ 24 грудня 2014 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cyu stattyu treba vikifikuvati dlya vidpovidnosti standartam yakosti Vikipediyi Bud laska dopomozhit dodavannyam dorechnih vnutrishnih posilan abo vdoskonalennyam rozmitki statti berezen 2015 Vidokremlennya klasu angl Extract class prijom refaktoringu sho polyagaye v rozdilenni klasu ta vidilenni poliv i metodiv sho pidtrimuyut okremij funkcional u novostvorenij klas z metoyu polegshennya roboti z danimi Prichini refaktoringuU hodi napisannya programi klasi mozhut otrimati masu dodatkovih obov yazkiv Perevagi zdijsnennya vidokremlennya klasuFunkciya takogo refaktoringu spriyannya dotrimannya principu yedinogo obov yazku klasu V rezultati kod klasiv staye bilsh chistim i zrozumilim Klasi z yedinim obov yazkom bilsh stijki do zmin Napriklad yaksho ye klas yakij vidpovidaye za 10 riznih rechej i do nogo potribno vnesti pevni zmini to zminyuyuchi odin element ye rizik poshkoditi inshi NedolikiYaksho chasto provoditi takij refaktoring potribno bude vdavatisya do antirefaktoringu vbudovuvannya klasu Poryadok refaktoringuStvoriti novij klas yakij mistitime vidilenu funkcionalnist Stvoriti zv yazok mizh starim i novim klasom Najkrashe yaksho cej zv yazok bude odnostoronnim pri comu drugij klas mozhna bude bez problem vikoristati povtorno Z inshogo boku za neobhidnistyu zavzhdi mozhna stvoriti dvostoronnij zv yazok Vikoristati peremishennya polya i peremishennya metodu dlya kozhnogo polya i metodu yaki potribno perenesti v novij klas Dlya metodiv slid rozpochinati z privatnih takim chinom znizhuyuchi imovirnist dopustiti masu pomilok Zadlya polegshennya procesu vipravlennya pomilok potribno provoditi testuvannya pislya kozhnogo peremishennya abi ne otrimati bagato pomilok v kinci roboti Pislya peremishennya potribno podivitis na otrimani klasi Mozhlivo klasi potribno bude perejmenuvati zvazhayuchi na yih novi obov yazki Takozh varto pereviriti chi mozhna pozbavitisya vid dvostoronnogo zv yazku mizh klasami yaksho vin z yavivsya Vazhlivim momentom ye dostupnist klasu zzovni mozhna povnistyu shovati klas zrobivshi privatnim i v toj zhe chas upravlyati jogo polyami iz starogo klasu abo zrobiti publichnim nadavshi kliyentovi mozhlivist bezposeredno minyati znachennya Rishennya zalezhit vid togo naskilki bezpechni dlya povedinki starogo klasu budut nespodivani pryami zmini znachen v novomu klasi PrikladPochatkovij klas C class Person public string getName return name public string GetTelephoneNumber return officeAreaCode officeNumber string getOfficeAreaCode return officeAreaCode void GetOfficeAreaCode string arg officeAreaCode arg string getOfficeNumber return officeNumber void SetOfficeNumber string arg officeNumber arg private string name private string officeAreaCode private string officeNumber U takomu vipadku vlasnika telefonnogo nomera mozhna vidiliti v okremij klas C class TelephoneNumber Potim potribno zrobiti posilannya z personi do telefonnogo nomera C class Person private TelephoneNumber officeTelephone new TelephoneNumber Teper potribno vikonati peremishennya polya C class TelephoneNumber string getAreaCode return areaCode void setAreaCode string arg areaCode arg private string areaCode class Person public string GetTelephoneNumber return getOfficeAreaCode officeNumber string getOfficeAreaCode return officeTelephone getAreaCode void setOfficeAreaCode string arg officeTelephone setAreaCode arg Ta peremishennya metodu C class Person public string getName return name public string getTelephoneNumber return officeTelephone getTelephoneNumber TelephoneNumber getOfficeTelephone return officeTelephone private String name private TelephoneNumber officeTelephone new TelephoneNumber class TelephoneNumber public string GetTelephoneNumber return areaCode number string getAreaCode return areaCode void SetAreaCode string arg areaCode arg string getNumber return number void SetNumber string arg number arg private string number private string areaCode AntirefaktoringVbudovuvannya klasuShozhi refaktoringiVityagannya pidklasu Zamina prostogo polya ob yektomBoretsya z zapahomDublyuvannya kodu Zanadto velikij klas Rozbizhni modifikaciyi Grupi danih Oderzhimist elementarnimi tipami Timchasove pole Nedorechna blizkistPosilannyaVidokremlennya klasu Refaktoring 23 lyutogo 2015 u Wayback Machine Extract Class Refactoring 24 grudnya 2014 u Wayback Machine Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi