how to (finally) start doing ddd by using bdd
TRANSCRIPT
![Page 1: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/1.jpg)
How to (finally) start doing
DDD by using BDD
![Page 2: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/2.jpg)
Kacper Gunia @cakper
So!ware Engineer @SensioLabsUK / @Inviqa
PHPers Silesia @PHPersPL
![Page 3: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/3.jpg)
What is BDD?
![Page 4: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/4.jpg)
Bug-drivenDevelopment ;)
![Page 5: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/5.jpg)
Behaviour-driven development is about implementing an application
by describing its behaviour from the perspective of its
stakeholders.-- Dan North
![Page 6: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/6.jpg)
BDD is about establishing a shared understanding of “done”
working from the outside in until you get there
-- Dan North
![Page 7: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/7.jpg)
BDD shows you what to do nextaka Technical Discipline
![Page 8: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/8.jpg)
How do we BDD?
![Page 9: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/9.jpg)
Feature: Traveler searches for cheap itineraries In order to save money while travelling As a world traveler I want to search for the cheapest itinerary
![Page 10: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/10.jpg)
Product owner writes scenarioand developer automates it
![Page 11: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/11.jpg)
Developer writes scenarioand then automates it
![Page 12: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/12.jpg)
No!
![Page 13: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/13.jpg)
BDD is about communication!
flickr.com/photos/dvids/5638829762
![Page 14: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/14.jpg)
![Page 15: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/15.jpg)
Scenario: Successfully find cheapest direct flight Given the flight from "WAW" to "LHR" priced $30 was scheduled And the flight from "WAW" to "LHR" priced $50 was scheduled When I open the "/search" page And I fill "WAW" in the "Departure airport" field And I fill "LHR" in the "Destination airport" field And I click "Search" Then I should be redirected to "/results" page And I should see $30 in the "#cheapest-flight-price" block
![Page 16: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/16.jpg)
![Page 17: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/17.jpg)
![Page 18: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/18.jpg)
Scenario: Successfully find cheapest direct flight Given the flight from "WAW" to "LHR" priced $30 was scheduled And the flight from "WAW" to "LHR" priced $50 was scheduled When I open the "/search" page And I fill "WAW" in the "Departure airport" field And I fill "LHR" in the "Destination airport" field And I click "Search" Then I should be redirected to "/results" page And I should see $30 in the "#cheapest-flight-price" block
![Page 19: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/19.jpg)
![Page 20: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/20.jpg)
Translation
![Page 21: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/21.jpg)
Can we do better?
![Page 22: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/22.jpg)
![Page 23: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/23.jpg)
![Page 24: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/24.jpg)
![Page 25: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/25.jpg)
Mission accomplished BoysWe can go home now!
flickr.com/photos/dvids/5638829762
![Page 26: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/26.jpg)
![Page 27: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/27.jpg)
![Page 28: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/28.jpg)
Translation again
![Page 29: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/29.jpg)
How to fix that?
![Page 30: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/30.jpg)
DDD
![Page 31: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/31.jpg)
What is DDD about?
![Page 32: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/32.jpg)
It’s about focusing on the domain and letting it affect the so"ware very
much-- Jimmy Nilsson
![Page 33: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/33.jpg)
But WHY do we need it?
![Page 34: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/34.jpg)
Everybody knows the jargonin their OWN FIELD
![Page 35: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/35.jpg)
It's about common understanding
![Page 36: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/36.jpg)
Ubiquitous language
![Page 37: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/37.jpg)
![Page 38: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/38.jpg)
![Page 39: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/39.jpg)
![Page 40: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/40.jpg)
Concrete examples are rooted in the problem domain
-- Matt Wynne
![Page 41: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/41.jpg)
![Page 42: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/42.jpg)
Domain Model
![Page 43: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/43.jpg)
A domain model (...) is not just the knowledge in a domain expert’s head;
it is a rigorously organized and selective abstraction of that knowledge
-- Eric Evans
![Page 44: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/44.jpg)
Model documentsthe knowledge
![Page 45: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/45.jpg)
Pushing for ubiquitous language hard enough makes your examples a domain
model-- Konstantin Kudryashov
![Page 46: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/46.jpg)
Scenario: Successfully find cheapest direct flight Given the flight from "WAW" to "LHR" priced $30 was scheduled And the flight from "WAW" to "LHR" priced $50 was scheduled When I open the "/search" page And I fill "WAW" in the "Departure airport" field And I fill "LHR" in the "Destination airport" field And I click "Search" Then I should be redirected to "/results" page And I should see $30 in the "#cheapest-flight-price" block
![Page 47: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/47.jpg)
Scenario: Successfully find cheapest direct itinerary Given the search for the itinerary schedule And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule And the itinerary from "WAW" to "LHR" priced $50 was planned in the schedule When I search for cheapest itinerary from "WAW" to "LHR" Then the cheapest itinerary should cost $30
![Page 48: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/48.jpg)
Modelling by example
![Page 49: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/49.jpg)
![Page 50: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/50.jpg)
![Page 51: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/51.jpg)
Phase 1
![Page 52: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/52.jpg)
![Page 53: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/53.jpg)
Scenario: Successfully find cheapest direct itinerary Given the search for the itinerary schedule And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule And the itinerary from "WAW" to "LHR" priced $50 was planned in the schedule When I search for cheapest itinerary from "WAW" to "LHR" Then the cheapest itinerary should cost $30
![Page 54: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/54.jpg)
![Page 55: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/55.jpg)
Given the search for the itinerary schedule
/** * @Given /^the search for the itinerary schedule$/ */ public function theSearchForTheItinerarySchedule() { $this->itinerarySchedule = new ItinerarySchedule(); $this->search = new Search($this->itinerarySchedule); }
![Page 56: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/56.jpg)
![Page 57: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/57.jpg)
Design emerges
![Page 58: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/58.jpg)
And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule
/** * @Given the itinerary from :fromAirport to :toAirport * priced $:price was planned in the schedule */ public function theItineraryFromToPricedWasPlannedInTheSchedule( $fromAirport, $toAirport, $price ) { $itinerary = new Itinerary( Airport::code($fromAirport), Airport::code($toAirport), Money::usd($price) );
$this->itinerarySchedule->plan($itinerary); }
![Page 59: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/59.jpg)
![Page 60: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/60.jpg)
When I search for cheapest itinerary from "WAW" to "LHR"
/** * @When I search for cheapest itinerary from :fromAirport to :toAirport */ public function iSearchForCheapestItineraryFromTo($fromAirport, $toAirport) { $this->cheapestItinerary = $this->search->forCheapest( Airport::code($fromAirport), Airport::code($toAirport) ); }
![Page 61: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/61.jpg)
Then the cheapest itinerary should cost $30
/** * @Then the cheapest itinerary should cost $:price */ public function theCheapestItineraryShouldCost($price) { expect($this->cheapestItinerary->cost())->toBeLike(Money::usd($price)); }
![Page 62: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/62.jpg)
![Page 63: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/63.jpg)
![Page 64: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/64.jpg)
Phase 2
![Page 65: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/65.jpg)
![Page 66: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/66.jpg)
@ui Scenario: Successfully find cheapest direct itinerary Given the search for the itinerary schedule And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule And the itinerary from "WAW" to "LHR" priced $50 was planned in the schedule When I search for cheapest itinerary from "WAW" to "LHR" Then the cheapest itinerary should cost $30
![Page 67: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/67.jpg)
Given the search for the itinerary schedule
/** * @Given the search for the itinerary schedule */ public function theSearchForTheItinerarySchedule() { $this->visit("/search"); }
![Page 68: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/68.jpg)
And the itinerary from "WAW" to "LHR" priced $30 was planned in the schedule
/** * @Given the itinerary from :fromAirport to :toAirport * priced $:price was planned in the schedule */ public function theItineraryFromToPricedWasPlannedInTheSchedule( $fromAirport, $toAirport, $price ) { $itinerary = new Itinerary( Airport::code($fromAirport), Airport::code($toAirport), Money::usd($price) );
$this->get("itinerary_schedule")->plan($itinerary); }
![Page 69: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/69.jpg)
When I search for cheapest itinerary from "WAW" to "LHR"
/** * @When I search for cheapest itinerary from :fromAirport to :toAirport */ public function iSearchForCheapestItineraryFromTo($fromAirport, $toAirport) { $this->fillIn("#from-airport", $fromAirport); $this->fillIn("#to-airport", $toAirport);
$this->clickButton("Search"); }
![Page 70: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/70.jpg)
Then the cheapest itinerary should cost $30
/** * @Then the cheapest itinerary should cost $:price */ public function theCheapestItineraryShouldCost($price) { $cheapestItinerary = $this->find("#cheapest-itinerary"); expect($cheapestItinerary)->toContainText(sprintf("From $%s", $price)); }
![Page 71: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/71.jpg)
# behat.yml default: suites: domain: contexts: [ SearchContext ] ui: contexts: [ WebSearchContext ] filters: { tags: '@ui' }
![Page 72: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/72.jpg)
Modelling by ExampleIn three (easy) steps
![Page 73: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/73.jpg)
· Have the conversation· Model your objects
· Go again through UI*
![Page 74: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/74.jpg)
*But
![Page 75: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/75.jpg)
You (really) don't have to automate
everything!
![Page 76: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/76.jpg)
![Page 77: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/77.jpg)
But there is a problem
![Page 78: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/78.jpg)
We ignored the depth of the domain
![Page 79: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/79.jpg)
On purpose
![Page 80: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/80.jpg)
You can't model the whole system using
one feature
![Page 81: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/81.jpg)
![Page 82: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/82.jpg)
Repeat the process and model the
planner
![Page 83: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/83.jpg)
What if model has different requirements
in this context?
![Page 84: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/84.jpg)
Bounded Context
![Page 85: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/85.jpg)
Language is limited
![Page 86: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/86.jpg)
Search Itinerary!=
Planner Itinerary!=
Booking Itinerary
![Page 87: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/87.jpg)
![Page 88: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/88.jpg)
Do not build fragile monoliths!
![Page 89: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/89.jpg)
Build applications withBounded context in mind
![Page 90: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/90.jpg)
--- Wrap up ---
![Page 91: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/91.jpg)
Have the conversation
![Page 92: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/92.jpg)
Do not separate the concepts from the implementation
![Page 93: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/93.jpg)
You cannot build conceptual models
without considering implementation issues
![Page 94: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/94.jpg)
Push forUbiquitous language
![Page 95: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/95.jpg)
Use Behat to drive your ModelNot only the UI
![Page 96: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/96.jpg)
"BDD is about conversations you have to
produce software"
![Page 97: How to (finally) start doing DDD by using BDD](https://reader036.vdocuments.us/reader036/viewer/2022062320/55a677761a28abb1758b468d/html5/thumbnails/97.jpg)
"DDD is about how youexplore domain models
and how you articulate this"