SlideShare a Scribd company logo
1 of 78
Download to read offline
Design Applicatif avec Symfony
Zoom sur la Clean Architecture
Romain Kuzniak

CTO @ OpenClassrooms
Nous sommes tous un jour
confrontés à un problème
de design des applications
• Rigidité (difficulté de faire les changements)
• Fragilité (bugs issus des changements)
• Immobilité (réutilisation)
• Viscosité (difficulté de faire les bonnes choses, design,
environnement, temps de compilation, déploiements, tests…)
Un bon design est un
design qui favorise le
changement
Cas d’étude
• Application de gestion d’un tableau agile
• Cas d’utilisation : fermeture d’un sprint avec génération
d’un rapport
• Manuelle par l’utilisateur via l’interface web ou une API
• Automatique à la fin du sprint via un cron
• Input :
• Opération explicite de l’utilisateur (web ou api)
• Scénario :
• Récupérer le sprint
• Pour toutes les tâches dont le statut est « Done » :
• Fermer la tâche :
• Passer le statut à « Close »
• Ajouter la date de fermeture de la tâche
• Ajouter la date de fermeture du sprint
• Sortir toutes les autres tâches du sprint
• Générer le rapport de sprint
• Nombre de tâches fermées au cours du sprint
• Nombre de tâches moyennes fermées au cours de tous les sprints
• Output :
• Rapport de sprint
Une règle métier est un comportement
(généralement lié à une entité)
disponible à travers toute l’application
Tâche
• Fermer une tâche
• Passer le statut à « Close »
• Ajouter la date de fermeture de la tâche
Sprint
• Fermer le sprint
• Pour toutes les tâches du sprint dont le statut est « Done » :
• Fermer la tâche
• Ajouter la date de fermeture du sprint
• Sortir toutes les autres tâches du sprint
Une règle applicative est une fonctionnalité
du domaine, liée à une ou plusieurs
entités, dans un contexte donné
• Récupérer un sprint
• Fermer le sprint
• Récupérer les données nécessaires au rapport
• 3 actions
• Via le web
• Via l’api
• Via une commande à la fin du sprint
• 2 règles applicatives
• Fermer un sprint
• Fermer le sprint courant
• 2 règles métiers
• Tâche : fermer la tâche
• Sprint : fermer le sprint
• 1 critère : capacité de changement
• 4 enjeux :
• la gestion des règles métiers
• la gestion des règles applicatives
• le couplage du domaine et de la Vue
• le couplage avec l’Infrastructure (accès aux données,
framework…)
MVC
• Trygve Reenskaug, Xerox Parc, 70’s
• GUI pattern à l’origine
• Principes :
• Séparer les données du traitement de la présentation
Controller
Vue
Model
Pattern Original (UI)
Vue
Entité
Repository
Controller
Model
Sprint
Entité = POPO
Sprint Repository
Controller
Web Controller
Règles applicatives
Règles métiers
Présentation
Accès aux données
Indice de changement : BAD
• Simple
• Documenté
• Totalement compatible
avec Symfony
• Aucune gestion des règles métiers
• Aucune gestion des règles
applicatives
• Pas de séparation des données
du domaine et de la vue
• Couplage fort avec l’infrastructure
Service Layers
• John J. Donovan, Open Environment Corporation, 90’s
• Grande popularité dans les applications de gestion
• Objectifs :
• Créer une application flexible
• Indépendance entre la présentation, la logique du
domaine et l’accès aux données
• Principe :
• Séparation en couches
Présentation
Data
Business
Service
Controller Vue
Vue
Entité
Repository
ControllerService
Data layer
Sprint
Entité = POPO
Sprint Repository
Business layer
Sprint Service
Règles applicatives
Règles métiers Tâche
Accès aux données
Règles métiers Sprint
Presentation layer
Web Controller
Indice de changement : MEDIUM
• Séparation Data /
Domaine / Présentation
• Documenté
• Totalement compatible
avec Symfony
• Couplage entre les règles
métiers et les règles
applicatives
• Pas de séparation des données
du domaine et de la vue
• Couplage fort avec
l’infrastructure
Domain Driven
Design
• Eric Evans, 2004
• Objectifs :
• Gérer des architectures complexes
• Indépendance avec le framework
• Indépendance avec l’UI
• Indépendance avec la base de données
• Testable
• Principe :
• Placer le domaine au centre de l’application
Presentation
Application
Domain
Infrastructure
• Ubiquitous Language
• Model Driven Design
• Entities
• Value Object
• Root Aggregates
• Services
• Repositories
• Cohabitation avec :
• AOP
• CQRS
Presentation
Application
Domain
Infrastructure
Repository Impl Service Impl …
Entity Value Object ServiceRepository
Service
Controller Vue
Domain Layer
Tâche
Sprint
Sprint Repository
Application Layer
Sprint Service
Injection de dépendances
AOP pour la gestion des transactions
Presentation Layer
Web Controller
Infrastructure Layer
Sprint Repository (Implémentation)
Indice de changement : GOOD
• Séparation Métier / Applicatif /
Présentation
• Séparation de l’infrastructure
(Framework, Base de
données…)
• Compatible avec Symfony
mais un peu de plomberie
• Beaucoup de classes
• Coût de développement
• Pas de SRP dans la
couche Application
Clean Architecture
• Robert C. Martin, 2008
• Objectifs :
• Gérer des architectures complexes
• Indépendance avec le framework
• Indépendance avec l’UI
• Indépendance avec la base de données
• Testable
• Principe :
• Placer le domaine au centre de l’application
• Communication entre les couches à travers des abstractions
• Application des principes S.O.L.I.D
• Architecture révélant son intention
Use Case
Controller
Presenter
View
Model
View
Request
Model
Response
Model
<I>Boundary
<I>Entity
Gateway
<A>Entity
Entity
Implementation
Gateway
Implementation
<I>Boundary
Entité
Sprint (Abstract)
Sprint (Implémentation)
Gateway
Sprint Gateway
Sprint Repository (Implémentation)
Use Case
Close Sprint
Close Sprint Response
Close Sprint Response DTO
Controller
Web Controller
Indice de changement : EXCELLENT
• Séparation Métier / Applicatif /
Présentation
• Séparation de l’infrastructure
(Framework, Base de données…)
• Principes S.O.L.I.D.
• Architecture révélant son intention
• Compatible avec Symfony
• Encore plus de classes
• Plomberie
• Coût de développement
• Peu documenté (mais cela
s’améliore)
Retour d’expérience
chez OpenClassrooms
Plus de 4 ans après
• Suppression de la rigidité, fragilité, immobilité, viscosité
• Infrastructure, Frameworks et librairie parfaitement
découplés
• Périmètre des tests adapté
• Environnement (déploiements, temps d'exécution des
tests…)
• Orientation fonctionnelle
• Productivité linéaire
• Aptitude au changement
• Courbe d’apprentissage longue et complexe
• Peu de documentation
• Peu de retours d’expérience
• Peu de développeurs formés
• Quantité de code
• Plomberie
• Beaucoup de code pour générer un Use Case
Devez-vous utiliser la
Clean Architecture ?
Évolution de la productivité
MVC n-tiers DDD Clean Architecture
• Soyez pragmatique
• Quelle taille d’application ?
• Quelle durée de développement ?
• Refactoring
Quelques mots sur
Symfony…
• Du bootstrap à l’architecture la plus avancée
• Tous les composants pour tous les besoins
• Standardisés !
• Montées de versions pérennes
Merci

