domain-driven design workshops
TRANSCRIPT
![Page 1: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/1.jpg)
Domain-Driven DesignJak stworzyć aplikację używając DDD
Mariusz Kopylec
![Page 2: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/2.jpg)
Domena
Dziedzina, w obrębie której budowane jest rozwiązanie zadanego problemu.
![Page 3: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/3.jpg)
Domena
Problem
• Operacje arytmetyczne
• Implementacja aplikacji Java
• Projektowanie aplikacji
Domena
• Liczby rzeczywiste
• JDK
• „Wspólny język”
![Page 4: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/4.jpg)
Domena: wspólny język
• Role: ekspert domenowy, programista
• Ustalony słownik pojęć
• Narzędzie do opisu działania aplikacji
![Page 5: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/5.jpg)
Domena: wspólny język
Usługa ma generować tokeny, które mają być ważne przez określony czas.
Token można wygenerować z domyślnym lub podanym czasem życia.
Usługa powinna udostępniać możliwość walidowania tokenów oraz ich odwoływania.
Odwołany token jest nieważny.
Nie można odwołać tego samego tokena wiele razy.
![Page 6: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/6.jpg)
Domena
Reprezentacją domeny w kodzie źródłowym jest model.
![Page 7: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/7.jpg)
Architektura
INTERFEJS UŻYTKOWNIKA
LOGIKA APLIKACJI
MODEL
INFR
AST
RU
KTU
RA
![Page 8: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/8.jpg)
Interfejs użytkownika
Odpowiedzialny za interakcje z użytkownikiem.
![Page 9: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/9.jpg)
Interfejs użytkownika
• Graficzny interfejs użytkownika
• Strona internetowa
![Page 10: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/10.jpg)
Logika aplikacji
Definiuje funkcjonalności (przypadki użycia).
![Page 11: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/11.jpg)
Logika aplikacji
• Serwis aplikacyjny
• Kontrakt z serwisem infrastrukturalnym
![Page 12: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/12.jpg)
Serwis aplikacyjny
• Metoda = przypadek użycia
• Operuje na modelu
• Bezstanowy
![Page 13: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/13.jpg)
Kontrakt z serwisem infrastrukturalnym
• Definiuje funkcjonalności pomocnicze
• Interfejs
![Page 14: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/14.jpg)
Model
Klocki, z których budujemy funkcjonalności.
Składa się z Domain Building Blocks.
![Page 15: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/15.jpg)
Model
• Agregat: encja, value object
• Serwis domenowy
• Fabryka
• Repozytorium
• Zdarzenie domenowe
• Polityka
![Page 16: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/16.jpg)
Agregat
• Podstawowa jednostka operacyjna
• Powiązane encje i value objecty
• Jeden punkt wejściowy – korzeń
• Zawsze w prawidłowym stanie
![Page 17: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/17.jpg)
Agregat: encja
• Unikalne ID
• Mutowalna
• Nieanemiczna
![Page 18: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/18.jpg)
Agregat: value object
• Brak unikalnego pola
• Niemutowalny
• Typ złożony
![Page 19: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/19.jpg)
Serwis domenowy
• Zachowanie logicznie nie pasujące do żadnej encji
• Proces wywodzący się ze „wspólnego języka”
• Bezstanowy
• Może być interfejsem
![Page 20: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/20.jpg)
Fabryka
• Tworzy agregaty
• Ogranicza sposoby tworzenia agregatu
• Wyciąga złożoną logikę z konstruktorów
![Page 21: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/21.jpg)
Repozytorium
• Zarządza utrwalaniem agregatów
• Interfejs
![Page 22: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/22.jpg)
Zdarzenie domenowe
• Oddziela model od innych warstw
• Konsumowane w innych warstwach
![Page 23: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/23.jpg)
Polityka
• Odzwierciedla wykonanie jednej operacji na kilka sposobów
• Wzorzec projektowy: Strategia
![Page 24: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/24.jpg)
Infrastruktura
Warstwa pomocnicza dla pozostałych warstw.
![Page 25: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/25.jpg)
Infrastruktura
• Serwis infrastrukturalny
• Implementacja repozytorium
![Page 26: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/26.jpg)
Serwis infrastrukturalny
• Spełnia kontrakt zdefiniowany w innych warstwach
• Bezstanowy
![Page 27: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/27.jpg)
Implementacja repozytorium
• Spełnia kontrakt zdefiniowany przez repozytorium
• Określa sposób utrwalania agregatów
• Bezstanowa
![Page 28: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/28.jpg)
Zasady pisania kodu
• Brak łączonych metod na agregacie
• Warunki w osobnych metodach
• „Fail fast”
• Dobrze nazwane klasy i metody
• Dostępność ograniczona do minimum
![Page 29: Domain-Driven Design workshops](https://reader031.vdocuments.pub/reader031/viewer/2022022414/587ed5821a28abdb198b6017/html5/thumbnails/29.jpg)
Zapamiętaj!
Agregat != Tabela