SlideShare une entreprise Scribd logo
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
Design applicatif avec symfony - Zoom sur la clean architecture - Symfony Live
• 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
Design applicatif avec symfony - Zoom sur la clean architecture - Symfony Live
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

Contenu connexe

Tendances

Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
NSCoder Mexico
 
Clean architecture
Clean architectureClean architecture
Clean architecture
Lieven Doclo
 
Towards Functional Programming through Hexagonal Architecture
Towards Functional Programming through Hexagonal ArchitectureTowards Functional Programming through Hexagonal Architecture
Towards Functional Programming through Hexagonal Architecture
CodelyTV
 
The Secrets of Hexagonal Architecture
The Secrets of Hexagonal ArchitectureThe Secrets of Hexagonal Architecture
The Secrets of Hexagonal Architecture
Nicolas Carlo
 
Clean architecture
Clean architectureClean architecture
Clean architecture
andbed
 
Hexagonal architecture for java applications
Hexagonal architecture for java applicationsHexagonal architecture for java applications
Hexagonal architecture for java applications
Fabricio Epaminondas
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
Zahra Heydari
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
Antoine Rey
 
Clean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software CraftsmanshipClean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software Craftsmanship
Ivan Paulovich
 
Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...
Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...
Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...
Microsoft Technet France
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
Scott Wlaschin
 
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
NETFest
 
Node.js 20버전에 변경된 점들.pdf
Node.js 20버전에 변경된 점들.pdfNode.js 20버전에 변경된 점들.pdf
Node.js 20버전에 변경된 점들.pdf
Seung kyoo Park
 
Clean architecture with asp.net core
Clean architecture with asp.net coreClean architecture with asp.net core
Clean architecture with asp.net core
Sam Nasr, MCSA, MVP
 
What is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | EdurekaWhat is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | Edureka
Edureka!
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the Domain
Victor Rentea
 
Spring Boot
Spring BootSpring Boot
Spring Boot
Jiayun Zhou
 
AWS CDK introduction
AWS CDK introductionAWS CDK introduction
AWS CDK introduction
leo lapworth
 
Introduction to Spring's Dependency Injection
Introduction to Spring's Dependency InjectionIntroduction to Spring's Dependency Injection
Introduction to Spring's Dependency Injection
Richard Paul
 
State management in react applications (Statecharts)
State management in react applications (Statecharts)State management in react applications (Statecharts)
State management in react applications (Statecharts)
Tomáš Drenčák
 

Tendances (20)

Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Towards Functional Programming through Hexagonal Architecture
Towards Functional Programming through Hexagonal ArchitectureTowards Functional Programming through Hexagonal Architecture
Towards Functional Programming through Hexagonal Architecture
 
The Secrets of Hexagonal Architecture
The Secrets of Hexagonal ArchitectureThe Secrets of Hexagonal Architecture
The Secrets of Hexagonal Architecture
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Hexagonal architecture for java applications
Hexagonal architecture for java applicationsHexagonal architecture for java applications
Hexagonal architecture for java applications
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Clean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software CraftsmanshipClean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software Craftsmanship
 
Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...
Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...
Architecture, bonnes pratiques et recettes pour la réussite de vos projets av...
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
 
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
 
Node.js 20버전에 변경된 점들.pdf
Node.js 20버전에 변경된 점들.pdfNode.js 20버전에 변경된 점들.pdf
Node.js 20버전에 변경된 점들.pdf
 
Clean architecture with asp.net core
Clean architecture with asp.net coreClean architecture with asp.net core
Clean architecture with asp.net core
 
What is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | EdurekaWhat is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | Edureka
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the Domain
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
AWS CDK introduction
AWS CDK introductionAWS CDK introduction
AWS CDK introduction
 
Introduction to Spring's Dependency Injection
Introduction to Spring's Dependency InjectionIntroduction to Spring's Dependency Injection
Introduction to Spring's Dependency Injection
 
State management in react applications (Statecharts)
State management in react applications (Statecharts)State management in react applications (Statecharts)
State management in react applications (Statecharts)
 

Similaire à 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 symfony2
RomainKuzniak
 
Mobilité && SAP
Mobilité && SAPMobilité && SAP
Mobilité && SAP
Lotfi GAALOUL
 
Objectif fluid&lt;fab />
Objectif fluid&lt;fab />Objectif fluid&lt;fab />
Objectif fluid&lt;fab />
∞ François CHERPION ∞
 
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 Libre
grolland
 
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
Bonitasoft
 
[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
Christophe 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 Framework
aOS 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 Framework
Jean 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-matthieupetite
AZUG 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.Net
Fré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 2014
Nuxeo
 
TechDays 2012 - Windows Azure
TechDays 2012 - Windows AzureTechDays 2012 - Windows Azure
TechDays 2012 - Windows Azure
Jason 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.1
Cellenza
 
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
aOS Community
 
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
Jean NETRY-VALERE
 
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
Stephane 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.1
Microsoft
 
Cours 1 les principes de base
Cours 1 les principes de baseCours 1 les principes de base
Cours 1 les principes de base
Mariem ZAOUALI
 

Similaire à 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
 
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
 
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
 
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