У чому різниця між Data Mapper, Table Data Gateway (Gateway), Об'єктом доступу до даних (DAO) та Шаблонами сховищ?


133

Я намагаюся підкреслити свої навички дизайнерського шаблону, і мені цікаво, чим відрізняються ці зразки? Всі вони здаються, що вони однакові - інкапсулюйте логіку бази даних для певного об'єкта, щоб викличний код не знав про базовий рівень стійкості. З мого короткого дослідження, вони, як правило, реалізують ваші стандартні методи CRUD та відволікають деталі, характерні для бази даних.

Крім умовних назв (наприклад, CustomerMapper vs. CustomerDAO проти CustomerGateway проти CustomerRepository), яка різниця, якщо така є? Якщо є різниця, коли б ви вибрали одне над іншим?

Раніше я писав би код, подібний до наступного (спрощено, природно - я зазвичай не використовую загальнодоступні властивості):

public class Customer
{
    public long ID;
    public string FirstName;
    public string LastName;
    public string CompanyName;
}

public interface ICustomerGateway
{
    IList<Customer> GetAll();
    Customer GetCustomerByID(long id);
    bool AddNewCustomer(Customer customer);
    bool UpdateCustomer(Customer customer);
    bool DeleteCustomer(long id);
}

і мають CustomerGatewayклас, який реалізує певну логіку бази даних для всіх методів. Іноді я б не використовував інтерфейс і робив усі методи на CustomerGateway статичними (я знаю, я знаю, це робить його менш перевіреним), тому я можу назвати це так:

Customer cust = CustomerGateway.GetCustomerByID(42);

Це здається тим самим принципом для шаблонів Map Mapper і Repository; Шаблон DAO (який, це те саме, що і шлюз, я думаю?) також, здається, заохочує шлюзи, характерні для бази даних.

Я щось пропускаю? Мабуть, дивним є 3-4 різних способи зробити одну і ту ж річ.

Відповіді:


97