More Related Content

What's hot

Clean Architecture
Clean ArchitectureClean Architecture
Clean ArchitectureBadoo
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
Clean architecture
Clean architectureClean architecture
Clean architectureandbed
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootMikalai Alimenkou
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2Stéphane Salmons
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Steve Pember
 
Kata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and AdaptersKata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and Adaptersholsky
 
Mocking in Java with Mockito
Mocking in Java with MockitoMocking in Java with Mockito
Mocking in Java with MockitoRichard Paul
 

What's hot (20)

Angular
AngularAngular
Angular
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Domain Driven Design 101
Domain Driven Design 101Domain Driven Design 101
Domain Driven Design 101
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Support cours angular
Support cours angularSupport cours angular
Support cours angular
 
Angular Avancé
Angular AvancéAngular Avancé
Angular Avancé
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring Boot
 
Ef code first
Ef code firstEf code first
Ef code first
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2Introduction au génie logiciel 1.2
Introduction au génie logiciel 1.2
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
 
Kata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and AdaptersKata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and Adapters
 
Mocking in Java with Mockito
Mocking in Java with MockitoMocking in Java with Mockito
Mocking in Java with Mockito
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 

Similar to Design applicatif avec symfony - Zoom sur la clean architecture - Symfony Live

Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2RomainKuzniak
 
Meetup Devops Geneve 06/17- EBU Feedbacks
Meetup Devops Geneve 06/17- EBU Feedbacks Meetup Devops Geneve 06/17- EBU Feedbacks
Meetup Devops Geneve 06/17- EBU Feedbacks Hidora
 
Saas Libre
Saas LibreSaas Libre
Saas Libregrolland
 
Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019
Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019
Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019Bonitasoft
 
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement MicrosoftChristophe HERAL
 
7 Session Aerow - New experience and SharePoint Framework
7   Session Aerow - New experience and SharePoint Framework7   Session Aerow - New experience and SharePoint Framework
7 Session Aerow - New experience and SharePoint FrameworkaOS Community
 
