際際滷

際際滷Share a Scribd company logo
Domain Driven Design


 != Anemic Domain Model
Agenda
   Dlaczego projektowanie dziedziny jest wa甜ne?
   Czym r坦甜ni si od modelu anemicznego?
   OO i OOP oraz SOA zamiast pisania procedur.
   Ubiquitous Language.
   Bounded Context.
   Context Mapping i wzorce integracyjne.
   Core Domain.
   Architektura warstwowa i wzorce projektowe.
   Dependency Injection oraz Aspect Oriented Programming.
Projektowanie dziedziny
   Bardzo wa甜ne przy tworzeniu zorzonego
    oprogramowania.
   Obiektowy model dziedziny, posiada stan i
    zachowanie.
   Rozwizanie problem坦w zo甜onoci.
   Modelowanie rozwizywanego problemu.
   Odpowiedzialno we waciwym miejscu.
   DRY
Model anemiczny dziedziny
   Przeronita warstwa usug, zawiera ca logik
    biznesow.
   Trudna w utrzymaniu warstwa usug.
   Degradacja warstwy dziedziny.
   Przeniesienie korzyci na rzecz fasady.
   Ograniczenie mo甜liwoci testowania modelu.
Programowanie zorientowane
             obiektowo
   OOP stworzone dla lepszego rozwizywania
    problem坦w.
   Zacierane przez niekt坦re technologie np. EJB, nie
    ma obiekt坦w mamy np. encje, beany.
   Wprowadzenie terminu POJO  zwyke obiekty
    jzyka Java.
   Czsto obsuga logiki sprowadza si do pisania
    kodu procedur.
Ubiquitous Language
   Tworzony w czasie rozm坦w z klientem.
   Wsp坦lny jzyk dla dziedziny, wynika z analizy.
   Wsp坦lny jzyk projektu dla projektant坦w,
    programist坦w zaczerpnity z 甜argonu wiata
    rzeczywistego.
Zwizany kontekst
   Ka甜dy model ma sw坦j kontekst.
   Integralno modelu.
   Jest logiczn ram rozwijanego modelu.
   Pojedyczy model atwiej zarzdzany przez jeden
    zesp坦.
   Ka甜dy zwizany kontekst powinien mie nazw
    ze wspolnego jzyka opisu.
Mapa kontekstu
Mapa kontekstu cd.
   Shared Kernel
   Customer-Supplier
   Conformist
   Separate Ways
   Open Host Services
   Anticorruption Layer
Mapa kontekstu cd.
   Shared Kernel oraz Customre-Supplier to
    wzorce dajace wysoki stopien interakcji pomiedzy
    kontekstami.
   Separate Way mo甜e by stosowany jeli chcemy
    by konteks by odseparowany i rozwijany
    oddzielnie.
   Open Host Service oraz Anticorruption Layer
    w przypadku interakcji z zewnetrznymi
    systemami.
Mapa kontekstu cd.
  Shared Kernel
Mapa kontekstu cd.
              Shared Kernel
   Redukuje duplikacje, ale w dalszym cigu
    utrzymuje odseparowane konteksty. Wymaga
    uwagi gdy甜 r坦甜ne zespoy modyfikuj rdze.
   Testy oraz Continuous Integration.
Mapa kontekstu cd.
            Customer-Supplier
   Jeli jeden podsystem zalerzy mocno od innego.
   Rezultat procesu jest przekazywany do
    podsystemu.
   Zespoy s mocno zainteresowane wzajemn
    relacj tworzonych podsystem坦w.
   Dostawca powinien wspiera klienta.
Mapa kontekstu cd.
               Conformist
   Podobnie jak w przypadku wzorca Shared Kernel,
    jednak bez mo甜liwoci dokonywania zmian.
   Jeli u甜ywanykomponent ma zorzony interfejs,
    u甜ywane w modelu jako wasny.
   Jeli komponent ma niewielki interfejs, warto
    zastanowi si nad adapterem do translacji
    pomidzy naszym modelem a modelem z kt坦rego
    komponent si wywodzi.
Mapa kontekstu cd.
            Anticorruption Layer
   Jeli integracja przez protok坦 komunikacyjny,
    lub przez baz danych.
   Brak informacji o modelu, dostpne s
    prymitywne dane.
   Istnieje ukryta semantyka danych.
   Potrzeba izolacji modelu od systemu
    zewntrznego.
