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

DDD et CQRS - Vers un développement orienté business par Boris Guéry

DDD et CQRS - Vers un développement orienté business par Boris Guéry

Domain Driven Development, ou développement piloté par le domaine est une approche qui prône l'ubiquité entre le domaine et le code, c'est une approche tout à fait adapté aux méthodes agiles avec beaucoup de tests, d'itérations et de refactorisation. Le CQRS, une approche qui découle naturellement de cette "pensée", et qui signifie "Command Query Responsibility Segregation". L'idée à travers cette approche est développé des services en essayant de calquer les actions réelles du domaine dans le code et séparer clairement les opérations d'écriture (commands) des opérations de lecture (queries) en jouant sur des évenements et leur gestionnaire. C'est une approche qui permet une scalabilité infinie et une retranscription fidèle du domaine applicatif.

Boris Guéry

Boris Guéry, directeur technique et associé au sein de la société Azurgate, éditrice de l'application Se Coucher Moins Bête. Également membre du collectif The Big Brains Company. Sur le web depuis 1997, il aime la bière mais aussi l'architecture web et les bonnes pratiques. Passionné de R&D mais également pragmatique, il développe principalement en PHP à l'aide du framework Symfony 2. Il a depuis acquis une véritable expertise dans la mise en place d'architecture scalable sur des applications à forte charge

/dev/var/

March 26, 2014
Tweet

More Decks by /dev/var/

Other Decks in Programming

Transcript

  1. SRP

  2. "Every method should EITHER be a COMMAND that PERFORMS AN

    ACTION or a QUERY that RETURNS DATA to the caller, NOT BOTH." Dr. Bertrand Meyer
  3. Write Model class ArticleEntity { public integer id; public string

    title; public string summary; public string details; public Author author; }
  4. Read models class ArticleSummary { public integer id; public string

    summary; public string authorName; } class ArticleListItem { public integer id; public string title; } class ArticleDetails { public integer id; public string summary; public string details; public string authorName; }
  5. Services class ArticleService { private EntityRepository er; public function constructor(EntityRepository

    er) { er = er; } public function publishArticle(PublishArticleCommand c) { Article article = er.findById(c.id); article.publish(); } }
  6. Events class Article { public integer id; public string title;

    public ArticleStatus status; public function publish() { status = ArticleStatus.published; raiseEvent(new PublishedArticleEvent(id, status); } }
  7. Event Handler class PublishedArticleEventHandler { private Logger logger; private RedisClient

    redis; public function onPublishedArticle(PublishedArticleEvent $event) { logger.log('Article ' + event.id + ' has been published'); redis.add('article/' + event.id', event.status); } }