Дублювання видимих даних - (англ. duplicate observed data) це один з прийомів рефакторингу, який застосовується у випадках, коли потрібно розділити дані наприклад GUI та предметної області.
Проблема
Дані предметної області програми зберігаються в класах, що відповідають за призначений для користувача інтерфейс (GUI).
Рішення
Має сенс виділити дані предметної області в окремі класи і, таким чином, забезпечити зв'язок і синхронізацію між класом предметної області і GUI.
Причини рефакторингу
Ви хочете мати декілька видів інтерфейсу для однакових даних (наприклад, у вас є додаток не лише для десктопа, але також для телефонів і планшетів). В цьому випадку вам буде дуже складно уникнути великої кількості помилок і дублювання коду, якщо ви не розділите GUI і предметну область.
Переваги
- Ви розділяєте відповідальність між класами бізнес-логіки і представлення (принцип єдиного обов'язку), що спрощує читабельність і розуміння програми в цілому.
- Якщо потрібно буде додати новий вид інтерфейсу, вам треба буде створити нові класи представлення, при цьому код бізнес-логіки чіпати немає ніякої нужди (принцип відкритості/закритості).
- Над бізнес-логікою і призначеними для користувача інтерфейсами тепер можуть працювати різні люди.
Коли його не можна застосувати
Цей рефакторинг, який в класичному виконанні здійснюється з введенням шаблону Спостерігач, практично не застосовується для вебдодатків, де всі класи перестворюються при кожному запиті до вебсервера.
Проте, загальний принцип відокремлення бізнес-логіки в окремі класи має сенс, у тому числі, і для вебдодатків. Але реалізується він за допомогою інших рефакторингів, які обираються з урахуванням дизайну вашої системи.
Порядок рефакторингу
- Необхідно приховати прямий доступ до даних предметної області в класі GUI, для чого найкраще використати самоінкапсуляцію поля. Таким чином, ви створите геттери і сеттери до цих даних.
- У обробниках подій класу GUI використайте сеттери для установки нових значень полів. Це дасть можливість передавати нові значення в пов'язаний об'єкт предметної області.
- Створіть клас предметної області і скопіюйте в нього необхідні поля з класу GUI. Для всіх цих полів створіть геттери і сеттери.
- Застосуйте патерн Спостерігач до цих двох класів:
- В класі предметної області створіть масив для зберігання об'єктів спостерігачів (об'єктів GUI), а також методи їх реєстрації, видалення і сповіщення.
- В класі GUI створіть поле для зберігання посилання на об'єкт предметної області, а також метод
update()
, який реагуватиме на зміни в цьому об'єкті та буде оновлювати значення полів в класі GUI. Зверніть увагу, в методі оновлення значення повинні встановлюватися безпосередньо, щоб уникнути рекурсії. - У конструкторі класу GUI створіть екземпляр класу предметної області і збережіть його в створеному полі. Зареєструйте об'єкт GUI як спостерігач в об'єкті предметної області.
- У сеттерах полів класу предметної області викликайте метод сповіщення спостерігача (тобто метод оновлення в класі GUI), щоб передати нові значення в призначений для користувача інтерфейс.
- Змініть сеттери полів класу GUI так, щоб вони тепер встановлювали нові значення в об'єкті предметної області, причому безпосередньо. Будьте уважні, якщо значення встановлюватимуться через сеттер класу предметної області, це приведе до нескінченної рекурсії.
Схожі в групі методів рефакторингу "Організація даних"
- Самоінкапсуляція поля
- Заміна простого поля об'єктом
- Заміна значення посиланням
- Заміна посилання значенням
- Заміна поля-масиву об'єктом
- Дублювання видимих даних
- Заміна одностороннього зв'язку двонаправленим
- Інкапсуляція поля
- Інкапсуляція колекції
- Заміна кодування типу класом
- Заміна кодування типу підкласами
- Заміна кодування типу станом/стратегією
- Заміна підкласу полями
Посилання
- Duplicate Observed Data [ 4 грудня 2014 у Wayback Machine.]
- Прийоми рефакторингу [ 15 грудня 2014 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Dublyuvannya vidimih danih angl duplicate observed data ce odin z prijomiv refaktoringu yakij zastosovuyetsya u vipadkah koli potribno rozdiliti dani napriklad GUI ta predmetnoyi oblasti ProblemaDani predmetnoyi oblasti programi zberigayutsya v klasah sho vidpovidayut za priznachenij dlya koristuvacha interfejs GUI RishennyaMaye sens vidiliti dani predmetnoyi oblasti v okremi klasi i takim chinom zabezpechiti zv yazok i sinhronizaciyu mizh klasom predmetnoyi oblasti i GUI Prichini refaktoringuVi hochete mati dekilka vidiv interfejsu dlya odnakovih danih napriklad u vas ye dodatok ne lishe dlya desktopa ale takozh dlya telefoniv i planshetiv V comu vipadku vam bude duzhe skladno uniknuti velikoyi kilkosti pomilok i dublyuvannya kodu yaksho vi ne rozdilite GUI i predmetnu oblast PerevagiVi rozdilyayete vidpovidalnist mizh klasami biznes logiki i predstavlennya princip yedinogo obov yazku sho sproshuye chitabelnist i rozuminnya programi v cilomu Yaksho potribno bude dodati novij vid interfejsu vam treba bude stvoriti novi klasi predstavlennya pri comu kod biznes logiki chipati nemaye niyakoyi nuzhdi princip vidkritosti zakritosti Nad biznes logikoyu i priznachenimi dlya koristuvacha interfejsami teper mozhut pracyuvati rizni lyudi Koli jogo ne mozhna zastosuvatiCej refaktoring yakij v klasichnomu vikonanni zdijsnyuyetsya z vvedennyam shablonu Sposterigach praktichno ne zastosovuyetsya dlya vebdodatkiv de vsi klasi perestvoryuyutsya pri kozhnomu zapiti do vebservera Prote zagalnij princip vidokremlennya biznes logiki v okremi klasi maye sens u tomu chisli i dlya vebdodatkiv Ale realizuyetsya vin za dopomogoyu inshih refaktoringiv yaki obirayutsya z urahuvannyam dizajnu vashoyi sistemi Poryadok refaktoringuNeobhidno prihovati pryamij dostup do danih predmetnoyi oblasti v klasi GUI dlya chogo najkrashe vikoristati samoinkapsulyaciyu polya Takim chinom vi stvorite getteri i setteri do cih danih U obrobnikah podij klasu GUI vikoristajte setteri dlya ustanovki novih znachen poliv Ce dast mozhlivist peredavati novi znachennya v pov yazanij ob yekt predmetnoyi oblasti Stvorit klas predmetnoyi oblasti i skopiyujte v nogo neobhidni polya z klasu GUI Dlya vsih cih poliv stvorit getteri i setteri Zastosujte patern Sposterigach do cih dvoh klasiv V klasi predmetnoyi oblasti stvorit masiv dlya zberigannya ob yektiv sposterigachiv ob yektiv GUI a takozh metodi yih reyestraciyi vidalennya i spovishennya V klasi GUI stvorit pole dlya zberigannya posilannya na ob yekt predmetnoyi oblasti a takozh metod update yakij reaguvatime na zmini v comu ob yekti ta bude onovlyuvati znachennya poliv v klasi GUI Zvernit uvagu v metodi onovlennya znachennya povinni vstanovlyuvatisya bezposeredno shob uniknuti rekursiyi U konstruktori klasu GUI stvorit ekzemplyar klasu predmetnoyi oblasti i zberezhit jogo v stvorenomu poli Zareyestrujte ob yekt GUI yak sposterigach v ob yekti predmetnoyi oblasti U setterah poliv klasu predmetnoyi oblasti viklikajte metod spovishennya sposterigacha tobto metod onovlennya v klasi GUI shob peredati novi znachennya v priznachenij dlya koristuvacha interfejs Zminit setteri poliv klasu GUI tak shob voni teper vstanovlyuvali novi znachennya v ob yekti predmetnoyi oblasti prichomu bezposeredno Budte uvazhni yaksho znachennya vstanovlyuvatimutsya cherez setter klasu predmetnoyi oblasti ce privede do neskinchennoyi rekursiyi Shozhi v grupi metodiv refaktoringu Organizaciya danih Samoinkapsulyaciya polya Zamina prostogo polya ob yektom Zamina znachennya posilannyam Zamina posilannya znachennyam Zamina polya masivu ob yektom Dublyuvannya vidimih danih Zamina odnostoronnogo zv yazku dvonapravlenim Inkapsulyaciya polya Inkapsulyaciya kolekciyi Zamina koduvannya tipu klasom Zamina koduvannya tipu pidklasami Zamina koduvannya tipu stanom strategiyeyu Zamina pidklasu polyamiPosilannyaDuplicate Observed Data 4 grudnya 2014 u Wayback Machine Prijomi refaktoringu 15 grudnya 2014 u Wayback Machine