Slide 1

Slide 1 text

De CRUD à DDD Comment Meetic a sauvé son legacy Icons made by Icongeek26, Freepik from www.flaticon.com Jean-Marie Lamodière - Backend tech lead @jmlamodiere

Slide 2

Slide 2 text

Legacy Architecture n-tiers DDD + Hexagonal 2002-2012 2013 2015

Slide 3

Slide 3 text

WHY ? Legacy, une fatalité ? Fait tourner la boîte Difficile à comprendre Maintenance coûteuse Icons made by Freepik from www.flaticon.com + - -

Slide 4

Slide 4 text

Legacy Architecture n-tiers DDD + Hexagonal 2002-2012 2013 2015

Slide 5

Slide 5 text

WHY ? Architecture n-tiers Presentation (Apps) Presentation Logique métier Données Icons made by Smashicon from www.flaticon.com

Slide 6

Slide 6 text

Appli Symfony toute neuve = Legacy v2 Icons made by Freepik from www.flaticon.com

Slide 7

Slide 7 text

WHY ? Framework MVC = CRUD* Icons made by Smashicon, Freepik from www.flaticon.com 3. Resource REST = entité *Create Read Update Delete *https://github.com/symfony/symfony-docs/issues/8893 Presentation Logique métier Données 2. ??? 1. Entité (getters/setters) + BDD auto-générés*

Slide 8

Slide 8 text

Legacy Architecture n-tiers DDD + Hexagonal 2002-2012 2013 2015

Slide 9

Slide 9 text

WHY ? Icons made by Freepik, Roundicon from www.flaticon.com Différence DDD / Hexagonal ? /Application /Command /Query /Domain /Read /Infrastructure /Symfony /Persistence

Slide 10

Slide 10 text

Domain Driven Design Eric Evans - 2004

Slide 11

Slide 11 text

WHY ? Domain Driven Design “Rendre le domaine explicite dans le code pour favoriser le dialogue tech/produit” Icons made by Icongeek26, Freepik from www.flaticon.com

Slide 12

Slide 12 text

WHY ? Domain Driven Design Patterns stratégiques Sous domaines : ● Core ● Supporting ● Generic Bounded context Patterns Tactiques Organisation du code : ● Entity ● Value Objects ● Domain events ● ...

Slide 13

Slide 13 text

WHY ? Bounded context ● “Dans le contexte culinaire : ● Dans le contexte botanique : ● Dans le contexte du : est un légume est un fruit est un feedback”

Slide 14

Slide 14 text

WHY ? Ubiquitous language “Language commun tech/produit au sein d’un bounded context” Défi : le placer dans le code :) Icons made by Icongeek26 from www.flaticon.com

Slide 15

Slide 15 text

Temporal coupling $member ->setStatus(‘active’) ->setActivationDate($now) ->setCanTalk(true); Icons made by Roundicons from www.flaticon.com Feature envy Anemic domain model Entité CRUD

Slide 16

Slide 16 text

WHY ?Notion métier implicite $member ->setFoo()->setBar() //... // Activate the member ->setStatus(‘active’) ->setActivationDate($now) ->setCanTalk(true);

Slide 17

Slide 17 text

$member ->setStatus(‘active’) ->setActivationDate($now) ->setCanTalk(true); Icons made by Roundicons from www.flaticon.com Class MyService1 Class Member $member ->setStatus(‘active’) ->setActivationDate($now) ->setCanTalk(true); Class MyService2 Feature envy

Slide 18

Slide 18 text

WHY ? $member = new Member(); //... $member->getActivationDate()->format(‘Y-m-d’); Fatal error: Uncaught Error: Call to a member function format() on null Icons made by Roundicons from www.flaticon.com Temporal coupling

Slide 19

Slide 19 text

WHY ? Entité DDD Rich domain model Icons made by Roundicons from www.flaticon.com $member = Member::register(/*...*/); ● Etat toujours valide ● Mutators explicites ● Emet des évènements $member->activate($now);

Slide 20

Slide 20 text

Icons made by Roundicons from www.flaticon.com Primitive obsession $product ->setPriceAmount(20.50) ->setCurrenty(“EUR”); (vont ensemble)

Slide 21

Slide 21 text

WHY ? Value Object DDD $price = new Price(20.50, “EUR”); $product ->setPrice($price); ● Explicite ● Immutable ● Valide

