Clean Architecture &Clean Architecture &Clean Architecture &Clean Architecture &
Code patrimonialCode patrimonialCode patrimonialCode patrimonial
Karol DelandKarol DelandKarol DelandKarol Deland
PrésentationPrésentationPrésentationPrésentation
► Conseiller en architecture logicielle
► Passionné d’architecture (oui je
parle de code même le midi…)
► Mon rôle est d’aider les équipes de
développement à livrer de la qualité
plus rapidement
www.linkedin.com/in/karoldeland
@karoldeland
http://pragma3.com
iAiAiAiA Groupe FinancierGroupe FinancierGroupe FinancierGroupe Financier
Une approche humaine
Adoption du Lean et de l’agilité depuis 2012
Plus de 1000 personnes en TI
En route vers le DevOps, le cloud et l’agilité à l’échelle
Pourquoi cette présentation?Pourquoi cette présentation?Pourquoi cette présentation?Pourquoi cette présentation?
Pour faire cesser l’entropie de
votre code patrimonial, vous aurez besoin
de vos meilleurs développeurs !
AgendaAgendaAgendaAgenda
Contexte du projetContexte du projetContexte du projetContexte du projet
Trois défis :Trois défis :Trois défis :Trois défis :
1- Modifications itératives
2- Réutilisation de code patrimonial
3- Simplification des tests
Ce que nous avons apprisCe que nous avons apprisCe que nous avons apprisCe que nous avons appris
ContexteContexteContexteContexte
• ProjetProjetProjetProjet ROVeRROVeRROVeRROVeR
(Refonte des Outils de Vente des Représentants)(Refonte des Outils de Vente des Représentants)(Refonte des Outils de Vente des Représentants)(Refonte des Outils de Vente des Représentants)
• 2015201520152015----2016201620162016
• Majeur pour l’entrepriseMajeur pour l’entrepriseMajeur pour l’entrepriseMajeur pour l’entreprise
• Raisons :Raisons :Raisons :Raisons :
Désuétude
Se démarquer sur le marché
Dotation des tarificateurs difficile
• 2 équipes2 équipes2 équipes2 équipes
• Agilité : scepticismeAgilité : scepticismeAgilité : scepticismeAgilité : scepticisme
Contexte (Logiciel)Contexte (Logiciel)Contexte (Logiciel)Contexte (Logiciel)
• Application VB6 désuèteApplication VB6 désuèteApplication VB6 désuèteApplication VB6 désuète
Formulaires de saisie de données personnelles (identification,
antécédents de santé, etc.)
• Réutilisation d’une partie de l’ancienne application (Limite de la portée)Réutilisation d’une partie de l’ancienne application (Limite de la portée)Réutilisation d’une partie de l’ancienne application (Limite de la portée)Réutilisation d’une partie de l’ancienne application (Limite de la portée)
• Mode connecté et déconnectéMode connecté et déconnectéMode connecté et déconnectéMode connecté et déconnecté
• Saisie massiveSaisie massiveSaisie massiveSaisie massive
• Options :Options :Options :Options :
WPF, Winforms, Web embarqué
AvantAvantAvantAvant
AprèsAprèsAprèsAprès
Premier défi :Premier défi :Premier défi :Premier défi :
Modifications itérativesModifications itérativesModifications itérativesModifications itératives
WPF dans
VB6
WPF dans VB6WPF dans VB6WPF dans VB6WPF dans VB6
MVVM… hein?MVVM… hein?MVVM… hein?MVVM… hein?
Image : https://prismlibrary.github.io/docs/wpf/Implementing-MVVM.html
Itératif = découplageItératif = découplageItératif = découplageItératif = découplage
ViewModel1 ViewModel2
““““ La plupart des problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatique
peuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirection
supplémentairesupplémentairesupplémentairesupplémentaire ””””
David Wheeler
Itératif = découplageItératif = découplageItératif = découplageItératif = découplage
ViewModel1 ViewModel2
Itératif = découplageItératif = découplageItératif = découplageItératif = découplage
ViewModel ViewModelEvent Broker
Publish Subscribe
Exemples connus de pub/Exemples connus de pub/Exemples connus de pub/Exemples connus de pub/subsubsubsub
• Messages broker :Messages broker :Messages broker :Messages broker :
Queues (WebSphereMQ, JMS, RabbitMQ, ActiveMQ)
Kafka
Redis
Azure Service Bus, Amazon SNS
• Notifications mobilesNotifications mobilesNotifications mobilesNotifications mobiles
• EventsEventsEventsEvents (.NET),(.NET),(.NET),(.NET), EventEventEventEvent ListenersListenersListenersListeners (Java)(Java)(Java)(Java)
Itératif = découplageItératif = découplageItératif = découplageItératif = découplage
ViewModel ViewModelEvent Broker
Publish Subscribe
ServiceNavigation Log
Découplage
Deuxième défi :Deuxième défi :Deuxième défi :Deuxième défi :
Réutilisation du domaineRéutilisation du domaineRéutilisation du domaineRéutilisation du domaine
““““ Domain model : An object model of theDomain model : An object model of theDomain model : An object model of theDomain model : An object model of the
domain that incorporates both behavior anddomain that incorporates both behavior anddomain that incorporates both behavior anddomain that incorporates both behavior and
data.data.data.data. ””””
Martin Fowler
https://martinfowler.com/eaaCatalog/domainModel.htmlhttps://martinfowler.com/eaaCatalog/domainModel.htmlhttps://martinfowler.com/eaaCatalog/domainModel.htmlhttps://martinfowler.com/eaaCatalog/domainModel.html
Réutilisation de l’existantRéutilisation de l’existantRéutilisation de l’existantRéutilisation de l’existant
Application VB6
Domaine
(Modèle objet, .NET)
Multiples responsabilités
Logique d’affaire
Persistance (XML)
Méga « graph » d’objets
Près de 1000 classes
Plus de 1000 enums
Réutilisation de l’existantRéutilisation de l’existantRéutilisation de l’existantRéutilisation de l’existant
Application VB6
Domaine
(Modèle objet, .NET)
Multiples responsabilités
Logique d’affaire
Persistance (XML)
Méga « graph » d’objets
Près de 1000 classes
Plus de 1000 enums
Application .NET
Réutiliser sans
modifier…
– Ça peut briser une autre
application!
– La structure objet est liée à la
persistence
– On avait des tests
automatisés, mais…
– Interface publique est
exposée COM
– Ah oui! On utilise un peu de
réflexion aussi…
– …
Image : https://blog.codinghorror.com/
BesoinsBesoinsBesoinsBesoins
• TestabilitéTestabilitéTestabilitéTestabilité
• Limiter les changements au modèle objetLimiter les changements au modèle objetLimiter les changements au modèle objetLimiter les changements au modèle objet
• Briser le cycle «Briser le cycle «Briser le cycle «Briser le cycle « développementdéveloppementdéveloppementdéveloppement refonterefonterefonterefonte »»»»
Clean Architecture
Robert C. Martin (Uncle Bob)
Infrastructure (REST,
Données, Log, etc.)
Présentation
(UI)
Couche service
application
Couche service
domaine
Domaine
Cœur de l’application
Architecture en
oignon
Jeffrey Palermo
Architecture en
oignon
Exemple
Présentation
(UI)
Infrastructure (REST, Données, Log,
etc.)
Couche service
application
Couche service
domaine
Domaine
TaskService
IBacklog
Program
TaskRepository
IEventPublisher
ITask
Repository
EventHub
ExempleExempleExempleExemple
Infrastructure (REST,
Données, Log, etc.)
Présentation
(UI)
Couche service
application
Couche service
domaine
Domaine
Cœur de l’application
Est-ce correct?
?
SacrilègeSacrilègeSacrilègeSacrilège !!!!
Où sont les DTO???Où sont les DTO???Où sont les DTO???Où sont les DTO???
Data Transfer ObjectData Transfer ObjectData Transfer ObjectData Transfer Object
https://martinfowler.com/bliki/LocalDTO.htmlhttps://martinfowler.com/bliki/LocalDTO.htmlhttps://martinfowler.com/bliki/LocalDTO.htmlhttps://martinfowler.com/bliki/LocalDTO.html
Troisième défi :Troisième défi :Troisième défi :Troisième défi :
Simplifier les testsSimplifier les testsSimplifier les testsSimplifier les tests
Un test compliqué à coder = mauvais designUn test compliqué à coder = mauvais designUn test compliqué à coder = mauvais designUn test compliqué à coder = mauvais design
• Chaque service applicatif dépendait de la racine de l’arbreChaque service applicatif dépendait de la racine de l’arbreChaque service applicatif dépendait de la racine de l’arbreChaque service applicatif dépendait de la racine de l’arbre
du domainedu domainedu domainedu domaine
• Pas de requêtes dynamiques sur le modèle objetPas de requêtes dynamiques sur le modèle objetPas de requêtes dynamiques sur le modèle objetPas de requêtes dynamiques sur le modèle objet
• Navigation entre les entités par un mécanisme statiqueNavigation entre les entités par un mécanisme statiqueNavigation entre les entités par un mécanisme statiqueNavigation entre les entités par un mécanisme statique
““““ La plupart des problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatique
peuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirection
supplémentairesupplémentairesupplémentairesupplémentaire ””””
David Wheeler
Avertissement : À force d’ê
Patron «Patron «Patron «Patron « RepositoryRepositoryRepositoryRepository »»»»
• Centralise la logique d’accès aux donnéesCentralise la logique d’accès aux donnéesCentralise la logique d’accès aux donnéesCentralise la logique d’accès aux données
• Simplifie les dépendances entre services applicatifs et objetsSimplifie les dépendances entre services applicatifs et objetsSimplifie les dépendances entre services applicatifs et objetsSimplifie les dépendances entre services applicatifs et objets
du domainedu domainedu domainedu domaine
• Pas facile à tester, mais diminue le risquePas facile à tester, mais diminue le risquePas facile à tester, mais diminue le risquePas facile à tester, mais diminue le risque
ExempleExempleExempleExemple
Ce que nous avons apprisCe que nous avons apprisCe que nous avons apprisCe que nous avons appris
LeçonsLeçonsLeçonsLeçons
• Ne pas avoir peur d’oserNe pas avoir peur d’oserNe pas avoir peur d’oserNe pas avoir peur d’oser
• Certains patrons peuvent être utiles dans d’autres contextesCertains patrons peuvent être utiles dans d’autres contextesCertains patrons peuvent être utiles dans d’autres contextesCertains patrons peuvent être utiles dans d’autres contextes
• Tester après coup n’encourage pas la réflexion sur les testsTester après coup n’encourage pas la réflexion sur les testsTester après coup n’encourage pas la réflexion sur les testsTester après coup n’encourage pas la réflexion sur les tests
globalementglobalementglobalementglobalement
• ÉtaitÉtaitÉtaitÉtait----ce un domaine riche ou du CRUD?ce un domaine riche ou du CRUD?ce un domaine riche ou du CRUD?ce un domaine riche ou du CRUD?
• ScreamingScreamingScreamingScreaming architecturearchitecturearchitecturearchitecture
Découpage en composant
• La «La «La «La « Clean architectureClean architectureClean architectureClean architecture » est la seule façon de conserver» est la seule façon de conserver» est la seule façon de conserver» est la seule façon de conserver
notre logique d’affaire dans le tempsnotre logique d’affaire dans le tempsnotre logique d’affaire dans le tempsnotre logique d’affaire dans le temps
Faire du neuf avec du vieux, c’est une
approche responsable. Cessez
d’espérer. Renverser la vapeur
maintenant, une itération à la fois,
refactoring par refactoring…
RéférencesRéférencesRéférencesRéférences
• LivresLivresLivresLivres
Clean Architecture, Robert C. Martin
Working Effectively With Legacy Code, Michael Feathers
• Blogs et articlesBlogs et articlesBlogs et articlesBlogs et articles
https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/
http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-
architecture.html
• Code source exempleCode source exempleCode source exempleCode source exemple
https://github.com/karoldeland/CleanArchitectureLegacyCode
Merci!Merci!Merci!Merci!
Questions?Questions?Questions?Questions?
www.linkedin.com/in/karoldeland
@karoldeland
http://pragma3.com

