Acknowledging ¡CAP ¡at ¡the ¡Root ¡ -‑-‑ ¡in ¡the ¡Domain ¡Model ¡ Eric ¡Evans ¡ Domainlanguage.com ¡ Twi>er: ¡ericevans0 ¡ ¡#dddesign ¡
Gap ¡between ¡formalism ¡and ¡ ¡ ¡pracFce ¡
Vessel ¡Voyage ¡XYZ ¡ OAK 2 4 LGB SHA 1 2 HKG
Vessel ¡Voyage ¡ABC ¡ SEA LGB SNG
Cargo ¡IFnerary ¡ SEA LGB HKG
Our ¡Cargo ¡Needs ¡2 ¡Voyages ¡
Schedules ¡and ¡IFneraries ¡ Voyage ¡Schedule ¡for ¡XYZ ¡ IFnerary ¡HKG-‑SEA ¡ • ETD ¡HKG ¡08:30 ¡Sa ¡ • HKG-‑LGB ¡on ¡XYZ ¡ • ETA ¡SHA ¡21:00 ¡Sa ¡ • LGB-‑ ¡SEA ¡on ¡ABC ¡ • ETD ¡SHA ¡06:30 ¡Su ¡ • ETA ¡LGB ¡13:20 ¡Th ¡ • … ¡ EsFmated ¡Layover ¡in ¡LGB: ¡ Voyage ¡Schedule ¡for ¡ABC ¡ ¡13:20 ¡Th ¡–10:15 ¡Sa ¡ • ETD ¡SNG ¡14:15 ¡Tu ¡ ¡Elapsed: ¡45:55 ¡ • ETA ¡LGB ¡22:05 ¡Fr ¡ • ETD ¡LGB ¡10:15 ¡Sa ¡ • ETA ¡SEA ¡07:40 ¡Su ¡ ¡
Cargo Vessel Voyage cargoId vesselVoyageId Origin assignedVessel ... Destination Arrival Deadline Weight ... Itinerary Schedule startLocation endLocation availableTime layover * * VesselLeg Leg departureLocCode = HKG loadLocation EDT = 8:30 Sa loadTime unloadLocCode = SHA * unloadLocation ETA = 21:00 Sa unloadTime
Schedules ¡and ¡IFneraries ¡ Voyage ¡Schedule ¡for ¡XYZ ¡ IFnerary ¡HKG-‑SEA ¡ • ETD ¡HKG ¡08:30 ¡Sa ¡ • HKG-‑LGB ¡on ¡XYZ ¡ • ETA ¡SHA ¡21:00 ¡Sa ¡ • LGB-‑ ¡SEA ¡on ¡ABC ¡ • ETD ¡SHA ¡06:30 ¡Su ¡ • ETA ¡LGB ¡13:20 ¡Th ¡ • … ¡ EsFmated ¡Layover ¡in ¡LGB: ¡ Voyage ¡Schedule ¡for ¡ABC ¡ ¡13:20 ¡Th ¡–10:15 ¡Sa ¡ • ETD ¡SNG ¡14:15 ¡Tu ¡ ¡Elapsed: ¡45:55 ¡ • ETA ¡LGB ¡22:05 ¡Fr ¡ • ETD ¡LGB ¡10:15 ¡Sa ¡ • ETA ¡SEA ¡07:40 ¡Su ¡ ¡
Delay ¡ Voyage ¡Schedule ¡for ¡XYZ ¡ IFnerary ¡HKG-‑SEA ¡ • ETD ¡HKG ¡08:30 ¡Sa ¡ • HKG-‑LGB ¡on ¡XYZ ¡ • ETA ¡SHA ¡21:00 ¡Sa ¡ • LGB-‑ ¡SEA ¡on ¡ABC ¡ • ETD ¡SHA ¡06:30 ¡Su ¡ • ETA ¡LGB ¡13:20 ¡Th ¡ • … ¡ EsFmated ¡Layover ¡in ¡LGB: ¡ Voyage ¡Schedule ¡for ¡ABC ¡ ¡13:20 ¡Th ¡–10:15 ¡Sa ¡ • ETD ¡SNG ¡14:15 ¡Tu ¡ ¡Elapsed: ¡45:55 ¡ • ETA ¡LGB ¡22:05 ¡Fr ¡ • ETD ¡LGB ¡10:15 ¡Sa ¡ • ETA ¡SEA ¡07:40 ¡Su ¡ ¡
New ¡Schedule ¡ Voyage ¡Schedule ¡for ¡XYZ ¡ IFnerary ¡HKG-‑SEA ¡ • ETD ¡HKG ¡08:30 ¡Sa ¡ • HKG-‑LGB ¡on ¡XYZ ¡ • ETA ¡SHA ¡21:00 ¡Sa ¡ • LGB-‑ ¡SEA ¡on ¡ABC ¡ • ETD ¡SHA ¡06:30 ¡Su ¡ • ETA ¡LGB ¡13:20 ¡Th ¡3:00 ¡Sa ¡(next) ¡ • … ¡ EsFmated ¡Layover ¡in ¡LGB: ¡ Voyage ¡Schedule ¡for ¡ABC ¡ ¡3:00 ¡Sa ¡–10:15 ¡Sa ¡ • ETD ¡SNG ¡14:15 ¡Tu ¡ ¡Elapsed: ¡45:55 ¡ ¡7:15 ¡ • ETA ¡LGB ¡22:05 ¡Fr ¡ • ETD ¡LGB ¡10:15 ¡Sa ¡(next) ¡ • ETA ¡SEA ¡07:40 ¡Su ¡(next) ¡ ¡
Cargo Vessel Voyage cargoId vesselVoyageId Origin assignedVessel ... Destination Arrival Deadline Weight ... Itinerary Schedule startLocation endLocation availableTime layover * * VesselLeg Leg departureLocCode = HKG loadLocation EDT = 8:30 Sa loadTime unloadLocCode = SHA * unloadLocation ETA = 21:00 Sa unloadTime
Some ¡Consistency ¡Rules ¡ • IFnerary ¡corresponds ¡to ¡Vessel ¡Voyage ¡ • IFnerary ¡connected ¡ • Layover ¡> ¡24 ¡hours ¡ ¡ ¡ ¡
Vessel Voyage vesselVoyageId = XYZ Schedule Cargo VesselLeg cargoId = AXB234Q Origin = HKG Destination = SEA departureLocCode = HKG Arrival Deadline = Tue next EDT = 8:30 Sa unloadLocCode = SHA Weight = ... ETA = 21:00 Sa departureLocCode = HKG EDT = 8:30 Mo unloadLocCode = LGB ETA = 13:20 Th departureLocCode = SHA EDT = 6:30 Su unloadLocCode = LGB Itinerary ETA = 13:20 Th startLocationCode= HKG endLocCode = SEA availableTime = 7:40 Su layover = 45:55 Vessel Voyage vesselVoyageId = ABC 1st 2nd Leg Schedule loadLocationCode = HKG loadTime = 8:30 Mo unloadLocCode = LGB unloadTime = 13:20 Th VesselLeg Leg VesselLeg loadLocationCode = LGB departureLocCode = HKG loadTime = 10:15 Sa EDT = 8:30 Mo departureLocCode = LGB unloadLocCode = SEA unloadLocCode = LGB departureLocCode = HKG EDT = 10:15 Sa unloadTime = 7:40 Su ETA = 13:20 Th EDT = 8:30 Mo unloadLocCode = SEA unloadLocCode = LGB VesselLeg ETA = 7:40 Su ETA = 13:20 Th VesselLeg
Vessel Voyage vesselVoyageId = XYZ Schedule Cargo VesselLeg cargoId = AXB234Q Origin = HKG Destination = SEA departureLocCode = HKG Arrival Deadline = Tue next EDT = 8:30 Sa unloadLocCode = SHA Weight = ... ETA = 21:00 Sa departureLocCode = HKG EDT = 8:30 Mo unloadLocCode = LGB ETA = 13:20 Th departureLocCode = SHA EDT = 6:30 Su unloadLocCode = LGB Itinerary ETA = 13:20 Th 3:00 Sa startLocationCode= HKG endLocCode = SEA availableTime = 7:40 Su layover = 45:55 7:15 Vessel Voyage vesselVoyageId = ABC 1st 2nd Leg Schedule loadLocationCode = HKG loadTime = 8:30 Sa unloadLocCode = LGB unloadTime=13:20Th 3:00 Sa VesselLeg Leg VesselLeg loadLocationCode = LGB departureLocCode = HKG loadTime = 10:15 Sa EDT = 8:30 Mo departureLocCode = LGB unloadLocCode = SEA unloadLocCode = LGB departureLocCode = HKG EDT = 10:15 Sa unloadTime = 7:40 Su ETA = 13:20 Th EDT = 8:30 Mo unloadLocCode = SEA unloadLocCode = LGB VesselLeg ETA = 7:40 Su ETA = 13:20 Th VesselLeg
Aggregates ¡
Aggregates: ¡ ¡ Consistency ¡Boundaries ¡ • Aggregates ¡are ¡always ¡internally ¡consistent. ¡ – Invariants ¡apply ¡at ¡every ¡transacFon ¡commit ¡ • Aggregates ¡“eventually ¡consistent” ¡with ¡each ¡ other. ¡ – Asynchronous ¡updates ¡propagate ¡through ¡system ¡ ¡ • Limit ¡Interconnectedness. ¡ – References ¡limited ¡to ¡aggregate ¡roots. ¡
Draw ¡Aggregate ¡Boundaries ¡ Vessel Voyage vesselVoyageId = XYZ Schedule Cargo cargoId = AXB234Q VesselLeg Origin = HKG Destination = SEA departureLocCode = HKG Arrival Deadline = Tue next EDT = 8:30 Sa Weight = ... unloadLocCode = SHA ETA = 21:00 Sa departureLocCode = HKG EDT = 8:30 Mo unloadLocCode = LGB ETA = 13:20 Th departureLocCode = SHA EDT = 6:30 Su unloadLocCode = LGB Itinerary ETA = 13:20 Th startLocationCode= HKG endLocCode = SEA availableTime = 7:40 Su layover = 45:55 Vessel Voyage vesselVoyageId = ABC 1st 2nd Leg Schedule loadLocationCode = HKG loadTime = 8:30 Sa unloadLocCode = LGB unloadTime = 13:20 Th VesselLeg Leg VesselLeg loadLocationCode = LGB departureLocCode = HKG loadTime = 10:15 Sa EDT = 8:30 Mo departureLocCode = LGB unloadLocCode = SEA unloadLocCode = LGB departureLocCode = HKG EDT = 10:15 Sa unloadTime = 7:40 Su ETA = 13:20 Th EDT = 8:30 Mo unloadLocCode = SEA unloadLocCode = LGB VesselLeg ETA = 7:40 Su ETA = 13:20 Th VesselLeg (But probably not these!)
Allowed ¡State ¡ Voyage ¡Schedule ¡for ¡XYZ ¡ IFnerary ¡HKG-‑SEA ¡ • ETD ¡HKG ¡08:30 ¡Sa ¡ • HKG-‑LGB ¡on ¡XYZ ¡ • ETA ¡SHA ¡21:00 ¡Sa ¡ • LGB-‑ ¡SEA ¡on ¡ABC ¡ • ETD ¡SHA ¡06:30 ¡Su ¡ • ETA ¡LGB ¡13:20 ¡Th ¡3:00 ¡Sa ¡(next) ¡ • … ¡ EsFmated ¡Layover ¡in ¡LGB: ¡ Voyage ¡Schedule ¡for ¡ABC ¡ ¡3:00 ¡Sa ¡–10:15 ¡Sa ¡ • ETD ¡SNG ¡14:15 ¡Tu ¡ ¡Elapsed: ¡45:55 ¡ ¡ • ETA ¡LGB ¡22:05 ¡Fr ¡ • ETD ¡LGB ¡10:15 ¡Sa ¡(next) ¡ • ETA ¡SEA ¡07:40 ¡Su ¡(next) ¡ ¡
Vessel Voyage vesselVoyageId = XYZ Schedule Cargo VesselLeg cargoId = AXB234Q Origin = HKG Destination = SEA departureLocCode = HKG Arrival Deadline = Tue next EDT = 8:30 Sa unloadLocCode = SHA Weight = ... ETA = 21:00 Sa departureLocCode = HKG EDT = 8:30 Mo unloadLocCode = LGB ETA = 13:20 Th departureLocCode = SHA EDT = 6:30 Su unloadLocCode = LGB Itinerary ETA = 13:20 Th startLocationCode= HKG endLocCode = SEA availableTime = 7:40 Su layover = 45:55 Vessel Voyage vesselVoyageId = ABC 1st 2nd Leg Schedule loadLocationCode = HKG loadTime = 8:30 Mo unloadLocCode = LGB unloadTime = 13:20 Th VesselLeg Leg VesselLeg loadLocationCode = LGB departureLocCode = HKG loadTime = 10:15 Sa EDT = 8:30 Mo departureLocCode = LGB unloadLocCode = SEA unloadLocCode = LGB departureLocCode = HKG EDT = 10:15 Sa unloadTime = 7:40 Su ETA = 13:20 Th EDT = 8:30 Mo unloadLocCode = SEA unloadLocCode = LGB VesselLeg ETA = 7:40 Su ETA = 13:20 Th VesselLeg
Recommend
More recommend