Upgrade to Pro — share decks privately, control downloads, hide ads and more …

De CRUD à DDD, comment Meetic a sauvé son legacy

De CRUD à DDD, comment Meetic a sauvé son legacy

Vidéo : https://youtu.be/tdE5wE5MvsI
ForumPHP 2019 : https://afup.org/talks/3037-de-crud-a-ddd-comment-meetic-a-sauve-son-legacy
Joind.in : https://joind.in/talk/1c557

Maîtriser son framework, c'est bien ! Il vous aidera à gérer les besoins génériques sans ré-inventer la roue, comme mettre en place un CRUD (Create Read Update Delete).

Mais dès que votre logique métier devient complexe, il vous faudra de nouvelles compétences pour garder un code lisible et évolutif.

- Vos tests automatisés cassent au moindre refactoring, vous freinant au lieu de vous aider ?
- Votre code est complexe à prendre en main pour les nouveaux arrivants ?
- Mettre à jour la version de votre framework prend des proportions anormales ?

Chez Meetic, nous sommes passés par là ! Découvrez pourquoi et comment notre culture a évolué vers de nouvelles pratiques, comme le Domain Driven Design et l'architecture Port & Adapters, nous aidant par exemple à créer des tests enfin utiles ou à mieux dialoguer avec les spécialistes du métier.

Des pratiques utilisables tout au long de votre carrière, quelques soient les changements de framework ou de language que nous réservent l'avenir !

Jean-Marie Lamodière

October 25, 2019
Tweet

More Decks by Jean-Marie Lamodière

Other Decks in Programming

Transcript

  1. 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
  2. WHY ? Legacy, une fatalité ? Fait tourner la boîte

    Difficile à comprendre Maintenance coûteuse Icons made by Freepik from www.flaticon.com + - -
  3. 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*
  4. WHY ? Icons made by Freepik, Roundicon from www.flaticon.com Différence

    DDD / Hexagonal ? /Application /Command /Query /Domain /Read /Infrastructure /Symfony /Persistence
  5. 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
  6. WHY ? Domain Driven Design Patterns stratégiques Sous domaines :

    • Core • Supporting • Generic Bounded context Patterns Tactiques Organisation du code : • Entity • Value Objects • Domain events • ...
  7. 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”
  8. 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
  9. WHY ?Notion métier implicite $member ->setFoo()->setBar() //... // Activate the

    member ->setStatus(‘active’) ->setActivationDate($now) ->setCanTalk(true);
  10. $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
  11. 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
  12. 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);
  13. WHY ? Value Object DDD $price = new Price(20.50, “EUR”);

    $product ->setPrice($price); • Explicite • Immutable • Valide
  14. WHY ? Value Object DDD @ Meetic $age = new

    Age(23); … = $age ->toSearchBirthdayMax(); • Factorise la validation • Factorise des fonctionnalités >= 18
  15. 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
  16. WHY ? Architecture Hexagonale “Découpler les décisions métier et techniques”

    Icons made by Roundicons from www.flaticon.com Low coupling High cohesion
  17. 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
  18. 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
  19. 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
  20. 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”
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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 !
  27. 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