Slide 22

Slide 22 text

WHY ? Value Object DDD @ Meetic $age = new Age(23); … = $age ->toSearchBirthdayMax(); ● Factorise la validation ● Factorise des fonctionnalités >= 18

Slide 23

Slide 23 text

$repo->persist($member)->flush; $repo->add($member); $member = $repo->get($memberId); $repo->increaseVueCounter($memberId); Repository DDD = “collection” Intention revealing interface Icons made by Roundicons, Freepik from www.flaticon.com

Slide 24

Slide 24 text

WHY ? Command Query Separation /Application /Command RegisterMember /Query GetNewMembers /Domain MemberRepositoryInterface Member Age

Slide 25

Slide 25 text

Hexagonal Architecture Ports & Adapters Clean architecture ... Dr. Alistair Cockburn - 2005

Slide 26

Slide 26 text

WHY ? Le découplage ? Low coupling High cohesion “Mettre ensemble ce qui a la même raison de changer.” Icons made by Roundicons from www.flaticon.com

Slide 27

Slide 27 text

WHY ? Architecture Hexagonale “Découpler les décisions métier et techniques” Icons made by Roundicons from www.flaticon.com Low coupling High cohesion

Slide 28

Slide 28 text

WHY ? Ex. de refactos techniques @Meetic Symfony 2 Icons made by Freepik from www.flaticon.com Symfony 4 Database Oracle Database External REST API Config files PostgreSQL

Slide 29

Slide 29 text

Port & Icons made by Freepik from www.flaticon.com Pas de framework Command Query MysqlRepository HttpRepository Framework ok TestRepository RestController Test CliController Repository Framework ok Adapter

Slide 30

Slide 30 text

WHY ? Infrastructure : test d’intégration Icons made by Freepik, Smashicons, Roundicons from www.flaticon.com Ex. de refactoring : QueryBuilder -> SQL pure MysqlRepository Docker mysql HttpRepository Wiremock Don’t mock what you don’t own

Slide 31

Slide 31 text

WHY ? Infra complexe en n-tiers Service métier MysqlDao* HttpDao* *Data Access Object “Entity” Connait les 2 DAO Icons made by Roundicon from www.flaticon.com “Entity”

Slide 32

Slide 32 text

WHY ? Infra complexe en hexagonal UseCase RepositoryInterface Entity AggregatorRepository MysqlDao* HttpDao* *Data Access Object Pas d’impact Icons made by Freepik, Roundicon from www.flaticon.com

Slide 33

Slide 33 text

Icons made by Smashicon from www.flaticon.com 3. Presentation N-Tiers Hexagonal 2. Logique métier 1. Données 2. Presentation 1. Logique métier 2. Données

Slide 34

Slide 34 text

WHY ? Icons made by Freepik from www.flaticon.com Arborescence Meetic /Application /Command RegisterMember /Query GetNewMembers /Domain MemberRepositoryInterface Member Age /Infrastructure /Symfony MemberController MemberSerializer /Persistence MysqlMemberRepository

Slide 35

Slide 35 text

WHY ? Ou mettre mon code ? Infrastructure ● Framework (+ version) ● Libraries (Doctrine, Guzzle) ● Base De Donnée ● REST, SOAP, Ligne de cmd ? Domaine Logique métier Icons made by Icongeek26, Freepik from www.flaticon.com Product Owner Expert métier Architecte Dev, Ops

Slide 36

Slide 36 text

Chemin de migration Icons made by Freepik from www.flaticon.com

Slide 37

Slide 37 text

WHY ? Ne pas empiler des couches Lava flow Refacto tranche métier “verticale” Icons made by Freepik, Pixel Perfect, Roundicons from www.flaticon.com New layer Old layer 1 Old layer 2

Slide 38

Slide 38 text

WHY ? Montrer l’exemple là ou c’est complexe Pas de DDD / Hexagonal si un CRUD suffit Rendre explicite une règle métier Animer des débats Pourquoi ? Fait comme ça !

Slide 39

Slide 39 text

Domain Driven Design “Rendre le domaine explicite” Hexagonal Découpler les décisions métier et techniques Product Owner Expert métier Architecte Dev, Ops @jmlamodiere Icons made by Icongeek26, Freepik from www.flaticon.com Merci https://joind.in/talk/1c557