Ваші прикладні умови; Усі DataMapper, DAO, DataTableGateway і Repository мають подібну мету (коли я їх використовую, я розраховую повернути об'єкт "Клієнт"), але різний намір / значення і внаслідок цього реалізація.

Repository «діє як колекція, за винятком можливості більш складної запитувача» [ Evans, Domain Driven Design ] і може розглядатися в якості «об'єктів в фасаді пам'яті» ( Repository обговорення )

DataMapper «переміщує дані між об'єктами і базою даних, зберігаючи при цьому їх незалежними один від одного і самого картографа» ( Fowler, PoEAA, Mapper )

TableDataGateway є «шлюзовий (об'єкт , який інкапсулює доступ до зовнішньої системи або ресурсу) в таблиці бази даних. Один екземпляр обробляє всі рядки в таблиці » ( Фаулера, PoEAA, TableDataGateway )

ДАО «відокремлює клієнтський інтерфейс ресурсу , обробок даних від його механізмів доступу до даних / адаптує API доступу конкретного ресурсу обробки даних для загального інтерфейсу клієнта» , що дозволяє «механізми доступу до даних для зміни незалежно від коду , який використовує дані» ( ВС светокопіі )

Сховище здається дуже загальним, не розкриваючи поняття взаємодії з базами даних. DAO забезпечує інтерфейс, що дозволяє використовувати різні основні реалізації баз даних. TableDataGateway - це конкретно тонка обгортка навколо одного столу. DataMapper виступає посередником, що дозволяє об’єкту Model еволюціонувати незалежно від представлення бази даних (з часом).


15
По правді кажучи, немає великої різниці між DAO і TableDataGateway, а в [Fowler, PoEAA] [1] вони говорять саме про це: "[Alur et al.] [2] обговорює шаблон об'єкта доступу до даних, який є табличним шлюзом даних. .. Я використав іншу назву, почасти тому, що бачу цей шаблон як особливе використання більш загальної концепції Gateway (466), і я хочу, щоб це ім'я відображало це ". [1]: martinfowler.com/books/eaa.html [2]: books.google.pt/books/about/…
Мігель Гамбоа

9
Гарна думка. Моє враження, що представлене PoEAA визначення TableDataGateway є вужчим, ніж DataAccessObject. Перший, схоже, передбачає відображення «один на один» із таблицею (реляційної) бази даних, де DAO може виступати як фасад для декількох базових нереляційних ресурсів. Акцент у DAO полягає у здатності замінити базовий сховище даних, акцент у TableDataGateway - інкапсуляція операцій SQL над однією таблицею (не обов'язково нейтральним / портативним сховищем даних).
Пірс Хікі

31

У світі дизайну програмного забезпечення є тенденція (принаймні, я так вважаю) вигадувати нові імена для відомих старих речей та шаблонів. І коли ми маємо нову парадигму (яка, можливо, трохи відрізняється від уже існуючих речей), вона зазвичай постачається з цілим набором нових назв для кожного рівня. Тож "Business Logic" стає "Layer Services" просто тому, що ми кажемо, що ми робимо SOA, а DAO стає Repository тільки тому, що ми кажемо, що ми робимо DDD (і кожен з них насправді не є чимось новим і унікальним, але знову ж таки: нові імена для вже відомих понять, зібраних в одній книзі). Тож я не кажу, що всі ці сучасні парадигми та абревіатури означають ТОЧНО одне й те саме, але ви насправді не повинні бути надто параноїдними щодо цього. Здебільшого це ті самі візерунки, тільки з різних сімей.


4
@MladenMihajlovic, те, що ви не розумієте чи не погоджуєтесь, не означає, що ця відповідь не вірна або подія правильна.
Cypher

2
@MladenMihajlovic - це не те, що говорить ця відповідь. Останнє речення підсумовує його.
Cypher

2
@Cypher Ці зразки здебільшого однакові? Ні, вони не. Реалізація схеми шлюзу відрізняється, ніж реалізація шаблону репозиторію. Вони можуть виглядати так само нетренованим оком, але це не так. Також, як правильно зазначив Младен Михайлович, ця відповідь є абсолютно неправильною. Бізнес-логіка та рівень обслуговування - це дві різні речі.
Фредерік Краутвальд

1
@Cypher Це насправді не питання думки, а факти. Шаблон шлюзу був сформульований Мартіном Фаулером у його PoEAA і здебільшого пов'язаний із моделями фасадів чи адаптерів [GoF]. Відмінність полягає в тому, що шлюз написаний для певного використання і зазвичай не існує інтерфейсу. Шлюз, як правило, включає лише два об'єкти, і ресурс, який перебуває в упаковці, не знає про Шлюз. (продовжується ...)
Фредерік Краутвальд

3
Це скоріше коментар, ніж відповідь.
Петур Інгі Егільссон

31

Data Mapper vs Data Data Gateway Щоб зробити короткий короткий опис:

  • Картограф даних отримає об’єкт Доменна модель (Сутність) як парам і використає його для здійснення операцій CRUD
  • Шлюз даних таблиці отримає всі параметри (як примітиви) для методів і нічого не буде знати про об'єкт Доменна модель (Сутність).

    Зрештою, вони обидва будуть посередником між об'єктами пам'яті та базою даних.


  • 6
    посилання стало несвіжим
    imela96


    15

    Ви маєте гарний момент. Виберіть той, хто вам найбільше знайомий. Мені подобається зазначити кілька речей, які можуть допомогти з’ясувати.

    Шлюз даних таблиці використовується в основному для однієї таблиці або представлення даних. Він містить усі виділення, вставки, оновлення та видалення. Таким чином, Клієнт - це стіл або вид у вашому випадку. Отже, один екземпляр об'єкта шлюзу даних таблиці обробляє всі рядки таблиці. Зазвичай це пов'язано з одним об’єктом на таблиці бази даних.

    У той час як Data Mapper більш незалежний від будь-якої логіки домену і менш зв'язаний (хоча я вважаю, чи є з'єднання, або не є з'єднання). Це лише посередницький рівень для передачі даних між об'єктами та базою даних, зберігаючи їх незалежно один від одного та самого картографа.

    Отже, зазвичай у картографі, ви бачите такі методи, як вставлення, оновлення, видалення, а в шлюзі даних таблиці ви знайдете getcustomerbyId, getcustomerbyName тощо.

    Об'єкт передачі даних відрізняється від вищезгаданих двох шаблонів, головним чином тим, що це схема розподілу, а не модель джерела даних, як вище двох шаблонів. Використовуйте його головним чином, коли ви працюєте з віддаленим інтерфейсом, і вам потрібно робити дзвінки менш балаканими, оскільки кожен дзвінок може дорожче. Тому зазвичай розробляють DTO, який може бути серіалізований по дроту, який може перенести всі дані назад на сервер для застосування подальших правил бізнесу або обробки.

    Я не добре розбираюся в шаблоні сховищ, тому що до цього часу я не отримав можливості використовувати, але буду дивитись на відповіді інших.


    1

    Нижче лише моє розуміння.

    TableGateWay / RowDataGateWay : У цьому контексті шлюз посилається на конкретну реалізацію, яка відображає кожен "доменний об'єкт", відображаючи кожен "шлюз об'єкта домену". Наприклад, якщо у нас є Person , то у нас буде PersonGateway для зберігання об’єкта домену Person до бази даних. Якщо у нас є Особа, Співробітник, Клієнт тощо, ми матимемо PersonGateway, EmployeeGateway та CustomerGateway. Кожен шлюз матиме специфічну функцію CRUD для цього об’єкта, і він не має нічого спільного з іншими шлюзами. Тут немає коду / модуля для багаторазового використання. Шлюз може бути додатково розділений на RowDataGateway або TableGateway, залежить, якщо ви передасте "id" або "об'єкт". Шлюз зазвичай порівнюють із записом Active. Він пов'язує вашу модель домену зі схемою бази даних.

    Репозиторій / DataMapper / DAO : Це одне і те ж. Усі вони посилаються на рівень персистентності, який передає об'єкти бази даних до доменної моделі. На відміну від шлюзу, репозиторій / DataMapper / DAO приховує реалізацію. Ви не знаєте, чи за особою стоїть PersonGateway. Це може, або це не може, вас не хвилює. Все, що ви знаєте, це те, що для кожного об’єкта домену повинні підтримуватися операції CRUD. Він відокремлює джерело даних та модель домену.

    Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
    Licensed under cc by-sa 3.0 with attribution required.