Vad är poängen med domändriven
design?
Peter Backlund, Citerus AB
peter.backlund@citerus.se
...
Vad är poängen med domändriven
design?
Peter Backlund, Citerus AB
peter.backlund@citerus.se
...
Domän: elektroniska passersystem/bokning
3
Vad vi hade
PeriodConfiguration getPeriodConfiguration(long personId, 
                                           long ...
Vägen till en kraftfull modell
• Domänexpert
• Strukturera kunskap
...
"Ok, vi säger att en lägenhet vill boka tvättstuga 3 den
22:a oktober mellan 14.00 och 18.00..."
...
Bokningsförfrågan
public class Bokningsförfrågan implements ValueObject<Bokningsförfrågan> {
 
  Bokare bokare;
  Boknings...
"Man ska kunna ställa in så att om du
har bokat tvättstugan exempelvis tre
gånger den här månaden och alla
bokningar är ak...
Struktur
9
Struktur
En av flera bokningsregler lyder:
Ett bokningsobjekt ska kunna ställas in så att antalet
bokningar per bokare p...
public class PerMånadPerBokareBegränsning implements Bokningsregel {
@Override
  public boolean tillåter(Bokningsförfrå...
public class PerMånadPerBokareBegränsning implements Bokningsregel {
@Override
  public boolean tillåter(Bokningsförfr...
public class PerMånadPerBokareBegränsning implements Bokningsregel {
@Override
  public boolean tillåter(Bokningsförfrå...
public class PerMånadPerBokareBegränsning implements Bokningsregel {
@Override
  public boolean tillåter(Bokningsförfrå...
public class PerMånadPerBokareBegränsning implements Bokningsregel {
@Override
  public boolean tillåter(Bokningsförfrå...
En kraftfull modell
public class Bokningsobjekt {
List<CalendarDate> dagarMedLedigaPass(Bokare bokare,
...
private CalendarInterval månadFörPasstart(Pass pass) {
TimePoint passtart = pass.somIntervall().start();
CalendarDate ...
Mer information
dddsample.sf.net
www.citerus.se/ddd
www.infoq.com/minibooks/
domain-driven-design-quickly
...
of 18

Poängen med DDD

En fältstudie av hur domändriven design/DDD har använts i vidareutvecklingen av en del i en större applikation, med autentiska kodexempel. Avsikten är att konkretisera och inspirera. Peter Backlund, presentation på Javaforum 2009-10-13
Published on: Mar 4, 2016
Published in: Technology      Business      
Source: www.slideshare.net


Transcripts - Poängen med DDD

  • 1. Vad är poängen med domändriven design? Peter Backlund, Citerus AB peter.backlund@citerus.se 1
  • 2. Vad är poängen med domändriven design? Peter Backlund, Citerus AB peter.backlund@citerus.se 2
  • 3. Domän: elektroniska passersystem/bokning 3
  • 4. Vad vi hade PeriodConfiguration getPeriodConfiguration(long personId,                                             long resourceGroupId,                                                   long bookersAccessCategoryId,                                             long from,                                             long to) • Utspridd logik • Svag eller beteendelösa typer • Svårt att studera, testa och förstå 4
  • 5. Vägen till en kraftfull modell • Domänexpert • Strukturera kunskap • Gemensamt språk 5
  • 6. "Ok, vi säger att en lägenhet vill boka tvättstuga 3 den 22:a oktober mellan 14.00 och 18.00..." 65
  • 7. Bokningsförfrågan public class Bokningsförfrågan implements ValueObject<Bokningsförfrågan> {     Bokare bokare;   Bokningsobjekt bokningsobjekt;      Pass pass;   ...   } 7
  • 8. "Man ska kunna ställa in så att om du har bokat tvättstugan exempelvis tre gånger den här månaden och alla bokningar är aktiva så ska det inte gå att boka en gång till förrän man har tagit bort nån bokning eller man har använt tvättiden, eller det blir en ny månad.” ”Det är viktigt därför att vi har upptäckt att folk bokar upp massor med pass och då ... vilket leder till att ... och ...” 85
  • 9. Struktur 9
  • 10. Struktur En av flera bokningsregler lyder: Ett bokningsobjekt ska kunna ställas in så att antalet bokningar per bokare per månad är begränsat till X st. En bokningsförfrågan tillåts om bokaren har färre än X aktiva bokningar av det bokningsobjektet under den månad då passet infaller, eller om ingen begränsning är satt. 10
  • 11. public class PerMånadPerBokareBegränsning implements Bokningsregel { @Override   public boolean tillåter(Bokningsförfrågan bokningsförfrågan) {    [...]   }     } 11
  • 12. public class PerMånadPerBokareBegränsning implements Bokningsregel { @Override   public boolean tillåter(Bokningsförfrågan bokningsförfrågan) {     Bokningsobjekt bokningsobjekt = bokningsförfrågan.bokningsobjekt();     Regelinställningar inställningar = bokningsobjekt.inställningar();     Integer antal = inställningar.perMånadPerBokare();              [...]   }    } 12
  • 13. public class PerMånadPerBokareBegränsning implements Bokningsregel { @Override   public boolean tillåter(Bokningsförfrågan bokningsförfrågan) {     Bokningsobjekt bokningsobjekt = bokningsförfrågan.bokningsobjekt();     Regelinställningar inställningar = bokningsobjekt.inställningar();     Integer antal = inställningar.perMånadPerBokare();              if (ejAngivet(antal)) {      return true;     } else { [...]     }   } } 13
  • 14. public class PerMånadPerBokareBegränsning implements Bokningsregel { @Override   public boolean tillåter(Bokningsförfrågan bokningsförfrågan) {     Bokningsobjekt bokningsobjekt = bokningsförfrågan.bokningsobjekt();     Regelinställningar inställningar = bokningsobjekt.inställningar();     Integer antal = inställningar.perMånadPerBokare();              if (ejAngivet(antal)) {      return true;     } else { Pass pass = bokningsförfrågan.pass();      Bokare bokare = bokningsförfrågan.bokare(); CalendarInterval passetsMånad = månadFörPasstart(pass);       [...]     }   } } 14
  • 15. public class PerMånadPerBokareBegränsning implements Bokningsregel { @Override   public boolean tillåter(Bokningsförfrågan bokningsförfrågan) {     Bokningsobjekt bokningsobjekt = bokningsförfrågan.bokningsobjekt();     Regelinställningar inställningar = bokningsobjekt.inställningar();     Integer antal = inställningar.perMånadPerBokare();              if (ejAngivet(antal)) {      return true;     } else { Pass pass = bokningsförfrågan.pass();      Bokare bokare = bokningsförfrågan.bokare(); CalendarInterval passetsMånad = månadFörPasstart(pass); List<Bokning> bokningarUnderMånad =  bokare.listaAktivaBokningar(bokningsobjekt, passetsMånad);       return bokningarUnderMånad.size() < antal;     }   } } 15
  • 16. En kraftfull modell public class Bokningsobjekt { List<CalendarDate> dagarMedLedigaPass(Bokare bokare, CalendarInterval intervall) {} List<Pass> ledigaPassUnderDag(Bokare bokare, CalendarDate dag) {} } 16
  • 17. private CalendarInterval månadFörPasstart(Pass pass) { TimePoint passtart = pass.somIntervall().start(); CalendarDate datumFörPassStart = passtart.calendarDate(TIDSZON); return datumFörPassStart.month(); } 17
  • 18. Mer information dddsample.sf.net www.citerus.se/ddd www.infoq.com/minibooks/ domain-driven-design-quickly 18

Related Documents