Mapa kontekstu cd.
            Anticorruption Layer
   Warstwa komunikuje si z zewntrznym
    modelem wykorzystujc zewntrzny jzyk.
   Spenia form dwu kierunkowego translatora
    pomidzy dziedzinami i jzykami.
   Service jako fasada z zastosowaniem adaptera.
Mapa kontekstu cd.
Anticorruption Layer
Mapa kontekstu cd.
             Separate Ways
   Jeli jest pewno 甜e mo甜na podzieli aplikacj na
    kilka mniejszych niezale甜nych od siebie aplikacji.
Mapa kontekstu cd.
             Open Host Service
   Jeli podsystem ma si integrowa z r坦甜nymi
    klientami i trzeba tworzy warstw translacji dla
    ka甜dego.
   Potrzeba utworzenia jednego protokou
    komunikacji reprezentujcego prze添roczyst
    grup usug.
Mapa kontekstu
Core Domain
   Po pierwsze wyszukanie i zdefiniowanie g坦wnej
    domeny projektu jako najbardziej priorytetowej.
   Zaniedbania w tej czci mog sta si
    katastrofalne dla systemu.
   Podporzdkowanie innych czci jako wsparcie.
Core Domain cd.
           Generic Subdomains
   Istotne dla funkcionowania systemu i penego
    wyra甜enia modelu.
   Identyfikowanie sp坦jntch poddomen, kt坦re jednak
    nie s motorem dziaania systemu.
   Osadzanie w osobnych moduach.
Architektura warstwowa.
   Interfejs u甜ytkownika - prezentacja i interpretacja polece
    u甜ytkownika.
   Warstwa aplikacji - koordynuje czynnoci aplikacji. Nie zawiera
    logiki bienzsowej ani stanu obiekt坦w biznesowych. Zachowuje
    stan zada.
   Warstwa dziedziny  serce aplikacji, zarzdza informacj o
    dziedzinie. Stan obiekt坦w biznesowych. Utrwalanie obiekt坦w w
    warstwie infrastruktury.
   Warstwa infrastruktury  jest wsparciem dla innych warstw.
    Dostarcza komunikacj midzy warstwami, implementuje
    utrwalanie obiekt坦w, zawiera dodatkowe wsparcie dla interfejsu
    u甜ytkownika.
Wzorce projektowe
   Implementacja modelu, te甜 mo甜e zawie.
Wzorce projektowe cd.
   Entities
   Value Objects
   Services
   Aggregates
   Factories
   Repositories
Wzorce projektowe cd.
                Entities
   Posiadaj to甜samo.
   Nie zmieniaj stanu.
   S to instancje trzymane w pamici.
   Referencja spenia warunek to甜samoci.
   Kombinacja unikalnych atrybut坦w.
   Konieczny obiekt w modelu dziedziny.
Wzorce projektowe cd.
             Value Objects
   Nie posiada to甜samoci.
   Wa甜ne s atrybuty.
   Uatwia to tworzenie obiekt坦w i zwalnianie.
   Powinny by immutable (tworzone przez
    konstruktor i niemodyfikowalne).
   Mog by wsp坦dzielone, zachowuj integralno
    danych.
   Mog zawiera inne obiekty VO lub referencje do
    Entity.
Wzorce projektowe cd.
                 Services
   Nie wszystkie aspekty domeny mog by
    mapowane do obiekt坦w.
   Jeli akcja nie jest w zasigu obiektu.
   Nie posiada wewntrznego stanu.
   Grupuje funkcionalno dla wielu obiekt坦w.
   Interfejsy dostarczajce operacje wewntrz
    konceptu dziedziny.
   Operacje s bezstanowe.
Wzorce projektowe cd.
              Aggregates
   Nale甜y do cyklu 甜ycia obiektu domeny.
   Okrela waciwoci obiektu i jego granice.
   Asocjacje one-to-one, one-to-many, many-to-
    many.
   Bidirectional ale samochod ma silnik.
   Aggregates posiada jednego roota  Entity
    (jedyny obiekt widziany z zewntrz)