Clean Architecture et Code patrimonial

  • 1.
    Clean Architecture &CleanArchitecture &Clean Architecture &Clean Architecture & Code patrimonialCode patrimonialCode patrimonialCode patrimonial Karol DelandKarol DelandKarol DelandKarol Deland
  • 2.
    PrésentationPrésentationPrésentationPrésentation ► Conseiller enarchitecture logicielle ► Passionné d’architecture (oui je parle de code même le midi…) ► Mon rôle est d’aider les équipes de développement à livrer de la qualité plus rapidement www.linkedin.com/in/karoldeland @karoldeland http://pragma3.com
  • 3.
    iAiAiAiA Groupe FinancierGroupeFinancierGroupe FinancierGroupe Financier Une approche humaine Adoption du Lean et de l’agilité depuis 2012 Plus de 1000 personnes en TI En route vers le DevOps, le cloud et l’agilité à l’échelle
  • 4.
    Pourquoi cette présentation?Pourquoicette présentation?Pourquoi cette présentation?Pourquoi cette présentation?
  • 5.
    Pour faire cesserl’entropie de votre code patrimonial, vous aurez besoin de vos meilleurs développeurs !
  • 6.
    AgendaAgendaAgendaAgenda Contexte du projetContextedu projetContexte du projetContexte du projet Trois défis :Trois défis :Trois défis :Trois défis : 1- Modifications itératives 2- Réutilisation de code patrimonial 3- Simplification des tests Ce que nous avons apprisCe que nous avons apprisCe que nous avons apprisCe que nous avons appris
  • 7.
    ContexteContexteContexteContexte • ProjetProjetProjetProjet ROVeRROVeRROVeRROVeR (Refontedes Outils de Vente des Représentants)(Refonte des Outils de Vente des Représentants)(Refonte des Outils de Vente des Représentants)(Refonte des Outils de Vente des Représentants) • 2015201520152015----2016201620162016 • Majeur pour l’entrepriseMajeur pour l’entrepriseMajeur pour l’entrepriseMajeur pour l’entreprise • Raisons :Raisons :Raisons :Raisons : Désuétude Se démarquer sur le marché Dotation des tarificateurs difficile • 2 équipes2 équipes2 équipes2 équipes • Agilité : scepticismeAgilité : scepticismeAgilité : scepticismeAgilité : scepticisme
  • 8.
    Contexte (Logiciel)Contexte (Logiciel)Contexte(Logiciel)Contexte (Logiciel) • Application VB6 désuèteApplication VB6 désuèteApplication VB6 désuèteApplication VB6 désuète Formulaires de saisie de données personnelles (identification, antécédents de santé, etc.) • Réutilisation d’une partie de l’ancienne application (Limite de la portée)Réutilisation d’une partie de l’ancienne application (Limite de la portée)Réutilisation d’une partie de l’ancienne application (Limite de la portée)Réutilisation d’une partie de l’ancienne application (Limite de la portée) • Mode connecté et déconnectéMode connecté et déconnectéMode connecté et déconnectéMode connecté et déconnecté • Saisie massiveSaisie massiveSaisie massiveSaisie massive • Options :Options :Options :Options : WPF, Winforms, Web embarqué
  • 9.
  • 10.
  • 11.
    Premier défi :Premierdéfi :Premier défi :Premier défi : Modifications itérativesModifications itérativesModifications itérativesModifications itératives
  • 12.
  • 13.
    WPF dans VB6WPFdans VB6WPF dans VB6WPF dans VB6
  • 14.
    MVVM… hein?MVVM… hein?MVVM…hein?MVVM… hein? Image : https://prismlibrary.github.io/docs/wpf/Implementing-MVVM.html
  • 15.
    Itératif = découplageItératif= découplageItératif = découplageItératif = découplage ViewModel1 ViewModel2
  • 16.
    ““““ La plupartdes problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatique peuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirection supplémentairesupplémentairesupplémentairesupplémentaire ”””” David Wheeler
  • 17.
    Itératif = découplageItératif= découplageItératif = découplageItératif = découplage ViewModel1 ViewModel2
  • 18.
    Itératif = découplageItératif= découplageItératif = découplageItératif = découplage ViewModel ViewModelEvent Broker Publish Subscribe
  • 19.
    Exemples connus depub/Exemples connus de pub/Exemples connus de pub/Exemples connus de pub/subsubsubsub • Messages broker :Messages broker :Messages broker :Messages broker : Queues (WebSphereMQ, JMS, RabbitMQ, ActiveMQ) Kafka Redis Azure Service Bus, Amazon SNS • Notifications mobilesNotifications mobilesNotifications mobilesNotifications mobiles • EventsEventsEventsEvents (.NET),(.NET),(.NET),(.NET), EventEventEventEvent ListenersListenersListenersListeners (Java)(Java)(Java)(Java)
  • 20.
    Itératif = découplageItératif= découplageItératif = découplageItératif = découplage ViewModel ViewModelEvent Broker Publish Subscribe ServiceNavigation Log
  • 21.
  • 22.
    Deuxième défi :Deuxièmedéfi :Deuxième défi :Deuxième défi : Réutilisation du domaineRéutilisation du domaineRéutilisation du domaineRéutilisation du domaine
  • 23.
    ““““ Domain model: An object model of theDomain model : An object model of theDomain model : An object model of theDomain model : An object model of the domain that incorporates both behavior anddomain that incorporates both behavior anddomain that incorporates both behavior anddomain that incorporates both behavior and data.data.data.data. ”””” Martin Fowler https://martinfowler.com/eaaCatalog/domainModel.htmlhttps://martinfowler.com/eaaCatalog/domainModel.htmlhttps://martinfowler.com/eaaCatalog/domainModel.htmlhttps://martinfowler.com/eaaCatalog/domainModel.html
  • 24.
    Réutilisation de l’existantRéutilisationde l’existantRéutilisation de l’existantRéutilisation de l’existant Application VB6 Domaine (Modèle objet, .NET) Multiples responsabilités Logique d’affaire Persistance (XML) Méga « graph » d’objets Près de 1000 classes Plus de 1000 enums
  • 25.
    Réutilisation de l’existantRéutilisationde l’existantRéutilisation de l’existantRéutilisation de l’existant Application VB6 Domaine (Modèle objet, .NET) Multiples responsabilités Logique d’affaire Persistance (XML) Méga « graph » d’objets Près de 1000 classes Plus de 1000 enums Application .NET
  • 26.
    Réutiliser sans modifier… – Çapeut briser une autre application! – La structure objet est liée à la persistence – On avait des tests automatisés, mais… – Interface publique est exposée COM – Ah oui! On utilise un peu de réflexion aussi… – … Image : https://blog.codinghorror.com/
  • 27.
    BesoinsBesoinsBesoinsBesoins • TestabilitéTestabilitéTestabilitéTestabilité • Limiterles changements au modèle objetLimiter les changements au modèle objetLimiter les changements au modèle objetLimiter les changements au modèle objet • Briser le cycle «Briser le cycle «Briser le cycle «Briser le cycle « développementdéveloppementdéveloppementdéveloppement refonterefonterefonterefonte »»»»
  • 28.
    Clean Architecture Robert C.Martin (Uncle Bob)
  • 29.
    Infrastructure (REST, Données, Log,etc.) Présentation (UI) Couche service application Couche service domaine Domaine Cœur de l’application Architecture en oignon Jeffrey Palermo
  • 30.
    Architecture en oignon Exemple Présentation (UI) Infrastructure (REST,Données, Log, etc.) Couche service application Couche service domaine Domaine TaskService IBacklog Program TaskRepository IEventPublisher ITask Repository EventHub
  • 31.
  • 32.
    Infrastructure (REST, Données, Log,etc.) Présentation (UI) Couche service application Couche service domaine Domaine Cœur de l’application Est-ce correct? ?
  • 33.
    SacrilègeSacrilègeSacrilègeSacrilège !!!! Où sontles DTO???Où sont les DTO???Où sont les DTO???Où sont les DTO??? Data Transfer ObjectData Transfer ObjectData Transfer ObjectData Transfer Object https://martinfowler.com/bliki/LocalDTO.htmlhttps://martinfowler.com/bliki/LocalDTO.htmlhttps://martinfowler.com/bliki/LocalDTO.htmlhttps://martinfowler.com/bliki/LocalDTO.html
  • 34.
    Troisième défi :Troisièmedéfi :Troisième défi :Troisième défi : Simplifier les testsSimplifier les testsSimplifier les testsSimplifier les tests
  • 35.
    Un test compliquéà coder = mauvais designUn test compliqué à coder = mauvais designUn test compliqué à coder = mauvais designUn test compliqué à coder = mauvais design • Chaque service applicatif dépendait de la racine de l’arbreChaque service applicatif dépendait de la racine de l’arbreChaque service applicatif dépendait de la racine de l’arbreChaque service applicatif dépendait de la racine de l’arbre du domainedu domainedu domainedu domaine • Pas de requêtes dynamiques sur le modèle objetPas de requêtes dynamiques sur le modèle objetPas de requêtes dynamiques sur le modèle objetPas de requêtes dynamiques sur le modèle objet • Navigation entre les entités par un mécanisme statiqueNavigation entre les entités par un mécanisme statiqueNavigation entre les entités par un mécanisme statiqueNavigation entre les entités par un mécanisme statique
  • 36.
    ““““ La plupartdes problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatiqueLa plupart des problèmes en informatique peuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirectionpeuvent se résoudre avec un niveau d’indirection supplémentairesupplémentairesupplémentairesupplémentaire ”””” David Wheeler Avertissement : À force d’ê
  • 37.
    Patron «Patron «Patron«Patron « RepositoryRepositoryRepositoryRepository »»»» • Centralise la logique d’accès aux donnéesCentralise la logique d’accès aux donnéesCentralise la logique d’accès aux donnéesCentralise la logique d’accès aux données • Simplifie les dépendances entre services applicatifs et objetsSimplifie les dépendances entre services applicatifs et objetsSimplifie les dépendances entre services applicatifs et objetsSimplifie les dépendances entre services applicatifs et objets du domainedu domainedu domainedu domaine • Pas facile à tester, mais diminue le risquePas facile à tester, mais diminue le risquePas facile à tester, mais diminue le risquePas facile à tester, mais diminue le risque
  • 38.
  • 39.
    Ce que nousavons apprisCe que nous avons apprisCe que nous avons apprisCe que nous avons appris
  • 40.
    LeçonsLeçonsLeçonsLeçons • Ne pasavoir peur d’oserNe pas avoir peur d’oserNe pas avoir peur d’oserNe pas avoir peur d’oser • Certains patrons peuvent être utiles dans d’autres contextesCertains patrons peuvent être utiles dans d’autres contextesCertains patrons peuvent être utiles dans d’autres contextesCertains patrons peuvent être utiles dans d’autres contextes • Tester après coup n’encourage pas la réflexion sur les testsTester après coup n’encourage pas la réflexion sur les testsTester après coup n’encourage pas la réflexion sur les testsTester après coup n’encourage pas la réflexion sur les tests globalementglobalementglobalementglobalement • ÉtaitÉtaitÉtaitÉtait----ce un domaine riche ou du CRUD?ce un domaine riche ou du CRUD?ce un domaine riche ou du CRUD?ce un domaine riche ou du CRUD? • ScreamingScreamingScreamingScreaming architecturearchitecturearchitecturearchitecture Découpage en composant • La «La «La «La « Clean architectureClean architectureClean architectureClean architecture » est la seule façon de conserver» est la seule façon de conserver» est la seule façon de conserver» est la seule façon de conserver notre logique d’affaire dans le tempsnotre logique d’affaire dans le tempsnotre logique d’affaire dans le tempsnotre logique d’affaire dans le temps
  • 41.
    Faire du neufavec du vieux, c’est une approche responsable. Cessez d’espérer. Renverser la vapeur maintenant, une itération à la fois, refactoring par refactoring…
  • 42.
    RéférencesRéférencesRéférencesRéférences • LivresLivresLivresLivres Clean Architecture,Robert C. Martin Working Effectively With Legacy Code, Michael Feathers • Blogs et articlesBlogs et articlesBlogs et articlesBlogs et articles https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/ http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean- architecture.html • Code source exempleCode source exempleCode source exempleCode source exemple https://github.com/karoldeland/CleanArchitectureLegacyCode
  • 43.