fbpx

Domain Driven Design – Repozytorium

Domain Driven Design – Repozytorium

Ostatnio wprowadziłam Cię w wykorzystanie fabryk w DDD. Kolejnym bardzo ważnym wzorcem jest Repozytorium. To ono pozwala nam na dobrze zarządzaniem zapisem i odczytem danych. Więcej szczegółów znajdziesz w dalszej części artykułu na, który serdecznie Cię zapraszam.

Czym jest repozytorium

Repozytorium to wzorzec wykorzystywany jako magazyn obiektów. Łączy ze sobą warstwę dziedziny z warstwą odwzorowania danych (storage). Udostępnia metody, które pozwalają na odczytywanie obiektów oraz utrwalanie ich stanów. Główne założenie dotyczące repozytoriów jest takie, że każdy obiekt utrwalony za pomocą repozytorium będzie odtworzony w niezmienionym stanie. W kontekście DDD pozwana on na uniezależnienie się od warstwy infrastruktury oraz stosowanych w niej technologii. Bardzo ważne jest to, że podejście domenowe nie determinuje konkretnych rozwiązań w temacie przechowywania danych, wręcz podkreśla niezależność modelu od bazy danych.

Źródło: [Evans. E DDD zapanuj nad złożonym systemem informatycznym, Helion, Gliwice 2015 s. 183]

Repozytoria nie powinny być tworzone dla każdego obiektu, który programista chce utrwalić, ponieważ zaburzy to spójność obiektów. Kłóci się to również z założeniami agregatów, w których dostęp do elementów zagnieżdżonych nie ma dostępu, jedynie przez korzeń agregatu. Prawidłowo zaprojektowane repozytoria powinny być zdefiniowanie jedynie dla agregatów. Dzięki referencjom lub asocjacjom obiekty mogą między sobą wchodzić w relacje, co pozwala nam na odwzorowanie struktury agregatu. Jednak nieprzemyślane stosowanie asocjacji może doprowadzić do sytuacji, że to właśnie struktura relacji między obiektami w warstwie zapisu zacznie determinować struktury domenowe, a nie odwrotnie. Prowadzi to w późniejszych etapach także do zaciemnienia modelu.

Typy repozytoriów

Wyróżniamy dwa typy repozytoriów: kolekcja oraz trwały magazyn. Repozytorium typu kolekcji to tradycyjne, najczęściej stosowane podejście. Jest ono najbardziej zbliżone do założeń w oryginalnym wzorcu DDD. Jak sugeruje nazwa sposób obsługi obiektów naśladuje kolekcje. Stan całej kolekcji obiektów jest monitorowany bez świadomości klienta. Gdy do repozytorium zostanie dodany jeden obiekt agregatu, to nie może zostać dodany ponownie, gdyż elementy są unikatowe. Dzięki temu nie ma potrzeby kolejny raz zapisywać danego obiektu, ponieważ podczas pobierania zwracany obiekt będzie referencją do obiektu znajdującego się już w kolekcji, co pozwala na kontrolowane modyfikacje.

W tego typu repozytoriach ważne jest aby pamiętać, że mechanizm utrwalania nie jest udostępniony klientom za pośrednictwem interfejsu. Należy rozumieć to w ten sposób, że repozytorium nie udostępnia metody save(), ponieważ utrwalenie odbywa się dzięki modyfikacjom oryginalnego obiektu z użyciem referencji. Ten typ jest stosowany przy relacyjnych bazach danych oraz w systemach mapowania obiektowo-relacyjnego (ORM).

W przypadku repozytorium typu trwały magazyn bazujemy na operacjach zapisywania. Zmiany na obiektach nie są śledzone, a utrwalanie obiektu odbywa się przy użyciu metody save() udostępnianej przez repozytorium. Modyfikowanie obiektów również odbywa się świadomie poprzez wywołanie odpowiedniej udostępnionej metody. Zasada dotycząca agregatów w tym przypadku również jest stosowana. Repozytorium nie powinno udostępniać dostępu do danych omijając korzeń agregatu. W tym przypadku jedną z możliwości utrwalenia agregatu jest jego serializacja. Większość języków programowania ma wbudowaną obsługę serializacji, która pozwala na odtworzenie pełnego i złożonego stanu obiektu. Ten typ jest rekomendowany przy bazach typu klucz-wartość.

Bardzo często repozytorium jest mylone z obiektem dostępu do danych (DOA). Jest między nimi wiele podobieństw np. oba tworzą pewną warstwę abstrakcji między modelem dziedzinowym a warstwą utrwalania. Jednak posiadają kilka znaczących różnic. DAO zwykle dostarcza jedynie interfejsów dla tabel w bazie danych oraz skupia się przede wszystkim na operacjach typu CRUD. Repozytorium ma trochę szersze zastosowanie i najważniejsze: jedno repozytorium nie równa się jednej tabeli. W projekcie DDD należy unikać korzystania z DAO.

Dzisiaj to już na tyle. Jeśli masz jakieś dodatkowe pytania, coś nadal jest dla Ciebie niezrozumiałe, pisz w komentarzu lub wiadomości prywatnej, na pewno odpisze!

Zgarnij darmowy ebook i cotygodniową dawkę wiedzy

.
Magdalena Limanówka-Kuciel
magdalena@panizkomputerem.pl

Jestem programistką, która lubi mieć ręce pełne roboty. Do życia potrzebuje komputera z internetem i kubka gorącej kawy. Więcej na stronie o mnie.