Wzorce projektowe cd.
               Factories
   Tworz zorzone czasem struktury Encji I
    Agregat坦w.
   Proces musi by atomowy tak aby obiekty byy
    we wasciwym stanie.
Wzorce projektowe cd.
              Repositories
   Baza danych jest czsci infrastruktury.
   Mo甜e przetrzymywa referencje do obiekt坦w.
Wzorce projektowe

                    Dependency Injection
    public class MoneyTransferServiceImpl implements MoneyTransferService {

   private final AccountRepository accountRepository;

   private final BankingTransactionRepository bankingTransactionRepository;

   @Autowired

   public MoneyTransferServiceImpl(AccountRepository accountRepository,

   BankingTransactionRepository

   bankingTransactionRepository) {

   this.accountRepository = accountRepository;

   this.bankingTransactionRepository = bankingTransactionRepository;

   }

   public class HibernateAccountRepository

   implements AccountRepository {

   private HibernateTemplate hibernateTemplate;

   @Autowired

   public HibernateAccountRepository(HibernateTemplate template) {

   hibernateTemplate = template;

   }

   }
Dependency Injection
   <beans>

   <context:annotation-config/>

   <bean name="moneyTransferService" class="MoneyTransferServiceImpl"/>

   <bean name="accountRepository" class="HibernateAccountRepository"/>

   </beans>
AOP
   <bean id="authorization.loggingListener" class="...impl.listener.LoggingListener" />

   <bean id="authorization.ConnectionAdvice" class="...impl.listener.ConnectionAorund">

   <property name="Listeners" >

    <list>

        <ref bean="authorization.loggingListener" />

    </list>

   </property>

   </bean>

   <aop:config>

   <aop:pointcut id="authorization.ConncetionPointcut" expression="execution(*
    ...impl.helper.TopUpConnection.*Invocation(..))" />

   <aop:aspect id="authorization.ConnectionAspect" ref="authorization.ConnectionAdvice">

   <aop:around method="around" pointcut-ref="authorization.ConncetionPointcut"/>

   </aop:aspect>

   </aop:config>
AOP
   public Object around(ProceedingJoinPoint call) throws Throwable {

   for(Listener listener : listeners) {

   notify(listener, call, null);

   }

   Object result = call.proceed();

   for(Listener listener : listeners) {

   notify(listener, call, result);

   }

   return result;

   }
Literatura
   Domain-Driven Design: Tackling Complexity in the
    Heart of Software  Eric Evans
   Patterns of Enterprise Application Architecture 
    Martin Fowler
   http://domaindrivendesign.org
   http://martinfowler.com

More Related Content