aOS Genève - Session - New Experience & SharePoint Framework
aOS Genève - Session - New Experience & SharePoint FrameworkaOS Genève - Session - New Experience & SharePoint Framework
aOS Genève - Session - New Experience & SharePoint FrameworkJean NETRY-VALERE
 
Gab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetite
Gab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetiteGab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetite
Gab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetiteAZUG FR
 
Accéder au développement Dot.Net et Asp.Net
Accéder au développement Dot.Net et Asp.NetAccéder au développement Dot.Net et Asp.Net
Accéder au développement Dot.Net et Asp.NetFrédéric Vandenbriele
 
Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...
Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...
Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...serge luca
 
Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014
Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014
Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014Nuxeo
 
TechDays 2012 - Windows Azure
TechDays 2012 - Windows AzureTechDays 2012 - Windows Azure
TechDays 2012 - Windows AzureJason De Oliveira
 
Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1Cellenza
 
aOS Toulouse - Session - New Experience & SharePoint Framework
aOS Toulouse - Session - New Experience & SharePoint FrameworkaOS Toulouse - Session - New Experience & SharePoint Framework
aOS Toulouse - Session - New Experience & SharePoint FrameworkJean NETRY-VALERE
 
6 Session Aerow - New experience and SharePoint framework
6   Session Aerow - New experience and SharePoint framework6   Session Aerow - New experience and SharePoint framework
6 Session Aerow - New experience and SharePoint frameworkaOS Community
 
Sw 100 fr docker conteneurisation des applications
Sw 100 fr docker conteneurisation des applicationsSw 100 fr docker conteneurisation des applications
Sw 100 fr docker conteneurisation des applicationsStephane Woillez
 
Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1Microsoft
 
Cours 1 les principes de base
Cours 1 les principes de baseCours 1 les principes de base
Cours 1 les principes de baseMariem ZAOUALI
 

Similar to Design applicatif avec symfony - Zoom sur la clean architecture - Symfony Live (20)

Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2
 
Mobilité && SAP
Mobilité && SAPMobilité && SAP
Mobilité && SAP
 
Objectif fluid&lt;fab />
Objectif fluid&lt;fab />Objectif fluid&lt;fab />
Objectif fluid&lt;fab />
 
Meetup Devops Geneve 06/17- EBU Feedbacks
Meetup Devops Geneve 06/17- EBU Feedbacks Meetup Devops Geneve 06/17- EBU Feedbacks
Meetup Devops Geneve 06/17- EBU Feedbacks
 
Saas Libre
Saas LibreSaas Libre
Saas Libre
 
Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019
Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019
Bonita 7.10 - Nathalie Cotté - Bonitaday Paris 2019
 
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
 
7 Session Aerow - New experience and SharePoint Framework
7   Session Aerow - New experience and SharePoint Framework7   Session Aerow - New experience and SharePoint Framework
7 Session Aerow - New experience and SharePoint Framework
 
aOS Genève - Session - New Experience & SharePoint Framework
aOS Genève - Session - New Experience & SharePoint FrameworkaOS Genève - Session - New Experience & SharePoint Framework
aOS Genève - Session - New Experience & SharePoint Framework
 
Gab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetite
Gab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetiteGab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetite
Gab17 lyon-rex build dev ops sur une infra iaas-paas multisite-by-matthieupetite
 
Accéder au développement Dot.Net et Asp.Net
Accéder au développement Dot.Net et Asp.NetAccéder au développement Dot.Net et Asp.Net
Accéder au développement Dot.Net et Asp.Net
 
Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...
Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...
Patterns pour porter son code SharePoint vers Office 365 (SharePoint Saturday...
 
Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014
Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014
Nuxeo en mode cloud SWORD Group - Nuxeo Tour 2014
 
TechDays 2012 - Windows Azure
TechDays 2012 - Windows AzureTechDays 2012 - Windows Azure
TechDays 2012 - Windows Azure
 
Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1
 
aOS Toulouse - Session - New Experience & SharePoint Framework
aOS Toulouse - Session - New Experience & SharePoint FrameworkaOS Toulouse - Session - New Experience & SharePoint Framework
aOS Toulouse - Session - New Experience & SharePoint Framework
 
6 Session Aerow - New experience and SharePoint framework
6   Session Aerow - New experience and SharePoint framework6   Session Aerow - New experience and SharePoint framework
6 Session Aerow - New experience and SharePoint framework
 
Sw 100 fr docker conteneurisation des applications
Sw 100 fr docker conteneurisation des applicationsSw 100 fr docker conteneurisation des applications
Sw 100 fr docker conteneurisation des applications
 
Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1
 
Cours 1 les principes de base
Cours 1 les principes de baseCours 1 les principes de base
Cours 1 les principes de base
 

Design applicatif avec symfony - Zoom sur la clean architecture - Symfony Live