Domain Driven Development

  • 1. Domain Driven Design != Anemic Domain Model
  • 2. Agenda Dlaczego projektowanie dziedziny jest wa甜ne? Czym r坦甜ni si od modelu anemicznego? OO i OOP oraz SOA zamiast pisania procedur. Ubiquitous Language. Bounded Context. Context Mapping i wzorce integracyjne. Core Domain. Architektura warstwowa i wzorce projektowe. Dependency Injection oraz Aspect Oriented Programming.
  • 3. Projektowanie dziedziny Bardzo wa甜ne przy tworzeniu zorzonego oprogramowania. Obiektowy model dziedziny, posiada stan i zachowanie. Rozwizanie problem坦w zo甜onoci. Modelowanie rozwizywanego problemu. Odpowiedzialno we waciwym miejscu. DRY
  • 4. Model anemiczny dziedziny Przeronita warstwa usug, zawiera ca logik biznesow. Trudna w utrzymaniu warstwa usug. Degradacja warstwy dziedziny. Przeniesienie korzyci na rzecz fasady. Ograniczenie mo甜liwoci testowania modelu.
  • 5. Programowanie zorientowane obiektowo OOP stworzone dla lepszego rozwizywania problem坦w. Zacierane przez niekt坦re technologie np. EJB, nie ma obiekt坦w mamy np. encje, beany. Wprowadzenie terminu POJO zwyke obiekty jzyka Java. Czsto obsuga logiki sprowadza si do pisania kodu procedur.
  • 6. Ubiquitous Language Tworzony w czasie rozm坦w z klientem. Wsp坦lny jzyk dla dziedziny, wynika z analizy. Wsp坦lny jzyk projektu dla projektant坦w, programist坦w zaczerpnity z 甜argonu wiata rzeczywistego.
  • 7. Zwizany kontekst Ka甜dy model ma sw坦j kontekst. Integralno modelu. Jest logiczn ram rozwijanego modelu. Pojedyczy model atwiej zarzdzany przez jeden zesp坦. Ka甜dy zwizany kontekst powinien mie nazw ze wspolnego jzyka opisu.
  • 9. Mapa kontekstu cd. Shared Kernel Customer-Supplier Conformist Separate Ways Open Host Services Anticorruption Layer
  • 10. Mapa kontekstu cd. Shared Kernel oraz Customre-Supplier to wzorce dajace wysoki stopien interakcji pomiedzy kontekstami. Separate Way mo甜e by stosowany jeli chcemy by konteks by odseparowany i rozwijany oddzielnie. Open Host Service oraz Anticorruption Layer w przypadku interakcji z zewnetrznymi systemami.
  • 11. Mapa kontekstu cd. Shared Kernel
  • 12. Mapa kontekstu cd. Shared Kernel Redukuje duplikacje, ale w dalszym cigu utrzymuje odseparowane konteksty. Wymaga uwagi gdy甜 r坦甜ne zespoy modyfikuj rdze. Testy oraz Continuous Integration.
  • 13. Mapa kontekstu cd. Customer-Supplier Jeli jeden podsystem zalerzy mocno od innego. Rezultat procesu jest przekazywany do podsystemu. Zespoy s mocno zainteresowane wzajemn relacj tworzonych podsystem坦w. Dostawca powinien wspiera klienta.
  • 14. Mapa kontekstu cd. Conformist Podobnie jak w przypadku wzorca Shared Kernel, jednak bez mo甜liwoci dokonywania zmian. Jeli u甜ywanykomponent ma zorzony interfejs, u甜ywane w modelu jako wasny. Jeli komponent ma niewielki interfejs, warto zastanowi si nad adapterem do translacji pomidzy naszym modelem a modelem z kt坦rego komponent si wywodzi.
  • 15. Mapa kontekstu cd. Anticorruption Layer Jeli integracja przez protok坦 komunikacyjny, lub przez baz danych. Brak informacji o modelu, dostpne s prymitywne dane. Istnieje ukryta semantyka danych. Potrzeba izolacji modelu od systemu zewntrznego.
  • 16. Mapa kontekstu cd. Anticorruption Layer Warstwa komunikuje si z zewntrznym modelem wykorzystujc zewntrzny jzyk. Spenia form dwu kierunkowego translatora pomidzy dziedzinami i jzykami. Service jako fasada z zastosowaniem adaptera.
  • 18. Mapa kontekstu cd. Separate Ways Jeli jest pewno 甜e mo甜na podzieli aplikacj na kilka mniejszych niezale甜nych od siebie aplikacji.
  • 19. Mapa kontekstu cd. Open Host Service Jeli podsystem ma si integrowa z r坦甜nymi klientami i trzeba tworzy warstw translacji dla ka甜dego. Potrzeba utworzenia jednego protokou komunikacji reprezentujcego prze添roczyst grup usug.
  • 21. Core Domain Po pierwsze wyszukanie i zdefiniowanie g坦wnej domeny projektu jako najbardziej priorytetowej. Zaniedbania w tej czci mog sta si katastrofalne dla systemu. Podporzdkowanie innych czci jako wsparcie.
  • 22. Core Domain cd. Generic Subdomains Istotne dla funkcionowania systemu i penego wyra甜enia modelu. Identyfikowanie sp坦jntch poddomen, kt坦re jednak nie s motorem dziaania systemu. Osadzanie w osobnych moduach.
  • 23. Architektura warstwowa. Interfejs u甜ytkownika - prezentacja i interpretacja polece u甜ytkownika. Warstwa aplikacji - koordynuje czynnoci aplikacji. Nie zawiera logiki bienzsowej ani stanu obiekt坦w biznesowych. Zachowuje stan zada. Warstwa dziedziny serce aplikacji, zarzdza informacj o dziedzinie. Stan obiekt坦w biznesowych. Utrwalanie obiekt坦w w warstwie infrastruktury. Warstwa infrastruktury jest wsparciem dla innych warstw. Dostarcza komunikacj midzy warstwami, implementuje utrwalanie obiekt坦w, zawiera dodatkowe wsparcie dla interfejsu u甜ytkownika.
  • 24. Wzorce projektowe Implementacja modelu, te甜 mo甜e zawie.
  • 25. Wzorce projektowe cd. Entities Value Objects Services Aggregates Factories Repositories
  • 26. Wzorce projektowe cd. Entities Posiadaj to甜samo. Nie zmieniaj stanu. S to instancje trzymane w pamici. Referencja spenia warunek to甜samoci. Kombinacja unikalnych atrybut坦w. Konieczny obiekt w modelu dziedziny.
  • 27. Wzorce projektowe cd. Value Objects Nie posiada to甜samoci. Wa甜ne s atrybuty. Uatwia to tworzenie obiekt坦w i zwalnianie. Powinny by immutable (tworzone przez konstruktor i niemodyfikowalne). Mog by wsp坦dzielone, zachowuj integralno danych. Mog zawiera inne obiekty VO lub referencje do Entity.
  • 28. Wzorce projektowe cd. Services Nie wszystkie aspekty domeny mog by mapowane do obiekt坦w. Jeli akcja nie jest w zasigu obiektu. Nie posiada wewntrznego stanu. Grupuje funkcionalno dla wielu obiekt坦w. Interfejsy dostarczajce operacje wewntrz konceptu dziedziny. Operacje s bezstanowe.
  • 29. Wzorce projektowe cd. Aggregates Nale甜y do cyklu 甜ycia obiektu domeny. Okrela waciwoci obiektu i jego granice. Asocjacje one-to-one, one-to-many, many-to- many. Bidirectional ale samochod ma silnik. Aggregates posiada jednego roota Entity (jedyny obiekt widziany z zewntrz)
  • 30. Wzorce projektowe cd. Factories Tworz zorzone czasem struktury Encji I Agregat坦w. Proces musi by atomowy tak aby obiekty byy we wasciwym stanie.
  • 31. Wzorce projektowe cd. Repositories Baza danych jest czsci infrastruktury. Mo甜e przetrzymywa referencje do obiekt坦w.
  • 33. Dependency Injection public class MoneyTransferServiceImpl implements MoneyTransferService { private final AccountRepository accountRepository; private final BankingTransactionRepository bankingTransactionRepository; @Autowired public MoneyTransferServiceImpl(AccountRepository accountRepository, BankingTransactionRepository bankingTransactionRepository) { this.accountRepository = accountRepository; this.bankingTransactionRepository = bankingTransactionRepository; } public class HibernateAccountRepository implements AccountRepository { private HibernateTemplate hibernateTemplate; @Autowired public HibernateAccountRepository(HibernateTemplate template) { hibernateTemplate = template; } }
  • 34. Dependency Injection <beans> <context:annotation-config/> <bean name="moneyTransferService" class="MoneyTransferServiceImpl"/> <bean name="accountRepository" class="HibernateAccountRepository"/> </beans>
  • 35. AOP <bean id="authorization.loggingListener" class="...impl.listener.LoggingListener" /> <bean id="authorization.ConnectionAdvice" class="...impl.listener.ConnectionAorund"> <property name="Listeners" > <list> <ref bean="authorization.loggingListener" /> </list> </property> </bean> <aop:config> <aop:pointcut id="authorization.ConncetionPointcut" expression="execution(* ...impl.helper.TopUpConnection.*Invocation(..))" /> <aop:aspect id="authorization.ConnectionAspect" ref="authorization.ConnectionAdvice"> <aop:around method="around" pointcut-ref="authorization.ConncetionPointcut"/> </aop:aspect> </aop:config>
  • 36. AOP public Object around(ProceedingJoinPoint call) throws Throwable { for(Listener listener : listeners) { notify(listener, call, null); } Object result = call.proceed(); for(Listener listener : listeners) { notify(listener, call, result); } return result; }
  • 37. Literatura Domain-Driven Design: Tackling Complexity in the Heart of Software Eric Evans Patterns of Enterprise Application Architecture Martin Fowler http://domaindrivendesign.org http://martinfowler.com