[{"data":1,"prerenderedAt":16240},["ShallowReactive",2],{"search-api":-1,"listing-cat-dette-technique-page-1":3},[4,472,1012,1645,2138,2946,3550,4264,4953,6219,9995,14697],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"id":11,"date":12,"listed":13,"nocomments":7,"hidden":7,"categories":14,"tags":15,"--cover":19,"readingTime":20,"body":25,"_type":466,"_id":467,"_source":468,"_file":469,"_stem":470,"_extension":471},"/fr/dette-technique/ingenierie-logicielle-avantage-concurrentiel","dette-technique",false,"","L'ingénierie logicielle comme avantage concurrentiel durable","Dans un monde où l'IA accélère tout le monde, la qualité d'engineering devient le différenciateur durable. Ce que les CTOs qui l'ont compris font différemment.",36,"2026-03-27",true,[6],[16,17,18],"Engineering Excellence","Avantage Compétitif","Leadership","covers/articles/ingenierie-avantage-concurrentiel.jpg",{"text":21,"minutes":22,"time":23,"words":24},"8 min read",7.68,460800,1536,{"type":26,"children":27,"toc":452},"root",[28,36,51,60,65,69,76,81,86,96,99,105,112,117,122,128,133,138,144,149,162,165,178,181,187,192,202,212,222,232,242,245,251,256,266,276,286,291,294,300,305,315,333,351,361,364,370,385,398,411,424,437,440],{"type":29,"tag":30,"props":31,"children":33},"element","h1",{"id":32},"lingénierie-logicielle-comme-avantage-concurrentiel-durable",[34],{"type":35,"value":9},"text",{"type":29,"tag":37,"props":38,"children":39},"p",{},[40,42,49],{"type":35,"value":41},"J'ai accompagné un client dans le secteur de la santé, 35 développeurs, pendant 12 mois. Quand j'ai commencé, le ",{"type":29,"tag":43,"props":44,"children":46},"a",{"href":45},"/fr/pratiques-agiles/reduire-work-in-progress-velocite",[47],{"type":35,"value":48},"lead time",{"type":35,"value":50}," était de 6 semaines, le taux de bugs de prod était élevé, et deux développeurs seniors venaient de partir en citant \"l'environnement technique trop dégradé\". Douze mois plus tard : lead time à 1,5 semaine, taux de bugs de prod en baisse de 65%, et deux nouveaux seniors recrutés qui avaient cité explicitement la qualité de l'environnement technique comme raison principale de rejoindre. Au moment de la prochaine levée de fonds, la due diligence technique est devenue un argument de valorisation, plus un risque à minimiser.",{"type":29,"tag":37,"props":52,"children":53},{},[54],{"type":29,"tag":55,"props":56,"children":57},"strong",{},[58],{"type":35,"value":59},"L'IA a rendu le code accessible à tout le monde. Elle n'a pas rendu la qualité d'engineering accessible à tout le monde. Et c'est là que se creuse le prochain écart concurrentiel.",{"type":29,"tag":37,"props":61,"children":62},{},[63],{"type":35,"value":64},"En 2024-2025, les outils de génération de code ont nivelé la vitesse de production du code. Une startup de 5 personnes peut générer autant de code qu'une équipe de 50 il y a 3 ans. Ce nivellement a changé les règles du jeu : la compétition ne se joue plus sur qui écrit le code le plus vite, mais sur qui le maintient, l'améliore, et le gouverne le mieux.",{"type":29,"tag":66,"props":67,"children":68},"hr",{},[],{"type":29,"tag":70,"props":71,"children":73},"h2",{"id":72},"lia-comme-égalisateur-et-révélateur",[74],{"type":35,"value":75},"L'IA comme égalisateur et révélateur",{"type":29,"tag":37,"props":77,"children":78},{},[79],{"type":35,"value":80},"L'IA a réduit le coût marginal de production de code à presque zéro. Un développeur augmenté par Copilot produit 20 à 40% de code supplémentaire selon les études GitHub. C'est un gain réel.",{"type":29,"tag":37,"props":82,"children":83},{},[84],{"type":35,"value":85},"Mais ce gain amplifie ce qui existe déjà. Une équipe avec de bonnes pratiques d'architecture, de test, et de revue de code bénéficie pleinement de l'IA : le code généré est bien intégré, testé, et maintenu. Une équipe avec de mauvaises pratiques produit plus de dette technique plus rapidement. L'IA amplifie les équipes solides et fragilise les équipes fragiles.",{"type":29,"tag":37,"props":87,"children":88},{},[89,94],{"type":29,"tag":55,"props":90,"children":91},{},[92],{"type":35,"value":93},"La donnée qui change tout",{"type":35,"value":95}," : le State of DevOps Report 2023 (DORA) montre que les équipes \"elite\" ont un deployment frequency 973 fois supérieur aux équipes \"low performers\", et un lead time 6 570 fois inférieur. L'IA n'a pas réduit cet écart. Elle l'a amplifié. Ce n'est pas de la théorie : c'est le résultat de 10 ans de données sur des milliers d'équipes.",{"type":29,"tag":66,"props":97,"children":98},{},[],{"type":29,"tag":70,"props":100,"children":102},{"id":101},"les-3-dimensions-de-lavantage-engineering",[103],{"type":35,"value":104},"Les 3 dimensions de l'avantage engineering",{"type":29,"tag":106,"props":107,"children":109},"h3",{"id":108},"dimension-1-la-vitesse-de-livraison-time-to-market",[110],{"type":35,"value":111},"Dimension 1 : La vitesse de livraison (time-to-market)",{"type":29,"tag":37,"props":113,"children":114},{},[115],{"type":35,"value":116},"La capacité à livrer des fonctionnalités en semaines plutôt qu'en mois est un avantage concurrentiel direct. Sur les marchés où les cycles d'innovation sont courts, une équipe qui déploie en production plusieurs fois par semaine peut itérer sur le feedback utilisateur 10 fois plus vite qu'une équipe qui déploie une fois par mois.",{"type":29,"tag":37,"props":118,"children":119},{},[120],{"type":35,"value":121},"Ce n'est pas une métrique technique, c'est une métrique business. Chaque semaine gagnée sur le lead time est une semaine d'avance sur le concurrent qui a eu la même idée.",{"type":29,"tag":106,"props":123,"children":125},{"id":124},"dimension-2-la-qualité-comme-réducteur-de-risque",[126],{"type":35,"value":127},"Dimension 2 : La qualité comme réducteur de risque",{"type":29,"tag":37,"props":129,"children":130},{},[131],{"type":35,"value":132},"Dans les secteurs régulés (finance, assurance, santé), la qualité d'engineering est une condition de survie réglementaire. Un incident lié à un code de mauvaise qualité peut déclencher une enquête de l'autorité de tutelle, une amende significative, et un dommage réputationnel durable. J'ai vu cela chez des clients dans le secteur bancaire, Canal+, BNP Paribas, Agirc-Arrco, où un incident technique mal géré avait des conséquences réglementaires immédiates.",{"type":29,"tag":37,"props":134,"children":135},{},[136],{"type":35,"value":137},"Mais dans tous les secteurs, la qualité réduit le coût opérationnel. Une équipe avec une absorption de dette technique à 20% (vs 40%) a 20% de capacité supplémentaire disponible pour l'innovation. Sur une équipe de 50 développeurs, c'est 10 développeurs-équivalents récupérés sans recrutement.",{"type":29,"tag":106,"props":139,"children":141},{"id":140},"dimension-3-lattractivité-des-talents",[142],{"type":35,"value":143},"Dimension 3 : L'attractivité des talents",{"type":29,"tag":37,"props":145,"children":146},{},[147],{"type":35,"value":148},"Les meilleurs développeurs choisissent leurs employeurs sur les pratiques techniques, pas seulement sur la rémunération. Une enquête Stack Overflow 2023 montre que 62% des développeurs considèrent la qualité technique de l'environnement de travail comme un critère de choix primaire.",{"type":29,"tag":37,"props":150,"children":151},{},[152,154,160],{"type":35,"value":153},"Une équipe avec un ",{"type":29,"tag":43,"props":155,"children":157},{"href":156},"/fr/dette-technique/introduction-maturite-engineering-5-niveaux",[158],{"type":35,"value":159},"niveau 4-5 de maturité engineering",{"type":35,"value":161}," attire et retient les développeurs seniors. Une équipe au niveau 1-2 a un turnover plus élevé et un coût de recrutement proportionnel. Le cercle vicieux : les bons développeurs partent à cause de la dette, les remplaçants sont moins expérimentés, la dette augmente.",{"type":29,"tag":66,"props":163,"children":164},{},[],{"type":29,"tag":166,"props":167,"children":172},"cta",{"cta":168,"href":169,"title":170,"type":171},"Réserver mon diagnostic gratuit →","https://app.kamanga.fr/forms/discovery-call","Votre engineering est-il un avantage concurrentiel ou un frein à la croissance ?","call",[173],{"type":29,"tag":37,"props":174,"children":175},{},[176],{"type":35,"value":177},"Vous sentez que votre engineering ne vous donne pas l'avantage qu'il devrait donner : le lead time est trop long, les bugs reviennent, les bons développeurs hésitent à rejoindre l'équipe. Un diagnostic de maturité engineering prend 2 jours. Il produit une vue claire de votre position et un plan d'action concret pour transformer votre engineering en levier de croissance.",{"type":29,"tag":66,"props":179,"children":180},{},[],{"type":29,"tag":70,"props":182,"children":184},{"id":183},"ce-que-les-équipes-délite-font-différemment",[185],{"type":35,"value":186},"Ce que les équipes d'élite font différemment",{"type":29,"tag":37,"props":188,"children":189},{},[190],{"type":35,"value":191},"La recherche DORA identifie 5 pratiques qui distinguent les équipes \"elite\" des autres, indépendamment de la taille ou du secteur :",{"type":29,"tag":37,"props":193,"children":194},{},[195,200],{"type":29,"tag":55,"props":196,"children":197},{},[198],{"type":35,"value":199},"1. Le trunk-based development",{"type":35,"value":201}," : intégration sur la branche principale au moins une fois par jour, feature flags pour isoler le code non-terminé. Réduit le coût de merge et les conflits d'intégration.",{"type":29,"tag":37,"props":203,"children":204},{},[205,210],{"type":29,"tag":55,"props":206,"children":207},{},[208],{"type":35,"value":209},"2. La suite de tests automatisés",{"type":35,"value":211}," : tests qui s'exécutent en moins de 10 minutes sur chaque commit, avec un objectif de non-régression garanti. Conditionne la confiance pour déployer fréquemment.",{"type":29,"tag":37,"props":213,"children":214},{},[215,220],{"type":29,"tag":55,"props":216,"children":217},{},[218],{"type":35,"value":219},"3. Le continuous deployment",{"type":35,"value":221}," : automatisation complète du pipeline de déploiement. Aucune intervention manuelle entre le commit et la prod. Réduit le risque humain et le lead time.",{"type":29,"tag":37,"props":223,"children":224},{},[225,230],{"type":29,"tag":55,"props":226,"children":227},{},[228],{"type":35,"value":229},"4. Le monitoring et l'observabilité",{"type":35,"value":231}," : visibilité temps réel sur les métriques de performance et d'erreur. MTTR \u003C 1 heure pour les incidents P1.",{"type":29,"tag":37,"props":233,"children":234},{},[235,240],{"type":29,"tag":55,"props":236,"children":237},{},[238],{"type":35,"value":239},"5. La culture du learning",{"type":35,"value":241}," : blameless post-mortems, partage de knowledge structuré, temps dédié à l'apprentissage. Les équipes qui apprennent progressent ; les autres stagnent. C'est ce que les travaux de Nicole Forsgren sur la culture DevOps démontrent de façon rigoureuse.",{"type":29,"tag":66,"props":243,"children":244},{},[],{"type":29,"tag":70,"props":246,"children":248},{"id":247},"comment-traduire-la-qualité-engineering-en-langage-board",[249],{"type":35,"value":250},"Comment traduire la qualité engineering en langage board",{"type":29,"tag":37,"props":252,"children":253},{},[254],{"type":35,"value":255},"Le board ne comprend pas \"maturité engineering\" ou \"dette technique\". Il comprend :",{"type":29,"tag":37,"props":257,"children":258},{},[259,264],{"type":29,"tag":55,"props":260,"children":261},{},[262],{"type":35,"value":263},"Risque opérationnel",{"type":35,"value":265}," : \"Notre taux d'incidents de prod génère X€ de coût direct et Y€ de risque réglementaire par an. Un investissement de Z€ en qualité technique réduit ce risque de 70% en 12 mois.\"",{"type":29,"tag":37,"props":267,"children":268},{},[269,274],{"type":29,"tag":55,"props":270,"children":271},{},[272],{"type":35,"value":273},"Efficacité du capital",{"type":35,"value":275}," : \"Nous investissons 40% de notre capacité engineering à maintenir l'existant. Un programme de 6 mois ramène ce chiffre à 20%, soit l'équivalent de 8 développeurs à plein temps récupérés pour l'innovation.\"",{"type":29,"tag":37,"props":277,"children":278},{},[279,284],{"type":29,"tag":55,"props":280,"children":281},{},[282],{"type":35,"value":283},"Avantage compétitif",{"type":35,"value":285}," : \"Notre lead time actuel de 6 semaines signifie que nous mettons 6 semaines à répondre aux opportunités de marché. Nos principaux concurrents sont à 2 semaines. Le delta nous coûte X% de chiffre d'affaires sur les opportunités time-sensitive.\"",{"type":29,"tag":37,"props":287,"children":288},{},[289],{"type":35,"value":290},"Ces trois angles permettent à un board de comprendre que l'investissement en qualité engineering n'est pas une dépense technique, c'est un levier de performance business. Ce changement de cadrage est souvent ce qui débloque les budgets que les CTOs n'arrivaient pas à obtenir en présentant le sujet dans sa version technique.",{"type":29,"tag":66,"props":292,"children":293},{},[],{"type":29,"tag":70,"props":295,"children":297},{"id":296},"le-plan-daction-pour-les-12-prochains-mois",[298],{"type":35,"value":299},"Le plan d'action pour les 12 prochains mois",{"type":29,"tag":37,"props":301,"children":302},{},[303],{"type":35,"value":304},"Si vous êtes au niveau 2-3 aujourd'hui et souhaitez faire de l'engineering un avantage concurrentiel, voici la séquence :",{"type":29,"tag":37,"props":306,"children":307},{},[308,313],{"type":29,"tag":55,"props":309,"children":310},{},[311],{"type":35,"value":312},"Trimestre 1",{"type":35,"value":314}," : Mesurer. Implémenter les 4 métriques DORA, quantifier l'absorption de la dette technique, identifier les 2-3 modules critiques qui génèrent le plus de coûts.",{"type":29,"tag":37,"props":316,"children":317},{},[318,323,325,331],{"type":29,"tag":55,"props":319,"children":320},{},[321],{"type":35,"value":322},"Trimestre 2",{"type":35,"value":324}," : Stabiliser. Programme de réduction de la dette sur les modules critiques, stabilisation de la CI/CD, installation des ",{"type":29,"tag":43,"props":326,"children":328},{"href":327},"/fr/dette-technique/outils-analyse-statique-2026",[329],{"type":35,"value":330},"outils d'analyse statique",{"type":35,"value":332},".",{"type":29,"tag":37,"props":334,"children":335},{},[336,341,343,349],{"type":29,"tag":55,"props":337,"children":338},{},[339],{"type":35,"value":340},"Trimestre 3",{"type":35,"value":342}," : Accélérer. Réduction du lead time sur un flux de delivery cible, introduction du continuous deployment, formation sur les pratiques avancées (TDD, ",{"type":29,"tag":43,"props":344,"children":346},{"href":345},"/fr/dette-technique/pair-programming-roi-conditions",[347],{"type":35,"value":348},"pair programming ciblé",{"type":35,"value":350},").",{"type":29,"tag":37,"props":352,"children":353},{},[354,359],{"type":29,"tag":55,"props":355,"children":356},{},[357],{"type":35,"value":358},"Trimestre 4",{"type":35,"value":360}," : Consolider et mesurer le ROI. Comparer les métriques de T4 vs T1. Préparer le business case pour le prochain cycle d'investissement.",{"type":29,"tag":66,"props":362,"children":363},{},[],{"type":29,"tag":70,"props":365,"children":367},{"id":366},"faq-sur-lengineering-comme-avantage-concurrentiel",[368],{"type":35,"value":369},"FAQ sur l'engineering comme avantage concurrentiel",{"type":29,"tag":371,"props":372,"children":373},"details",{},[374,380],{"type":29,"tag":375,"props":376,"children":377},"summary",{},[378],{"type":35,"value":379},"1. L'IA ne va-t-elle pas rendre ces investissements obsolètes en quelques années ?",{"type":29,"tag":37,"props":381,"children":382},{},[383],{"type":35,"value":384},"Non, et c'est précisément l'inverse. L'IA rend les pratiques d'engineering solides plus importantes, pas moins. Le code généré par l'IA doit être testé, reviewé, maintenu et gouverné. Une équipe sans bonnes pratiques génère de la dette technique à la vitesse de l'IA. Une équipe avec de bonnes pratiques bénéficie pleinement de la productivité de l'IA tout en maintenant la qualité.",{"type":29,"tag":371,"props":386,"children":387},{},[388,393],{"type":29,"tag":375,"props":389,"children":390},{},[391],{"type":35,"value":392},"2. Ces pratiques sont-elles accessibles aux petites équipes (\u003C 10 développeurs) ?",{"type":29,"tag":37,"props":394,"children":395},{},[396],{"type":35,"value":397},"Oui, et souvent plus rapidement. Une équipe de 8 développeurs peut atteindre le niveau 4 en 6 mois : la coordination est simple, les standards s'adoptent vite, et l'impact de chaque amélioration est immédiatement visible. Les pratiques DORA (CI/CD, trunk-based development, monitoring) s'appliquent quelle que soit la taille de l'équipe.",{"type":29,"tag":371,"props":399,"children":400},{},[401,406],{"type":29,"tag":375,"props":402,"children":403},{},[404],{"type":35,"value":405},"3. Comment prouver la valeur de l'investissement engineering à un investisseur lors d'une due diligence ?",{"type":29,"tag":37,"props":407,"children":408},{},[409],{"type":35,"value":410},"Quatre métriques convaincantes pour une due diligence : deployment frequency (> 1/semaine), lead time (\u003C 1 semaine), change failure rate (\u003C 5%), MTTR (\u003C 1 heure). Ces chiffres montrent la capacité à itérer rapidement et à maintenir la stabilité. Je recommande de préparer un \"engineering health report\" avant toute due diligence : c'est ce qui a fait la différence pour ce client dont je parlais.",{"type":29,"tag":371,"props":412,"children":413},{},[414,419],{"type":29,"tag":375,"props":415,"children":416},{},[417],{"type":35,"value":418},"4. Par où commencer si le board ne voit pas encore la valeur de l'engineering ?",{"type":29,"tag":37,"props":420,"children":421},{},[422],{"type":35,"value":423},"Commencer par un incident et le transformer en business case. La prochaine fois qu'un incident de prod a un impact business mesurable, calculer le coût total : temps de résolution, impact sur le revenu, coût réputationnel. Montrer que des pratiques standard auraient prévenu cet incident. Un seul incident bien documenté vaut mieux que dix slides de théorie.",{"type":29,"tag":371,"props":425,"children":426},{},[427,432],{"type":29,"tag":375,"props":428,"children":429},{},[430],{"type":35,"value":431},"5. Comment maintenir les standards de qualité quand la croissance crée une pression intense sur la livraison ?",{"type":29,"tag":37,"props":433,"children":434},{},[435],{"type":35,"value":436},"La croissance augmente la pression et teste les standards. Les équipes qui maintiennent la qualité pendant la croissance ont toutes une chose en commun : le \"budget technique\" est non-négociable. 20% de la capacité de l'équipe est protégée pour la qualité, les tests, et la réduction de la dette, quelles que soient les pressions externes. Sans ce budget explicite et défendu par le CTO, la qualité se dégrade invariablement sous la pression.",{"type":29,"tag":66,"props":438,"children":439},{},[],{"type":29,"tag":166,"props":441,"children":446},{"cta":442,"href":443,"title":444,"type":445},"Accéder à l'assessment gratuit →","/mes-ressources","Ressource gratuite : Engineering Maturity Self-Assessment","resource",[447],{"type":29,"tag":37,"props":448,"children":449},{},[450],{"type":35,"value":451},"30 questions pour évaluer votre maturité engineering sur 5 dimensions. Score automatique, positionnement sur les 5 niveaux, et les 3 actions prioritaires pour transformer votre engineering en avantage concurrentiel mesurable.",{"title":8,"searchDepth":453,"depth":453,"links":454},2,[455,456,462,463,464,465],{"id":72,"depth":453,"text":75},{"id":101,"depth":453,"text":104,"children":457},[458,460,461],{"id":108,"depth":459,"text":111},3,{"id":124,"depth":459,"text":127},{"id":140,"depth":459,"text":143},{"id":183,"depth":453,"text":186},{"id":247,"depth":453,"text":250},{"id":296,"depth":453,"text":299},{"id":366,"depth":453,"text":369},"markdown","content:fr:dette-technique:ingenierie-logicielle-avantage-concurrentiel.md","content","fr/dette-technique/ingenierie-logicielle-avantage-concurrentiel.md","fr/dette-technique/ingenierie-logicielle-avantage-concurrentiel","md",{"_path":345,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":473,"description":474,"id":475,"date":476,"listed":13,"nocomments":7,"hidden":7,"categories":477,"tags":478,"--cover":482,"readingTime":483,"body":487,"_type":466,"_id":1009,"_source":468,"_file":1010,"_stem":1011,"_extension":471},"Pair programming : ROI réel et conditions de succès","Les études montrent un ROI de 15% sur la qualité à long terme — mais seulement dans certaines conditions. Ce que la recherche dit vraiment sur le pair programming.",31,"2026-03-16",[6],[479,480,481],"Pair Programming","ROI","Pratiques Engineering","covers/articles/pair-programming-roi.jpg",{"text":21,"minutes":484,"time":485,"words":486},7.3,438000,1460,{"type":26,"children":488,"toc":996},[489,494,499,507,512,515,521,540,545,564,574,577,583,588,598,608,618,628,631,640,643,649,655,660,685,690,708,714,719,724,730,763,769,774,777,783,793,803,813,816,822,832,842,860,877,880,886,899,912,925,946,959,962,970,973,981,986],{"type":29,"tag":30,"props":490,"children":492},{"id":491},"pair-programming-roi-réel-et-conditions-de-succès",[493],{"type":35,"value":473},{"type":29,"tag":37,"props":495,"children":496},{},[497],{"type":35,"value":498},"J'accompagnais une équipe dans une banque d'investissement parisienne : 18 développeurs, une culture tech solide. Trois nouveaux développeurs venaient de rejoindre l'équipe. Habituellement, leur montée en compétence prenait 8 semaines avant d'être autonomes sur les modules critiques. J'ai proposé d'introduire le pair programming exclusivement sur leur onboarding : chaque nouveau développeur pairait systématiquement avec un senior sur ses premières stories complexes. Le résultat, mesuré 6 semaines plus tard : les trois nouvelles recrues étaient autonomes en 4 semaines au lieu de 8. Et sans qu'on le planifie, les seniors avaient commencé à se pairer entre eux sur les stories de refactoring difficiles.",{"type":29,"tag":37,"props":500,"children":501},{},[502],{"type":29,"tag":55,"props":503,"children":504},{},[505],{"type":35,"value":506},"Le pair programming est soit adulé par les équipes XP, soit rejeté par les managers qui voient \"deux personnes sur un seul clavier\". Rarement évalué objectivement. Or les données sont là, et elles sont plus nuancées que ce que les deux camps affirment.",{"type":29,"tag":37,"props":508,"children":509},{},[510],{"type":35,"value":511},"J'ai introduit le pair programming dans une dizaine d'équipes au cours des 10 dernières années, dans la finance, les médias, les télécoms. Certaines fois, ça a transformé la culture et la qualité. D'autres fois, ça a créé des tensions et été abandonné en 3 semaines. La différence ne tenait pas à la pratique, mais aux conditions d'introduction.",{"type":29,"tag":66,"props":513,"children":514},{},[],{"type":29,"tag":70,"props":516,"children":518},{"id":517},"ce-que-la-recherche-dit-vraiment",[519],{"type":35,"value":520},"Ce que la recherche dit vraiment",{"type":29,"tag":37,"props":522,"children":523},{},[524,526,531,533,538],{"type":35,"value":525},"L'étude de référence est celle de Laurie Williams et Robert Kessler (2000, University of Utah) : sur un projet de développement logiciel, le pair programming produit un code avec ",{"type":29,"tag":55,"props":527,"children":528},{},[529],{"type":35,"value":530},"15% moins de défauts",{"type":35,"value":532}," que le développement solo, mais avec ",{"type":29,"tag":55,"props":534,"children":535},{},[536],{"type":35,"value":537},"15% de temps supplémentaire",{"type":35,"value":539}," à court terme.",{"type":29,"tag":37,"props":541,"children":542},{},[543],{"type":35,"value":544},"Le ROI net sur le long terme est positif pour une raison simple : le coût d'un défaut en production est 10 à 100 fois supérieur au coût de le détecter pendant le développement. 15% de temps en plus pour 15% de défauts en moins, c'est rentable dès que les défauts ont un coût significatif.",{"type":29,"tag":37,"props":546,"children":547},{},[548,550,555,557,562],{"type":35,"value":549},"Une méta-analyse de 2007 (Hannay et al., 18 études) nuance cependant les résultats : le bénéfice du pair programming est plus élevé pour les ",{"type":29,"tag":55,"props":551,"children":552},{},[553],{"type":35,"value":554},"tâches complexes",{"type":35,"value":556}," et ",{"type":29,"tag":55,"props":558,"children":559},{},[560],{"type":35,"value":561},"les juniors qui travaillent avec des seniors",{"type":35,"value":563},". Sur des tâches simples ou répétitives, l'overhead est présent sans le bénéfice proportionnel.",{"type":29,"tag":37,"props":565,"children":566},{},[567,572],{"type":29,"tag":55,"props":568,"children":569},{},[570],{"type":35,"value":571},"Ce que ça signifie concrètement",{"type":35,"value":573}," : le pair programming n'est pas une pratique à appliquer uniformément. C'est une pratique à utiliser sur les bonnes tâches, dans les bonnes conditions.",{"type":29,"tag":66,"props":575,"children":576},{},[],{"type":29,"tag":70,"props":578,"children":580},{"id":579},"quand-le-pair-programming-dégrade-la-productivité",[581],{"type":35,"value":582},"Quand le pair programming dégrade la productivité",{"type":29,"tag":37,"props":584,"children":585},{},[586],{"type":35,"value":587},"Avant les conditions de succès, les conditions d'échec, parce qu'elles sont plus fréquentes.",{"type":29,"tag":37,"props":589,"children":590},{},[591,596],{"type":29,"tag":55,"props":592,"children":593},{},[594],{"type":35,"value":595},"Tâches trop simples",{"type":35,"value":597}," : un bug trivial, une modification de configuration, une story de 1 point. L'overhead cognitif de coordonner deux personnes dépasse le bénéfice. Résultat : frustration et sentiment de temps perdu.",{"type":29,"tag":37,"props":599,"children":600},{},[601,606],{"type":29,"tag":55,"props":602,"children":603},{},[604],{"type":35,"value":605},"Parité trop déséquilibrée sans intention pédagogique",{"type":35,"value":607}," : un senior qui \"dicte\" pendant qu'un junior \"exécute\" n'est pas du pair programming, c'est de la supervision déguisée. C'est épuisant pour les deux et n'apporte pas les bénéfices de qualité attendus.",{"type":29,"tag":37,"props":609,"children":610},{},[611,616],{"type":29,"tag":55,"props":612,"children":613},{},[614],{"type":35,"value":615},"Sessions trop longues sans rotation",{"type":35,"value":617}," : après 90 minutes de pair programming intensif, la fatigue cognitive s'accumule. Des sessions de plus de 2 heures sans pause produisent des erreurs que des sessions de 90 minutes n'auraient pas produites.",{"type":29,"tag":37,"props":619,"children":620},{},[621,626],{"type":29,"tag":55,"props":622,"children":623},{},[624],{"type":35,"value":625},"Introduction imposée sans explication",{"type":35,"value":627}," : \"Désormais, toutes les stories se font en pair programming.\" Sans comprendre pourquoi, les développeurs perçoivent la pratique comme un manque de confiance. La résistance est immédiate et dure.",{"type":29,"tag":66,"props":629,"children":630},{},[],{"type":29,"tag":166,"props":632,"children":634},{"cta":168,"href":169,"title":633,"type":171},"Vous voulez introduire le pair programming mais vous ne savez pas comment éviter la résistance ?",[635],{"type":29,"tag":37,"props":636,"children":637},{},[638],{"type":35,"value":639},"Vous avez tenté de lancer le pair programming et ça n'a pas pris, ou vous voulez bien faire du premier coup pour ne pas brûler le capital de confiance de l'équipe. L'introduction réussie dépend de la communication des objectifs, du choix des premières tâches, et du format adapté à votre contexte. En 30 minutes, on définit la stratégie adaptée.",{"type":29,"tag":66,"props":641,"children":642},{},[],{"type":29,"tag":70,"props":644,"children":646},{"id":645},"les-4-conditions-de-succès",[647],{"type":35,"value":648},"Les 4 conditions de succès",{"type":29,"tag":106,"props":650,"children":652},{"id":651},"condition-1-le-bon-contexte-de-tâche",[653],{"type":35,"value":654},"Condition 1 : Le bon contexte de tâche",{"type":29,"tag":37,"props":656,"children":657},{},[658],{"type":35,"value":659},"Le pair programming apporte le plus de valeur sur :",{"type":29,"tag":661,"props":662,"children":663},"ul",{},[664,670,675,680],{"type":29,"tag":665,"props":666,"children":667},"li",{},[668],{"type":35,"value":669},"Les tâches complexes avec des contraintes non-triviales",{"type":29,"tag":665,"props":671,"children":672},{},[673],{"type":35,"value":674},"Les tâches dans des zones de code peu connues ou à haut risque",{"type":29,"tag":665,"props":676,"children":677},{},[678],{"type":35,"value":679},"Les tâches d'architecture ou de design",{"type":29,"tag":665,"props":681,"children":682},{},[683],{"type":35,"value":684},"L'onboarding d'un nouveau développeur sur un module spécifique",{"type":29,"tag":37,"props":686,"children":687},{},[688],{"type":35,"value":689},"Il apporte peu de valeur sur :",{"type":29,"tag":661,"props":691,"children":692},{},[693,698,703],{"type":29,"tag":665,"props":694,"children":695},{},[696],{"type":35,"value":697},"Les tâches répétitives et bien définies",{"type":29,"tag":665,"props":699,"children":700},{},[701],{"type":35,"value":702},"Les investigations longues et exploratoires (pair review après, pas pair programming pendant)",{"type":29,"tag":665,"props":704,"children":705},{},[706],{"type":35,"value":707},"Les optimisations de performance nécessitant du profiling individuel",{"type":29,"tag":106,"props":709,"children":711},{"id":710},"condition-2-la-rotation-du-rôle-drivernavigator",[712],{"type":35,"value":713},"Condition 2 : La rotation du rôle driver/navigator",{"type":29,"tag":37,"props":715,"children":716},{},[717],{"type":35,"value":718},"Le format classique est driver/navigator : le driver écrit le code, le navigator réfléchit à la direction et détecte les erreurs. La rotation doit être explicite et fréquente, toutes les 25 à 30 minutes (technique Pomodoro adaptée).",{"type":29,"tag":37,"props":720,"children":721},{},[722],{"type":35,"value":723},"Sans rotation, l'un des deux s'ennuie ou se décroche. Avec rotation, les deux restent engagés et le code bénéficie de deux perspectives actives.",{"type":29,"tag":106,"props":725,"children":727},{"id":726},"condition-3-la-parité-ajustée-à-lobjectif",[728],{"type":35,"value":729},"Condition 3 : La parité ajustée à l'objectif",{"type":29,"tag":661,"props":731,"children":732},{},[733,743,753],{"type":29,"tag":665,"props":734,"children":735},{},[736,741],{"type":29,"tag":55,"props":737,"children":738},{},[739],{"type":35,"value":740},"Objectif qualité",{"type":35,"value":742}," : deux développeurs de niveau similaire, l'un challenge l'autre, la qualité est le produit des deux regards",{"type":29,"tag":665,"props":744,"children":745},{},[746,751],{"type":29,"tag":55,"props":747,"children":748},{},[749],{"type":35,"value":750},"Objectif formation",{"type":35,"value":752}," : un senior + un junior avec intention pédagogique explicite, le senior explique ses raisonnements, le junior pose des questions sans être jugé",{"type":29,"tag":665,"props":754,"children":755},{},[756,761],{"type":29,"tag":55,"props":757,"children":758},{},[759],{"type":35,"value":760},"Objectif connaissance métier",{"type":35,"value":762}," : un développeur qui connaît le code + un développeur qui connaît le métier, le knowledge sharing est bidirectionnel",{"type":29,"tag":106,"props":764,"children":766},{"id":765},"condition-4-la-durée-et-le-rythme",[767],{"type":35,"value":768},"Condition 4 : La durée et le rythme",{"type":29,"tag":37,"props":770,"children":771},{},[772],{"type":35,"value":773},"Sessions recommandées : 90 à 120 minutes maximum par bloc, avec une pause de 15 minutes. Maximum 4 heures de pair programming par jour pour une personne. Au-delà, la qualité baisse et la fatigue s'accumule.",{"type":29,"tag":66,"props":775,"children":776},{},[],{"type":29,"tag":70,"props":778,"children":780},{"id":779},"les-3-formats",[781],{"type":35,"value":782},"Les 3 formats",{"type":29,"tag":37,"props":784,"children":785},{},[786,791],{"type":29,"tag":55,"props":787,"children":788},{},[789],{"type":35,"value":790},"Driver/Navigator (classique)",{"type":35,"value":792}," : un développeur code, l'autre navigue. Rotation toutes les 25-30 minutes. Format le plus connu, le plus polyvalent.",{"type":29,"tag":37,"props":794,"children":795},{},[796,801],{"type":29,"tag":55,"props":797,"children":798},{},[799],{"type":35,"value":800},"Ping-Pong (TDD)",{"type":35,"value":802}," : développeur A écrit un test qui échoue, développeur B écrit le code minimum pour le faire passer, développeur A écrit le prochain test. Particulièrement efficace pour ancrer le TDD dans les habitudes de l'équipe, et pour rendre le TDD moins aride pour les développeurs qui résistent à l'écriture de tests.",{"type":29,"tag":37,"props":804,"children":805},{},[806,811],{"type":29,"tag":55,"props":807,"children":808},{},[809],{"type":35,"value":810},"Mob programming (Ensemble)",{"type":35,"value":812}," : l'équipe entière (3 à 6 personnes) travaille sur le même problème avec un seul clavier. Un driver, le reste navigue. Rotation toutes les 7-15 minutes. Très efficace pour les décisions d'architecture et l'onboarding accéléré, coûteux en temps d'équipe.",{"type":29,"tag":66,"props":814,"children":815},{},[],{"type":29,"tag":70,"props":817,"children":819},{"id":818},"comment-lintroduire-progressivement-sans-résistance",[820],{"type":35,"value":821},"Comment l'introduire progressivement sans résistance",{"type":29,"tag":37,"props":823,"children":824},{},[825,830],{"type":29,"tag":55,"props":826,"children":827},{},[828],{"type":35,"value":829},"Semaine 1-2",{"type":35,"value":831}," : proposition volontaire. \"Si quelqu'un veut essayer le pair programming sur sa prochaine story complexe, voilà comment ça fonctionne.\" Trouver 2 volontaires enthousiastes.",{"type":29,"tag":37,"props":833,"children":834},{},[835,840],{"type":29,"tag":55,"props":836,"children":837},{},[838],{"type":35,"value":839},"Semaine 3-4",{"type":35,"value":841}," : débrief public. Partager les retours des premiers pairs en rétrospective. Ne pas idéaliser, partager les difficultés aussi.",{"type":29,"tag":37,"props":843,"children":844},{},[845,850,852,858],{"type":29,"tag":55,"props":846,"children":847},{},[848],{"type":35,"value":849},"Mois 2",{"type":35,"value":851}," : intégrer dans la ",{"type":29,"tag":43,"props":853,"children":855},{"href":854},"/fr/dette-technique/definition-of-done-qualite",[856],{"type":35,"value":857},"DoD",{"type":35,"value":859}," pour les stories complexes (score > M en sizing). Pas pour toutes les stories.",{"type":29,"tag":37,"props":861,"children":862},{},[863,868,870,876],{"type":29,"tag":55,"props":864,"children":865},{},[866],{"type":35,"value":867},"Mois 3+",{"type":35,"value":869}," : laisser l'équipe définir ses propres règles sur quand pairer. Les équipes qui ont le contrôle sur leur pratique l'adoptent plus durablement que celles qui la subissent. Le pair programming s'intègre naturellement dans les ",{"type":29,"tag":43,"props":871,"children":873},{"href":872},"/fr/management/engineering-culture-rituels",[874],{"type":35,"value":875},"rituels de culture engineering",{"type":35,"value":332},{"type":29,"tag":66,"props":878,"children":879},{},[],{"type":29,"tag":70,"props":881,"children":883},{"id":882},"faq-sur-le-pair-programming",[884],{"type":35,"value":885},"FAQ sur le pair programming",{"type":29,"tag":371,"props":887,"children":888},{},[889,894],{"type":29,"tag":375,"props":890,"children":891},{},[892],{"type":35,"value":893},"1. Le pair programming est-il compatible avec le télétravail ?",{"type":29,"tag":37,"props":895,"children":896},{},[897],{"type":35,"value":898},"Oui, avec les bons outils. VS Code Live Share, JetBrains Code With Me, et Tuple sont conçus pour le pair programming à distance. La qualité est légèrement inférieure à l'in-person (plus de latence dans la communication) mais tout à fait viable. La règle : pas de pair programming à distance sur des connexions \u003C 10 Mbps ou avec des outils de visioconférence trop lourds.",{"type":29,"tag":371,"props":900,"children":901},{},[902,907],{"type":29,"tag":375,"props":903,"children":904},{},[905],{"type":35,"value":906},"2. Comment gérer le pair programming avec des développeurs introvertis ?",{"type":29,"tag":37,"props":908,"children":909},{},[910],{"type":35,"value":911},"Le pair programming intense et continu est épuisant pour les introvertis. Solution : sessions de 90 minutes maximum, avec des blocs de travail solo entre les sessions. Le format ping-pong TDD fonctionne souvent mieux que le driver/navigator pour les introvertis : les rôles sont clairs, alternés, et le focus est sur le code, pas sur la conversation.",{"type":29,"tag":371,"props":913,"children":914},{},[915,920],{"type":29,"tag":375,"props":916,"children":917},{},[918],{"type":35,"value":919},"3. Faut-il mesurer le ROI du pair programming dans notre équipe ?",{"type":29,"tag":37,"props":921,"children":922},{},[923],{"type":35,"value":924},"Oui, et c'est simple. Mesurer sur 2 mois : le taux de bugs sur les stories développées en pair vs solo, et le cycle time des stories complexes. Si le taux de bugs baisse significativement (> 15%), le ROI est positif même avec un overhead de temps modéré. Sur l'équipe bancaire que j'ai mentionnée, la réduction du temps d'onboarding de 8 à 4 semaines représentait seule 20 000€ d'économie par recrue.",{"type":29,"tag":371,"props":926,"children":927},{},[928,933],{"type":29,"tag":375,"props":929,"children":930},{},[931],{"type":35,"value":932},"4. Le pair programming remplace-t-il la code review ?",{"type":29,"tag":37,"props":934,"children":935},{},[936,938,944],{"type":35,"value":937},"Non. Le pair programming réduit le besoin de review approfondie (le code a déjà eu un second regard) mais ne la remplace pas. Une ",{"type":29,"tag":43,"props":939,"children":941},{"href":940},"/fr/intelligence-artificielle/ia-code-review-retour-experience",[942],{"type":35,"value":943},"code review",{"type":35,"value":945}," asynchrone reste nécessaire pour : la cohérence avec les standards de l'équipe, les aspects de sécurité, et le regard externe d'un développeur non impliqué dans la session.",{"type":29,"tag":371,"props":947,"children":948},{},[949,954],{"type":29,"tag":375,"props":950,"children":951},{},[952],{"type":35,"value":953},"5. Comment justifier le pair programming au management qui voit \"deux développeurs sur un seul clavier\" ?",{"type":29,"tag":37,"props":955,"children":956},{},[957],{"type":35,"value":958},"Le même argument que pour les tests : le coût de corriger un bug en production est 10 à 100 fois le coût de le détecter pendant le développement. 15% de temps en plus pendant le développement pour 15% de défauts en moins, c'est un ROI positif sur la durée. Je propose un pilote de 6 semaines avec mesure des métriques de qualité avant/après : les chiffres parlent d'eux-mêmes.",{"type":29,"tag":66,"props":960,"children":961},{},[],{"type":29,"tag":166,"props":963,"children":964},{"cta":442,"href":443,"title":444,"type":445},[965],{"type":29,"tag":37,"props":966,"children":967},{},[968],{"type":35,"value":969},"L'assessment évalue vos pratiques de collaboration et de qualité, incluant les revues de code et les pratiques de développement collaboratif. Score de maturité et plan d'action sur 90 jours.",{"type":29,"tag":66,"props":971,"children":972},{},[],{"type":29,"tag":37,"props":974,"children":975},{},[976],{"type":29,"tag":55,"props":977,"children":978},{},[979],{"type":35,"value":980},"Vous voulez savoir où en est vraiment votre équipe ?",{"type":29,"tag":37,"props":982,"children":983},{},[984],{"type":35,"value":985},"Téléchargez le template d'audit Engineering Health Report — un outil structuré pour diagnostiquer la qualité de votre code, votre couverture de tests et votre niveau de dette technique en moins d'une heure.",{"type":29,"tag":37,"props":987,"children":988},{},[989,991],{"type":35,"value":990},"→ ",{"type":29,"tag":55,"props":992,"children":993},{},[994],{"type":35,"value":995},"Téléchargez le template d'audit",{"title":8,"searchDepth":453,"depth":453,"links":997},[998,999,1000,1006,1007,1008],{"id":517,"depth":453,"text":520},{"id":579,"depth":453,"text":582},{"id":645,"depth":453,"text":648,"children":1001},[1002,1003,1004,1005],{"id":651,"depth":459,"text":654},{"id":710,"depth":459,"text":713},{"id":726,"depth":459,"text":729},{"id":765,"depth":459,"text":768},{"id":779,"depth":453,"text":782},{"id":818,"depth":453,"text":821},{"id":882,"depth":453,"text":885},"content:fr:dette-technique:pair-programming-roi-conditions.md","fr/dette-technique/pair-programming-roi-conditions.md","fr/dette-technique/pair-programming-roi-conditions",{"_path":854,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":1013,"description":1014,"id":1015,"date":1016,"listed":13,"nocomments":7,"hidden":7,"categories":1017,"tags":1018,"--cover":1022,"readingTime":1023,"body":1027,"_type":466,"_id":1642,"_source":468,"_file":1643,"_stem":1644,"_extension":471},"Définir une Definition of Done qui améliore vraiment la qualité","Une DoD vague produit une qualité vague. Comment construire une Definition of Done qui tient ses promesses et s'améliore dans le temps.",26,"2026-03-04",[6],[1019,1020,1021],"Definition of Done","Qualité","Agile","covers/articles/definition-of-done-qualite.jpg",{"text":21,"minutes":1024,"time":1025,"words":1026},7.46,447600,1492,{"type":26,"children":1028,"toc":1632},[1029,1034,1039,1047,1052,1055,1061,1079,1082,1088,1105,1110,1120,1138,1143,1153,1156,1162,1177,1182,1192,1202,1220,1230,1240,1250,1260,1269,1272,1281,1284,1290,1295,1305,1315,1325,1335,1344,1347,1353,1358,1368,1386,1398,1407,1410,1416,1425,1428,1434,1539,1542,1548,1561,1574,1595,1608,1621,1624],{"type":29,"tag":30,"props":1030,"children":1032},{"id":1031},"définir-une-definition-of-done-qui-améliore-vraiment-la-qualité",[1033],{"type":35,"value":1013},{"type":29,"tag":37,"props":1035,"children":1036},{},[1037],{"type":35,"value":1038},"Je me souviens d'une équipe dans une grande organisation de retraite complémentaire. Ils avaient une DoD, une vraie, écrite, affichée dans la salle. Je leur ai demandé comment elle était utilisée. Le Scrum Master a répondu avec un sourire gêné : \"En théorie, elle est vérifiée avant chaque merge. En pratique, en fin de sprint, on coche tout et on merge pour tenir le sprint.\" J'ai vérifié les métriques : 38% des bugs de prod de l'année précédente étaient apparus dans des stories \"Done\" selon la DoD de l'équipe. Ce n'était pas un problème de personnes. C'était un problème de contrat.",{"type":29,"tag":37,"props":1040,"children":1041},{},[1042],{"type":29,"tag":55,"props":1043,"children":1044},{},[1045],{"type":35,"value":1046},"La DoD la plus fréquente que je rencontre dans les équipes : \"Le code est mergé et testé.\" C'est une description, pas une Definition of Done. Et cette ambiguïté est directement responsable de 30 à 40% des bugs qui atteignent la production.",{"type":29,"tag":37,"props":1048,"children":1049},{},[1050],{"type":35,"value":1051},"La Definition of Done est le contrat de qualité de l'équipe. Quand elle est vague, chaque développeur l'interprète différemment. Quand elle est absente, la qualité dépend de la conscience professionnelle individuelle, ce qui est insuffisant pour garantir la cohérence.",{"type":29,"tag":66,"props":1053,"children":1054},{},[],{"type":29,"tag":70,"props":1056,"children":1058},{"id":1057},"avant-de-commencer-les-prérequis",[1059],{"type":35,"value":1060},"Avant de commencer : les prérequis",{"type":29,"tag":661,"props":1062,"children":1063},{},[1064,1069,1074],{"type":29,"tag":665,"props":1065,"children":1066},{},[1067],{"type":35,"value":1068},"L'équipe a déjà une DoD existante (même minimale ou informelle) à partir de laquelle progresser",{"type":29,"tag":665,"props":1070,"children":1071},{},[1072],{"type":35,"value":1073},"Le Product Owner et le Tech Lead sont impliqués dans la redéfinition",{"type":29,"tag":665,"props":1075,"children":1076},{},[1077],{"type":35,"value":1078},"L'équipe a accès aux métriques de base : taux de bugs de prod, lead time, incidents récents",{"type":29,"tag":66,"props":1080,"children":1081},{},[],{"type":29,"tag":70,"props":1083,"children":1085},{"id":1084},"étape-1-auditer-la-dod-actuelle-ou-son-absence",[1086],{"type":35,"value":1087},"Étape 1 : Auditer la DoD actuelle (ou son absence)",{"type":29,"tag":37,"props":1089,"children":1090},{},[1091,1096,1098,1103],{"type":29,"tag":55,"props":1092,"children":1093},{},[1094],{"type":35,"value":1095},"Durée estimée",{"type":35,"value":1097}," : 2 heures en atelier équipe\n",{"type":29,"tag":55,"props":1099,"children":1100},{},[1101],{"type":35,"value":1102},"Qui",{"type":35,"value":1104}," : Toute l'équipe de développement + PO + Scrum Master",{"type":29,"tag":37,"props":1106,"children":1107},{},[1108],{"type":35,"value":1109},"Avant de construire une nouvelle DoD, comprendre pourquoi l'actuelle ne fonctionne pas.",{"type":29,"tag":37,"props":1111,"children":1112},{},[1113,1118],{"type":29,"tag":55,"props":1114,"children":1115},{},[1116],{"type":35,"value":1117},"Questions à poser en atelier",{"type":35,"value":1119}," :",{"type":29,"tag":661,"props":1121,"children":1122},{},[1123,1128,1133],{"type":29,"tag":665,"props":1124,"children":1125},{},[1126],{"type":35,"value":1127},"\"Quand considérez-vous qu'une story est vraiment terminée ?\" Recueillir les réponses individuelles avant la discussion.",{"type":29,"tag":665,"props":1129,"children":1130},{},[1131],{"type":35,"value":1132},"\"Citez un bug récent de prod : quelle étape de la DoD aurait dû le détecter ?\"",{"type":29,"tag":665,"props":1134,"children":1135},{},[1136],{"type":35,"value":1137},"\"Y a-t-il des items de notre DoD actuelle que personne ne vérifie vraiment ?\"",{"type":29,"tag":37,"props":1139,"children":1140},{},[1141],{"type":35,"value":1142},"Le dernier exercice est le plus révélateur. Dans 80% des équipes que j'accompagne, il existe des items \"fantômes\" dans la DoD : des critères formellement présents mais systématiquement contournés, généralement par manque de temps en fin de sprint.",{"type":29,"tag":37,"props":1144,"children":1145},{},[1146,1151],{"type":29,"tag":55,"props":1147,"children":1148},{},[1149],{"type":35,"value":1150},"Résultat attendu",{"type":35,"value":1152}," : une liste de ce qui fonctionne, ce qui est contourné, et ce qui manque.",{"type":29,"tag":66,"props":1154,"children":1155},{},[],{"type":29,"tag":70,"props":1157,"children":1159},{"id":1158},"étape-2-les-7-critères-non-négociables-dune-dod-solide",[1160],{"type":35,"value":1161},"Étape 2 : Les 7 critères non-négociables d'une DoD solide",{"type":29,"tag":37,"props":1163,"children":1164},{},[1165,1169,1171,1175],{"type":29,"tag":55,"props":1166,"children":1167},{},[1168],{"type":35,"value":1095},{"type":35,"value":1170}," : 1 heure de discussion\n",{"type":29,"tag":55,"props":1172,"children":1173},{},[1174],{"type":35,"value":1102},{"type":35,"value":1176}," : Tech Lead + PO",{"type":29,"tag":37,"props":1178,"children":1179},{},[1180],{"type":35,"value":1181},"Ces 7 critères sont le minimum pour une DoD qui protège réellement la qualité. Adaptez le wording à votre contexte, mais ne supprimez pas les catégories.",{"type":29,"tag":37,"props":1183,"children":1184},{},[1185,1190],{"type":29,"tag":55,"props":1186,"children":1187},{},[1188],{"type":35,"value":1189},"1. Code reviewé par au moins un pair",{"type":35,"value":1191},"\nPas \"par le Tech Lead si disponible\". Par n'importe quel pair, avec un retour documenté dans la PR. Spécifier le délai maximum : aucune PR ne reste sans review plus de 24 heures ouvrées.",{"type":29,"tag":37,"props":1193,"children":1194},{},[1195,1200],{"type":29,"tag":55,"props":1196,"children":1197},{},[1198],{"type":35,"value":1199},"2. Tests automatisés écrits ou mis à jour",{"type":35,"value":1201},"\nSpécifier le type : tests unitaires pour la logique, tests d'intégration pour les interactions avec les dépendances. Spécifier le seuil : la couverture du module ne descend pas en dessous du seuil de l'équipe.",{"type":29,"tag":37,"props":1203,"children":1204},{},[1205,1218],{"type":29,"tag":55,"props":1206,"children":1207},{},[1208,1210,1216],{"type":35,"value":1209},"3. ",{"type":29,"tag":43,"props":1211,"children":1213},{"href":1212},"/fr/pratiques-agiles/continuous-integration-fondamentaux",[1214],{"type":35,"value":1215},"Build CI",{"type":35,"value":1217}," vert sur la branche",{"type":35,"value":1219},"\nÉvident mais souvent contourné \"pour gagner du temps\". Un build rouge = story non terminée, sans exception.",{"type":29,"tag":37,"props":1221,"children":1222},{},[1223,1228],{"type":29,"tag":55,"props":1224,"children":1225},{},[1226],{"type":35,"value":1227},"4. Critères d'acceptation vérifiés et documentés",{"type":35,"value":1229},"\nChaque critère d'acceptation de la story doit avoir été testé manuellement ou automatiquement. Le résultat est documenté dans le ticket.",{"type":29,"tag":37,"props":1231,"children":1232},{},[1233,1238],{"type":29,"tag":55,"props":1234,"children":1235},{},[1236],{"type":35,"value":1237},"5. Pas de régression identifiée sur les scénarios existants",{"type":35,"value":1239},"\nUne suite de tests de régression tourne sur chaque PR. Si elle n'existe pas, c'est un déficit à combler progressivement, mais c'est un objectif de la DoD.",{"type":29,"tag":37,"props":1241,"children":1242},{},[1243,1248],{"type":29,"tag":55,"props":1244,"children":1245},{},[1246],{"type":35,"value":1247},"6. Documentation mise à jour si applicable",{"type":35,"value":1249},"\nPas de documentation pour chaque story. Mais si la story modifie une API publique, un flux d'intégration, ou une règle métier documentée, la documentation est mise à jour dans la même PR.",{"type":29,"tag":37,"props":1251,"children":1252},{},[1253,1258],{"type":29,"tag":55,"props":1254,"children":1255},{},[1256],{"type":35,"value":1257},"7. Déployable en environnement de staging sans intervention manuelle",{"type":35,"value":1259},"\nLa story doit pouvoir être déployée en staging en appuyant sur un bouton. Si un déploiement nécessite des étapes manuelles, c'est une dette technique à documenter et traiter.",{"type":29,"tag":37,"props":1261,"children":1262},{},[1263,1267],{"type":29,"tag":55,"props":1264,"children":1265},{},[1266],{"type":35,"value":1150},{"type":35,"value":1268}," : une DoD de 7 items précis et actionnables.",{"type":29,"tag":66,"props":1270,"children":1271},{},[],{"type":29,"tag":166,"props":1273,"children":1275},{"cta":168,"href":169,"title":1274,"type":171},"Votre équipe merge du code que tout le monde sait incomplet faute d'une DoD claire ?",[1276],{"type":29,"tag":37,"props":1277,"children":1278},{},[1279],{"type":35,"value":1280},"Vous voyez les patterns se répéter : les bugs arrivent en prod sur des stories \"Done\", les revues de code sont expéditives en fin de sprint, et personne n'ose vraiment bloquer un merge. Ce n'est pas de la mauvaise volonté, c'est l'absence d'un contrat clair. En 30 minutes, on identifie la vraie cause et on définit une DoD réaliste et tenue.",{"type":29,"tag":66,"props":1282,"children":1283},{},[],{"type":29,"tag":70,"props":1285,"children":1287},{"id":1286},"étape-3-lintégrer-dans-le-workflow-sans-friction",[1288],{"type":35,"value":1289},"Étape 3 : L'intégrer dans le workflow sans friction",{"type":29,"tag":37,"props":1291,"children":1292},{},[1293],{"type":35,"value":1294},"Une DoD que personne ne consulte n'existe pas. Elle doit être au bon endroit, au bon moment.",{"type":29,"tag":37,"props":1296,"children":1297},{},[1298,1303],{"type":29,"tag":55,"props":1299,"children":1300},{},[1301],{"type":35,"value":1302},"Dans Jira/Linear",{"type":35,"value":1304}," : ajouter la DoD comme checklist dans le template de story. Chaque item est coché (et non supprimé) avant de passer au statut \"Done\". L'outil garde une trace.",{"type":29,"tag":37,"props":1306,"children":1307},{},[1308,1313],{"type":29,"tag":55,"props":1309,"children":1310},{},[1311],{"type":35,"value":1312},"Dans GitHub/GitLab",{"type":35,"value":1314}," : créer un template de PR avec les items de la DoD comme checklist. Le développeur les coche au moment de la PR, pas après coup.",{"type":29,"tag":37,"props":1316,"children":1317},{},[1318,1323],{"type":29,"tag":55,"props":1319,"children":1320},{},[1321],{"type":35,"value":1322},"Dans le sprint review",{"type":35,"value":1324}," : le PO valide que les items de la DoD ont été respectés avant d'accepter la story. C'est le moment de fermeture du cycle qualité.",{"type":29,"tag":37,"props":1326,"children":1327},{},[1328,1333],{"type":29,"tag":55,"props":1329,"children":1330},{},[1331],{"type":35,"value":1332},"L'erreur à éviter",{"type":35,"value":1334}," : transformer la DoD en checklist bureaucratique que tout le monde coche sans vérifier. Pour éviter ça, j'inclus des items vérifiables de façon objective (build vert, coverage seuil) plutôt que subjectifs (\"le code est de qualité\").",{"type":29,"tag":37,"props":1336,"children":1337},{},[1338,1342],{"type":29,"tag":55,"props":1339,"children":1340},{},[1341],{"type":35,"value":1150},{"type":35,"value":1343}," : la DoD est intégrée dans les templates Jira et GitHub. Elle est visible au bon moment dans le workflow.",{"type":29,"tag":66,"props":1345,"children":1346},{},[],{"type":29,"tag":70,"props":1348,"children":1350},{"id":1349},"étape-4-la-faire-évoluer-chaque-trimestre",[1351],{"type":35,"value":1352},"Étape 4 : La faire évoluer chaque trimestre",{"type":29,"tag":37,"props":1354,"children":1355},{},[1356],{"type":35,"value":1357},"Une DoD figée devient rapidement soit trop laxiste (l'équipe a progressé et la DoD ne reflète plus ses standards actuels) soit trop contraignante (les outils ont changé et certains items ne s'appliquent plus).",{"type":29,"tag":37,"props":1359,"children":1360},{},[1361,1366],{"type":29,"tag":55,"props":1362,"children":1363},{},[1364],{"type":35,"value":1365},"Rituel recommandé",{"type":35,"value":1367}," : une session de 1 heure par trimestre, en même temps que le trimestrial planning, pour réviser la DoD :",{"type":29,"tag":661,"props":1369,"children":1370},{},[1371,1376,1381],{"type":29,"tag":665,"props":1372,"children":1373},{},[1374],{"type":35,"value":1375},"Quels items sont systématiquement respectés ? (→ potentiellement automatisables dans la CI)",{"type":29,"tag":665,"props":1377,"children":1378},{},[1379],{"type":35,"value":1380},"Quels items sont régulièrement contournés ? (→ soit les supprimer, soit identifier pourquoi et lever le blocage)",{"type":29,"tag":665,"props":1382,"children":1383},{},[1384],{"type":35,"value":1385},"Quels items manquent compte tenu des problèmes rencontrés ce trimestre ?",{"type":29,"tag":37,"props":1387,"children":1388},{},[1389,1391,1396],{"type":35,"value":1390},"L'objectif à 12-18 mois : une DoD qui contient des items d'un ",{"type":29,"tag":43,"props":1392,"children":1393},{"href":156},[1394],{"type":35,"value":1395},"niveau 3 de maturité engineering",{"type":35,"value":1397}," : les standards de qualité sont ancrés dans les pratiques de l'équipe, pas seulement dans un document.",{"type":29,"tag":37,"props":1399,"children":1400},{},[1401,1405],{"type":29,"tag":55,"props":1402,"children":1403},{},[1404],{"type":35,"value":1150},{"type":35,"value":1406}," : une DoD vivante, révisée trimestriellement, qui progresse avec le niveau de maturité de l'équipe.",{"type":29,"tag":66,"props":1408,"children":1409},{},[],{"type":29,"tag":70,"props":1411,"children":1413},{"id":1412},"le-piège-à-éviter",[1414],{"type":35,"value":1415},"Le piège à éviter",{"type":29,"tag":1417,"props":1418,"children":1419},"blockquote",{},[1420],{"type":29,"tag":37,"props":1421,"children":1422},{},[1423],{"type":35,"value":1424},"Ne jamais créer deux niveaux de DoD \"selon le temps disponible\". J'ai vu des équipes définir une \"DoD normale\" et une \"DoD express\" pour les sprints surchargés. Résultat : la DoD express devient la norme, et la DoD normale n'est jamais appliquée. Une seule DoD : si elle n'est pas atteignable, réduire le scope du sprint, pas les standards. C'est la discipline fondamentale d'un système agile sain.",{"type":29,"tag":66,"props":1426,"children":1427},{},[],{"type":29,"tag":70,"props":1429,"children":1431},{"id":1430},"en-résumé",[1432],{"type":35,"value":1433},"En résumé",{"type":29,"tag":1435,"props":1436,"children":1437},"table",{},[1438,1462],{"type":29,"tag":1439,"props":1440,"children":1441},"thead",{},[1442],{"type":29,"tag":1443,"props":1444,"children":1445},"tr",{},[1446,1452,1457],{"type":29,"tag":1447,"props":1448,"children":1449},"th",{},[1450],{"type":35,"value":1451},"Étape",{"type":29,"tag":1447,"props":1453,"children":1454},{},[1455],{"type":35,"value":1456},"Action",{"type":29,"tag":1447,"props":1458,"children":1459},{},[1460],{"type":35,"value":1461},"Résultat",{"type":29,"tag":1463,"props":1464,"children":1465},"tbody",{},[1466,1485,1503,1521],{"type":29,"tag":1443,"props":1467,"children":1468},{},[1469,1475,1480],{"type":29,"tag":1470,"props":1471,"children":1472},"td",{},[1473],{"type":35,"value":1474},"1",{"type":29,"tag":1470,"props":1476,"children":1477},{},[1478],{"type":35,"value":1479},"Auditer la DoD actuelle en atelier",{"type":29,"tag":1470,"props":1481,"children":1482},{},[1483],{"type":35,"value":1484},"Identifier les items fantômes et les manques",{"type":29,"tag":1443,"props":1486,"children":1487},{},[1488,1493,1498],{"type":29,"tag":1470,"props":1489,"children":1490},{},[1491],{"type":35,"value":1492},"2",{"type":29,"tag":1470,"props":1494,"children":1495},{},[1496],{"type":35,"value":1497},"Définir les 7 critères non-négociables",{"type":29,"tag":1470,"props":1499,"children":1500},{},[1501],{"type":35,"value":1502},"DoD précise et actionnable",{"type":29,"tag":1443,"props":1504,"children":1505},{},[1506,1511,1516],{"type":29,"tag":1470,"props":1507,"children":1508},{},[1509],{"type":35,"value":1510},"3",{"type":29,"tag":1470,"props":1512,"children":1513},{},[1514],{"type":35,"value":1515},"Intégrer dans Jira et GitHub",{"type":29,"tag":1470,"props":1517,"children":1518},{},[1519],{"type":35,"value":1520},"DoD consultée au bon moment dans le workflow",{"type":29,"tag":1443,"props":1522,"children":1523},{},[1524,1529,1534],{"type":29,"tag":1470,"props":1525,"children":1526},{},[1527],{"type":35,"value":1528},"4",{"type":29,"tag":1470,"props":1530,"children":1531},{},[1532],{"type":35,"value":1533},"Réviser chaque trimestre",{"type":29,"tag":1470,"props":1535,"children":1536},{},[1537],{"type":35,"value":1538},"DoD qui progresse avec la maturité de l'équipe",{"type":29,"tag":66,"props":1540,"children":1541},{},[],{"type":29,"tag":70,"props":1543,"children":1545},{"id":1544},"faq-sur-la-definition-of-done",[1546],{"type":35,"value":1547},"FAQ sur la Definition of Done",{"type":29,"tag":371,"props":1549,"children":1550},{},[1551,1556],{"type":29,"tag":375,"props":1552,"children":1553},{},[1554],{"type":35,"value":1555},"1. Quelle est la différence entre la DoD et les critères d'acceptation ?",{"type":29,"tag":37,"props":1557,"children":1558},{},[1559],{"type":35,"value":1560},"Les critères d'acceptation sont spécifiques à une story : ils décrivent ce que cette story particulière doit faire. La DoD est transversale à toutes les stories : elle décrit les standards de qualité qui s'appliquent à toute livraison, quelles que soient les fonctionnalités. Une story peut respecter tous ses critères d'acceptation et ne pas respecter la DoD (ex : pas de tests écrits, code non reviewé).",{"type":29,"tag":371,"props":1562,"children":1563},{},[1564,1569],{"type":29,"tag":375,"props":1565,"children":1566},{},[1567],{"type":35,"value":1568},"2. La DoD doit-elle être la même pour tous les types de stories ?",{"type":29,"tag":37,"props":1570,"children":1571},{},[1572],{"type":35,"value":1573},"Généralement oui, avec des nuances légères. Certains items peuvent être contextuels (la documentation n'est pas mise à jour pour une story de refactoring interne). Mais les items fondamentaux (code reviewé, build vert, tests écrits) s'appliquent à toutes les stories sans exception. Trop d'exceptions crée de l'ambiguïté et ouvre la porte aux contournements.",{"type":29,"tag":371,"props":1575,"children":1576},{},[1577,1582],{"type":29,"tag":375,"props":1578,"children":1579},{},[1580],{"type":35,"value":1581},"3. Comment gérer la résistance de l'équipe à une DoD plus stricte ?",{"type":29,"tag":37,"props":1583,"children":1584},{},[1585,1587,1593],{"type":35,"value":1586},"La résistance vient généralement de la peur que la DoD crée un blocage en fin de sprint. La réponse est de traiter la cause : si la DoD ne peut pas être respectée dans un sprint, le problème est en amont (stories trop grandes, ",{"type":29,"tag":43,"props":1588,"children":1590},{"href":1589},"/fr/pratiques-agiles/definition-of-ready-bugs-sprint",[1591],{"type":35,"value":1592},"Definition of Ready absente",{"type":35,"value":1594},", capacité surestimée) pas dans la DoD elle-même. Impliquer l'équipe dans la rédaction de la DoD réduit significativement la résistance à son application.",{"type":29,"tag":371,"props":1596,"children":1597},{},[1598,1603],{"type":29,"tag":375,"props":1599,"children":1600},{},[1601],{"type":35,"value":1602},"4. Faut-il une DoD différente par équipe dans une organisation avec plusieurs équipes ?",{"type":29,"tag":37,"props":1604,"children":1605},{},[1606],{"type":35,"value":1607},"Une base commune + des extensions par équipe est la meilleure approche. La base commune garantit un niveau minimum de qualité cohérent à travers l'organisation, particulièrement important pour les composants partagés. Les extensions permettent aux équipes d'adapter aux spécificités de leur contexte (ex : une équipe data peut avoir des items spécifiques sur la validation des schémas).",{"type":29,"tag":371,"props":1609,"children":1610},{},[1611,1616],{"type":29,"tag":375,"props":1612,"children":1613},{},[1614],{"type":35,"value":1615},"5. Comment mesurer si la DoD améliore réellement la qualité ?",{"type":29,"tag":37,"props":1617,"children":1618},{},[1619],{"type":35,"value":1620},"Trois métriques à suivre avant/après l'amélioration de la DoD : le taux de bugs de prod sur les stories \"Done\" (doit baisser), le nombre de réouvertures de tickets (doit baisser), et le temps passé en correction de bugs vs développement de features (doit s'améliorer). Sur les équipes que j'accompagne, une DoD bien appliquée réduit le taux de bugs de prod de 25 à 40% en 3 mois.",{"type":29,"tag":66,"props":1622,"children":1623},{},[],{"type":29,"tag":166,"props":1625,"children":1626},{"cta":442,"href":443,"title":444,"type":445},[1627],{"type":29,"tag":37,"props":1628,"children":1629},{},[1630],{"type":35,"value":1631},"L'assessment évalue vos pratiques de qualité, incluant la Definition of Done, les pratiques de tests et de revue de code. Identifiez votre niveau actuel et les 3 actions prioritaires pour progresser.",{"title":8,"searchDepth":453,"depth":453,"links":1633},[1634,1635,1636,1637,1638,1639,1640,1641],{"id":1057,"depth":453,"text":1060},{"id":1084,"depth":453,"text":1087},{"id":1158,"depth":453,"text":1161},{"id":1286,"depth":453,"text":1289},{"id":1349,"depth":453,"text":1352},{"id":1412,"depth":453,"text":1415},{"id":1430,"depth":453,"text":1433},{"id":1544,"depth":453,"text":1547},"content:fr:dette-technique:definition-of-done-qualite.md","fr/dette-technique/definition-of-done-qualite.md","fr/dette-technique/definition-of-done-qualite",{"_path":1646,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":1647,"description":1648,"id":1649,"date":1650,"listed":13,"nocomments":7,"hidden":7,"categories":1651,"tags":1652,"--cover":1655,"readingTime":1656,"body":1660,"_type":466,"_id":2135,"_source":468,"_file":2136,"_stem":2137,"_extension":471},"/fr/dette-technique/tests-integration-legacy-pieges","Tests d'intégration : les pièges à éviter dans un legacy","Ajouter des tests d'intégration à un legacy est souvent plus difficile qu'écrire from scratch. Les 4 pièges classiques et la séquence qui fonctionne.",21,"2026-02-20",[6],[1653,1654,1020],"Tests Intégration","Legacy","covers/articles/tests-integration-legacy.jpg",{"text":21,"minutes":1657,"time":1658,"words":1659},7.63,457800,1526,{"type":26,"children":1661,"toc":2126},[1662,1667,1672,1680,1691,1694,1700,1705,1732,1737,1740,1746,1751,1761,1778,1781,1787,1792,1801,1817,1830,1833,1842,1845,1851,1856,1864,1887,1903,1908,1911,1917,1922,1931,1951,1956,1959,1965,2036,2041,2044,2050,2063,2076,2089,2102,2115,2118],{"type":29,"tag":30,"props":1663,"children":1665},{"id":1664},"tests-dintégration-les-pièges-à-éviter-dans-un-legacy",[1666],{"type":35,"value":1647},{"type":29,"tag":37,"props":1668,"children":1669},{},[1670],{"type":35,"value":1671},"J'accompagnais une équipe dans un opérateur télécoms : des ingénieurs sérieux, déterminés à \"enfin écrire des tests sur le legacy\". Ils avaient décidé d'attaquer directement le moteur de facturation : 18 000 lignes de code, 30 dépendances, et une logique métier partiellement documentée. Quatre semaines plus tard, ils avaient produit 3 tests unitaires instables et une équipe découragée. Les tests ne compilaient pas parce que les dépendances ne pouvaient pas être initialisées dans un contexte de test. La motivation avait plongé. On a repris à zéro, mais différemment.",{"type":29,"tag":37,"props":1673,"children":1674},{},[1675],{"type":29,"tag":55,"props":1676,"children":1677},{},[1678],{"type":35,"value":1679},"Décider d'ajouter des tests d'intégration à un legacy est une bonne décision. Mal exécutée, c'est une décision qui peut paralyser l'équipe pendant 3 mois pour un résultat décevant. Les pièges sont prévisibles et évitables.",{"type":29,"tag":37,"props":1681,"children":1682},{},[1683,1685,1689],{"type":35,"value":1684},"Les tests unitaires sur le legacy ont une limite bien connue : ils testent des unités isolées mais ne testent pas le comportement d'ensemble. Pour un filet de sécurité au niveau de l'équipe, assurez-vous que votre ",{"type":29,"tag":43,"props":1686,"children":1687},{"href":854},[1688],{"type":35,"value":1019},{"type":35,"value":1690}," exige des tests d'intégration sur les chemins critiques.. Un système peut avoir 70% de couverture unitaire et tomber en production parce que l'intégration entre composants n'est pas testée. Mais ajouter des tests d'intégration à un legacy n'est pas une opération simple. Le legacy n'a généralement pas été conçu pour être testé.",{"type":29,"tag":66,"props":1692,"children":1693},{},[],{"type":29,"tag":70,"props":1695,"children":1697},{"id":1696},"pourquoi-les-tests-unitaires-seuls-ne-suffisent-pas",[1698],{"type":35,"value":1699},"Pourquoi les tests unitaires seuls ne suffisent pas",{"type":29,"tag":37,"props":1701,"children":1702},{},[1703],{"type":35,"value":1704},"Un test unitaire isole une fonction et vérifie son comportement en isolation. C'est nécessaire. Mais c'est insuffisant pour détecter les bugs qui apparaissent à la jonction entre composants.",{"type":29,"tag":37,"props":1706,"children":1707},{},[1708,1713,1715,1722,1724,1730],{"type":29,"tag":55,"props":1709,"children":1710},{},[1711],{"type":35,"value":1712},"Exemple concret",{"type":35,"value":1714}," : deux classes parfaitement testées en isolation, l'une qui sérialise une date en ",{"type":29,"tag":1716,"props":1717,"children":1719},"code",{"className":1718},[],[1720],{"type":35,"value":1721},"MM/DD/YYYY",{"type":35,"value":1723}," et l'autre qui la désérialise en attendant ",{"type":29,"tag":1716,"props":1725,"children":1727},{"className":1726},[],[1728],{"type":35,"value":1729},"YYYY-MM-DD",{"type":35,"value":1731},". Les tests unitaires passent. Le système plante en prod.",{"type":29,"tag":37,"props":1733,"children":1734},{},[1735],{"type":35,"value":1736},"Les tests d'intégration testent les interactions : entre services, entre couches, entre la couche application et la base de données. Ils ont un coût d'exécution plus élevé mais une valeur de détection différente et complémentaire. Sur un legacy, les bugs les plus coûteux sont presque toujours des bugs d'intégration, pas des bugs unitaires. J'ai rarement vu un incident de prod majeur causé par un bug unitaire. J'en ai vu des dizaines causés par des bugs d'intégration silencieux.",{"type":29,"tag":66,"props":1738,"children":1739},{},[],{"type":29,"tag":70,"props":1741,"children":1743},{"id":1742},"piège-1-tester-sans-comprendre-le-comportement-attendu",[1744],{"type":35,"value":1745},"Piège 1 : Tester sans comprendre le comportement attendu",{"type":29,"tag":37,"props":1747,"children":1748},{},[1749],{"type":35,"value":1750},"La première erreur est de commencer à écrire des tests sans savoir ce que le système est censé faire. Sur un legacy réel, le comportement attendu est souvent partiellement documenté ou connu uniquement par des personnes qui ont quitté l'entreprise.",{"type":29,"tag":37,"props":1752,"children":1753},{},[1754,1759],{"type":29,"tag":55,"props":1755,"children":1756},{},[1757],{"type":35,"value":1758},"Ce qui arrive",{"type":35,"value":1760}," : l'équipe écrit des tests qui vérifient le comportement actuel, y compris les bugs existants. Quand un vrai bug est corrigé, les tests cassent. L'équipe corrige les tests pour \"faire passer le build\" au lieu de corriger le comportement. Les tests deviennent un obstacle plutôt qu'un filet de sécurité.",{"type":29,"tag":37,"props":1762,"children":1763},{},[1764,1769,1771,1776],{"type":29,"tag":55,"props":1765,"children":1766},{},[1767],{"type":35,"value":1768},"La sortie",{"type":35,"value":1770}," : avant d'écrire le premier test d'intégration, j'organise une session de 2 à 3 heures avec un expert métier pour définir les ",{"type":29,"tag":55,"props":1772,"children":1773},{},[1774],{"type":35,"value":1775},"comportements de référence",{"type":35,"value":1777}," : quels sont les scénarios nominaux et les scénarios d'erreur qui doivent être garantis ? Cette session produit les spécifications des tests, pas l'inverse.",{"type":29,"tag":66,"props":1779,"children":1780},{},[],{"type":29,"tag":70,"props":1782,"children":1784},{"id":1783},"piège-2-commencer-par-le-code-le-plus-complexe",[1785],{"type":35,"value":1786},"Piège 2 : Commencer par le code le plus complexe",{"type":29,"tag":37,"props":1788,"children":1789},{},[1790],{"type":35,"value":1791},"L'instinct technique pousse à attaquer les modules les plus risqués en premier. C'est une mauvaise stratégie, je l'ai apprise à mes dépens dans mes premiers accompagnements.",{"type":29,"tag":37,"props":1793,"children":1794},{},[1795,1799],{"type":29,"tag":55,"props":1796,"children":1797},{},[1798],{"type":35,"value":1758},{"type":35,"value":1800}," : l'équipe passe 3 semaines à essayer de tester le module central du legacy, celui avec 10 000 lignes de code, 30 dépendances implicites, et une logique métier que personne ne comprend entièrement. Les tests ne compilent pas. L'équipe est bloquée et découragée.",{"type":29,"tag":37,"props":1802,"children":1803},{},[1804,1808,1810,1815],{"type":29,"tag":55,"props":1805,"children":1806},{},[1807],{"type":35,"value":1768},{"type":35,"value":1809}," : commencer par les modules ",{"type":29,"tag":55,"props":1811,"children":1812},{},[1813],{"type":35,"value":1814},"en bordure",{"type":35,"value":1816}," du système, c'est-à-dire les points d'entrée et de sortie. Un test d'intégration qui vérifie qu'une API renvoie le bon status code pour une requête valide est simple à écrire et immédiatement utile. Une fois les tests de bordure en place, progresser vers le centre.",{"type":29,"tag":1417,"props":1818,"children":1819},{},[1820],{"type":29,"tag":37,"props":1821,"children":1822},{},[1823,1828],{"type":29,"tag":55,"props":1824,"children":1825},{},[1826],{"type":35,"value":1827},"Retour sur l'équipe télécoms",{"type":35,"value":1829}," : après l'échec initial sur le moteur de facturation, j'ai proposé de pivoter vers les tests de bordure, à savoir les API REST qui alimentent le moteur. En 2 semaines, 15 tests d'intégration fonctionnels. Ce succès rapide a relancé la motivation et donné une base solide pour progresser vers le centre progressivement.",{"type":29,"tag":66,"props":1831,"children":1832},{},[],{"type":29,"tag":166,"props":1834,"children":1836},{"cta":168,"href":169,"title":1835,"type":171},"Vous essayez d'ajouter des tests à un legacy mais vous ne savez pas par où commencer ?",[1837],{"type":29,"tag":37,"props":1838,"children":1839},{},[1840],{"type":35,"value":1841},"Vous avez déjà essayé, et soit l'équipe s'est découragée, soit les tests écrits ne donnent pas confiance. La séquence d'ajout de tests sur un legacy dépend de l'architecture, de la criticité des modules, et des ressources disponibles. En 30 minutes, on définit la stratégie adaptée à votre contexte.",{"type":29,"tag":66,"props":1843,"children":1844},{},[],{"type":29,"tag":70,"props":1846,"children":1848},{"id":1847},"piège-3-créer-une-dépendance-à-la-base-de-données-de-production",[1849],{"type":35,"value":1850},"Piège 3 : Créer une dépendance à la base de données de production",{"type":29,"tag":37,"props":1852,"children":1853},{},[1854],{"type":35,"value":1855},"Pour tester l'intégration, il faut des données. L'approche la plus simple est de pointer sur la base de données de production (ou une copie) dans les tests. C'est une très mauvaise idée.",{"type":29,"tag":37,"props":1857,"children":1858},{},[1859,1863],{"type":29,"tag":55,"props":1860,"children":1861},{},[1862],{"type":35,"value":1758},{"type":35,"value":1119},{"type":29,"tag":661,"props":1865,"children":1866},{},[1867,1872,1877,1882],{"type":29,"tag":665,"props":1868,"children":1869},{},[1870],{"type":35,"value":1871},"Les tests sont non-déterministes : ils dépendent de l'état des données, qui change",{"type":29,"tag":665,"props":1873,"children":1874},{},[1875],{"type":35,"value":1876},"Les tests ralentissent avec le volume de données",{"type":29,"tag":665,"props":1878,"children":1879},{},[1880],{"type":35,"value":1881},"Des tests mal écrits peuvent modifier des données réelles",{"type":29,"tag":665,"props":1883,"children":1884},{},[1885],{"type":35,"value":1886},"La base de prod ne peut pas être réinitialisée entre les tests",{"type":29,"tag":37,"props":1888,"children":1889},{},[1890,1894,1896,1901],{"type":29,"tag":55,"props":1891,"children":1892},{},[1893],{"type":35,"value":1768},{"type":35,"value":1895}," : utiliser une base de test dédiée, initialisée à chaque exécution de test avec un jeu de données connu et contrôlé. Pour les bases relationnelles, les ",{"type":29,"tag":55,"props":1897,"children":1898},{},[1899],{"type":35,"value":1900},"test containers",{"type":35,"value":1902}," (Testcontainers Java, Python, Node.js) permettent de démarrer une vraie base de données dans Docker pour chaque suite de tests : propre, isolée, et détruite après.",{"type":29,"tag":37,"props":1904,"children":1905},{},[1906],{"type":35,"value":1907},"Pour les systèmes avec des données volumineuses, créer un dataset de test représentatif mais minimal (100 à 1 000 enregistrements couvrant tous les scénarios) plutôt que de copier des millions de lignes de prod.",{"type":29,"tag":66,"props":1909,"children":1910},{},[],{"type":29,"tag":70,"props":1912,"children":1914},{"id":1913},"piège-4-ignorer-les-tests-de-régression-comportementale",[1915],{"type":35,"value":1916},"Piège 4 : Ignorer les tests de régression comportementale",{"type":29,"tag":37,"props":1918,"children":1919},{},[1920],{"type":35,"value":1921},"Le legacy a un comportement actuel. Ce comportement, même imparfait, est probablement attendu par les utilisateurs. Des tests d'intégration qui ne couvrent pas ce comportement actuel permettent des régressions silencieuses.",{"type":29,"tag":37,"props":1923,"children":1924},{},[1925,1929],{"type":29,"tag":55,"props":1926,"children":1927},{},[1928],{"type":35,"value":1758},{"type":35,"value":1930}," : l'équipe écrit de nouveaux tests d'intégration basés sur la documentation (incomplète). Des comportements non-documentés mais attendus par les utilisateurs sont cassés lors d'un refactoring. L'équipe l'apprend en production.",{"type":29,"tag":37,"props":1932,"children":1933},{},[1934,1938,1940,1949],{"type":29,"tag":55,"props":1935,"children":1936},{},[1937],{"type":35,"value":1768},{"type":35,"value":1939}," : les ",{"type":29,"tag":55,"props":1941,"children":1942},{},[1943],{"type":29,"tag":43,"props":1944,"children":1946},{"href":1945},"/fr/dette-technique/legacy-code-evaluer-risque",[1947],{"type":35,"value":1948},"characterization tests",{"type":35,"value":1950}," d'abord. Avant d'écrire des tests qui vérifient le comportement attendu, écrire des tests qui documentent le comportement actuel. C'est le concept de Michael Feathers dans \"Working Effectively with Legacy Code\" : un characterization test capture ce que le système fait réellement, pas ce qu'il devrait faire.",{"type":29,"tag":37,"props":1952,"children":1953},{},[1954],{"type":35,"value":1955},"Ces tests ont une propriété précieuse : si un refactoring casse un characterization test, il faut une décision explicite pour valider que le changement de comportement est intentionnel. C'est le filet de sécurité que je rends obligatoire avant toute modification significative d'un legacy.",{"type":29,"tag":66,"props":1957,"children":1958},{},[],{"type":29,"tag":70,"props":1960,"children":1962},{"id":1961},"la-séquence-qui-fonctionne",[1963],{"type":35,"value":1964},"La séquence qui fonctionne",{"type":29,"tag":1966,"props":1967,"children":1968},"ol",{},[1969,1979,1989,2006,2016,2026],{"type":29,"tag":665,"props":1970,"children":1971},{},[1972,1977],{"type":29,"tag":55,"props":1973,"children":1974},{},[1975],{"type":35,"value":1976},"Session de définition des comportements de référence",{"type":35,"value":1978}," (2-3h avec expert métier) → liste des scénarios à garantir",{"type":29,"tag":665,"props":1980,"children":1981},{},[1982,1987],{"type":29,"tag":55,"props":1983,"children":1984},{},[1985],{"type":35,"value":1986},"Audit des dépendances",{"type":35,"value":1988}," (1 jour) → cartographie des intégrations externes, DB, services tiers",{"type":29,"tag":665,"props":1990,"children":1991},{},[1992,1997,1999,2004],{"type":29,"tag":55,"props":1993,"children":1994},{},[1995],{"type":35,"value":1996},"Infrastructure de test",{"type":35,"value":1998}," (2-3 jours) → test containers, fixtures de données, ",{"type":29,"tag":43,"props":2000,"children":2001},{"href":1212},[2002],{"type":35,"value":2003},"CI",{"type":35,"value":2005}," configurée",{"type":29,"tag":665,"props":2007,"children":2008},{},[2009,2014],{"type":29,"tag":55,"props":2010,"children":2011},{},[2012],{"type":35,"value":2013},"Characterization tests sur les chemins critiques",{"type":35,"value":2015}," (1-2 semaines) → documentation du comportement actuel",{"type":29,"tag":665,"props":2017,"children":2018},{},[2019,2024],{"type":29,"tag":55,"props":2020,"children":2021},{},[2022],{"type":35,"value":2023},"Tests d'intégration de bordure",{"type":35,"value":2025}," (2-3 semaines) → points d'entrée et de sortie du système",{"type":29,"tag":665,"props":2027,"children":2028},{},[2029,2034],{"type":29,"tag":55,"props":2030,"children":2031},{},[2032],{"type":35,"value":2033},"Progression vers le centre",{"type":35,"value":2035}," (continu) → module par module, en priorisant par criticité",{"type":29,"tag":37,"props":2037,"children":2038},{},[2039],{"type":35,"value":2040},"Cette séquence n'est pas rapide : comptez 6 à 10 semaines pour une base solide. Mais elle produit des tests qui tiennent dans le temps et qui augmentent réellement la confiance de l'équipe.",{"type":29,"tag":66,"props":2042,"children":2043},{},[],{"type":29,"tag":70,"props":2045,"children":2047},{"id":2046},"faq-sur-les-tests-dintégration-en-legacy",[2048],{"type":35,"value":2049},"FAQ sur les tests d'intégration en legacy",{"type":29,"tag":371,"props":2051,"children":2052},{},[2053,2058],{"type":29,"tag":375,"props":2054,"children":2055},{},[2056],{"type":35,"value":2057},"1. Quelle est la différence entre un test d'intégration et un test end-to-end ?",{"type":29,"tag":37,"props":2059,"children":2060},{},[2061],{"type":35,"value":2062},"Un test d'intégration vérifie l'interaction entre deux ou plusieurs composants internes du système (ex : service + base de données). Un test end-to-end vérifie un scénario utilisateur complet, de l'interface jusqu'à la persistance. Sur un legacy, je commence par les tests d'intégration : ils sont plus rapides, plus stables, et plus faciles à diagnostiquer que les tests E2E.",{"type":29,"tag":371,"props":2064,"children":2065},{},[2066,2071],{"type":29,"tag":375,"props":2067,"children":2068},{},[2069],{"type":35,"value":2070},"2. Combien de temps faut-il pour avoir une suite de tests d'intégration utile sur un legacy ?",{"type":29,"tag":37,"props":2072,"children":2073},{},[2074],{"type":35,"value":2075},"Pour un legacy de taille moyenne (50 000 à 200 000 lignes de code), comptez 6 à 10 semaines pour avoir une suite couvrant les 10 à 15 scénarios critiques. C'est un investissement qui se rentabilise dès le premier refactoring majeur : une régression évitée sur un module critique vaut facilement 10 fois le coût de la suite de tests.",{"type":29,"tag":371,"props":2077,"children":2078},{},[2079,2084],{"type":29,"tag":375,"props":2080,"children":2081},{},[2082],{"type":35,"value":2083},"3. Faut-il des développeurs dédiés aux tests ou tous les développeurs participent ?",{"type":29,"tag":37,"props":2085,"children":2086},{},[2087],{"type":35,"value":2088},"Tous les développeurs participent. Les tests d'intégration ne sont pas une spécialité, ils sont une responsabilité de l'équipe. En pratique, je désigne un \"test champion\" par équipe pour maintenir l'infrastructure et les standards, mais chaque développeur qui modifie un module doit ajouter ou mettre à jour les tests correspondants.",{"type":29,"tag":371,"props":2090,"children":2091},{},[2092,2097],{"type":29,"tag":375,"props":2093,"children":2094},{},[2095],{"type":35,"value":2096},"4. Comment gérer les tests qui tombent de façon intermittente (flaky tests) ?",{"type":29,"tag":37,"props":2098,"children":2099},{},[2100],{"type":35,"value":2101},"Les flaky tests sont le cancer des suites de tests : ils réduisent la confiance dans tous les tests et poussent les équipes à ignorer les échecs. Ma règle est simple : un flaky test est soit corrigé dans les 48h, soit désactivé avec un ticket de suivi. Un test désactivé qui n'a pas de ticket actif dans le backlog est supprimé. La discipline sur les flaky tests conditionne la confiance dans toute la suite.",{"type":29,"tag":371,"props":2103,"children":2104},{},[2105,2110],{"type":29,"tag":375,"props":2106,"children":2107},{},[2108],{"type":35,"value":2109},"5. Les test containers ralentissent-ils la CI de manière inacceptable ?",{"type":29,"tag":37,"props":2111,"children":2112},{},[2113],{"type":35,"value":2114},"Sur un pipeline bien configuré, non. Les test containers démarrent en 5 à 15 secondes pour une base PostgreSQL ou MySQL. En parallélisant les suites de tests et en utilisant un cache Docker sur la CI, l'impact sur le temps total est marginal. Le vrai coût est le premier setup : 1 à 2 jours pour configurer l'infrastructure. Après ça, chaque nouvelle suite de tests bénéficie de l'infrastructure existante.",{"type":29,"tag":66,"props":2116,"children":2117},{},[],{"type":29,"tag":166,"props":2119,"children":2120},{"cta":442,"href":443,"title":444,"type":445},[2121],{"type":29,"tag":37,"props":2122,"children":2123},{},[2124],{"type":35,"value":2125},"L'assessment inclut une évaluation complète de vos pratiques de tests : couverture, types de tests, intégration dans la CI. Identifiez vos angles morts et priorisez les améliorations à fort impact.",{"title":8,"searchDepth":453,"depth":453,"links":2127},[2128,2129,2130,2131,2132,2133,2134],{"id":1696,"depth":453,"text":1699},{"id":1742,"depth":453,"text":1745},{"id":1783,"depth":453,"text":1786},{"id":1847,"depth":453,"text":1850},{"id":1913,"depth":453,"text":1916},{"id":1961,"depth":453,"text":1964},{"id":2046,"depth":453,"text":2049},"content:fr:dette-technique:tests-integration-legacy-pieges.md","fr/dette-technique/tests-integration-legacy-pieges.md","fr/dette-technique/tests-integration-legacy-pieges",{"_path":2139,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":2140,"description":2141,"id":2142,"date":2143,"listed":13,"nocomments":7,"hidden":7,"categories":2144,"tags":2145,"--cover":2149,"readingTime":2150,"body":2155,"_type":466,"_id":2943,"_source":468,"_file":2944,"_stem":2945,"_extension":471},"/fr/dette-technique/programme-refactoring-approuve-business","Comment créer un programme de refactoring approuvé par le business","Le refactoring refusé par le business n'est pas un problème technique : c'est un problème de présentation. Construire le business case qui obtient le feu vert.",16,"2026-02-09",[6],[2146,2147,2148],"Refactoring","Business Case","Management","covers/articles/refactoring-business-case.jpg",{"text":2151,"minutes":2152,"time":2153,"words":2154},"7 min read",6.88,412800,1376,{"type":26,"children":2156,"toc":2933},[2157,2162,2167,2175,2180,2183,2187,2210,2213,2219,2234,2239,2244,2267,2276,2307,2312,2321,2324,2330,2345,2350,2367,2377,2386,2508,2518,2527,2530,2539,2542,2548,2553,2562,2571,2589,2598,2616,2625,2643,2653,2662,2665,2671,2676,2737,2747,2750,2754,2762,2765,2769,2861,2864,2870,2883,2896,2909,2922,2925],{"type":29,"tag":30,"props":2158,"children":2160},{"id":2159},"comment-créer-un-programme-de-refactoring-approuvé-par-le-business",[2161],{"type":35,"value":2140},{"type":29,"tag":37,"props":2163,"children":2164},{},[2165],{"type":35,"value":2166},"Il y a quelques années, j'accompagnais le CTO d'une société de gestion d'épargne, avec une équipe de 20 développeurs. Il venait de se faire refuser pour la troisième fois un programme de refactoring sur leur module de calcul de rendement. Sa présentation était techniquement parfaite : complexité cyclomatique, taux de duplication, nombre de hotspots SonarQube. Le CPO l'avait écouté poliment puis avait dit : \"Je comprends que c'est important pour toi, mais on a la roadmap à tenir.\" Ce n'était pas un refus du business face à la technique. C'était un professionnel qui ne voyait pas son problème dans ce que l'autre lui présentait.",{"type":29,"tag":37,"props":2168,"children":2169},{},[2170],{"type":29,"tag":55,"props":2171,"children":2172},{},[2173],{"type":35,"value":2174},"\"On a besoin de 3 mois pour refactoriser le core.\" Réponse du CPO : \"Pas maintenant, on a la roadmap feature à tenir.\" Cette conversation se joue dans 80% des entreprises tech. Et dans 80% des cas, c'est l'équipe technique qui présente mal, pas le business qui refuse mal.",{"type":29,"tag":37,"props":2176,"children":2177},{},[2178],{"type":35,"value":2179},"Le business ne comprend pas \"refactoring\". Il comprend \"coût\", \"risque\", \"délai\", et \"avantage concurrentiel\". Tant que vous présentez un projet technique dans un langage technique, vous demandez au business de vous faire confiance sur un sujet qu'il ne maîtrise pas. Ce n'est pas raisonnable, et ce n'est pas sa faute.",{"type":29,"tag":66,"props":2181,"children":2182},{},[],{"type":29,"tag":70,"props":2184,"children":2185},{"id":1057},[2186],{"type":35,"value":1060},{"type":29,"tag":661,"props":2188,"children":2189},{},[2190,2200,2205],{"type":29,"tag":665,"props":2191,"children":2192},{},[2193,2195],{"type":35,"value":2194},"Vous avez identifié le périmètre du refactoring (module, couche, ou composant spécifique, si ce n'est pas encore fait, commencez par ",{"type":29,"tag":43,"props":2196,"children":2197},{"href":1945},[2198],{"type":35,"value":2199},"évaluer le risque du code legacy",{"type":29,"tag":665,"props":2201,"children":2202},{},[2203],{"type":35,"value":2204},"Vous avez une estimation grossière de l'effort technique (order of magnitude : semaines, pas jours)",{"type":29,"tag":665,"props":2206,"children":2207},{},[2208],{"type":35,"value":2209},"Vous avez accès aux métriques de base : lead time, taux de bugs, temps passé en maintenance",{"type":29,"tag":66,"props":2211,"children":2212},{},[],{"type":29,"tag":70,"props":2214,"children":2216},{"id":2215},"étape-1-quantifier-le-coût-actuel-pas-leffort-de-refactoring",[2217],{"type":35,"value":2218},"Étape 1 : Quantifier le coût actuel, pas l'effort de refactoring",{"type":29,"tag":37,"props":2220,"children":2221},{},[2222,2226,2228,2232],{"type":29,"tag":55,"props":2223,"children":2224},{},[2225],{"type":35,"value":1095},{"type":35,"value":2227}," : 4 heures\n",{"type":29,"tag":55,"props":2229,"children":2230},{},[2231],{"type":35,"value":1102},{"type":35,"value":2233}," : Tech Lead + 1 développeur senior",{"type":29,"tag":37,"props":2235,"children":2236},{},[2237],{"type":35,"value":2238},"C'est l'étape que la plupart des équipes sautent. Elles présentent l'effort du refactoring sans jamais quantifier le coût de l'inaction.",{"type":29,"tag":37,"props":2240,"children":2241},{},[2242],{"type":35,"value":2243},"Questions à chiffrer :",{"type":29,"tag":661,"props":2245,"children":2246},{},[2247,2252,2257,2262],{"type":29,"tag":665,"props":2248,"children":2249},{},[2250],{"type":35,"value":2251},"Quel pourcentage du temps de l'équipe est consacré à la maintenance de ce module ?",{"type":29,"tag":665,"props":2253,"children":2254},{},[2255],{"type":35,"value":2256},"Combien d'incidents de prod ce module a-t-il causés les 6 derniers mois ?",{"type":29,"tag":665,"props":2258,"children":2259},{},[2260],{"type":35,"value":2261},"Quel est le lead time pour une modification simple dans ce module vs un module sain ?",{"type":29,"tag":665,"props":2263,"children":2264},{},[2265],{"type":35,"value":2266},"Combien de développeurs ont quitté l'équipe en citant \"la dette technique\" dans leur entretien de sortie ?",{"type":29,"tag":37,"props":2268,"children":2269},{},[2270,2275],{"type":29,"tag":55,"props":2271,"children":2272},{},[2273],{"type":35,"value":2274},"Calcul type",{"type":35,"value":1119},{"type":29,"tag":661,"props":2277,"children":2278},{},[2279,2289,2299],{"type":29,"tag":665,"props":2280,"children":2281},{},[2282,2284],{"type":35,"value":2283},"Équipe de 20 développeurs × 40% d'absorption sur ce module × 450€/jour × 220 jours = ",{"type":29,"tag":55,"props":2285,"children":2286},{},[2287],{"type":35,"value":2288},"792 000€/an",{"type":29,"tag":665,"props":2290,"children":2291},{},[2292,2294],{"type":35,"value":2293},"3 incidents P1 × 80 000€ d'impact moyen = ",{"type":29,"tag":55,"props":2295,"children":2296},{},[2297],{"type":35,"value":2298},"240 000€/an",{"type":29,"tag":665,"props":2300,"children":2301},{},[2302],{"type":29,"tag":55,"props":2303,"children":2304},{},[2305],{"type":35,"value":2306},"Coût total de l'inaction : ~1 000 000€/an",{"type":29,"tag":37,"props":2308,"children":2309},{},[2310],{"type":35,"value":2311},"Ce chiffre est le fondement du business case. Sans lui, vous demandez un investissement sans montrer le retour. Avec lui, vous parlez la même langue que votre interlocuteur.",{"type":29,"tag":37,"props":2313,"children":2314},{},[2315,2319],{"type":29,"tag":55,"props":2316,"children":2317},{},[2318],{"type":35,"value":1150},{"type":35,"value":2320}," : un tableur avec les coûts actuels quantifiés, prêt à être présenté.",{"type":29,"tag":66,"props":2322,"children":2323},{},[],{"type":29,"tag":70,"props":2325,"children":2327},{"id":2326},"étape-2-construire-le-roi-en-langage-business",[2328],{"type":35,"value":2329},"Étape 2 : Construire le ROI en langage business",{"type":29,"tag":37,"props":2331,"children":2332},{},[2333,2337,2339,2343],{"type":29,"tag":55,"props":2334,"children":2335},{},[2336],{"type":35,"value":1095},{"type":35,"value":2338}," : 3 heures\n",{"type":29,"tag":55,"props":2340,"children":2341},{},[2342],{"type":35,"value":1102},{"type":35,"value":2344}," : CTO + Tech Lead",{"type":29,"tag":37,"props":2346,"children":2347},{},[2348],{"type":35,"value":2349},"Le ROI d'un programme de refactoring a deux composantes :",{"type":29,"tag":37,"props":2351,"children":2352},{},[2353,2358,2360,2365],{"type":29,"tag":55,"props":2354,"children":2355},{},[2356],{"type":35,"value":2357},"Composante 1 : Réduction des coûts",{"type":35,"value":2359}," : si le refactoring réduit l'",{"type":29,"tag":43,"props":2361,"children":2362},{"href":156},[2363],{"type":35,"value":2364},"absorption de 40% à 20%",{"type":35,"value":2366},", vous récupérez 50% du coût de l'inaction. Sur l'exemple précédent : 500 000€/an récupérés.",{"type":29,"tag":37,"props":2368,"children":2369},{},[2370,2375],{"type":29,"tag":55,"props":2371,"children":2372},{},[2373],{"type":35,"value":2374},"Composante 2 : Accélération business",{"type":35,"value":2376}," : le lead time divisé par 2 ou 3 signifie que les features arrivent plus vite sur le marché. Chiffrez-le en termes de features livrées par trimestre ou de time-to-market sur vos initiatives stratégiques.",{"type":29,"tag":37,"props":2378,"children":2379},{},[2380,2385],{"type":29,"tag":55,"props":2381,"children":2382},{},[2383],{"type":35,"value":2384},"Format de présentation pour le board",{"type":35,"value":1119},{"type":29,"tag":1435,"props":2387,"children":2388},{},[2389,2408],{"type":29,"tag":1439,"props":2390,"children":2391},{},[2392],{"type":29,"tag":1443,"props":2393,"children":2394},{},[2395,2398,2403],{"type":29,"tag":1447,"props":2396,"children":2397},{},[],{"type":29,"tag":1447,"props":2399,"children":2400},{},[2401],{"type":35,"value":2402},"Scénario actuel",{"type":29,"tag":1447,"props":2404,"children":2405},{},[2406],{"type":35,"value":2407},"Après refactoring",{"type":29,"tag":1463,"props":2409,"children":2410},{},[2411,2429,2450,2468,2486],{"type":29,"tag":1443,"props":2412,"children":2413},{},[2414,2419,2424],{"type":29,"tag":1470,"props":2415,"children":2416},{},[2417],{"type":35,"value":2418},"Absorption maintenance",{"type":29,"tag":1470,"props":2420,"children":2421},{},[2422],{"type":35,"value":2423},"40%",{"type":29,"tag":1470,"props":2425,"children":2426},{},[2427],{"type":35,"value":2428},"20%",{"type":29,"tag":1443,"props":2430,"children":2431},{},[2432,2440,2445],{"type":29,"tag":1470,"props":2433,"children":2434},{},[2435],{"type":29,"tag":43,"props":2436,"children":2437},{"href":45},[2438],{"type":35,"value":2439},"Lead time moyen",{"type":29,"tag":1470,"props":2441,"children":2442},{},[2443],{"type":35,"value":2444},"4 semaines",{"type":29,"tag":1470,"props":2446,"children":2447},{},[2448],{"type":35,"value":2449},"2 semaines",{"type":29,"tag":1443,"props":2451,"children":2452},{},[2453,2458,2463],{"type":29,"tag":1470,"props":2454,"children":2455},{},[2456],{"type":35,"value":2457},"Incidents P1/an",{"type":29,"tag":1470,"props":2459,"children":2460},{},[2461],{"type":35,"value":2462},"6",{"type":29,"tag":1470,"props":2464,"children":2465},{},[2466],{"type":35,"value":2467},"1-2",{"type":29,"tag":1443,"props":2469,"children":2470},{},[2471,2476,2481],{"type":29,"tag":1470,"props":2472,"children":2473},{},[2474],{"type":35,"value":2475},"Coût annuel estimé",{"type":29,"tag":1470,"props":2477,"children":2478},{},[2479],{"type":35,"value":2480},"1 000 000€",{"type":29,"tag":1470,"props":2482,"children":2483},{},[2484],{"type":35,"value":2485},"400 000€",{"type":29,"tag":1443,"props":2487,"children":2488},{},[2489,2497,2500],{"type":29,"tag":1470,"props":2490,"children":2491},{},[2492],{"type":29,"tag":55,"props":2493,"children":2494},{},[2495],{"type":35,"value":2496},"Économie annuelle",{"type":29,"tag":1470,"props":2498,"children":2499},{},[],{"type":29,"tag":1470,"props":2501,"children":2502},{},[2503],{"type":29,"tag":55,"props":2504,"children":2505},{},[2506],{"type":35,"value":2507},"600 000€",{"type":29,"tag":37,"props":2509,"children":2510},{},[2511,2513],{"type":35,"value":2512},"Investissement programme : 200 000€ (3 mois, 4 développeurs). ",{"type":29,"tag":55,"props":2514,"children":2515},{},[2516],{"type":35,"value":2517},"ROI : 3 mois.",{"type":29,"tag":37,"props":2519,"children":2520},{},[2521,2525],{"type":29,"tag":55,"props":2522,"children":2523},{},[2524],{"type":35,"value":1150},{"type":35,"value":2526}," : un slide ou un tableau de 1 page qui montre le ROI clairement.",{"type":29,"tag":66,"props":2528,"children":2529},{},[],{"type":29,"tag":166,"props":2531,"children":2533},{"cta":168,"href":169,"title":2532,"type":171},"Votre programme de refactoring est bloqué faute de budget approuvé ?",[2534],{"type":29,"tag":37,"props":2535,"children":2536},{},[2537],{"type":35,"value":2538},"Vous avez la conviction technique, vous voyez le coût s'accumuler chaque mois, mais vous n'arrivez pas à obtenir le feu vert. Ce n'est pas un problème de légitimité, c'est un problème de présentation. En 30 minutes, je vous aide à construire les chiffres clés et la structure de présentation qui débloque le budget dans votre contexte.",{"type":29,"tag":66,"props":2540,"children":2541},{},[],{"type":29,"tag":70,"props":2543,"children":2545},{"id":2544},"étape-3-proposer-un-plan-en-3-phases-avec-quick-wins",[2546],{"type":35,"value":2547},"Étape 3 : Proposer un plan en 3 phases avec quick wins",{"type":29,"tag":37,"props":2549,"children":2550},{},[2551],{"type":35,"value":2552},"Le business est rassuré par les quick wins. Un programme de 6 mois qui ne livre rien de visible pendant 6 mois est un programme à haut risque perçu.",{"type":29,"tag":37,"props":2554,"children":2555},{},[2556,2561],{"type":29,"tag":55,"props":2557,"children":2558},{},[2559],{"type":35,"value":2560},"Structure recommandée en 3 phases",{"type":35,"value":1119},{"type":29,"tag":37,"props":2563,"children":2564},{},[2565,2570],{"type":29,"tag":55,"props":2566,"children":2567},{},[2568],{"type":35,"value":2569},"Phase 1 (4-6 semaines) : Stabilisation et quick wins",{"type":35,"value":1119},{"type":29,"tag":661,"props":2572,"children":2573},{},[2574,2579,2584],{"type":29,"tag":665,"props":2575,"children":2576},{},[2577],{"type":35,"value":2578},"Objectif : réduire les incidents de prod immédiats",{"type":29,"tag":665,"props":2580,"children":2581},{},[2582],{"type":35,"value":2583},"Livrable visible : réduction du taux d'incidents de 50%",{"type":29,"tag":665,"props":2585,"children":2586},{},[2587],{"type":35,"value":2588},"Investissement : 20% de la capacité de l'équipe",{"type":29,"tag":37,"props":2590,"children":2591},{},[2592,2597],{"type":29,"tag":55,"props":2593,"children":2594},{},[2595],{"type":35,"value":2596},"Phase 2 (6-8 semaines) : Refactoring structurel",{"type":35,"value":1119},{"type":29,"tag":661,"props":2599,"children":2600},{},[2601,2606,2611],{"type":29,"tag":665,"props":2602,"children":2603},{},[2604],{"type":35,"value":2605},"Objectif : réduire l'absorption de la dette",{"type":29,"tag":665,"props":2607,"children":2608},{},[2609],{"type":35,"value":2610},"Livrable visible : le lead time sur le module cible commence à baisser",{"type":29,"tag":665,"props":2612,"children":2613},{},[2614],{"type":35,"value":2615},"Investissement : 30-40% de la capacité",{"type":29,"tag":37,"props":2617,"children":2618},{},[2619,2624],{"type":29,"tag":55,"props":2620,"children":2621},{},[2622],{"type":35,"value":2623},"Phase 3 (4-6 semaines) : Consolidation et transfert",{"type":35,"value":1119},{"type":29,"tag":661,"props":2626,"children":2627},{},[2628,2633,2638],{"type":29,"tag":665,"props":2629,"children":2630},{},[2631],{"type":35,"value":2632},"Objectif : documenter, tester, former l'équipe sur les nouveaux patterns",{"type":29,"tag":665,"props":2634,"children":2635},{},[2636],{"type":35,"value":2637},"Livrable visible : les autres équipes peuvent modifier le module sans accompagnement",{"type":29,"tag":665,"props":2639,"children":2640},{},[2641],{"type":35,"value":2642},"Investissement : 20% de la capacité",{"type":29,"tag":37,"props":2644,"children":2645},{},[2646,2651],{"type":29,"tag":55,"props":2647,"children":2648},{},[2649],{"type":35,"value":2650},"L'argument clé",{"type":35,"value":2652}," : les features continuent de sortir pendant tout le programme. Ce n'est pas un arrêt, c'est une réallocation partielle et temporaire. C'est précisément ce que la théorie des contraintes de Goldratt préconise : traiter le goulot d'étranglement en maintenant le flux global.",{"type":29,"tag":37,"props":2654,"children":2655},{},[2656,2660],{"type":29,"tag":55,"props":2657,"children":2658},{},[2659],{"type":35,"value":1150},{"type":35,"value":2661}," : un plan de 3 phases avec les livrables visibles à chaque étape.",{"type":29,"tag":66,"props":2663,"children":2664},{},[],{"type":29,"tag":70,"props":2666,"children":2668},{"id":2667},"étape-4-le-pitch-de-10-minutes-qui-obtient-le-budget",[2669],{"type":35,"value":2670},"Étape 4 : Le pitch de 10 minutes qui obtient le budget",{"type":29,"tag":37,"props":2672,"children":2673},{},[2674],{"type":35,"value":2675},"Structure du pitch :",{"type":29,"tag":1966,"props":2677,"children":2678},{},[2679,2689,2699,2709,2719],{"type":29,"tag":665,"props":2680,"children":2681},{},[2682,2687],{"type":29,"tag":55,"props":2683,"children":2684},{},[2685],{"type":35,"value":2686},"L'enjeu",{"type":35,"value":2688}," (2 min) : \"Notre module X nous coûte 1M€/an. Voici les chiffres.\"",{"type":29,"tag":665,"props":2690,"children":2691},{},[2692,2697],{"type":29,"tag":55,"props":2693,"children":2694},{},[2695],{"type":35,"value":2696},"Le diagnostic",{"type":35,"value":2698}," (2 min) : \"Voici pourquoi il coûte autant et pourquoi ça va empirer.\"",{"type":29,"tag":665,"props":2700,"children":2701},{},[2702,2707],{"type":29,"tag":55,"props":2703,"children":2704},{},[2705],{"type":35,"value":2706},"La solution",{"type":35,"value":2708}," (2 min) : \"Un programme de 3 mois, 3 phases, qui continue à livrer des features.\"",{"type":29,"tag":665,"props":2710,"children":2711},{},[2712,2717],{"type":29,"tag":55,"props":2713,"children":2714},{},[2715],{"type":35,"value":2716},"Le ROI",{"type":35,"value":2718}," (2 min) : \"Investissement : 200K€. Économie annuelle : 600K€. Retour en 3 mois.\"",{"type":29,"tag":665,"props":2720,"children":2721},{},[2722,2727,2729,2735],{"type":29,"tag":55,"props":2723,"children":2724},{},[2725],{"type":35,"value":2726},"La décision demandée",{"type":35,"value":2728}," (2 min) : \"On a besoin de votre feu vert pour allouer 30% de la capacité de l'équipe pendant 3 mois, à partir du ",{"type":29,"tag":2730,"props":2731,"children":2732},"span",{},[2733],{"type":35,"value":2734},"date",{"type":35,"value":2736},".\"",{"type":29,"tag":37,"props":2738,"children":2739},{},[2740,2745],{"type":29,"tag":55,"props":2741,"children":2742},{},[2743],{"type":35,"value":2744},"Ce qu'il ne faut surtout pas dire",{"type":35,"value":2746}," : \"On a besoin de payer la dette technique.\" C'est une phrase technique sans signification financière. Remplacez-la par : \"On a besoin de réduire notre coût opérationnel de 600K€/an.\" Ce n'est pas du spin, c'est la même réalité exprimée dans la langue de votre interlocuteur.",{"type":29,"tag":66,"props":2748,"children":2749},{},[],{"type":29,"tag":70,"props":2751,"children":2752},{"id":1412},[2753],{"type":35,"value":1415},{"type":29,"tag":1417,"props":2755,"children":2756},{},[2757],{"type":29,"tag":37,"props":2758,"children":2759},{},[2760],{"type":35,"value":2761},"Ne promettre jamais une réduction de 100% de la dette. Je promets des améliorations mesurables sur des métriques spécifiques. Un programme qui promet \"tout refactoriser\" ne sera jamais terminé et perdra la confiance du business. Un programme qui promet \"réduire les incidents P1 de 6 à 2 par an sur le module X en 3 mois\" est vérifiable et crédible.",{"type":29,"tag":66,"props":2763,"children":2764},{},[],{"type":29,"tag":70,"props":2766,"children":2767},{"id":1430},[2768],{"type":35,"value":1433},{"type":29,"tag":1435,"props":2770,"children":2771},{},[2772,2790],{"type":29,"tag":1439,"props":2773,"children":2774},{},[2775],{"type":29,"tag":1443,"props":2776,"children":2777},{},[2778,2782,2786],{"type":29,"tag":1447,"props":2779,"children":2780},{},[2781],{"type":35,"value":1451},{"type":29,"tag":1447,"props":2783,"children":2784},{},[2785],{"type":35,"value":1456},{"type":29,"tag":1447,"props":2787,"children":2788},{},[2789],{"type":35,"value":1461},{"type":29,"tag":1463,"props":2791,"children":2792},{},[2793,2810,2827,2844],{"type":29,"tag":1443,"props":2794,"children":2795},{},[2796,2800,2805],{"type":29,"tag":1470,"props":2797,"children":2798},{},[2799],{"type":35,"value":1474},{"type":29,"tag":1470,"props":2801,"children":2802},{},[2803],{"type":35,"value":2804},"Quantifier le coût actuel de l'inaction",{"type":29,"tag":1470,"props":2806,"children":2807},{},[2808],{"type":35,"value":2809},"Chiffres prêts pour le business case",{"type":29,"tag":1443,"props":2811,"children":2812},{},[2813,2817,2822],{"type":29,"tag":1470,"props":2814,"children":2815},{},[2816],{"type":35,"value":1492},{"type":29,"tag":1470,"props":2818,"children":2819},{},[2820],{"type":35,"value":2821},"Construire le ROI en langage financier",{"type":29,"tag":1470,"props":2823,"children":2824},{},[2825],{"type":35,"value":2826},"Slide de ROI en 1 page",{"type":29,"tag":1443,"props":2828,"children":2829},{},[2830,2834,2839],{"type":29,"tag":1470,"props":2831,"children":2832},{},[2833],{"type":35,"value":1510},{"type":29,"tag":1470,"props":2835,"children":2836},{},[2837],{"type":35,"value":2838},"Plan en 3 phases avec quick wins visibles",{"type":29,"tag":1470,"props":2840,"children":2841},{},[2842],{"type":35,"value":2843},"Programme crédible sans arrêt des features",{"type":29,"tag":1443,"props":2845,"children":2846},{},[2847,2851,2856],{"type":29,"tag":1470,"props":2848,"children":2849},{},[2850],{"type":35,"value":1528},{"type":29,"tag":1470,"props":2852,"children":2853},{},[2854],{"type":35,"value":2855},"Pitch de 10 minutes structuré",{"type":29,"tag":1470,"props":2857,"children":2858},{},[2859],{"type":35,"value":2860},"Feu vert et budget alloué",{"type":29,"tag":66,"props":2862,"children":2863},{},[],{"type":29,"tag":70,"props":2865,"children":2867},{"id":2866},"faq-sur-le-business-case-du-refactoring",[2868],{"type":35,"value":2869},"FAQ sur le business case du refactoring",{"type":29,"tag":371,"props":2871,"children":2872},{},[2873,2878],{"type":29,"tag":375,"props":2874,"children":2875},{},[2876],{"type":35,"value":2877},"1. Que faire si le business accepte mais réduit le budget de moitié ?",{"type":29,"tag":37,"props":2879,"children":2880},{},[2881],{"type":35,"value":2882},"Ne pas accepter un programme sous-dimensionné qui ne peut pas atteindre ses objectifs. C'est pire qu'un refus : il consomme de la capacité sans produire de résultats, et détruit la crédibilité pour les prochaines demandes. Il vaut mieux replanifier sur un périmètre plus restreint (un module au lieu de trois) avec le budget disponible, et livrer des résultats mesurables avant de demander la suite.",{"type":29,"tag":371,"props":2884,"children":2885},{},[2886,2891],{"type":29,"tag":375,"props":2887,"children":2888},{},[2889],{"type":35,"value":2890},"2. Comment mesurer l'impact du programme une fois démarré ?",{"type":29,"tag":37,"props":2892,"children":2893},{},[2894],{"type":35,"value":2895},"Je définis les métriques de succès avant de commencer : lead time cible, taux d'incidents cible, absorption de maintenance cible. Je mesure ces métriques à J0, J30, J60, J90. Un tableau de bord visible par le business tous les 15 jours. La transparence sur les progrès maintient le soutien et prévient les remises en question en cours de route.",{"type":29,"tag":371,"props":2897,"children":2898},{},[2899,2904],{"type":29,"tag":375,"props":2900,"children":2901},{},[2902],{"type":35,"value":2903},"3. Le business peut-il comprendre les concepts techniques comme la \"dette technique\" ?",{"type":29,"tag":37,"props":2905,"children":2906},{},[2907],{"type":35,"value":2908},"Oui, mais pas dans le vocabulaire technique. L'analogie financière fonctionne très bien : \"La dette technique est exactement comme une dette financière. Elle a un principal (le travail à faire pour la rembourser) et des intérêts (le surcoût de travail que vous payez chaque jour parce qu'elle existe). Nous payons actuellement 1M€/an d'intérêts. Ce programme rembourse une partie du principal et réduit les intérêts de 60%.\"",{"type":29,"tag":371,"props":2910,"children":2911},{},[2912,2917],{"type":29,"tag":375,"props":2913,"children":2914},{},[2915],{"type":35,"value":2916},"4. Comment gérer la pression de maintenir la roadmap feature pendant le programme ?",{"type":29,"tag":37,"props":2918,"children":2919},{},[2920],{"type":35,"value":2921},"Je négocie explicitement le \"budget technique\" avant de commencer : X% de la capacité de l'équipe est allouée au programme pendant Y semaines. Ce n'est pas du temps volé aux features, c'est un investissement planifié. Je présente chaque sprint les features livrées ET l'avancement du programme. La co-existence est possible à condition que les règles soient claires dès le départ.",{"type":29,"tag":66,"props":2923,"children":2924},{},[],{"type":29,"tag":166,"props":2926,"children":2927},{"cta":442,"href":443,"title":444,"type":445},[2928],{"type":29,"tag":37,"props":2929,"children":2930},{},[2931],{"type":35,"value":2932},"L'assessment inclut une section dédiée à la gestion de la dette technique et vous aide à quantifier votre niveau d'absorption actuel : le premier chiffre dont vous avez besoin pour votre business case.",{"title":8,"searchDepth":453,"depth":453,"links":2934},[2935,2936,2937,2938,2939,2940,2941,2942],{"id":1057,"depth":453,"text":1060},{"id":2215,"depth":453,"text":2218},{"id":2326,"depth":453,"text":2329},{"id":2544,"depth":453,"text":2547},{"id":2667,"depth":453,"text":2670},{"id":1412,"depth":453,"text":1415},{"id":1430,"depth":453,"text":1433},{"id":2866,"depth":453,"text":2869},"content:fr:dette-technique:programme-refactoring-approuve-business.md","fr/dette-technique/programme-refactoring-approuve-business.md","fr/dette-technique/programme-refactoring-approuve-business",{"_path":327,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":2947,"description":2948,"id":2949,"date":2950,"listed":13,"nocomments":7,"hidden":7,"categories":2951,"tags":2952,"--cover":2956,"readingTime":2957,"body":2961,"_type":466,"_id":3547,"_source":468,"_file":3548,"_stem":3549,"_extension":471},"Les outils d'analyse statique indispensables en 2026","L'analyse statique détecte en secondes ce que les code reviews manquent en heures. Panorama des outils qui font la différence selon le langage et le contexte.",11,"2026-01-28",[6],[2953,2954,2955],"Analyse Statique","Qualité Code","Outillage","covers/articles/analyse-statique-outils.jpg",{"text":21,"minutes":2958,"time":2959,"words":2960},7.425,445500,1485,{"type":26,"children":2962,"toc":3531},[2963,2968,2973,2981,2992,2995,3001,3010,3043,3052,3075,3080,3083,3089,3095,3100,3110,3116,3121,3130,3136,3141,3150,3153,3159,3165,3175,3185,3195,3208,3214,3248,3258,3264,3274,3292,3310,3313,3322,3325,3331,3336,3344,3355,3363,3368,3376,3381,3384,3390,3395,3405,3415,3425,3438,3441,3447,3460,3473,3486,3499,3520,3523],{"type":29,"tag":30,"props":2964,"children":2966},{"id":2965},"les-outils-danalyse-statique-indispensables-en-2026",[2967],{"type":35,"value":2947},{"type":29,"tag":37,"props":2969,"children":2970},{},[2971],{"type":35,"value":2972},"J'accompagnais un client dans le secteur financier à Paris : 30 développeurs, des ingénieurs motivés, des code reviews sérieuses. Lors d'un audit de sécurité, le prestataire externe a trouvé 14 vulnérabilités critiques dans leur codebase. Dont 11 que SonarQube aurait détectées automatiquement en 30 secondes. L'équipe faisait des code reviews depuis 2 ans, et personne n'avait vu ces failles. Pas parce qu'ils étaient mauvais. Parce que les reviewers humains regardent la logique, l'architecture, la lisibilité. Pas les patterns de sécurité connus.",{"type":29,"tag":37,"props":2974,"children":2975},{},[2976],{"type":29,"tag":55,"props":2977,"children":2978},{},[2979],{"type":35,"value":2980},"Une code review humaine prend 45 minutes en moyenne et détecte 60% des problèmes. Un outil d'analyse statique prend 30 secondes et détecte les 40% restants, mais pas les mêmes 40%. Les deux sont complémentaires. La plupart des équipes n'utilisent qu'un seul des deux.",{"type":29,"tag":37,"props":2982,"children":2983},{},[2984,2986,2990],{"type":35,"value":2985},"Dans les équipes que j'accompagne, l'installation d'un outil d'analyse statique dans la CI réduit en moyenne de 30% le nombre de commentaires de ",{"type":29,"tag":43,"props":2987,"children":2988},{"href":940},[2989],{"type":35,"value":943},{"type":35,"value":2991}," liés au style, à la sécurité basique, et à la complexité évitable. Ce qui libère les reviewers pour ce qui compte vraiment : la logique métier, l'architecture, et les décisions de design.",{"type":29,"tag":66,"props":2993,"children":2994},{},[],{"type":29,"tag":70,"props":2996,"children":2998},{"id":2997},"ce-que-lanalyse-statique-peut-et-ne-peut-pas-faire",[2999],{"type":35,"value":3000},"Ce que l'analyse statique peut et ne peut pas faire",{"type":29,"tag":37,"props":3002,"children":3003},{},[3004,3009],{"type":29,"tag":55,"props":3005,"children":3006},{},[3007],{"type":35,"value":3008},"Ce qu'elle fait bien",{"type":35,"value":1119},{"type":29,"tag":661,"props":3011,"children":3012},{},[3013,3018,3023,3028,3033,3038],{"type":29,"tag":665,"props":3014,"children":3015},{},[3016],{"type":35,"value":3017},"Détecter les vulnérabilités de sécurité connues (injections, secrets hardcodés, dépendances vulnérables)",{"type":29,"tag":665,"props":3019,"children":3020},{},[3021],{"type":35,"value":3022},"Mesurer la complexité cyclomatique et alerter sur les fonctions trop complexes",{"type":29,"tag":665,"props":3024,"children":3025},{},[3026],{"type":35,"value":3027},"Identifier les duplications de code",{"type":29,"tag":665,"props":3029,"children":3030},{},[3031],{"type":35,"value":3032},"Enforcer les conventions de style (sans discussions en review)",{"type":29,"tag":665,"props":3034,"children":3035},{},[3036],{"type":35,"value":3037},"Détecter les bugs courants : null pointers potentiels, ressources non fermées, conditions toujours vraies",{"type":29,"tag":665,"props":3039,"children":3040},{},[3041],{"type":35,"value":3042},"Mesurer la couverture de tests et bloquer si elle descend sous un seuil",{"type":29,"tag":37,"props":3044,"children":3045},{},[3046,3051],{"type":29,"tag":55,"props":3047,"children":3048},{},[3049],{"type":35,"value":3050},"Ce qu'elle ne fait pas",{"type":35,"value":1119},{"type":29,"tag":661,"props":3053,"children":3054},{},[3055,3060,3065,3070],{"type":29,"tag":665,"props":3056,"children":3057},{},[3058],{"type":35,"value":3059},"Comprendre l'intention du code",{"type":29,"tag":665,"props":3061,"children":3062},{},[3063],{"type":35,"value":3064},"Évaluer si la logique métier est correcte",{"type":29,"tag":665,"props":3066,"children":3067},{},[3068],{"type":35,"value":3069},"Détecter les problèmes d'architecture de haut niveau",{"type":29,"tag":665,"props":3071,"children":3072},{},[3073],{"type":35,"value":3074},"Remplacer le jugement d'un senior sur un design pattern",{"type":29,"tag":37,"props":3076,"children":3077},{},[3078],{"type":35,"value":3079},"L'erreur courante est de sur-configurer les outils pour tout détecter, et de créer tant de faux positifs que l'équipe les ignore. Un outil d'analyse statique bien configuré doit générer des alertes actionnées à chaque fois. Si une alerte est régulièrement ignorée, c'est soit une règle à désactiver, soit un problème de discipline à adresser explicitement.",{"type":29,"tag":66,"props":3081,"children":3082},{},[],{"type":29,"tag":70,"props":3084,"children":3086},{"id":3085},"les-catégories-doutils",[3087],{"type":35,"value":3088},"Les catégories d'outils",{"type":29,"tag":106,"props":3090,"children":3092},{"id":3091},"linters-et-formateurs",[3093],{"type":35,"value":3094},"Linters et formateurs",{"type":29,"tag":37,"props":3096,"children":3097},{},[3098],{"type":35,"value":3099},"Ils enforecent le style et détectent les erreurs syntaxiques et les anti-patterns simples. Ce sont les outils les plus rapides à mettre en place et les plus immédiatement utiles pour réduire le bruit en code review.",{"type":29,"tag":37,"props":3101,"children":3102},{},[3103,3108],{"type":29,"tag":55,"props":3104,"children":3105},{},[3106],{"type":35,"value":3107},"Exemples",{"type":35,"value":3109}," : ESLint (JavaScript/TypeScript), Checkstyle (Java), pylint/flake8 (Python), ktlint (Kotlin), SwiftLint (Swift).",{"type":29,"tag":106,"props":3111,"children":3113},{"id":3112},"outils-sast-static-application-security-testing",[3114],{"type":35,"value":3115},"Outils SAST (Static Application Security Testing)",{"type":29,"tag":37,"props":3117,"children":3118},{},[3119],{"type":35,"value":3120},"Ils analysent le code à la recherche de vulnérabilités de sécurité connues : injections SQL, XSS, gestion incorrecte des secrets, dépendances avec des CVE connus.",{"type":29,"tag":37,"props":3122,"children":3123},{},[3124,3128],{"type":29,"tag":55,"props":3125,"children":3126},{},[3127],{"type":35,"value":3107},{"type":35,"value":3129}," : SonarQube, Semgrep, Snyk Code, GitHub Advanced Security, Checkmarx.",{"type":29,"tag":106,"props":3131,"children":3133},{"id":3132},"outils-de-métriques-de-qualité",[3134],{"type":35,"value":3135},"Outils de métriques de qualité",{"type":29,"tag":37,"props":3137,"children":3138},{},[3139],{"type":35,"value":3140},"Ils mesurent la complexité cyclomatique, la duplication, le couplage, et la cohésion. Ils donnent une vue quantitative de la santé du code et permettent de suivre l'évolution dans le temps.",{"type":29,"tag":37,"props":3142,"children":3143},{},[3144,3148],{"type":29,"tag":55,"props":3145,"children":3146},{},[3147],{"type":35,"value":3107},{"type":35,"value":3149}," : SonarQube (métriques), CodeClimate, NDepend (.NET), Codacy.",{"type":29,"tag":66,"props":3151,"children":3152},{},[],{"type":29,"tag":70,"props":3154,"children":3156},{"id":3155},"les-outils-par-écosystème",[3157],{"type":35,"value":3158},"Les outils par écosystème",{"type":29,"tag":106,"props":3160,"children":3162},{"id":3161},"java-kotlin",[3163],{"type":35,"value":3164},"Java / Kotlin",{"type":29,"tag":37,"props":3166,"children":3167},{},[3168,3173],{"type":29,"tag":55,"props":3169,"children":3170},{},[3171],{"type":35,"value":3172},"SonarQube",{"type":35,"value":3174}," reste la référence. La version Community est gratuite et couvre l'essentiel : bugs, vulnérabilités, code smells, couverture de tests, duplications. Pour les équipes avec des contraintes de sécurité avancées, SonarQube Developer Edition ajoute l'analyse des branches et les Security Hotspots.",{"type":29,"tag":37,"props":3176,"children":3177},{},[3178,3183],{"type":29,"tag":55,"props":3179,"children":3180},{},[3181],{"type":35,"value":3182},"Checkstyle + PMD + SpotBugs",{"type":35,"value":3184}," : la combinaison classique. Checkstyle pour le style, PMD pour les anti-patterns, SpotBugs pour les bugs potentiels. Plus granulaire que SonarQube mais nécessite plus de configuration.",{"type":29,"tag":37,"props":3186,"children":3187},{},[3188,3193],{"type":29,"tag":55,"props":3189,"children":3190},{},[3191],{"type":35,"value":3192},"ktlint",{"type":35,"value":3194}," pour Kotlin : léger, opinionated, intégrable en 5 minutes dans Gradle.",{"type":29,"tag":1417,"props":3196,"children":3197},{},[3198],{"type":29,"tag":37,"props":3199,"children":3200},{},[3201,3206],{"type":29,"tag":55,"props":3202,"children":3203},{},[3204],{"type":35,"value":3205},"Configuration recommandée",{"type":35,"value":3207}," : SonarQube avec quality gate bloquant si le coverage descend sous le seuil de l'équipe ou si de nouveaux Security Hotspots Critical/Blocker apparaissent.",{"type":29,"tag":106,"props":3209,"children":3211},{"id":3210},"javascript-typescript",[3212],{"type":35,"value":3213},"JavaScript / TypeScript",{"type":29,"tag":37,"props":3215,"children":3216},{},[3217,3222,3224,3230,3232,3238,3240,3246],{"type":29,"tag":55,"props":3218,"children":3219},{},[3220],{"type":35,"value":3221},"ESLint",{"type":35,"value":3223}," est incontournable. Avec les plugins ",{"type":29,"tag":1716,"props":3225,"children":3227},{"className":3226},[],[3228],{"type":35,"value":3229},"@typescript-eslint",{"type":35,"value":3231},", ",{"type":29,"tag":1716,"props":3233,"children":3235},{"className":3234},[],[3236],{"type":35,"value":3237},"eslint-plugin-security",{"type":35,"value":3239},", et ",{"type":29,"tag":1716,"props":3241,"children":3243},{"className":3242},[],[3244],{"type":35,"value":3245},"eslint-plugin-sonarjs",{"type":35,"value":3247},", il couvre style, sécurité basique, et patterns problématiques. Prettier en complément pour le formatage : ESLint détecte, Prettier formate.",{"type":29,"tag":37,"props":3249,"children":3250},{},[3251,3256],{"type":29,"tag":55,"props":3252,"children":3253},{},[3254],{"type":35,"value":3255},"Semgrep",{"type":35,"value":3257}," pour les règles de sécurité plus avancées et les patterns custom. Particulièrement utile pour enforcer des règles métier ou des patterns d'architecture.",{"type":29,"tag":106,"props":3259,"children":3261},{"id":3260},"python",[3262],{"type":35,"value":3263},"Python",{"type":29,"tag":37,"props":3265,"children":3266},{},[3267,3272],{"type":29,"tag":55,"props":3268,"children":3269},{},[3270],{"type":35,"value":3271},"Ruff",{"type":35,"value":3273}," a remplacé flake8 + isort + pyupgrade en 2024-2025. 10 à 100 fois plus rapide, même couverture. Si vous êtes encore sur flake8, la migration vaut 2 heures de travail.",{"type":29,"tag":37,"props":3275,"children":3276},{},[3277,3282,3284,3290],{"type":29,"tag":55,"props":3278,"children":3279},{},[3280],{"type":35,"value":3281},"mypy ou pyright",{"type":35,"value":3283}," pour le type checking statique. Sur un codebase sans annotations, introduire mypy progressivement (mode ",{"type":29,"tag":1716,"props":3285,"children":3287},{"className":3286},[],[3288],{"type":35,"value":3289},"--ignore-missing-imports",{"type":35,"value":3291}," d'abord) produit des résultats en quelques semaines.",{"type":29,"tag":37,"props":3293,"children":3294},{},[3295,3300,3302,3308],{"type":29,"tag":55,"props":3296,"children":3297},{},[3298],{"type":35,"value":3299},"Bandit",{"type":35,"value":3301}," pour la sécurité : détecte les hardcoded passwords, les appels ",{"type":29,"tag":1716,"props":3303,"children":3305},{"className":3304},[],[3306],{"type":35,"value":3307},"eval()",{"type":35,"value":3309},", les configurations TLS faibles.",{"type":29,"tag":66,"props":3311,"children":3312},{},[],{"type":29,"tag":166,"props":3314,"children":3316},{"cta":168,"href":169,"title":3315,"type":171},"Votre pipeline CI n'inclut pas encore d'analyse statique, ou les alertes sont ignorées ?",[3317],{"type":29,"tag":37,"props":3318,"children":3319},{},[3320],{"type":35,"value":3321},"Vous avez des outils en place mais ils génèrent du bruit que personne n'actionne, ou vous n'avez rien et vous savez que des vulnérabilités passent en production sans être détectées. Un audit de votre outillage qualité prend une demi-journée. En 30 minutes, on identifie les changements à fort impact pour votre équipe.",{"type":29,"tag":66,"props":3323,"children":3324},{},[],{"type":29,"tag":70,"props":3326,"children":3328},{"id":3327},"comment-intégrer-sans-ralentir-la-ci",[3329],{"type":35,"value":3330},"Comment intégrer sans ralentir la CI",{"type":29,"tag":37,"props":3332,"children":3333},{},[3334],{"type":35,"value":3335},"Le principal frein à l'adoption de l'analyse statique est la peur de ralentir la CI. C'est un faux problème si l'intégration est pensée correctement.",{"type":29,"tag":37,"props":3337,"children":3338},{},[3339],{"type":29,"tag":55,"props":3340,"children":3341},{},[3342],{"type":35,"value":3343},"Principe 1 : Séparer le feedback rapide du feedback complet",{"type":29,"tag":37,"props":3345,"children":3346},{},[3347,3349,3353],{"type":35,"value":3348},"Faire tourner le linter sur le diff (pas sur tout le codebase) en moins de 60 secondes dans la ",{"type":29,"tag":43,"props":3350,"children":3351},{"href":1212},[3352],{"type":35,"value":2003},{"type":35,"value":3354},". Faire tourner l'analyse complète (SonarQube) en parallèle du build, sans le bloquer. Le quality gate bloque le merge, pas le build.",{"type":29,"tag":37,"props":3356,"children":3357},{},[3358],{"type":29,"tag":55,"props":3359,"children":3360},{},[3361],{"type":35,"value":3362},"Principe 2 : Commencer par \"warn\", passer à \"error\" progressivement",{"type":29,"tag":37,"props":3364,"children":3365},{},[3366],{"type":35,"value":3367},"Ne jamais activer tous les checks en mode bloquant dès le premier jour sur un codebase existant. Commencer en mode avertissement sur les nouvelles règles, corriger les violations existantes sur 2-4 semaines, puis passer en mode bloquant.",{"type":29,"tag":37,"props":3369,"children":3370},{},[3371],{"type":29,"tag":55,"props":3372,"children":3373},{},[3374],{"type":35,"value":3375},"Principe 3 : Zero tolerance sur le nouveau code uniquement",{"type":29,"tag":37,"props":3377,"children":3378},{},[3379],{"type":35,"value":3380},"SonarQube et Codacy permettent de configurer des quality gates \"new code only\" : les règles ne s'appliquent qu'aux lignes modifiées dans la PR en cours. C'est la stratégie la plus efficace pour améliorer la qualité progressivement sans bloquer les équipes sur de l'existant.",{"type":29,"tag":66,"props":3382,"children":3383},{},[],{"type":29,"tag":70,"props":3385,"children":3387},{"id":3386},"les-métriques-à-surveiller",[3388],{"type":35,"value":3389},"Les métriques à surveiller",{"type":29,"tag":37,"props":3391,"children":3392},{},[3393],{"type":35,"value":3394},"Une fois les outils en place, trois métriques donnent une vue claire de la santé du codebase :",{"type":29,"tag":37,"props":3396,"children":3397},{},[3398,3403],{"type":29,"tag":55,"props":3399,"children":3400},{},[3401],{"type":35,"value":3402},"Complexité cyclomatique moyenne",{"type":35,"value":3404}," : idéalement \u003C 10 par fonction. Au-dessus de 20, la fonction est difficile à tester et à maintenir. Je suis cette métrique trimestre par trimestre : une dérive ici prédit presque toujours une augmentation des bugs de prod dans les 60 jours.",{"type":29,"tag":37,"props":3406,"children":3407},{},[3408,3413],{"type":29,"tag":55,"props":3409,"children":3410},{},[3411],{"type":35,"value":3412},"Taux de duplication",{"type":35,"value":3414}," : objectif \u003C 5% pour un nouveau projet, \u003C 15% pour un legacy en cours de réduction. Au-delà, chaque modification implique de synchroniser plusieurs endroits, ce qui crée du couplage implicite, exactement ce que le principe DRY (Don't Repeat Yourself) du Clean Code cherche à éliminer.",{"type":29,"tag":37,"props":3416,"children":3417},{},[3418,3423],{"type":29,"tag":55,"props":3419,"children":3420},{},[3421],{"type":35,"value":3422},"Technical Debt Ratio",{"type":35,"value":3424}," (SonarQube) : le rapport entre le temps estimé pour corriger tous les code smells et le temps total de développement. Un ratio \u003C 5% est sain. Entre 5% et 10%, surveiller. Au-dessus de 10%, planifier une intervention.",{"type":29,"tag":1417,"props":3426,"children":3427},{},[3428],{"type":29,"tag":37,"props":3429,"children":3430},{},[3431,3436],{"type":29,"tag":55,"props":3432,"children":3433},{},[3434],{"type":35,"value":3435},"Ce que j'ai observé chez ce client",{"type":35,"value":3437}," : l'installation de SonarQube avec un quality gate basic (0 blocker, 0 critical en nouveau code) a réduit de 40% le nombre de commentaires sécurité en code review en 3 mois. Le temps des reviewers s'est reporté sur la logique métier et l'architecture, et la satisfaction des développeurs a augmenté. Le coût d'installation : 2 jours d'un DevOps. Le ROI : immédiat.",{"type":29,"tag":66,"props":3439,"children":3440},{},[],{"type":29,"tag":70,"props":3442,"children":3444},{"id":3443},"faq-sur-lanalyse-statique",[3445],{"type":35,"value":3446},"FAQ sur l'analyse statique",{"type":29,"tag":371,"props":3448,"children":3449},{},[3450,3455],{"type":29,"tag":375,"props":3451,"children":3452},{},[3453],{"type":35,"value":3454},"1. SonarQube ou Codacy ou CodeClimate : lequel choisir ?",{"type":29,"tag":37,"props":3456,"children":3457},{},[3458],{"type":35,"value":3459},"SonarQube est le plus complet et le plus configurable, mais nécessite une infrastructure (auto-hébergé) ou un abonnement SonarCloud. Codacy et CodeClimate sont plus simples à démarrer (intégration GitHub/GitLab en 5 minutes) et suffisants pour la plupart des équipes. Ma recommandation : Codacy ou SonarCloud pour les équipes \u003C 50 développeurs, SonarQube auto-hébergé pour les grandes organisations avec des contraintes de sécurité des données.",{"type":29,"tag":371,"props":3461,"children":3462},{},[3463,3468],{"type":29,"tag":375,"props":3464,"children":3465},{},[3466],{"type":35,"value":3467},"2. L'analyse statique ralentit notre CI. Comment l'accélérer ?",{"type":29,"tag":37,"props":3469,"children":3470},{},[3471],{"type":35,"value":3472},"Trois leviers : (1) Faire tourner le linter en mode incrémental sur le diff uniquement (ESLint --cache, SonarQube \"new code only\"). (2) Paralléliser l'analyse statique avec le build : elle n'a pas besoin de bloquer le build, seulement le merge. (3) Utiliser un cache agressif pour les analyses qui ne changent pas entre commits. Sur un codebase de 500K lignes, une analyse SonarQube correctement configurée ne devrait pas dépasser 5-8 minutes.",{"type":29,"tag":371,"props":3474,"children":3475},{},[3476,3481],{"type":29,"tag":375,"props":3477,"children":3478},{},[3479],{"type":35,"value":3480},"3. Comment gérer la dette technique détectée par SonarQube sur un legacy ?",{"type":29,"tag":37,"props":3482,"children":3483},{},[3484],{"type":35,"value":3485},"Ne pas essayer de tout corriger d'un coup. Stratégie en 3 phases : (1) Activer le quality gate \"new code only\" : la dette existante ne bloque pas, mais le nouveau code est propre. (2) Créer un backlog dédié avec les violations les plus critiques (Blocker et Critical). (3) Allouer 10-15% de la capacité de l'équipe chaque sprint pour résorber la dette détectée, en commençant par les modules les plus fréquemment modifiés.",{"type":29,"tag":371,"props":3487,"children":3488},{},[3489,3494],{"type":29,"tag":375,"props":3490,"children":3491},{},[3492],{"type":35,"value":3493},"4. Les développeurs résistent à l'analyse statique. Comment les convaincre ?",{"type":29,"tag":37,"props":3495,"children":3496},{},[3497],{"type":35,"value":3498},"La résistance vient souvent des faux positifs et des règles perçues comme arbitraires. La solution : impliquer l'équipe dans la configuration initiale. J'organise une session de 2h pour décider ensemble quelles règles activer et lesquelles désactiver. Les règles décidées collectivement sont respectées. Les règles imposées sont contournées.",{"type":29,"tag":371,"props":3500,"children":3501},{},[3502,3507],{"type":29,"tag":375,"props":3503,"children":3504},{},[3505],{"type":35,"value":3506},"5. Faut-il des outils différents pour le code IA-généré ?",{"type":29,"tag":37,"props":3508,"children":3509},{},[3510,3512,3518],{"type":35,"value":3511},"En 2026, le code généré par des LLMs comme Copilot doit passer exactement les mêmes checks que le code humain, et potentiellement des checks supplémentaires sur la sécurité. Le code IA a tendance à générer des patterns avec des hardcoded credentials ou des injections si le prompt n'est pas bien contrôlé. Semgrep avec des règles custom pour les patterns de ",{"type":29,"tag":43,"props":3513,"children":3515},{"href":3514},"/fr/intelligence-artificielle/llm-securite-code-vulnerabilites",[3516],{"type":35,"value":3517},"sécurité IA-spécifiques",{"type":35,"value":3519}," est une bonne addition à votre pipeline.",{"type":29,"tag":66,"props":3521,"children":3522},{},[],{"type":29,"tag":166,"props":3524,"children":3525},{"cta":442,"href":443,"title":444,"type":445},[3526],{"type":29,"tag":37,"props":3527,"children":3528},{},[3529],{"type":35,"value":3530},"L'assessment évalue votre niveau de maturité sur les pratiques d'outillage qualité, incluant l'analyse statique et la CI. Score automatique + recommandations priorisées pour les 90 prochains jours.",{"title":8,"searchDepth":453,"depth":453,"links":3532},[3533,3534,3539,3544,3545,3546],{"id":2997,"depth":453,"text":3000},{"id":3085,"depth":453,"text":3088,"children":3535},[3536,3537,3538],{"id":3091,"depth":459,"text":3094},{"id":3112,"depth":459,"text":3115},{"id":3132,"depth":459,"text":3135},{"id":3155,"depth":453,"text":3158,"children":3540},[3541,3542,3543],{"id":3161,"depth":459,"text":3164},{"id":3210,"depth":459,"text":3213},{"id":3260,"depth":459,"text":3263},{"id":3327,"depth":453,"text":3330},{"id":3386,"depth":453,"text":3389},{"id":3443,"depth":453,"text":3446},"content:fr:dette-technique:outils-analyse-statique-2026.md","fr/dette-technique/outils-analyse-statique-2026.md","fr/dette-technique/outils-analyse-statique-2026",{"_path":1945,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":3551,"description":3552,"id":3553,"date":3554,"listed":13,"nocomments":7,"hidden":7,"categories":3555,"tags":3556,"--cover":3559,"readingTime":3560,"body":3564,"_type":466,"_id":4261,"_source":468,"_file":4262,"_stem":4263,"_extension":471},"Legacy code : comment évaluer le risque avant d'intervenir","Modifier du code legacy sans évaluation préalable est la cause #1 des régressions. Les 4 dimensions de risque à évaluer avant de toucher à la moindre ligne.",6,"2026-01-16",[6],[3557,2146,3558],"Legacy Code","Risque","covers/articles/legacy-code-risque.jpg",{"text":21,"minutes":3561,"time":3562,"words":3563},7.93,475800,1586,{"type":26,"children":3565,"toc":4252},[3566,3571,3576,3584,3589,3592,3598,3603,3615,3627,3632,3635,3641,3646,3655,3673,3682,3700,3720,3723,3729,3734,3742,3760,3769,3787,3800,3803,3812,3815,3821,3826,3834,3860,3869,3887,3897,3900,3906,3911,3919,3937,3946,3979,3992,3995,4001,4006,4128,4137,4155,4160,4163,4169,4182,4195,4208,4221,4241,4244],{"type":29,"tag":30,"props":3567,"children":3569},{"id":3568},"legacy-code-comment-évaluer-le-risque-avant-dintervenir",[3570],{"type":35,"value":3551},{"type":29,"tag":37,"props":3572,"children":3573},{},[3574],{"type":35,"value":3575},"J'étais dans une grande banque de réseau, avec une équipe de 35 développeurs. Un tech lead expérimenté m'annonce qu'il va \"faire un petit refactoring de 2 jours\" sur un module de calcul de frais. Deux semaines plus tard, la release était bloquée. Le module contenait une règle fiscale codée dans une condition sans commentaire, que personne ne connaissait plus. La personne qui l'avait écrite avait quitté l'entreprise trois ans plus tôt. Ce refactoring \"anodin\" avait cassé silencieusement un calcul utilisé sur 40 000 comptes clients.",{"type":29,"tag":37,"props":3577,"children":3578},{},[3579],{"type":29,"tag":55,"props":3580,"children":3581},{},[3582],{"type":35,"value":3583},"Modifier du code legacy sans évaluation préalable est la cause numéro un des régressions inattendues. Non pas parce que les développeurs sont imprudents, mais parce que le code legacy contient des comportements implicites que personne ne connaît plus.",{"type":29,"tag":37,"props":3585,"children":3586},{},[3587],{"type":35,"value":3588},"J'ai vu des équipes bloquer des releases entières pour des \"petits refactorings de 2 jours\". J'en ai vu d'autres refuser de toucher à des modules critiques pendant des années, laissant la dette s'accumuler jusqu'à ce que la maintenance devienne insoutenable. Entre la témérité et la paralysie, il existe une voie structurée : l'évaluation de risque en 4 dimensions.",{"type":29,"tag":66,"props":3590,"children":3591},{},[],{"type":29,"tag":70,"props":3593,"children":3595},{"id":3594},"pourquoi-le-code-legacy-est-un-terrain-miné",[3596],{"type":35,"value":3597},"Pourquoi le code legacy est un terrain miné",{"type":29,"tag":37,"props":3599,"children":3600},{},[3601],{"type":35,"value":3602},"Le danger du code legacy n'est pas sa complexité syntaxique. C'est l'accumulation de comportements implicites : des règles métier encodées dans des conditions sans commentaire, des effets de bord non documentés, des dépendances cachées entre modules qui semblent indépendants.",{"type":29,"tag":37,"props":3604,"children":3605},{},[3606,3608,3613],{"type":35,"value":3607},"Une étude de Cambridge University a estimé que les développeurs passent ",{"type":29,"tag":55,"props":3609,"children":3610},{},[3611],{"type":35,"value":3612},"50% de leur temps",{"type":35,"value":3614}," à comprendre du code existant avant de le modifier. Sur du code legacy, ce chiffre peut atteindre 70-80%.",{"type":29,"tag":37,"props":3616,"children":3617},{},[3618,3620,3625],{"type":35,"value":3619},"Le coût d'une régression sur un module critique va bien au-delà du temps de correction : il inclut le rollback, la communication de crise, le test de non-régression élargi, et la perte de confiance en l'équipe. Dans le secteur financier, une régression sur un moteur de calcul peut déclencher un incident réglementaire aux conséquences disproportionnées. J'ai accompagné une équipe Crédit Agricole où un incident de ce type avait mobilisé 12 personnes pendant 4 jours (voir comment ",{"type":29,"tag":43,"props":3621,"children":3622},{"href":2139},[3623],{"type":35,"value":3624},"obtenir le budget pour traiter ces risques",{"type":35,"value":3626},"), soit 48 jours-homme pour corriger ce qu'une évaluation de risque préalable aurait évité.",{"type":29,"tag":37,"props":3628,"children":3629},{},[3630],{"type":35,"value":3631},"La bonne nouvelle : le risque d'intervention sur le legacy est évaluable. Il repose sur 4 dimensions.",{"type":29,"tag":66,"props":3633,"children":3634},{},[],{"type":29,"tag":70,"props":3636,"children":3638},{"id":3637},"dimension-1-couverture-de-tests-ou-son-absence",[3639],{"type":35,"value":3640},"Dimension 1 : Couverture de tests (ou son absence)",{"type":29,"tag":37,"props":3642,"children":3643},{},[3644],{"type":35,"value":3645},"C'est la dimension la plus visible et la plus impactante. Un module bien couvert en tests est un module sur lequel on peut intervenir avec confiance : si on casse quelque chose, les tests le disent immédiatement.",{"type":29,"tag":37,"props":3647,"children":3648},{},[3649,3654],{"type":29,"tag":55,"props":3650,"children":3651},{},[3652],{"type":35,"value":3653},"Comment évaluer",{"type":35,"value":1119},{"type":29,"tag":661,"props":3656,"children":3657},{},[3658,3663,3668],{"type":29,"tag":665,"props":3659,"children":3660},{},[3661],{"type":35,"value":3662},"Calculer la couverture de tests du module cible (outils : JaCoCo, Istanbul, Coverage.py)",{"type":29,"tag":665,"props":3664,"children":3665},{},[3666],{"type":35,"value":3667},"Distinguer couverture de lignes (insuffisante) et couverture de branches (significative)",{"type":29,"tag":665,"props":3669,"children":3670},{},[3671],{"type":35,"value":3672},"Identifier les tests d'intégration qui couvrent le comportement end-to-end, pas seulement les tests unitaires",{"type":29,"tag":37,"props":3674,"children":3675},{},[3676,3681],{"type":29,"tag":55,"props":3677,"children":3678},{},[3679],{"type":35,"value":3680},"Seuils de risque",{"type":35,"value":1119},{"type":29,"tag":661,"props":3683,"children":3684},{},[3685,3690,3695],{"type":29,"tag":665,"props":3686,"children":3687},{},[3688],{"type":35,"value":3689},"Couverture > 70% avec tests d'intégration → risque faible",{"type":29,"tag":665,"props":3691,"children":3692},{},[3693],{"type":35,"value":3694},"Couverture 30-70% → risque modéré, ajouter des tests de caractérisation avant d'intervenir",{"type":29,"tag":665,"props":3696,"children":3697},{},[3698],{"type":35,"value":3699},"Couverture \u003C 30% → risque élevé, écrire des characterization tests avant tout refactoring",{"type":29,"tag":1417,"props":3701,"children":3702},{},[3703],{"type":29,"tag":37,"props":3704,"children":3705},{},[3706,3711,3713,3718],{"type":29,"tag":55,"props":3707,"children":3708},{},[3709],{"type":35,"value":3710},"La règle de Michael Feathers",{"type":35,"value":3712}," dans \"Working Effectively with Legacy Code\" : avant de modifier du legacy sans tests, écrire un \"",{"type":29,"tag":43,"props":3714,"children":3715},{"href":1646},[3716],{"type":35,"value":3717},"characterization test",{"type":35,"value":3719},"\" : un test qui documente le comportement actuel, même s'il semble bizarre. Ce test devient votre filet de sécurité. Ce livre reste la référence absolue sur le sujet, 20 ans après sa publication.",{"type":29,"tag":66,"props":3721,"children":3722},{},[],{"type":29,"tag":70,"props":3724,"children":3726},{"id":3725},"dimension-2-compréhension-métier-du-code",[3727],{"type":35,"value":3728},"Dimension 2 : Compréhension métier du code",{"type":29,"tag":37,"props":3730,"children":3731},{},[3732],{"type":35,"value":3733},"Un module peut avoir une couverture de tests à 80% et rester dangereux si personne dans l'équipe ne comprend ce qu'il fait sur le plan métier.",{"type":29,"tag":37,"props":3735,"children":3736},{},[3737,3741],{"type":29,"tag":55,"props":3738,"children":3739},{},[3740],{"type":35,"value":3653},{"type":35,"value":1119},{"type":29,"tag":661,"props":3743,"children":3744},{},[3745,3750,3755],{"type":29,"tag":665,"props":3746,"children":3747},{},[3748],{"type":35,"value":3749},"Identifier la ou les personnes capables d'expliquer la règle métier implémentée",{"type":29,"tag":665,"props":3751,"children":3752},{},[3753],{"type":35,"value":3754},"Vérifier si la documentation métier (spécifications, tickets d'origine) existe et est accessible",{"type":29,"tag":665,"props":3756,"children":3757},{},[3758],{"type":35,"value":3759},"Estimer le \"bus factor\" : si cette personne part, le module devient-il opaque ?",{"type":29,"tag":37,"props":3761,"children":3762},{},[3763,3768],{"type":29,"tag":55,"props":3764,"children":3765},{},[3766],{"type":35,"value":3767},"Questions concrètes à poser",{"type":35,"value":1119},{"type":29,"tag":661,"props":3770,"children":3771},{},[3772,3777,3782],{"type":29,"tag":665,"props":3773,"children":3774},{},[3775],{"type":35,"value":3776},"\"Pouvez-vous m'expliquer ce que ce module fait en 3 phrases, sans regarder le code ?\"",{"type":29,"tag":665,"props":3778,"children":3779},{},[3780],{"type":35,"value":3781},"\"Existe-t-il des cas limites non évidents dans cette règle métier ?\"",{"type":29,"tag":665,"props":3783,"children":3784},{},[3785],{"type":35,"value":3786},"\"Y a-t-il eu des incidents passés sur ce module dont la cause était une incompréhension métier ?\"",{"type":29,"tag":1417,"props":3788,"children":3789},{},[3790],{"type":29,"tag":37,"props":3791,"children":3792},{},[3793,3798],{"type":29,"tag":55,"props":3794,"children":3795},{},[3796],{"type":35,"value":3797},"Ce que j'ai vécu dans une société d'assurance vie",{"type":35,"value":3799}," : un module de calcul de prime avait une couverture de tests à 65%. L'équipe estimait le risque modéré. Mais lors de l'entretien, il s'est avéré que l'unique développeur qui comprenait les règles fiscales avait quitté l'entreprise 18 mois plus tôt. Le risque réel était élevé. Nous avons passé 3 jours à documenter le comportement avant d'intervenir. Ce délai a semblé coûteux sur le moment, mais il nous a évité une régression sur 80 000 contrats.",{"type":29,"tag":66,"props":3801,"children":3802},{},[],{"type":29,"tag":166,"props":3804,"children":3806},{"cta":168,"href":169,"title":3805,"type":171},"Vous avez un module legacy critique à refactoriser mais vous ne savez pas par où commencer ?",[3807],{"type":29,"tag":37,"props":3808,"children":3809},{},[3810],{"type":35,"value":3811},"Vous voyez la dette s'accumuler, vous savez qu'il faut intervenir, mais chaque fois que vous vous approchez du code, quelque chose vous retient. C'est normal : le legacy non évalué est objectivement risqué. En 30 minutes, je vous aide à définir la séquence d'intervention qui minimise les régressions et libère de la capacité sans bloquer votre roadmap.",{"type":29,"tag":66,"props":3813,"children":3814},{},[],{"type":29,"tag":70,"props":3816,"children":3818},{"id":3817},"dimension-3-couplage-et-surface-dimpact",[3819],{"type":35,"value":3820},"Dimension 3 : Couplage et surface d'impact",{"type":29,"tag":37,"props":3822,"children":3823},{},[3824],{"type":35,"value":3825},"Un module peut être simple à comprendre et bien testé, et quand même risqué à modifier s'il est fortement couplé à d'autres modules. Chaque modification peut déclencher des effets en cascade.",{"type":29,"tag":37,"props":3827,"children":3828},{},[3829,3833],{"type":29,"tag":55,"props":3830,"children":3831},{},[3832],{"type":35,"value":3653},{"type":35,"value":1119},{"type":29,"tag":661,"props":3835,"children":3836},{},[3837,3850,3855],{"type":29,"tag":665,"props":3838,"children":3839},{},[3840,3842,3848],{"type":35,"value":3841},"Identifier les dépendances entrantes et sortantes du module (outils : Structure101, Sonargraph, ",{"type":29,"tag":1716,"props":3843,"children":3845},{"className":3844},[],[3846],{"type":35,"value":3847},"git log --follow",{"type":35,"value":3849},")",{"type":29,"tag":665,"props":3851,"children":3852},{},[3853],{"type":35,"value":3854},"Cartographier les modules qui appellent le module cible",{"type":29,"tag":665,"props":3856,"children":3857},{},[3858],{"type":35,"value":3859},"Évaluer le couplage de données : le module partage-t-il des structures de données ou une base avec d'autres modules ?",{"type":29,"tag":37,"props":3861,"children":3862},{},[3863,3868],{"type":29,"tag":55,"props":3864,"children":3865},{},[3866],{"type":35,"value":3867},"Indicateurs de couplage à risque",{"type":35,"value":1119},{"type":29,"tag":661,"props":3870,"children":3871},{},[3872,3877,3882],{"type":29,"tag":665,"props":3873,"children":3874},{},[3875],{"type":35,"value":3876},"Plus de 5 modules différents qui appellent directement le module cible",{"type":29,"tag":665,"props":3878,"children":3879},{},[3880],{"type":35,"value":3881},"Modification de schéma de base de données partagée",{"type":29,"tag":665,"props":3883,"children":3884},{},[3885],{"type":35,"value":3886},"Présence de \"shotgun surgery\" : un changement logique qui nécessite de modifier 8+ fichiers",{"type":29,"tag":37,"props":3888,"children":3889},{},[3890,3895],{"type":29,"tag":55,"props":3891,"children":3892},{},[3893],{"type":35,"value":3894},"La règle empirique",{"type":35,"value":3896}," : pour chaque module entrant dans le scope de refactoring, je vérifie les 3 niveaux de dépendances (direct, indirect, transitif). La surface d'impact réelle est souvent 3 à 5 fois plus large que l'estimation initiale.",{"type":29,"tag":66,"props":3898,"children":3899},{},[],{"type":29,"tag":70,"props":3901,"children":3903},{"id":3902},"dimension-4-criticité-business-du-module",[3904],{"type":35,"value":3905},"Dimension 4 : Criticité business du module",{"type":29,"tag":37,"props":3907,"children":3908},{},[3909],{"type":35,"value":3910},"Deux modules à risque technique équivalent n'ont pas le même risque réel si l'un gère les notifications email et l'autre les virements bancaires.",{"type":29,"tag":37,"props":3912,"children":3913},{},[3914,3918],{"type":29,"tag":55,"props":3915,"children":3916},{},[3917],{"type":35,"value":3653},{"type":35,"value":1119},{"type":29,"tag":661,"props":3920,"children":3921},{},[3922,3927,3932],{"type":29,"tag":665,"props":3923,"children":3924},{},[3925],{"type":35,"value":3926},"Identifier la criticité business : quel processus métier ce module supporte-t-il ?",{"type":29,"tag":665,"props":3928,"children":3929},{},[3930],{"type":35,"value":3931},"Évaluer l'impact d'une régression : financier, réglementaire, réputationnel",{"type":29,"tag":665,"props":3933,"children":3934},{},[3935],{"type":35,"value":3936},"Vérifier le SLA : ce module a-t-il un SLA de disponibilité ou de performance ?",{"type":29,"tag":37,"props":3938,"children":3939},{},[3940,3945],{"type":29,"tag":55,"props":3941,"children":3942},{},[3943],{"type":35,"value":3944},"Niveaux de criticité",{"type":35,"value":1119},{"type":29,"tag":661,"props":3947,"children":3948},{},[3949,3959,3969],{"type":29,"tag":665,"props":3950,"children":3951},{},[3952,3957],{"type":29,"tag":55,"props":3953,"children":3954},{},[3955],{"type":35,"value":3956},"Critique",{"type":35,"value":3958}," : module dans le chemin de traitement principal, impact direct sur le revenu ou la conformité réglementaire",{"type":29,"tag":665,"props":3960,"children":3961},{},[3962,3967],{"type":29,"tag":55,"props":3963,"children":3964},{},[3965],{"type":35,"value":3966},"Important",{"type":35,"value":3968}," : module utilisé quotidiennement, régression visible par les utilisateurs mais non-bloquante",{"type":29,"tag":665,"props":3970,"children":3971},{},[3972,3977],{"type":29,"tag":55,"props":3973,"children":3974},{},[3975],{"type":35,"value":3976},"Standard",{"type":35,"value":3978}," : module d'administration, batch non-temps-réel, fonctionnalité non-critique",{"type":29,"tag":1417,"props":3980,"children":3981},{},[3982],{"type":29,"tag":37,"props":3983,"children":3984},{},[3985,3990],{"type":29,"tag":55,"props":3986,"children":3987},{},[3988],{"type":35,"value":3989},"Règle",{"type":35,"value":3991}," : la criticité business multiplie le risque technique. Un module à risque technique modéré + criticité haute = risque réel élevé. Je refuse de commencer un refactoring sans avoir établi ce mapping clairement.",{"type":29,"tag":66,"props":3993,"children":3994},{},[],{"type":29,"tag":70,"props":3996,"children":3998},{"id":3997},"la-matrice-de-risque-et-comment-lutiliser",[3999],{"type":35,"value":4000},"La matrice de risque et comment l'utiliser",{"type":29,"tag":37,"props":4002,"children":4003},{},[4004],{"type":35,"value":4005},"Je combine les 4 dimensions dans une matrice simple :",{"type":29,"tag":1435,"props":4007,"children":4008},{},[4009,4035],{"type":29,"tag":1439,"props":4010,"children":4011},{},[4012],{"type":29,"tag":1443,"props":4013,"children":4014},{},[4015,4020,4025,4030],{"type":29,"tag":1447,"props":4016,"children":4017},{},[4018],{"type":35,"value":4019},"Dimension",{"type":29,"tag":1447,"props":4021,"children":4022},{},[4023],{"type":35,"value":4024},"Score 1 (faible)",{"type":29,"tag":1447,"props":4026,"children":4027},{},[4028],{"type":35,"value":4029},"Score 2 (modéré)",{"type":29,"tag":1447,"props":4031,"children":4032},{},[4033],{"type":35,"value":4034},"Score 3 (élevé)",{"type":29,"tag":1463,"props":4036,"children":4037},{},[4038,4061,4084,4107],{"type":29,"tag":1443,"props":4039,"children":4040},{},[4041,4046,4051,4056],{"type":29,"tag":1470,"props":4042,"children":4043},{},[4044],{"type":35,"value":4045},"Couverture tests",{"type":29,"tag":1470,"props":4047,"children":4048},{},[4049],{"type":35,"value":4050},"> 70%",{"type":29,"tag":1470,"props":4052,"children":4053},{},[4054],{"type":35,"value":4055},"30-70%",{"type":29,"tag":1470,"props":4057,"children":4058},{},[4059],{"type":35,"value":4060},"\u003C 30%",{"type":29,"tag":1443,"props":4062,"children":4063},{},[4064,4069,4074,4079],{"type":29,"tag":1470,"props":4065,"children":4066},{},[4067],{"type":35,"value":4068},"Compréhension métier",{"type":29,"tag":1470,"props":4070,"children":4071},{},[4072],{"type":35,"value":4073},"Bien documenté",{"type":29,"tag":1470,"props":4075,"children":4076},{},[4077],{"type":35,"value":4078},"Documenté partiellement",{"type":29,"tag":1470,"props":4080,"children":4081},{},[4082],{"type":35,"value":4083},"Non documenté",{"type":29,"tag":1443,"props":4085,"children":4086},{},[4087,4092,4097,4102],{"type":29,"tag":1470,"props":4088,"children":4089},{},[4090],{"type":35,"value":4091},"Couplage",{"type":29,"tag":1470,"props":4093,"children":4094},{},[4095],{"type":35,"value":4096},"\u003C 3 dépendances",{"type":29,"tag":1470,"props":4098,"children":4099},{},[4100],{"type":35,"value":4101},"3-7 dépendances",{"type":29,"tag":1470,"props":4103,"children":4104},{},[4105],{"type":35,"value":4106},"> 7 dépendances",{"type":29,"tag":1443,"props":4108,"children":4109},{},[4110,4115,4119,4124],{"type":29,"tag":1470,"props":4111,"children":4112},{},[4113],{"type":35,"value":4114},"Criticité business",{"type":29,"tag":1470,"props":4116,"children":4117},{},[4118],{"type":35,"value":3976},{"type":29,"tag":1470,"props":4120,"children":4121},{},[4122],{"type":35,"value":4123},"Importante",{"type":29,"tag":1470,"props":4125,"children":4126},{},[4127],{"type":35,"value":3956},{"type":29,"tag":37,"props":4129,"children":4130},{},[4131,4136],{"type":29,"tag":55,"props":4132,"children":4133},{},[4134],{"type":35,"value":4135},"Score total",{"type":35,"value":1119},{"type":29,"tag":661,"props":4138,"children":4139},{},[4140,4145,4150],{"type":29,"tag":665,"props":4141,"children":4142},{},[4143],{"type":35,"value":4144},"4-6 points → Intervention directe possible",{"type":29,"tag":665,"props":4146,"children":4147},{},[4148],{"type":35,"value":4149},"7-9 points → Sécuriser avant d'intervenir (tests de caractérisation, documentation)",{"type":29,"tag":665,"props":4151,"children":4152},{},[4153],{"type":35,"value":4154},"10-12 points → Planifier une phase de préparation de 2-4 semaines avant toute modification",{"type":29,"tag":37,"props":4156,"children":4157},{},[4158],{"type":35,"value":4159},"Ce n'est pas un outil de blocage, c'est un outil de planification. Un module à 10-12 points peut et doit être refactorisé. Mais la séquence d'intervention change radicalement.",{"type":29,"tag":66,"props":4161,"children":4162},{},[],{"type":29,"tag":70,"props":4164,"children":4166},{"id":4165},"faq-sur-lévaluation-du-risque-legacy",[4167],{"type":35,"value":4168},"FAQ sur l'évaluation du risque legacy",{"type":29,"tag":371,"props":4170,"children":4171},{},[4172,4177],{"type":29,"tag":375,"props":4173,"children":4174},{},[4175],{"type":35,"value":4176},"1. Combien de temps faut-il pour évaluer le risque d'un module legacy ?",{"type":29,"tag":37,"props":4178,"children":4179},{},[4180],{"type":35,"value":4181},"Pour un module de taille moyenne (5 000 à 20 000 lignes de code), l'évaluation des 4 dimensions prend 2 à 4 heures en impliquant un tech lead et un développeur qui connaît le contexte métier. Pour un module critique avec des dépendances complexes, comptez une demi-journée. C'est un investissement rentable : une régression sur un module critique peut coûter 10 à 100 fois ce temps en incident management.",{"type":29,"tag":371,"props":4183,"children":4184},{},[4185,4190],{"type":29,"tag":375,"props":4186,"children":4187},{},[4188],{"type":35,"value":4189},"2. Qu'est-ce qu'un characterization test et comment l'écrire ?",{"type":29,"tag":37,"props":4191,"children":4192},{},[4193],{"type":35,"value":4194},"Un characterization test documente le comportement actuel d'un module, qu'il soit correct ou non. On appelle la fonction avec des inputs réels, on observe l'output, et on l'encode comme valeur attendue dans le test. L'objectif n'est pas de vérifier que le comportement est juste, c'est de détecter si une modification le change. C'est le filet de sécurité minimal avant toute intervention sur du legacy non testé, tel que Michael Feathers l'a formalisé.",{"type":29,"tag":371,"props":4196,"children":4197},{},[4198,4203],{"type":29,"tag":375,"props":4199,"children":4200},{},[4201],{"type":35,"value":4202},"3. Comment gérer un module legacy sans aucun test et sans documentation ?",{"type":29,"tag":37,"props":4204,"children":4205},{},[4206],{"type":35,"value":4207},"La séquence que je recommande : (1) Identifier un expert métier capable d'expliquer ce que le module est censé faire. (2) Écrire des characterization tests basés sur des exemples de données réelles de production. (3) Organiser une session de \"live coding\" où un développeur senior lit le code à voix haute pendant qu'un autre prend des notes sur les règles implicites découvertes. (4) Documenter les règles dans des commentaires proches du code avant toute modification. Ce processus prend 1 à 3 jours mais réduit le risque de 70-80%.",{"type":29,"tag":371,"props":4209,"children":4210},{},[4211,4216],{"type":29,"tag":375,"props":4212,"children":4213},{},[4214],{"type":35,"value":4215},"4. Quand est-ce qu'il vaut mieux réécrire que refactoriser ?",{"type":29,"tag":37,"props":4217,"children":4218},{},[4219],{"type":35,"value":4220},"La réécriture est justifiée quand : (1) le couplage est si fort qu'il est impossible de modifier une partie sans toucher à l'ensemble, (2) la technologie sous-jacente est en fin de vie et ne peut pas être migrée progressivement, (3) la logique métier est si obscure qu'elle ne peut pas être testée avant d'être comprise. Mais la réécriture from scratch a un taux d'échec élevé : je préfère la migration progressive par le pattern \"strangler fig\" de Martin Fowler : remplacer le legacy morceau par morceau tout en maintenant le système en production.",{"type":29,"tag":371,"props":4222,"children":4223},{},[4224,4229],{"type":29,"tag":375,"props":4225,"children":4226},{},[4227],{"type":35,"value":4228},"5. Comment convaincre l'équipe de faire une évaluation de risque systématique ?",{"type":29,"tag":37,"props":4230,"children":4231},{},[4232,4234,4239],{"type":35,"value":4233},"La meilleure approche est de partager un post-mortem d'une régression passée en montrant qu'une évaluation préalable l'aurait évitée. Ensuite, intégrer l'évaluation dans la ",{"type":29,"tag":43,"props":4235,"children":4236},{"href":1589},[4237],{"type":35,"value":4238},"Definition of Ready",{"type":35,"value":4240}," des stories de refactoring : \"une story de refactoring legacy est prête quand la matrice de risque a été remplie\". Une fois que l'équipe a utilisé l'outil 2-3 fois et évité des régressions, le réflexe s'installe naturellement.",{"type":29,"tag":66,"props":4242,"children":4243},{},[],{"type":29,"tag":166,"props":4245,"children":4246},{"cta":442,"href":443,"title":444,"type":445},[4247],{"type":29,"tag":37,"props":4248,"children":4249},{},[4250],{"type":35,"value":4251},"30 questions sur 5 dimensions de maturité engineering, incluant une section dédiée aux pratiques sur le code legacy et la gestion de la dette technique. Score automatique + 3 priorités d'action pour les 90 prochains jours.",{"title":8,"searchDepth":453,"depth":453,"links":4253},[4254,4255,4256,4257,4258,4259,4260],{"id":3594,"depth":453,"text":3597},{"id":3637,"depth":453,"text":3640},{"id":3725,"depth":453,"text":3728},{"id":3817,"depth":453,"text":3820},{"id":3902,"depth":453,"text":3905},{"id":3997,"depth":453,"text":4000},{"id":4165,"depth":453,"text":4168},"content:fr:dette-technique:legacy-code-evaluer-risque.md","fr/dette-technique/legacy-code-evaluer-risque.md","fr/dette-technique/legacy-code-evaluer-risque",{"_path":156,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":4265,"description":4266,"id":4267,"date":4268,"listed":13,"nocomments":7,"hidden":7,"categories":4269,"tags":4270,"--cover":4273,"readingTime":4274,"body":4279,"_type":466,"_id":4950,"_source":468,"_file":4951,"_stem":4952,"_extension":471},"Introduction à la maturité engineering : les 5 niveaux","La plupart des équipes pensent être au niveau 3 et se découvrent au niveau 2. Comprendre les 5 niveaux de maturité engineering pour progresser vraiment.",1,"2026-01-05",[6],[4271,4272],"Maturité Engineering","Évaluation Équipe","covers/articles/maturite-engineering-niveaux.jpg",{"text":4275,"minutes":4276,"time":4277,"words":4278},"10 min read",9.48,568800,1896,{"type":26,"children":4280,"toc":4932},[4281,4286,4291,4299,4304,4309,4312,4318,4323,4328,4333,4343,4346,4352,4358,4363,4372,4400,4406,4411,4419,4452,4462,4468,4479,4487,4515,4521,4526,4534,4562,4568,4573,4581,4609,4612,4621,4624,4630,4636,4641,4653,4659,4664,4669,4675,4680,4693,4696,4702,4707,4715,4733,4743,4753,4763,4773,4783,4796,4799,4805,4810,4815,4820,4825,4828,4834,4847,4860,4873,4886,4899,4902,4910,4913,4920,4924],{"type":29,"tag":30,"props":4282,"children":4284},{"id":4283},"introduction-à-la-maturité-engineering-les-5-niveaux",[4285],{"type":35,"value":4265},{"type":29,"tag":37,"props":4287,"children":4288},{},[4289],{"type":35,"value":4290},"Il y a quelques années, j'ai rencontré le CTO d'une grande compagnie d'assurance. Soixante développeurs, des sprints bien rodés, des retrospectives régulières. Il était fier de ses équipes. \"On est clairement au niveau 3\", m'a-t-il dit. Quand j'ai commencé à poser mes 12 questions de diagnostic, le tableau a changé. Couverture de tests à 14%. Revues de code contournées en fin de sprint. Lead time moyen de 5 semaines. Niveau 2 : solide, mais niveau 2. Ce n'était pas un jugement. C'était le point de départ.",{"type":29,"tag":37,"props":4292,"children":4293},{},[4294],{"type":29,"tag":55,"props":4295,"children":4296},{},[4297],{"type":35,"value":4298},"La plupart des équipes pensent être au niveau 3. À l'évaluation, elles se découvrent au niveau 2. Ce n'est pas un problème de personnes, c'est toujours un problème de système.",{"type":29,"tag":37,"props":4300,"children":4301},{},[4302],{"type":35,"value":4303},"J'ai accompagné plus de 25 équipes engineering dans la finance, l'assurance et les médias : BNP Paribas, Crédit Agricole, Canal+, Agirc-Arrco. La première conversation est presque toujours la même : le CTO sait que quelque chose ne tourne pas rond, mais il n'a pas de cadre pour nommer ce qu'il observe. \"On fait de l'Agile depuis 3 ans, les équipes tournent, les releases sortent...\", et pourtant le lead time reste élevé, les bugs de prod reviennent, les bons développeurs partent.",{"type":29,"tag":37,"props":4305,"children":4306},{},[4307],{"type":35,"value":4308},"Le modèle des 5 niveaux de maturité engineering donne le cadre qui manque.",{"type":29,"tag":66,"props":4310,"children":4311},{},[],{"type":29,"tag":70,"props":4313,"children":4315},{"id":4314},"pourquoi-faire-de-lagile-ne-suffit-pas",[4316],{"type":35,"value":4317},"Pourquoi \"faire de l'Agile\" ne suffit pas",{"type":29,"tag":37,"props":4319,"children":4320},{},[4321],{"type":35,"value":4322},"L'Agile est une méthode de livraison. La maturité engineering est quelque chose d'autre : c'est la capacité d'une organisation technique à produire du logiciel de qualité, à un rythme soutenu, sans s'épuiser ni s'endetter.",{"type":29,"tag":37,"props":4324,"children":4325},{},[4326],{"type":35,"value":4327},"Une équipe peut avoir des sprints de 2 semaines, une vélocité stable, des retrospectives régulières, et une dette technique qui croît de 15% par trimestre, une couverture de tests à 12%, et un onboarding de 6 mois pour les nouveaux développeurs.",{"type":29,"tag":37,"props":4329,"children":4330},{},[4331],{"type":35,"value":4332},"L'Agile organise le travail. La maturité engineering détermine la qualité de ce qu'on livre et la vitesse à laquelle on peut itérer sur la durée.",{"type":29,"tag":37,"props":4334,"children":4335},{},[4336,4341],{"type":29,"tag":55,"props":4337,"children":4338},{},[4339],{"type":35,"value":4340},"La distinction clé",{"type":35,"value":4342}," : la maturité engineering se mesure sur les pratiques techniques (tests, architecture, CI/CD, revues de code) autant que sur les pratiques organisationnelles. Les deux doivent progresser ensemble. C'est ce que le modèle DORA mesure depuis 2014, et les données de la recherche State of DevOps sont sans ambiguïté : les équipes \"elite\" ont un deployment frequency 973 fois supérieur aux équipes \"low performers\". L'écart ne vient pas de l'Agile. Il vient des pratiques engineering.",{"type":29,"tag":66,"props":4344,"children":4345},{},[],{"type":29,"tag":70,"props":4347,"children":4349},{"id":4348},"les-5-niveaux-description-et-signaux-observables",[4350],{"type":35,"value":4351},"Les 5 niveaux : description et signaux observables",{"type":29,"tag":106,"props":4353,"children":4355},{"id":4354},"niveau-1-chaotique",[4356],{"type":35,"value":4357},"Niveau 1 : Chaotique",{"type":29,"tag":37,"props":4359,"children":4360},{},[4361],{"type":35,"value":4362},"L'équipe livre quand elle peut. Les releases sont des événements stressants. Les bugs de prod sont gérés en mode pompier. Il n'existe pas de process de revue de code formalisé, les tests sont rares ou inexistants, et le déploiement est une opération manuelle risquée.",{"type":29,"tag":37,"props":4364,"children":4365},{},[4366,4371],{"type":29,"tag":55,"props":4367,"children":4368},{},[4369],{"type":35,"value":4370},"Signaux observables",{"type":35,"value":1119},{"type":29,"tag":661,"props":4373,"children":4374},{},[4375,4380,4385,4390,4395],{"type":29,"tag":665,"props":4376,"children":4377},{},[4378],{"type":35,"value":4379},"Pas de pipeline CI/CD fonctionnel",{"type":29,"tag":665,"props":4381,"children":4382},{},[4383],{"type":35,"value":4384},"Couverture de tests \u003C 10%",{"type":29,"tag":665,"props":4386,"children":4387},{},[4388],{"type":35,"value":4389},"Incidents de prod hebdomadaires",{"type":29,"tag":665,"props":4391,"children":4392},{},[4393],{"type":35,"value":4394},"Durée de déploiement > 2 heures",{"type":29,"tag":665,"props":4396,"children":4397},{},[4398],{"type":35,"value":4399},"Connaissance du système concentrée sur 1-2 personnes",{"type":29,"tag":106,"props":4401,"children":4403},{"id":4402},"niveau-2-répétable",[4404],{"type":35,"value":4405},"Niveau 2 : Répétable",{"type":29,"tag":37,"props":4407,"children":4408},{},[4409],{"type":35,"value":4410},"Des processus commencent à exister. Il y a une CI basique, quelques tests, des revues de code informelles. Mais tout repose sur la discipline individuelle, pas sur des standards d'équipe. La qualité varie selon qui travaille sur quoi.",{"type":29,"tag":37,"props":4412,"children":4413},{},[4414,4418],{"type":29,"tag":55,"props":4415,"children":4416},{},[4417],{"type":35,"value":4370},{"type":35,"value":1119},{"type":29,"tag":661,"props":4420,"children":4421},{},[4422,4427,4432,4437,4442],{"type":29,"tag":665,"props":4423,"children":4424},{},[4425],{"type":35,"value":4426},"CI qui tourne mais souvent cassée",{"type":29,"tag":665,"props":4428,"children":4429},{},[4430],{"type":35,"value":4431},"Tests écrits par certains développeurs, pas tous",{"type":29,"tag":665,"props":4433,"children":4434},{},[4435],{"type":35,"value":4436},"Code reviews qui varient selon le reviewer",{"type":29,"tag":665,"props":4438,"children":4439},{},[4440],{"type":35,"value":4441},"Déploiement semi-automatisé mais fragile",{"type":29,"tag":665,"props":4443,"children":4444},{},[4445,4450],{"type":29,"tag":43,"props":4446,"children":4447},{"href":45},[4448],{"type":35,"value":4449},"Lead time",{"type":35,"value":4451}," de 3 à 6 semaines",{"type":29,"tag":37,"props":4453,"children":4454},{},[4455,4460],{"type":29,"tag":55,"props":4456,"children":4457},{},[4458],{"type":35,"value":4459},"C'est le niveau où se trouvent ~40% des équipes que j'évalue.",{"type":35,"value":4461}," Et souvent, elles se perçoivent au niveau 3.",{"type":29,"tag":106,"props":4463,"children":4465},{"id":4464},"niveau-3-défini",[4466],{"type":35,"value":4467},"Niveau 3 : Défini",{"type":29,"tag":37,"props":4469,"children":4470},{},[4471,4473,4477],{"type":35,"value":4472},"L'équipe a des standards partagés. La ",{"type":29,"tag":43,"props":4474,"children":4475},{"href":854},[4476],{"type":35,"value":1019},{"type":35,"value":4478}," est écrite et respectée. La couverture de tests est une métrique suivie. Le pipeline CI/CD est fiable. Les pratiques ne dépendent plus des individus mais de l'équipe.",{"type":29,"tag":37,"props":4480,"children":4481},{},[4482,4486],{"type":29,"tag":55,"props":4483,"children":4484},{},[4485],{"type":35,"value":4370},{"type":35,"value":1119},{"type":29,"tag":661,"props":4488,"children":4489},{},[4490,4495,4500,4505,4510],{"type":29,"tag":665,"props":4491,"children":4492},{},[4493],{"type":35,"value":4494},"CI/CD stable, build \u003C 15 minutes",{"type":29,"tag":665,"props":4496,"children":4497},{},[4498],{"type":35,"value":4499},"Couverture de tests 40-60%",{"type":29,"tag":665,"props":4501,"children":4502},{},[4503],{"type":35,"value":4504},"Definition of Done appliquée à chaque story",{"type":29,"tag":665,"props":4506,"children":4507},{},[4508],{"type":35,"value":4509},"Lead time de 1 à 3 semaines",{"type":29,"tag":665,"props":4511,"children":4512},{},[4513],{"type":35,"value":4514},"Onboarding \u003C 4 semaines pour un nouveau développeur",{"type":29,"tag":106,"props":4516,"children":4518},{"id":4517},"niveau-4-géré",[4519],{"type":35,"value":4520},"Niveau 4 : Géré",{"type":29,"tag":37,"props":4522,"children":4523},{},[4524],{"type":35,"value":4525},"L'équipe mesure et pilote. Les métriques DORA sont connues et suivies. La dette technique est quantifiée et priorisée. Les incidents donnent lieu à des blameless post-mortems. Le feedback loop du code à la prod est court et fiable.",{"type":29,"tag":37,"props":4527,"children":4528},{},[4529,4533],{"type":29,"tag":55,"props":4530,"children":4531},{},[4532],{"type":35,"value":4370},{"type":35,"value":1119},{"type":29,"tag":661,"props":4535,"children":4536},{},[4537,4542,4547,4552,4557],{"type":29,"tag":665,"props":4538,"children":4539},{},[4540],{"type":35,"value":4541},"Deployment frequency > 1/semaine",{"type":29,"tag":665,"props":4543,"children":4544},{},[4545],{"type":35,"value":4546},"Lead time \u003C 1 semaine",{"type":29,"tag":665,"props":4548,"children":4549},{},[4550],{"type":35,"value":4551},"MTTR \u003C 1 heure pour les incidents P1",{"type":29,"tag":665,"props":4553,"children":4554},{},[4555],{"type":35,"value":4556},"Change failure rate \u003C 5%",{"type":29,"tag":665,"props":4558,"children":4559},{},[4560],{"type":35,"value":4561},"Absorption de la dette technique \u003C 20%",{"type":29,"tag":106,"props":4563,"children":4565},{"id":4564},"niveau-5-optimisé",[4566],{"type":35,"value":4567},"Niveau 5 : Optimisé",{"type":29,"tag":37,"props":4569,"children":4570},{},[4571],{"type":35,"value":4572},"L'amélioration continue est systémique. L'équipe expérimente, mesure l'impact, et intègre les apprentissages dans ses pratiques. Le continuous delivery est une réalité, pas une aspiration. L'IA augmente les développeurs sans créer de dette de gouvernance.",{"type":29,"tag":37,"props":4574,"children":4575},{},[4576,4580],{"type":29,"tag":55,"props":4577,"children":4578},{},[4579],{"type":35,"value":4370},{"type":35,"value":1119},{"type":29,"tag":661,"props":4582,"children":4583},{},[4584,4589,4594,4599,4604],{"type":29,"tag":665,"props":4585,"children":4586},{},[4587],{"type":35,"value":4588},"Déploiement plusieurs fois par jour",{"type":29,"tag":665,"props":4590,"children":4591},{},[4592],{"type":35,"value":4593},"Feature flags utilisés systématiquement",{"type":29,"tag":665,"props":4595,"children":4596},{},[4597],{"type":35,"value":4598},"Chaos engineering pratiqué",{"type":29,"tag":665,"props":4600,"children":4601},{},[4602],{"type":35,"value":4603},"Inner source et contribution cross-équipe",{"type":29,"tag":665,"props":4605,"children":4606},{},[4607],{"type":35,"value":4608},"Temps consacré à l'innovation > 20%",{"type":29,"tag":66,"props":4610,"children":4611},{},[],{"type":29,"tag":166,"props":4613,"children":4615},{"cta":168,"href":169,"title":4614,"type":171},"À quel niveau se trouve vraiment votre équipe ?",[4616],{"type":29,"tag":37,"props":4617,"children":4618},{},[4619],{"type":35,"value":4620},"La plupart des CTOs que j'accompagne ont une intuition sur leur niveau, mais l'évaluation structurée révèle presque toujours des angles morts. Vous savez que quelque chose freine votre équipe, mais vous n'arrivez pas à mettre le doigt dessus précisément. En 30 minutes, j'identifie les 2-3 pratiques qui bloquent votre progression au niveau suivant.",{"type":29,"tag":66,"props":4622,"children":4623},{},[],{"type":29,"tag":70,"props":4625,"children":4627},{"id":4626},"les-3-patterns-qui-bloquent-la-progression-entre-niveaux",[4628],{"type":35,"value":4629},"Les 3 patterns qui bloquent la progression entre niveaux",{"type":29,"tag":106,"props":4631,"children":4633},{"id":4632},"pattern-1-la-pression-feature-qui-court-circuite-la-qualité",[4634],{"type":35,"value":4635},"Pattern 1 : La pression feature qui court-circuite la qualité",{"type":29,"tag":37,"props":4637,"children":4638},{},[4639],{"type":35,"value":4640},"L'équipe a les bonnes intentions mais le backlog feature ne laisse pas de place aux investissements en qualité. Résultat : on reste au niveau 2 indéfiniment, en sachant pertinemment que c'est sous-optimal.",{"type":29,"tag":37,"props":4642,"children":4643},{},[4644,4646,4651],{"type":35,"value":4645},"J'ai vu ce pattern se répéter dans des organisations de toutes tailles. La sortie, c'est de négocier un \"budget technique\" explicite : typiquement 20% de la capacité de l'équipe dédiée à la qualité, la ",{"type":29,"tag":43,"props":4647,"children":4648},{"href":2139},[4649],{"type":35,"value":4650},"dette technique et les pratiques",{"type":35,"value":4652},". Sans cette négociation, l'amélioration reste un vœu pieux. C'est d'ailleurs ce que préconise le modèle de la théorie des contraintes appliqué au développement logiciel : éliminer le goulot d'étranglement systémique avant d'optimiser l'output.",{"type":29,"tag":106,"props":4654,"children":4656},{"id":4655},"pattern-2-le-manque-de-leadership-technique-partagé",[4657],{"type":35,"value":4658},"Pattern 2 : Le manque de leadership technique partagé",{"type":29,"tag":37,"props":4660,"children":4661},{},[4662],{"type":35,"value":4663},"Au niveau 2, la qualité dépend du senior le plus motivé. Si ce senior part, l'équipe régresse. La progression vers le niveau 3 nécessite que les standards soient portés par l'équipe, pas par un individu.",{"type":29,"tag":37,"props":4665,"children":4666},{},[4667],{"type":35,"value":4668},"La sortie : les guildes techniques, les coding standards documentés dans le dépôt, et les revues de code croisées entre équipes.",{"type":29,"tag":106,"props":4670,"children":4672},{"id":4671},"pattern-3-labsence-de-mesure",[4673],{"type":35,"value":4674},"Pattern 3 : L'absence de mesure",{"type":29,"tag":37,"props":4676,"children":4677},{},[4678],{"type":35,"value":4679},"\"On s'améliore\", mais comment le savez-vous ? La progression entre niveaux nécessite des métriques de base : lead time, deployment frequency, taux de bugs de prod, couverture de tests. Sans mesure, l'amélioration est une impression, pas un fait.",{"type":29,"tag":37,"props":4681,"children":4682},{},[4683,4685,4691],{"type":35,"value":4684},"La sortie : implémenter les ",{"type":29,"tag":43,"props":4686,"children":4688},{"href":4687},"/fr/management/metriques-management-developpeurs-motivation",[4689],{"type":35,"value":4690},"4 métriques DORA",{"type":35,"value":4692}," en moins d'une semaine. Les données existent déjà dans vos outils (Jira, GitHub, PagerDuty).",{"type":29,"tag":66,"props":4694,"children":4695},{},[],{"type":29,"tag":70,"props":4697,"children":4699},{"id":4698},"comment-auto-évaluer-son-équipe-12-questions",[4700],{"type":35,"value":4701},"Comment auto-évaluer son équipe : 12 questions",{"type":29,"tag":37,"props":4703,"children":4704},{},[4705],{"type":35,"value":4706},"Voici les 12 questions que je pose systématiquement lors d'un premier diagnostic. Répondez honnêtement : l'enjeu n'est pas de scorer haut, mais de voir clairement.",{"type":29,"tag":37,"props":4708,"children":4709},{},[4710],{"type":29,"tag":55,"props":4711,"children":4712},{},[4713],{"type":35,"value":4714},"Pratiques de code (3 questions)",{"type":29,"tag":1966,"props":4716,"children":4717},{},[4718,4723,4728],{"type":29,"tag":665,"props":4719,"children":4720},{},[4721],{"type":35,"value":4722},"Quelle est la couverture de tests automatisés de votre codebase principale ?",{"type":29,"tag":665,"props":4724,"children":4725},{},[4726],{"type":35,"value":4727},"Est-ce que 100% des pull requests font l'objet d'une revue de code avant merge ?",{"type":29,"tag":665,"props":4729,"children":4730},{},[4731],{"type":35,"value":4732},"Avez-vous une Definition of Done écrite et appliquée à chaque story ?",{"type":29,"tag":37,"props":4734,"children":4735},{},[4736,4741],{"type":29,"tag":55,"props":4737,"children":4738},{},[4739],{"type":35,"value":4740},"CI/CD (3 questions)",{"type":35,"value":4742},"\n4. Votre pipeline CI tourne-t-il sur chaque commit et est-il vert > 90% du temps ?\n5. Quel est le temps moyen entre l'écriture d'une ligne de code et sa mise en prod ?\n6. Déployez-vous en production au moins une fois par semaine ?",{"type":29,"tag":37,"props":4744,"children":4745},{},[4746,4751],{"type":29,"tag":55,"props":4747,"children":4748},{},[4749],{"type":35,"value":4750},"Architecture (2 questions)",{"type":35,"value":4752},"\n7. Pouvez-vous déployer un service sans toucher aux autres ?\n8. Est-ce qu'un nouveau développeur peut comprendre l'architecture en moins d'une journée ?",{"type":29,"tag":37,"props":4754,"children":4755},{},[4756,4761],{"type":29,"tag":55,"props":4757,"children":4758},{},[4759],{"type":35,"value":4760},"Culture (2 questions)",{"type":35,"value":4762},"\n9. Les incidents de prod donnent-ils lieu à des post-mortems sans blame ?\n10. Les développeurs consacrent-ils du temps à l'apprentissage chaque semaine ?",{"type":29,"tag":37,"props":4764,"children":4765},{},[4766,4771],{"type":29,"tag":55,"props":4767,"children":4768},{},[4769],{"type":35,"value":4770},"Métriques (2 questions)",{"type":35,"value":4772},"\n11. Connaissez-vous votre lead time moyen pour une User Story ?\n12. Suivez-vous le taux d'absorption de la dette technique ?",{"type":29,"tag":37,"props":4774,"children":4775},{},[4776,4781],{"type":29,"tag":55,"props":4777,"children":4778},{},[4779],{"type":35,"value":4780},"Scoring",{"type":35,"value":4782}," : 0-4 oui → niveau 1-2 | 5-8 oui → niveau 3 | 9-12 oui → niveau 4-5",{"type":29,"tag":1417,"props":4784,"children":4785},{},[4786],{"type":29,"tag":37,"props":4787,"children":4788},{},[4789,4794],{"type":29,"tag":55,"props":4790,"children":4791},{},[4792],{"type":35,"value":4793},"Ce que j'observe sur le terrain",{"type":35,"value":4795}," : dans une équipe de 45 développeurs d'une grande compagnie d'assurance, le CTO estimait son équipe au niveau 3 (\"on a la CI, les sprints tournent, les revues de code sont faites\"). Le diagnostic en 12 questions a révélé 5 \"oui\" sur 12 : niveau 2 solide. Le blocage principal : les revues de code étaient théoriquement obligatoires mais contournées en fin de sprint. En 6 mois, l'équipe a atteint le niveau 3 en travaillant spécifiquement sur la DoD et les métriques DORA.",{"type":29,"tag":66,"props":4797,"children":4798},{},[],{"type":29,"tag":70,"props":4800,"children":4802},{"id":4801},"ce-que-ça-change-de-connaître-son-niveau",[4803],{"type":35,"value":4804},"Ce que ça change de connaître son niveau",{"type":29,"tag":37,"props":4806,"children":4807},{},[4808],{"type":35,"value":4809},"La valeur du modèle n'est pas le score, c'est la clarté sur où investir l'énergie.",{"type":29,"tag":37,"props":4811,"children":4812},{},[4813],{"type":35,"value":4814},"Une équipe au niveau 1 qui essaie d'implémenter des feature flags (pratique de niveau 4-5) va échouer et se décourager. La même énergie investie à stabiliser la CI et écrire des tests de base produira des résultats tangibles en 8 semaines.",{"type":29,"tag":37,"props":4816,"children":4817},{},[4818],{"type":35,"value":4819},"La progression est séquentielle. On ne saute pas de niveaux. Et chaque niveau a ses 2-3 pratiques critiques qui débloquent la suite. C'est le principe fondamental que Martin Fowler décrit dans son travail sur le refactoring continu : on améliore par petits pas mesurables, pas par transformations révolutionnaires.",{"type":29,"tag":37,"props":4821,"children":4822},{},[4823],{"type":35,"value":4824},"Côté business, l'enjeu est direct : une équipe au niveau 2 avec 40% d'absorption de dette technique sur 50 développeurs représente environ 3,5 millions d'euros de capacité perdue chaque année. Passer au niveau 3 réduit cette absorption à 20%, soit 1,75 million récupérés. Ce n'est pas de la théorie, c'est de l'arithmétique.",{"type":29,"tag":66,"props":4826,"children":4827},{},[],{"type":29,"tag":70,"props":4829,"children":4831},{"id":4830},"faq-sur-la-maturité-engineering",[4832],{"type":35,"value":4833},"FAQ sur la maturité engineering",{"type":29,"tag":371,"props":4835,"children":4836},{},[4837,4842],{"type":29,"tag":375,"props":4838,"children":4839},{},[4840],{"type":35,"value":4841},"1. Est-ce qu'il faut atteindre le niveau 5 pour être une bonne équipe ?",{"type":29,"tag":37,"props":4843,"children":4844},{},[4845],{"type":35,"value":4846},"Non. Le niveau 5 est un horizon, pas un prérequis. Pour la plupart des équipes, l'objectif réaliste et utile est le niveau 3-4. Le niveau 3 apporte déjà une réduction significative du lead time, une baisse des bugs de prod, et une meilleure attractivité pour les développeurs seniors. Viser le niveau 5 dès le départ disperse l'énergie et crée de la frustration.",{"type":29,"tag":371,"props":4848,"children":4849},{},[4850,4855],{"type":29,"tag":375,"props":4851,"children":4852},{},[4853],{"type":35,"value":4854},"2. Combien de temps faut-il pour progresser d'un niveau ?",{"type":29,"tag":37,"props":4856,"children":4857},{},[4858],{"type":35,"value":4859},"En moyenne 3 à 6 mois pour une progression d'un niveau, avec un accompagnement structuré et un budget technique dédié (20% de la capacité de l'équipe). Sans ces deux conditions, la progression peut prendre 12 à 18 mois, ou ne jamais arriver. La variable principale est le soutien du management : sans feu vert explicite sur le budget technique, les équipes restent bloquées.",{"type":29,"tag":371,"props":4861,"children":4862},{},[4863,4868],{"type":29,"tag":375,"props":4864,"children":4865},{},[4866],{"type":35,"value":4867},"3. Le modèle s'applique-t-il à toutes les tailles d'équipes ?",{"type":29,"tag":37,"props":4869,"children":4870},{},[4871],{"type":35,"value":4872},"Oui, avec des nuances. Pour une équipe de 5 développeurs, le passage au niveau 4 peut se faire en quelques mois : la coordination est simple, les standards s'adoptent vite. Pour une équipe de 200 développeurs, la progression est plus lente et nécessite une stratégie de diffusion des pratiques (guildes, inner source, champions par tribu). Le modèle est le même, la vitesse d'exécution diffère.",{"type":29,"tag":371,"props":4874,"children":4875},{},[4876,4881],{"type":29,"tag":375,"props":4877,"children":4878},{},[4879],{"type":35,"value":4880},"4. Comment convaincre le business d'investir dans la maturité engineering ?",{"type":29,"tag":37,"props":4882,"children":4883},{},[4884],{"type":35,"value":4885},"Je traduis le niveau actuel en coût. Une équipe au niveau 2 avec 40% d'absorption de la dette technique sur 50 développeurs représente ~3,5M€/an de capacité perdue. La progression au niveau 3 réduit cette absorption à 20%, soit 1,75M€ récupérés. Face à un investissement de 150-200K€ pour un programme de 6 mois, le ROI est évident, à condition de le formuler en langage financier, pas en langage technique.",{"type":29,"tag":371,"props":4887,"children":4888},{},[4889,4894],{"type":29,"tag":375,"props":4890,"children":4891},{},[4892],{"type":35,"value":4893},"5. Peut-on évaluer la maturité engineering d'une équipe qu'on vient de rejoindre ?",{"type":29,"tag":37,"props":4895,"children":4896},{},[4897],{"type":35,"value":4898},"Oui, et c'est même recommandé dans les 30 premiers jours d'un nouveau CTO. Les 12 questions de l'auto-évaluation donnent une première lecture. Pour un diagnostic complet, il faut ajouter : l'analyse du cycle time des 3 derniers mois, le taux de bugs de prod, les entretiens informels avec 5-6 développeurs, et la revue du pipeline CI/CD. En 3 jours, on a une image fiable.",{"type":29,"tag":66,"props":4900,"children":4901},{},[],{"type":29,"tag":166,"props":4903,"children":4904},{"cta":442,"href":443,"title":444,"type":445},[4905],{"type":29,"tag":37,"props":4906,"children":4907},{},[4908],{"type":35,"value":4909},"30 questions structurées sur 5 dimensions : pratiques de code, CI/CD, architecture, culture, et adoption IA. Score de maturité automatique et 3 priorités d'action pour les 90 prochains jours. Utilisé dans plus de 25 diagnostics terrain.",{"type":29,"tag":66,"props":4911,"children":4912},{},[],{"type":29,"tag":37,"props":4914,"children":4915},{},[4916],{"type":29,"tag":55,"props":4917,"children":4918},{},[4919],{"type":35,"value":980},{"type":29,"tag":37,"props":4921,"children":4922},{},[4923],{"type":35,"value":985},{"type":29,"tag":37,"props":4925,"children":4926},{},[4927,4928],{"type":35,"value":990},{"type":29,"tag":55,"props":4929,"children":4930},{},[4931],{"type":35,"value":995},{"title":8,"searchDepth":453,"depth":453,"links":4933},[4934,4935,4942,4947,4948,4949],{"id":4314,"depth":453,"text":4317},{"id":4348,"depth":453,"text":4351,"children":4936},[4937,4938,4939,4940,4941],{"id":4354,"depth":459,"text":4357},{"id":4402,"depth":459,"text":4405},{"id":4464,"depth":459,"text":4467},{"id":4517,"depth":459,"text":4520},{"id":4564,"depth":459,"text":4567},{"id":4626,"depth":453,"text":4629,"children":4943},[4944,4945,4946],{"id":4632,"depth":459,"text":4635},{"id":4655,"depth":459,"text":4658},{"id":4671,"depth":459,"text":4674},{"id":4698,"depth":453,"text":4701},{"id":4801,"depth":453,"text":4804},{"id":4830,"depth":453,"text":4833},"content:fr:dette-technique:introduction-maturite-engineering-5-niveaux.md","fr/dette-technique/introduction-maturite-engineering-5-niveaux.md","fr/dette-technique/introduction-maturite-engineering-5-niveaux",{"_path":4954,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":4955,"description":4956,"id":4957,"date":4958,"listed":13,"nocomments":7,"hidden":7,"categories":4959,"tags":4960,"--cover":4963,"readingTime":4964,"body":4969,"_type":466,"_id":6216,"_source":468,"_file":6217,"_stem":6218,"_extension":471},"/fr/dette-technique/boy-scout-rule-developpement-code-clean-java","La règle du Boy Scout en Développement, Comment améliorer votre code au quotidien","Découvrez la règle du Boy Scout en développement logiciel, son application pratique avec des exemples en Java, et des conseils pour garder une codebase propre et maintenable.",52,"2024-09-04",[6],[4961,4962],"Clean code","Software craftsmanship","covers/articles/boy-scout-rule-developpement-code-clean-java.jpg",{"text":4965,"minutes":4966,"time":4967,"words":4968},"11 min read",10.34,620400,2068,{"type":26,"children":4970,"toc":6200},[4971,4976,4981,4986,4989,4995,5001,5013,5018,5024,5029,5034,5037,5043,5049,5054,5061,5090,5185,5191,5196,5256,5262,5267,5342,5354,5410,5416,5429,5435,5440,5702,5708,5718,5889,5898,5904,5909,5949,5952,5958,5964,5969,5980,5985,5996,6008,6018,6023,6029,6034,6039,6045,6050,6060,6065,6075,6080,6090,6095,6106,6111,6114,6120,6133,6146,6159,6172,6185,6194],{"type":29,"tag":37,"props":4972,"children":4973},{},[4974],{"type":35,"value":4975},"Imaginez un instant que vous vous promenez dans un parc magnifique. Vous remarquez un morceau de papier jeté sur le sol. Vous pourriez facilement l'ignorer, mais à la place, vous le ramassez et le jetez dans la poubelle la plus proche. C’est simple, c’est rapide, et le parc est un peu plus propre grâce à vous. Ce geste, aussi insignifiant qu'il puisse paraître, est au cœur de la règle du Boy Scout appliquée au développement logiciel.",{"type":29,"tag":37,"props":4977,"children":4978},{},[4979],{"type":35,"value":4980},"En tant que coach en software craftsmanship, je vois souvent des équipes lutter pour maintenir une codebase propre, particulièrement lorsqu'elles sont sous pression pour livrer rapidement. Et je comprends tout à fait cette pression – vous devez avancer, ajouter des fonctionnalités, résoudre des bugs, tout en jonglant avec des délais serrés. Mais voilà le paradoxe : négliger les petits problèmes aujourd'hui peut rapidement transformer votre code en un véritable casse-tête demain.",{"type":29,"tag":37,"props":4982,"children":4983},{},[4984],{"type":35,"value":4985},"Je vous explique ici comment appliquer la règle du Boy Scout à votre code : une méthode simple mais puissante qui peut faire une grande différence sur le long terme. Vous verrez non seulement ce qu’est cette règle, mais aussi comment l’intégrer dans votre routine quotidienne sans ralentir votre rythme de travail. Et pour rendre le tout plus concret, nous examinerons quelques exemples en Java.",{"type":29,"tag":66,"props":4987,"children":4988},{},[],{"type":29,"tag":70,"props":4990,"children":4992},{"id":4991},"introduction-au-boy-scout-rule",[4993],{"type":35,"value":4994},"Introduction au Boy Scout Rule",{"type":29,"tag":106,"props":4996,"children":4998},{"id":4997},"comprendre-le-concept",[4999],{"type":35,"value":5000},"Comprendre le concept",{"type":29,"tag":37,"props":5002,"children":5003},{},[5004,5006,5011],{"type":35,"value":5005},"La règle du Boy Scout, popularisée par Robert C. Martin, aussi connu sous le nom de Uncle Bob, est simple : ",{"type":29,"tag":55,"props":5007,"children":5008},{},[5009],{"type":35,"value":5010},"« Laissez le campement plus propre que vous ne l'avez trouvé. »",{"type":35,"value":5012}," Appliquée au développement logiciel, cette règle signifie que chaque fois que vous touchez une partie du code, vous devriez la laisser dans un état légèrement meilleur que celui dans lequel vous l'avez trouvée.",{"type":29,"tag":37,"props":5014,"children":5015},{},[5016],{"type":35,"value":5017},"Mais qu'est-ce que cela signifie concrètement ? Cela peut être aussi simple que de renommer une variable pour qu'elle soit plus descriptive, de supprimer un bout de code mort ou d'ajouter un commentaire clair pour expliquer un algorithme complexe. L'idée est de constamment apporter de petites améliorations au code, ce qui, au fil du temps, conduit à une codebase plus propre, plus maintenable et plus facile à comprendre.",{"type":29,"tag":106,"props":5019,"children":5021},{"id":5020},"pourquoi-cette-règle-est-elle-importante",[5022],{"type":35,"value":5023},"Pourquoi cette règle est-elle importante ?",{"type":29,"tag":37,"props":5025,"children":5026},{},[5027],{"type":35,"value":5028},"Vous avez sans doute déjà été confronté à du code compliqué, mal documenté ou rempli de \"quick fixes\" qui, au final, ralentissent votre travail. Ce code devient de plus en plus difficile à maintenir, et chaque modification risque d'introduire de nouveaux bugs. La dette technique s'accumule, et bientôt, même les tâches simples deviennent des projets de grande envergure. C'est exactement ce que j'ai observé dans des équipes que j'accompagnais chez BNP Paribas CIB et Agirc-Arrco : la dette s'installe progressivement, et le moment où elle devient critique est souvent atteint bien avant que l'équipe en prenne conscience.",{"type":29,"tag":37,"props":5030,"children":5031},{},[5032],{"type":35,"value":5033},"La règle du Boy Scout est un antidote à ce problème. En appliquant cette règle régulièrement, vous évitez que la dette technique ne devienne ingérable, ce qui se traduit concrètement par des cycles de livraison plus courts et une réduction du coût de maintenance. De plus, en améliorant constamment le code, vous réduisez la probabilité d'introduire des erreurs et facilitez la vie des autres développeurs qui travaillent avec vous (ou pour vous). Ce n'est pas une révolution immédiate, mais un processus graduel qui, s'il est suivi de manière rigoureuse, transforme votre codebase en une ressource stable et fiable.",{"type":29,"tag":66,"props":5035,"children":5036},{},[],{"type":29,"tag":70,"props":5038,"children":5040},{"id":5039},"application-pratique-de-la-règle",[5041],{"type":35,"value":5042},"Application pratique de la règle",{"type":29,"tag":106,"props":5044,"children":5046},{"id":5045},"exemples-concrets-en-java",[5047],{"type":35,"value":5048},"Exemples concrets en Java",{"type":29,"tag":37,"props":5050,"children":5051},{},[5052],{"type":35,"value":5053},"Appliquer la règle du Boy Scout dans votre code ne signifie pas que vous devez refactoriser chaque ligne de code que vous touchez. Il s'agit plutôt de petites améliorations progressives qui, cumulées, améliorent significativement la qualité de votre codebase. Voici quelques exemples pratiques de la façon dont vous pouvez appliquer cette règle en Java.",{"type":29,"tag":5055,"props":5056,"children":5058},"h4",{"id":5057},"_1-renommage-de-variables",[5059],{"type":35,"value":5060},"1. Renommage de variables",{"type":29,"tag":37,"props":5062,"children":5063},{},[5064,5066,5072,5074,5080,5082,5088],{"type":35,"value":5065},"Imaginez que vous travaillez sur une classe où vous trouvez une variable mal nommée, comme ",{"type":29,"tag":1716,"props":5067,"children":5069},{"className":5068},[],[5070],{"type":35,"value":5071},"int x",{"type":35,"value":5073},". Vous devez y ajouter une nouvelle fonctionnalité. Avant de le faire, prenez quelques secondes pour renommer ",{"type":29,"tag":1716,"props":5075,"children":5077},{"className":5076},[],[5078],{"type":35,"value":5079},"x",{"type":35,"value":5081}," en quelque chose de plus descriptif, comme ",{"type":29,"tag":1716,"props":5083,"children":5085},{"className":5084},[],[5086],{"type":35,"value":5087},"int numberOfItems",{"type":35,"value":5089},". Cela améliore instantanément la lisibilité du code pour vous et pour les autres développeurs qui y travailleront plus tard.",{"type":29,"tag":5091,"props":5092,"children":5096},"pre",{"className":5093,"code":5094,"language":5095,"meta":8,"style":8},"language-java shiki shiki-themes catppuccin-frappe github-dark","// Avant\nint x = 5;\n\n// Après\nint numberOfItems = 5;\n","java",[5097],{"type":29,"tag":1716,"props":5098,"children":5099},{"__ignoreMap":8},[5100,5110,5143,5151,5160],{"type":29,"tag":2730,"props":5101,"children":5103},{"class":5102,"line":4267},"line",[5104],{"type":29,"tag":2730,"props":5105,"children":5107},{"style":5106},"--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit",[5108],{"type":35,"value":5109},"// Avant\n",{"type":29,"tag":2730,"props":5111,"children":5112},{"class":5102,"line":453},[5113,5119,5125,5131,5137],{"type":29,"tag":2730,"props":5114,"children":5116},{"style":5115},"--shiki-default:#CA9EE6;--shiki-dark:#F97583",[5117],{"type":35,"value":5118},"int",{"type":29,"tag":2730,"props":5120,"children":5122},{"style":5121},"--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8",[5123],{"type":35,"value":5124}," x ",{"type":29,"tag":2730,"props":5126,"children":5128},{"style":5127},"--shiki-default:#81C8BE;--shiki-dark:#F97583",[5129],{"type":35,"value":5130},"=",{"type":29,"tag":2730,"props":5132,"children":5134},{"style":5133},"--shiki-default:#EF9F76;--shiki-dark:#79B8FF",[5135],{"type":35,"value":5136}," 5",{"type":29,"tag":2730,"props":5138,"children":5140},{"style":5139},"--shiki-default:#949CBB;--shiki-dark:#E1E4E8",[5141],{"type":35,"value":5142},";\n",{"type":29,"tag":2730,"props":5144,"children":5145},{"class":5102,"line":459},[5146],{"type":29,"tag":2730,"props":5147,"children":5148},{"emptyLinePlaceholder":13},[5149],{"type":35,"value":5150},"\n",{"type":29,"tag":2730,"props":5152,"children":5154},{"class":5102,"line":5153},4,[5155],{"type":29,"tag":2730,"props":5156,"children":5157},{"style":5106},[5158],{"type":35,"value":5159},"// Après\n",{"type":29,"tag":2730,"props":5161,"children":5163},{"class":5102,"line":5162},5,[5164,5168,5173,5177,5181],{"type":29,"tag":2730,"props":5165,"children":5166},{"style":5115},[5167],{"type":35,"value":5118},{"type":29,"tag":2730,"props":5169,"children":5170},{"style":5121},[5171],{"type":35,"value":5172}," numberOfItems ",{"type":29,"tag":2730,"props":5174,"children":5175},{"style":5127},[5176],{"type":35,"value":5130},{"type":29,"tag":2730,"props":5178,"children":5179},{"style":5133},[5180],{"type":35,"value":5136},{"type":29,"tag":2730,"props":5182,"children":5183},{"style":5139},[5184],{"type":35,"value":5142},{"type":29,"tag":5055,"props":5186,"children":5188},{"id":5187},"_2-suppression-de-code-mort",[5189],{"type":35,"value":5190},"2. Suppression de code mort",{"type":29,"tag":37,"props":5192,"children":5193},{},[5194],{"type":35,"value":5195},"Il est fréquent de trouver des blocs de code commentés ou des méthodes obsolètes qui ne sont plus utilisés. Par exemple, si vous trouvez une méthode inutilisée dans une classe, supprimez-la. Cela allège la classe et réduit le bruit visuel pour les autres développeurs.",{"type":29,"tag":5091,"props":5197,"children":5199},{"className":5093,"code":5198,"language":5095,"meta":8,"style":8},"// Code mort à supprimer\npublic void oldMethod() {\n    // Cette méthode n'est plus utilisée\n}\n",[5200],{"type":29,"tag":1716,"props":5201,"children":5202},{"__ignoreMap":8},[5203,5211,5240,5248],{"type":29,"tag":2730,"props":5204,"children":5205},{"class":5102,"line":4267},[5206],{"type":29,"tag":2730,"props":5207,"children":5208},{"style":5106},[5209],{"type":35,"value":5210},"// Code mort à supprimer\n",{"type":29,"tag":2730,"props":5212,"children":5213},{"class":5102,"line":453},[5214,5219,5224,5230,5235],{"type":29,"tag":2730,"props":5215,"children":5216},{"style":5115},[5217],{"type":35,"value":5218},"public",{"type":29,"tag":2730,"props":5220,"children":5221},{"style":5115},[5222],{"type":35,"value":5223}," void",{"type":29,"tag":2730,"props":5225,"children":5227},{"style":5226},"--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit",[5228],{"type":35,"value":5229}," oldMethod",{"type":29,"tag":2730,"props":5231,"children":5232},{"style":5139},[5233],{"type":35,"value":5234},"()",{"type":29,"tag":2730,"props":5236,"children":5237},{"style":5139},[5238],{"type":35,"value":5239}," {\n",{"type":29,"tag":2730,"props":5241,"children":5242},{"class":5102,"line":459},[5243],{"type":29,"tag":2730,"props":5244,"children":5245},{"style":5106},[5246],{"type":35,"value":5247},"    // Cette méthode n'est plus utilisée\n",{"type":29,"tag":2730,"props":5249,"children":5250},{"class":5102,"line":5153},[5251],{"type":29,"tag":2730,"props":5252,"children":5253},{"style":5139},[5254],{"type":35,"value":5255},"}\n",{"type":29,"tag":5055,"props":5257,"children":5259},{"id":5258},"_3-simplification-des-conditions",[5260],{"type":35,"value":5261},"3. Simplification des conditions",{"type":29,"tag":37,"props":5263,"children":5264},{},[5265],{"type":35,"value":5266},"Si vous tombez sur une condition complexe, essayez de la simplifier. Par exemple, si vous voyez quelque chose comme ceci :",{"type":29,"tag":5091,"props":5268,"children":5270},{"className":5093,"code":5269,"language":5095,"meta":8,"style":8},"// Avant\nif (isUserLoggedIn() == true) {\n    showDashboard();\n}\n",[5271],{"type":29,"tag":1716,"props":5272,"children":5273},{"__ignoreMap":8},[5274,5281,5322,5335],{"type":29,"tag":2730,"props":5275,"children":5276},{"class":5102,"line":4267},[5277],{"type":29,"tag":2730,"props":5278,"children":5279},{"style":5106},[5280],{"type":35,"value":5109},{"type":29,"tag":2730,"props":5282,"children":5283},{"class":5102,"line":453},[5284,5289,5294,5299,5303,5308,5314,5318],{"type":29,"tag":2730,"props":5285,"children":5286},{"style":5115},[5287],{"type":35,"value":5288},"if",{"type":29,"tag":2730,"props":5290,"children":5291},{"style":5139},[5292],{"type":35,"value":5293}," (",{"type":29,"tag":2730,"props":5295,"children":5296},{"style":5226},[5297],{"type":35,"value":5298},"isUserLoggedIn",{"type":29,"tag":2730,"props":5300,"children":5301},{"style":5139},[5302],{"type":35,"value":5234},{"type":29,"tag":2730,"props":5304,"children":5305},{"style":5127},[5306],{"type":35,"value":5307}," ==",{"type":29,"tag":2730,"props":5309,"children":5311},{"style":5310},"--shiki-default:#E78284;--shiki-dark:#79B8FF",[5312],{"type":35,"value":5313}," true",{"type":29,"tag":2730,"props":5315,"children":5316},{"style":5139},[5317],{"type":35,"value":3849},{"type":29,"tag":2730,"props":5319,"children":5320},{"style":5139},[5321],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5323,"children":5324},{"class":5102,"line":459},[5325,5330],{"type":29,"tag":2730,"props":5326,"children":5327},{"style":5226},[5328],{"type":35,"value":5329},"    showDashboard",{"type":29,"tag":2730,"props":5331,"children":5332},{"style":5139},[5333],{"type":35,"value":5334},"();\n",{"type":29,"tag":2730,"props":5336,"children":5337},{"class":5102,"line":5153},[5338],{"type":29,"tag":2730,"props":5339,"children":5340},{"style":5139},[5341],{"type":35,"value":5255},{"type":29,"tag":37,"props":5343,"children":5344},{},[5345,5347,5353],{"type":35,"value":5346},"Vous pouvez simplifier en retirant la comparaison inutile avec ",{"type":29,"tag":1716,"props":5348,"children":5350},{"className":5349},[],[5351],{"type":35,"value":5352},"true",{"type":35,"value":1119},{"type":29,"tag":5091,"props":5355,"children":5357},{"className":5093,"code":5356,"language":5095,"meta":8,"style":8},"// Après\nif (isUserLoggedIn()) {\n    showDashboard();\n}\n",[5358],{"type":29,"tag":1716,"props":5359,"children":5360},{"__ignoreMap":8},[5361,5368,5392,5403],{"type":29,"tag":2730,"props":5362,"children":5363},{"class":5102,"line":4267},[5364],{"type":29,"tag":2730,"props":5365,"children":5366},{"style":5106},[5367],{"type":35,"value":5159},{"type":29,"tag":2730,"props":5369,"children":5370},{"class":5102,"line":453},[5371,5375,5379,5383,5388],{"type":29,"tag":2730,"props":5372,"children":5373},{"style":5115},[5374],{"type":35,"value":5288},{"type":29,"tag":2730,"props":5376,"children":5377},{"style":5139},[5378],{"type":35,"value":5293},{"type":29,"tag":2730,"props":5380,"children":5381},{"style":5226},[5382],{"type":35,"value":5298},{"type":29,"tag":2730,"props":5384,"children":5385},{"style":5139},[5386],{"type":35,"value":5387},"())",{"type":29,"tag":2730,"props":5389,"children":5390},{"style":5139},[5391],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5393,"children":5394},{"class":5102,"line":459},[5395,5399],{"type":29,"tag":2730,"props":5396,"children":5397},{"style":5226},[5398],{"type":35,"value":5329},{"type":29,"tag":2730,"props":5400,"children":5401},{"style":5139},[5402],{"type":35,"value":5334},{"type":29,"tag":2730,"props":5404,"children":5405},{"class":5102,"line":5153},[5406],{"type":29,"tag":2730,"props":5407,"children":5408},{"style":5139},[5409],{"type":35,"value":5255},{"type":29,"tag":106,"props":5411,"children":5413},{"id":5412},"appliquer-la-règle-via-le-clean-code-et-le-refactoring",[5414],{"type":35,"value":5415},"Appliquer la règle via le Clean Code et le Refactoring",{"type":29,"tag":37,"props":5417,"children":5418},{},[5419,5421,5427],{"type":35,"value":5420},"Le ",{"type":29,"tag":43,"props":5422,"children":5424},{"href":5423},"/fr/dette-technique/clean-code-software-craftsmanship-principes-java",[5425],{"type":35,"value":5426},"Clean Code",{"type":35,"value":5428}," et le refactoring sont des pratiques essentielles pour appliquer la règle du Boy Scout. Ces concepts, également popularisés par des experts comme Robert C. Martin, se concentrent sur la création de code clair, lisible et sans ambiguïté. Voici comment la règle du Boy Scout s'intègre parfaitement avec ces pratiques :",{"type":29,"tag":5055,"props":5430,"children":5432},{"id":5431},"_1-refactoring-continu",[5433],{"type":35,"value":5434},"1. Refactoring continu",{"type":29,"tag":37,"props":5436,"children":5437},{},[5438],{"type":35,"value":5439},"Le refactoring consiste à restructurer le code existant sans changer son comportement externe. Chaque fois que vous touchez une section du code, prenez un moment pour voir si vous pouvez simplifier une méthode, réduire la duplication ou améliorer la structure globale. Par exemple, vous pourriez extraire une méthode pour clarifier une opération complexe.",{"type":29,"tag":5091,"props":5441,"children":5443},{"className":5093,"code":5442,"language":5095,"meta":8,"style":8},"// Avant\npublic void processOrder() {\n    // Code complexe pour vérifier les stocks\n    if (stock >= orderQuantity) {\n        // Traitement de la commande\n    }\n}\n\n// Après - Refactoring en extrayant une méthode\npublic void processOrder() {\n    if (isStockSufficient()) {\n        // Traitement de la commande\n    }\n}\n\nprivate boolean isStockSufficient() {\n    return stock >= orderQuantity;\n}\n",[5444],{"type":29,"tag":1716,"props":5445,"children":5446},{"__ignoreMap":8},[5447,5454,5478,5486,5521,5529,5537,5545,5553,5562,5586,5610,5618,5626,5634,5642,5668,5694],{"type":29,"tag":2730,"props":5448,"children":5449},{"class":5102,"line":4267},[5450],{"type":29,"tag":2730,"props":5451,"children":5452},{"style":5106},[5453],{"type":35,"value":5109},{"type":29,"tag":2730,"props":5455,"children":5456},{"class":5102,"line":453},[5457,5461,5465,5470,5474],{"type":29,"tag":2730,"props":5458,"children":5459},{"style":5115},[5460],{"type":35,"value":5218},{"type":29,"tag":2730,"props":5462,"children":5463},{"style":5115},[5464],{"type":35,"value":5223},{"type":29,"tag":2730,"props":5466,"children":5467},{"style":5226},[5468],{"type":35,"value":5469}," processOrder",{"type":29,"tag":2730,"props":5471,"children":5472},{"style":5139},[5473],{"type":35,"value":5234},{"type":29,"tag":2730,"props":5475,"children":5476},{"style":5139},[5477],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5479,"children":5480},{"class":5102,"line":459},[5481],{"type":29,"tag":2730,"props":5482,"children":5483},{"style":5106},[5484],{"type":35,"value":5485},"    // Code complexe pour vérifier les stocks\n",{"type":29,"tag":2730,"props":5487,"children":5488},{"class":5102,"line":5153},[5489,5494,5498,5503,5508,5513,5517],{"type":29,"tag":2730,"props":5490,"children":5491},{"style":5115},[5492],{"type":35,"value":5493},"    if",{"type":29,"tag":2730,"props":5495,"children":5496},{"style":5139},[5497],{"type":35,"value":5293},{"type":29,"tag":2730,"props":5499,"children":5500},{"style":5121},[5501],{"type":35,"value":5502},"stock ",{"type":29,"tag":2730,"props":5504,"children":5505},{"style":5127},[5506],{"type":35,"value":5507},">=",{"type":29,"tag":2730,"props":5509,"children":5510},{"style":5121},[5511],{"type":35,"value":5512}," orderQuantity",{"type":29,"tag":2730,"props":5514,"children":5515},{"style":5139},[5516],{"type":35,"value":3849},{"type":29,"tag":2730,"props":5518,"children":5519},{"style":5139},[5520],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5522,"children":5523},{"class":5102,"line":5162},[5524],{"type":29,"tag":2730,"props":5525,"children":5526},{"style":5106},[5527],{"type":35,"value":5528},"        // Traitement de la commande\n",{"type":29,"tag":2730,"props":5530,"children":5531},{"class":5102,"line":3553},[5532],{"type":29,"tag":2730,"props":5533,"children":5534},{"style":5139},[5535],{"type":35,"value":5536},"    }\n",{"type":29,"tag":2730,"props":5538,"children":5540},{"class":5102,"line":5539},7,[5541],{"type":29,"tag":2730,"props":5542,"children":5543},{"style":5139},[5544],{"type":35,"value":5255},{"type":29,"tag":2730,"props":5546,"children":5548},{"class":5102,"line":5547},8,[5549],{"type":29,"tag":2730,"props":5550,"children":5551},{"emptyLinePlaceholder":13},[5552],{"type":35,"value":5150},{"type":29,"tag":2730,"props":5554,"children":5556},{"class":5102,"line":5555},9,[5557],{"type":29,"tag":2730,"props":5558,"children":5559},{"style":5106},[5560],{"type":35,"value":5561},"// Après - Refactoring en extrayant une méthode\n",{"type":29,"tag":2730,"props":5563,"children":5565},{"class":5102,"line":5564},10,[5566,5570,5574,5578,5582],{"type":29,"tag":2730,"props":5567,"children":5568},{"style":5115},[5569],{"type":35,"value":5218},{"type":29,"tag":2730,"props":5571,"children":5572},{"style":5115},[5573],{"type":35,"value":5223},{"type":29,"tag":2730,"props":5575,"children":5576},{"style":5226},[5577],{"type":35,"value":5469},{"type":29,"tag":2730,"props":5579,"children":5580},{"style":5139},[5581],{"type":35,"value":5234},{"type":29,"tag":2730,"props":5583,"children":5584},{"style":5139},[5585],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5587,"children":5588},{"class":5102,"line":2949},[5589,5593,5597,5602,5606],{"type":29,"tag":2730,"props":5590,"children":5591},{"style":5115},[5592],{"type":35,"value":5493},{"type":29,"tag":2730,"props":5594,"children":5595},{"style":5139},[5596],{"type":35,"value":5293},{"type":29,"tag":2730,"props":5598,"children":5599},{"style":5226},[5600],{"type":35,"value":5601},"isStockSufficient",{"type":29,"tag":2730,"props":5603,"children":5604},{"style":5139},[5605],{"type":35,"value":5387},{"type":29,"tag":2730,"props":5607,"children":5608},{"style":5139},[5609],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5611,"children":5613},{"class":5102,"line":5612},12,[5614],{"type":29,"tag":2730,"props":5615,"children":5616},{"style":5106},[5617],{"type":35,"value":5528},{"type":29,"tag":2730,"props":5619,"children":5621},{"class":5102,"line":5620},13,[5622],{"type":29,"tag":2730,"props":5623,"children":5624},{"style":5139},[5625],{"type":35,"value":5536},{"type":29,"tag":2730,"props":5627,"children":5629},{"class":5102,"line":5628},14,[5630],{"type":29,"tag":2730,"props":5631,"children":5632},{"style":5139},[5633],{"type":35,"value":5255},{"type":29,"tag":2730,"props":5635,"children":5637},{"class":5102,"line":5636},15,[5638],{"type":29,"tag":2730,"props":5639,"children":5640},{"emptyLinePlaceholder":13},[5641],{"type":35,"value":5150},{"type":29,"tag":2730,"props":5643,"children":5644},{"class":5102,"line":2142},[5645,5650,5655,5660,5664],{"type":29,"tag":2730,"props":5646,"children":5647},{"style":5115},[5648],{"type":35,"value":5649},"private",{"type":29,"tag":2730,"props":5651,"children":5652},{"style":5115},[5653],{"type":35,"value":5654}," boolean",{"type":29,"tag":2730,"props":5656,"children":5657},{"style":5226},[5658],{"type":35,"value":5659}," isStockSufficient",{"type":29,"tag":2730,"props":5661,"children":5662},{"style":5139},[5663],{"type":35,"value":5234},{"type":29,"tag":2730,"props":5665,"children":5666},{"style":5139},[5667],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5669,"children":5671},{"class":5102,"line":5670},17,[5672,5677,5682,5686,5690],{"type":29,"tag":2730,"props":5673,"children":5674},{"style":5115},[5675],{"type":35,"value":5676},"    return",{"type":29,"tag":2730,"props":5678,"children":5679},{"style":5121},[5680],{"type":35,"value":5681}," stock ",{"type":29,"tag":2730,"props":5683,"children":5684},{"style":5127},[5685],{"type":35,"value":5507},{"type":29,"tag":2730,"props":5687,"children":5688},{"style":5121},[5689],{"type":35,"value":5512},{"type":29,"tag":2730,"props":5691,"children":5692},{"style":5139},[5693],{"type":35,"value":5142},{"type":29,"tag":2730,"props":5695,"children":5697},{"class":5102,"line":5696},18,[5698],{"type":29,"tag":2730,"props":5699,"children":5700},{"style":5139},[5701],{"type":35,"value":5255},{"type":29,"tag":5055,"props":5703,"children":5705},{"id":5704},"_2-clean-code-en-action",[5706],{"type":35,"value":5707},"2. Clean Code en action",{"type":29,"tag":37,"props":5709,"children":5710},{},[5711,5712,5716],{"type":35,"value":5420},{"type":29,"tag":43,"props":5713,"children":5714},{"href":5423},[5715],{"type":35,"value":5426},{"type":35,"value":5717}," encourage des pratiques telles que l'élimination des mauvaises odeurs de code (code smells), l'écriture de tests unitaires, et la maintenance d'une architecture claire. Lorsque vous appliquez la règle du Boy Scout, cherchez à rendre chaque partie du code que vous touchez conforme aux principes du Clean Code. Par exemple, si vous voyez une méthode trop longue, divisez-la en plusieurs méthodes plus courtes et plus descriptives.",{"type":29,"tag":5091,"props":5719,"children":5721},{"className":5093,"code":5720,"language":5095,"meta":8,"style":8},"// Avant - Méthode trop longue\npublic void generateReport() {\n    // Initialisation des paramètres\n    // Calcul des statistiques\n    // Génération du fichier de rapport\n    // Envoi du rapport par email\n}\n\n// Après - Méthode clean avec des responsabilités claires\npublic void generateReport() {\n    initializeParameters();\n    calculateStatistics();\n    generateReportFile();\n    sendReportByEmail();\n}\n",[5722],{"type":29,"tag":1716,"props":5723,"children":5724},{"__ignoreMap":8},[5725,5733,5757,5765,5773,5781,5789,5796,5803,5811,5834,5846,5858,5870,5882],{"type":29,"tag":2730,"props":5726,"children":5727},{"class":5102,"line":4267},[5728],{"type":29,"tag":2730,"props":5729,"children":5730},{"style":5106},[5731],{"type":35,"value":5732},"// Avant - Méthode trop longue\n",{"type":29,"tag":2730,"props":5734,"children":5735},{"class":5102,"line":453},[5736,5740,5744,5749,5753],{"type":29,"tag":2730,"props":5737,"children":5738},{"style":5115},[5739],{"type":35,"value":5218},{"type":29,"tag":2730,"props":5741,"children":5742},{"style":5115},[5743],{"type":35,"value":5223},{"type":29,"tag":2730,"props":5745,"children":5746},{"style":5226},[5747],{"type":35,"value":5748}," generateReport",{"type":29,"tag":2730,"props":5750,"children":5751},{"style":5139},[5752],{"type":35,"value":5234},{"type":29,"tag":2730,"props":5754,"children":5755},{"style":5139},[5756],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5758,"children":5759},{"class":5102,"line":459},[5760],{"type":29,"tag":2730,"props":5761,"children":5762},{"style":5106},[5763],{"type":35,"value":5764},"    // Initialisation des paramètres\n",{"type":29,"tag":2730,"props":5766,"children":5767},{"class":5102,"line":5153},[5768],{"type":29,"tag":2730,"props":5769,"children":5770},{"style":5106},[5771],{"type":35,"value":5772},"    // Calcul des statistiques\n",{"type":29,"tag":2730,"props":5774,"children":5775},{"class":5102,"line":5162},[5776],{"type":29,"tag":2730,"props":5777,"children":5778},{"style":5106},[5779],{"type":35,"value":5780},"    // Génération du fichier de rapport\n",{"type":29,"tag":2730,"props":5782,"children":5783},{"class":5102,"line":3553},[5784],{"type":29,"tag":2730,"props":5785,"children":5786},{"style":5106},[5787],{"type":35,"value":5788},"    // Envoi du rapport par email\n",{"type":29,"tag":2730,"props":5790,"children":5791},{"class":5102,"line":5539},[5792],{"type":29,"tag":2730,"props":5793,"children":5794},{"style":5139},[5795],{"type":35,"value":5255},{"type":29,"tag":2730,"props":5797,"children":5798},{"class":5102,"line":5547},[5799],{"type":29,"tag":2730,"props":5800,"children":5801},{"emptyLinePlaceholder":13},[5802],{"type":35,"value":5150},{"type":29,"tag":2730,"props":5804,"children":5805},{"class":5102,"line":5555},[5806],{"type":29,"tag":2730,"props":5807,"children":5808},{"style":5106},[5809],{"type":35,"value":5810},"// Après - Méthode clean avec des responsabilités claires\n",{"type":29,"tag":2730,"props":5812,"children":5813},{"class":5102,"line":5564},[5814,5818,5822,5826,5830],{"type":29,"tag":2730,"props":5815,"children":5816},{"style":5115},[5817],{"type":35,"value":5218},{"type":29,"tag":2730,"props":5819,"children":5820},{"style":5115},[5821],{"type":35,"value":5223},{"type":29,"tag":2730,"props":5823,"children":5824},{"style":5226},[5825],{"type":35,"value":5748},{"type":29,"tag":2730,"props":5827,"children":5828},{"style":5139},[5829],{"type":35,"value":5234},{"type":29,"tag":2730,"props":5831,"children":5832},{"style":5139},[5833],{"type":35,"value":5239},{"type":29,"tag":2730,"props":5835,"children":5836},{"class":5102,"line":2949},[5837,5842],{"type":29,"tag":2730,"props":5838,"children":5839},{"style":5226},[5840],{"type":35,"value":5841},"    initializeParameters",{"type":29,"tag":2730,"props":5843,"children":5844},{"style":5139},[5845],{"type":35,"value":5334},{"type":29,"tag":2730,"props":5847,"children":5848},{"class":5102,"line":5612},[5849,5854],{"type":29,"tag":2730,"props":5850,"children":5851},{"style":5226},[5852],{"type":35,"value":5853},"    calculateStatistics",{"type":29,"tag":2730,"props":5855,"children":5856},{"style":5139},[5857],{"type":35,"value":5334},{"type":29,"tag":2730,"props":5859,"children":5860},{"class":5102,"line":5620},[5861,5866],{"type":29,"tag":2730,"props":5862,"children":5863},{"style":5226},[5864],{"type":35,"value":5865},"    generateReportFile",{"type":29,"tag":2730,"props":5867,"children":5868},{"style":5139},[5869],{"type":35,"value":5334},{"type":29,"tag":2730,"props":5871,"children":5872},{"class":5102,"line":5628},[5873,5878],{"type":29,"tag":2730,"props":5874,"children":5875},{"style":5226},[5876],{"type":35,"value":5877},"    sendReportByEmail",{"type":29,"tag":2730,"props":5879,"children":5880},{"style":5139},[5881],{"type":35,"value":5334},{"type":29,"tag":2730,"props":5883,"children":5884},{"class":5102,"line":5636},[5885],{"type":29,"tag":2730,"props":5886,"children":5887},{"style":5139},[5888],{"type":35,"value":5255},{"type":29,"tag":166,"props":5890,"children":5892},{"cta":168,"href":169,"title":5891,"type":171},"La dette technique de votre équipe est hors de contrôle ?",[5893],{"type":29,"tag":37,"props":5894,"children":5895},{},[5896],{"type":35,"value":5897},"Le code se dégrade à chaque sprint, personne ne prend le temps de nettoyer, et les développeurs sont démotivés par une codebase qu'ils n'osent plus toucher. Réservons 30 minutes pour évaluer l'état réel de votre codebase et bâtir un plan de remédiation réaliste.",{"type":29,"tag":106,"props":5899,"children":5901},{"id":5900},"quand-et-comment-lappliquer",[5902],{"type":35,"value":5903},"Quand et comment l'appliquer ?",{"type":29,"tag":37,"props":5905,"children":5906},{},[5907],{"type":35,"value":5908},"La règle du Boy Scout ne signifie pas que vous devez passer tout votre temps à nettoyer du code, mais plutôt à saisir les opportunités d'amélioration lorsque vous les rencontrez. Par exemple :",{"type":29,"tag":661,"props":5910,"children":5911},{},[5912,5929,5939],{"type":29,"tag":665,"props":5913,"children":5914},{},[5915,5927],{"type":29,"tag":55,"props":5916,"children":5917},{},[5918,5920,5926],{"type":35,"value":5919},"Pendant une ",{"type":29,"tag":43,"props":5921,"children":5923},{"href":5922},"/fr/dette-technique/revue-de-code-java-guide-exemples",[5924],{"type":35,"value":5925},"révision de code",{"type":35,"value":1119},{"type":35,"value":5928}," Lors de la relecture du code d'un collègue, si vous voyez une opportunité d'amélioration, suggérez-la. Cela peut être une bonne occasion d'appliquer la règle sans perturber le flux de travail.",{"type":29,"tag":665,"props":5930,"children":5931},{},[5932,5937],{"type":29,"tag":55,"props":5933,"children":5934},{},[5935],{"type":35,"value":5936},"Avant d'ajouter une nouvelle fonctionnalité :",{"type":35,"value":5938}," Avant d'ajouter du nouveau code, prenez quelques instants pour voir si la zone que vous modifiez peut être améliorée.",{"type":29,"tag":665,"props":5940,"children":5941},{},[5942,5947],{"type":29,"tag":55,"props":5943,"children":5944},{},[5945],{"type":35,"value":5946},"En corrigeant un bug :",{"type":35,"value":5948}," Lorsque vous travaillez sur un correctif, profitez de l'occasion pour nettoyer les sections du code concernées.",{"type":29,"tag":66,"props":5950,"children":5951},{},[],{"type":29,"tag":70,"props":5953,"children":5955},{"id":5954},"conseils-pour-intégrer-la-règle-dans-votre-routine",[5956],{"type":35,"value":5957},"Conseils pour intégrer la règle dans votre routine",{"type":29,"tag":106,"props":5959,"children":5961},{"id":5960},"meilleures-pratiques",[5962],{"type":35,"value":5963},"Meilleures pratiques",{"type":29,"tag":37,"props":5965,"children":5966},{},[5967],{"type":35,"value":5968},"Intégrer la règle du Boy Scout dans votre routine quotidienne ne nécessite pas de révolutionner votre manière de travailler, mais plutôt de développer des habitudes qui vous aideront à maintenir un code propre et maintenable. Voici quelques conseils pratiques pour y parvenir :",{"type":29,"tag":5055,"props":5970,"children":5972},{"id":5971},"_1-adoptez-une-mentalité-damélioration-continue",[5973,5975],{"type":35,"value":5974},"1. ",{"type":29,"tag":55,"props":5976,"children":5977},{},[5978],{"type":35,"value":5979},"Adoptez une mentalité d'amélioration continue",{"type":29,"tag":37,"props":5981,"children":5982},{},[5983],{"type":35,"value":5984},"La règle du Boy Scout est avant tout une question d'état d'esprit. Plutôt que de voir le code comme quelque chose de figé, voyez-le comme un élément vivant qui peut toujours être amélioré. Chaque petit changement positif que vous faites contribue à la santé globale de la codebase.",{"type":29,"tag":5055,"props":5986,"children":5988},{"id":5987},"_2-intégrez-des-revues-de-code-régulières",[5989,5991],{"type":35,"value":5990},"2. ",{"type":29,"tag":55,"props":5992,"children":5993},{},[5994],{"type":35,"value":5995},"Intégrez des revues de code régulières",{"type":29,"tag":37,"props":5997,"children":5998},{},[5999,6001,6006],{"type":35,"value":6000},"Les ",{"type":29,"tag":43,"props":6002,"children":6003},{"href":5922},[6004],{"type":35,"value":6005},"revues de code",{"type":35,"value":6007}," ne sont pas seulement l'occasion de détecter des erreurs, mais aussi de repérer des opportunités d'amélioration. Je recommande aux équipes que j'accompagne d'utiliser ces moments pour identifier et appliquer la règle du Boy Scout, en proposant des suggestions pour nettoyer ou refactorer le code.",{"type":29,"tag":5055,"props":6009,"children":6011},{"id":6010},"_3-utilisez-des-outils-danalyse-statique",[6012,6013],{"type":35,"value":1209},{"type":29,"tag":55,"props":6014,"children":6015},{},[6016],{"type":35,"value":6017},"Utilisez des outils d'analyse statique",{"type":29,"tag":37,"props":6019,"children":6020},{},[6021],{"type":35,"value":6022},"Des outils comme SonarQube, Checkstyle ou PMD peuvent vous aider à détecter automatiquement des \"odeurs de code\" (code smells) et des violations des principes de Clean Code. Intégrez ces outils dans votre pipeline CI/CD pour garantir que les nouvelles modifications ne dégradent pas la qualité du code.",{"type":29,"tag":5055,"props":6024,"children":6026},{"id":6025},"_4-allouez",[6027],{"type":35,"value":6028},"4. **Allouez",{"type":29,"tag":37,"props":6030,"children":6031},{},[6032],{"type":35,"value":6033},"du temps pour le refactoring**",{"type":29,"tag":37,"props":6035,"children":6036},{},[6037],{"type":35,"value":6038},"Le refactoring ne doit pas être vu comme une tâche distincte qui prend du temps supplémentaire, mais comme une partie intégrante de votre processus de développement. Réservez régulièrement du temps pour nettoyer le code, que ce soit en début ou en fin de sprint, ou chaque fois que vous travaillez sur une nouvelle fonctionnalité.",{"type":29,"tag":106,"props":6040,"children":6042},{"id":6041},"comment-éviter-les-pièges-courants",[6043],{"type":35,"value":6044},"Comment éviter les pièges courants ?",{"type":29,"tag":37,"props":6046,"children":6047},{},[6048],{"type":35,"value":6049},"Bien que la règle du Boy Scout soit simple en théorie, il est facile de tomber dans certains pièges qui peuvent limiter son efficacité. Voici quelques pièges à éviter :",{"type":29,"tag":5055,"props":6051,"children":6053},{"id":6052},"_1-ne-pas-confondre-amélioration-avec-réécriture-complète",[6054,6055],{"type":35,"value":5974},{"type":29,"tag":55,"props":6056,"children":6057},{},[6058],{"type":35,"value":6059},"Ne pas confondre amélioration avec réécriture complète",{"type":29,"tag":37,"props":6061,"children":6062},{},[6063],{"type":35,"value":6064},"L'idée n'est pas de refactorer tout le projet en une seule fois. Cela peut être tentant, surtout si vous travaillez sur un code ancien et difficile à maintenir, mais cela peut également introduire de nouveaux bugs et retarder les délais. Concentrez-vous plutôt sur de petites améliorations progressives.",{"type":29,"tag":5055,"props":6066,"children":6068},{"id":6067},"_2-éviter-de-casser-le-flux-de-travail",[6069,6070],{"type":35,"value":5990},{"type":29,"tag":55,"props":6071,"children":6072},{},[6073],{"type":35,"value":6074},"Éviter de casser le flux de travail",{"type":29,"tag":37,"props":6076,"children":6077},{},[6078],{"type":35,"value":6079},"Je vous recommande de ne pas passer trop de temps à nettoyer le code au détriment des fonctionnalités que vous devez livrer. Trouvez un équilibre en limitant vos améliorations à des tâches qui peuvent être accomplies en quelques minutes, ou planifiez des sessions dédiées pour des refactorings plus conséquents.",{"type":29,"tag":5055,"props":6081,"children":6083},{"id":6082},"_3-ne-pas-négliger-les-tests",[6084,6085],{"type":35,"value":1209},{"type":29,"tag":55,"props":6086,"children":6087},{},[6088],{"type":35,"value":6089},"Ne pas négliger les tests",{"type":29,"tag":37,"props":6091,"children":6092},{},[6093],{"type":35,"value":6094},"Chaque fois que vous appliquez la règle du Boy Scout, assurez-vous que vos changements sont bien couverts par des tests. Les tests automatisés sont essentiels pour s'assurer que vos petites améliorations n'introduisent pas de régressions.",{"type":29,"tag":5055,"props":6096,"children":6098},{"id":6097},"_4-éviter-la-surcharge-de-commentaires",[6099,6101],{"type":35,"value":6100},"4. ",{"type":29,"tag":55,"props":6102,"children":6103},{},[6104],{"type":35,"value":6105},"Éviter la surcharge de commentaires",{"type":29,"tag":37,"props":6107,"children":6108},{},[6109],{"type":35,"value":6110},"Il peut être tentant d’ajouter beaucoup de commentaires pour expliquer chaque petite amélioration, mais cela peut rendre le code verbeux et difficile à lire. Utilisez des noms de variables et des méthodes claires qui se suffisent à elles-mêmes, réduisant ainsi le besoin de commentaires excessifs.",{"type":29,"tag":66,"props":6112,"children":6113},{},[],{"type":29,"tag":70,"props":6115,"children":6117},{"id":6116},"faq",[6118],{"type":35,"value":6119},"FAQ",{"type":29,"tag":371,"props":6121,"children":6122},{},[6123,6128],{"type":29,"tag":375,"props":6124,"children":6125},{},[6126],{"type":35,"value":6127},"1. Est-ce que la règle du Boy Scout ralentit la progression du projet ?",{"type":29,"tag":37,"props":6129,"children":6130},{},[6131],{"type":35,"value":6132},"Non, si elle est appliquée correctement. La clé est de faire de petites améliorations incrémentales à chaque fois que vous touchez du code. En évitant de tout refactorer d’un coup, vous améliorez progressivement la qualité du code sans impacter le flux de travail. De plus, à long terme, vous économiserez du temps en réduisant la dette technique et en rendant le code plus facile à comprendre et à maintenir.",{"type":29,"tag":371,"props":6134,"children":6135},{},[6136,6141],{"type":29,"tag":375,"props":6137,"children":6138},{},[6139],{"type":35,"value":6140},"2. Quelle est la différence entre la règle du Boy Scout et un gros refactoring ?",{"type":29,"tag":37,"props":6142,"children":6143},{},[6144],{"type":35,"value":6145},"Le gros refactoring est un processus plus intense qui implique souvent une réorganisation structurelle majeure du code. En revanche, la règle du Boy Scout se concentre sur de petites améliorations continues, comme le renommage de variables ou la suppression de code mort. L'objectif est de toujours laisser le code un peu plus propre que vous ne l'avez trouvé, sans entrer dans une refonte complète.",{"type":29,"tag":371,"props":6147,"children":6148},{},[6149,6154],{"type":29,"tag":375,"props":6150,"children":6151},{},[6152],{"type":35,"value":6153},"3. Quand est-il préférable de ne pas appliquer la règle du Boy Scout ?",{"type":29,"tag":37,"props":6155,"children":6156},{},[6157],{"type":35,"value":6158},"Il y a des moments où il est préférable de se concentrer uniquement sur la tâche à accomplir, comme lorsqu'il y a des délais serrés pour livrer une fonctionnalité critique ou un correctif urgent. Dans ces cas, appliquez la règle du Boy Scout seulement si cela n'entraîne pas de retards significatifs. Vous pouvez également programmer une session de nettoyage après la livraison de la fonctionnalité.",{"type":29,"tag":371,"props":6160,"children":6161},{},[6162,6167],{"type":29,"tag":375,"props":6163,"children":6164},{},[6165],{"type":35,"value":6166},"4. Quels outils peuvent aider à appliquer la règle du Boy Scout ?",{"type":29,"tag":37,"props":6168,"children":6169},{},[6170],{"type":35,"value":6171},"Des outils comme SonarQube, Checkstyle ou PMD peuvent analyser le code et identifier les zones à améliorer. Ils sont particulièrement utiles pour détecter les violations des principes de Clean Code, les \"odeurs de code\", et la duplication. Ces outils permettent de repérer rapidement les problèmes à corriger lorsque vous appliquez la règle du Boy Scout.",{"type":29,"tag":371,"props":6173,"children":6174},{},[6175,6180],{"type":29,"tag":375,"props":6176,"children":6177},{},[6178],{"type":35,"value":6179},"5. Combien de temps dois-je passer sur le nettoyage du code à chaque itération ?",{"type":29,"tag":37,"props":6181,"children":6182},{},[6183],{"type":35,"value":6184},"Idéalement, vous ne devriez pas passer plus de quelques minutes à chaque fois que vous touchez du code. L'idée est d'appliquer la règle de manière rapide et légère, tout en continuant à travailler sur votre tâche principale. Si vous identifiez une zone qui nécessite un refactoring plus conséquent, vous pouvez la noter et y revenir plus tard avec une approche plus ciblée.",{"type":29,"tag":166,"props":6186,"children":6188},{"cta":442,"href":443,"title":6187,"type":445},"Ressource gratuite : Votre équipe livre-t-elle aussi vite qu'elle le pourrait ?",[6189],{"type":29,"tag":37,"props":6190,"children":6191},{},[6192],{"type":35,"value":6193},"30 questions, 5 dimensions, score sur 100. Mesurez la maturité engineering de votre équipe avec le benchmark utilisé dans des DSI de 50 à 800+ développeurs — et identifiez vos 3 chantiers prioritaires.",{"type":29,"tag":6195,"props":6196,"children":6197},"style",{},[6198],{"type":35,"value":6199},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":8,"searchDepth":453,"depth":453,"links":6201},[6202,6206,6211,6215],{"id":4991,"depth":453,"text":4994,"children":6203},[6204,6205],{"id":4997,"depth":459,"text":5000},{"id":5020,"depth":459,"text":5023},{"id":5039,"depth":453,"text":5042,"children":6207},[6208,6209,6210],{"id":5045,"depth":459,"text":5048},{"id":5412,"depth":459,"text":5415},{"id":5900,"depth":459,"text":5903},{"id":5954,"depth":453,"text":5957,"children":6212},[6213,6214],{"id":5960,"depth":459,"text":5963},{"id":6041,"depth":459,"text":6044},{"id":6116,"depth":453,"text":6119},"content:fr:dette-technique:boy-scout-rule-developpement-code-clean-java.md","fr/dette-technique/boy-scout-rule-developpement-code-clean-java.md","fr/dette-technique/boy-scout-rule-developpement-code-clean-java",{"_path":6220,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":6221,"description":6222,"id":6223,"date":6224,"listed":13,"nocomments":7,"hidden":7,"categories":6225,"tags":6226,"--cover":6227,"readingTime":6228,"body":6233,"_type":466,"_id":9992,"_source":468,"_file":9993,"_stem":9994,"_extension":471},"/fr/dette-technique/principe-kiss-bonnes-pratiques-java","Appliquer le principe KISS en développement logiciel, Bonnes pratiques et exemples Java","Découvrez comment appliquer le principe KISS (Keep It Simple, Stupid) pour écrire du code simple et de qualité. Apprenez des bonnes pratiques de Software Craftsmanship...",40,"2024-08-06",[6],[4961,4962],"covers/articles/principe-kiss.jpg",{"text":6229,"minutes":6230,"time":6231,"words":6232},"12 min read",11.355,681300,2271,{"type":26,"children":6234,"toc":9971},[6235,6241,6246,6264,6289,6292,6298,6303,6314,6320,6325,6330,6336,6347,6352,6355,6364,6370,6387,6398,6404,6409,6417,6875,6887,6893,6898,6904,6921,6929,7090,7096,7114,7120,7131,7134,7140,7151,7157,7162,7522,7533,7845,7850,7856,7861,8103,8108,8236,8241,8247,8252,8635,8646,8830,8835,8841,8846,9249,9260,9821,9826,9829,9835,9854,9873,9886,9905,9918,9937,9940,9957,9967],{"type":29,"tag":70,"props":6236,"children":6238},{"id":6237},"appliquer-le-principe-kiss-en-développement-logiciel-bonnes-pratiques-et-exemples-java",[6239],{"type":35,"value":6240},"Appliquer le principe KISS en développement logiciel : Bonnes pratiques et exemples Java",{"type":29,"tag":37,"props":6242,"children":6243},{},[6244],{"type":35,"value":6245},"Si vous avez déjà travaillé sur un projet de développement qui, au départ, semblait simple mais qui est rapidement devenu un cauchemar à maintenir, vous n’êtes pas seul. De nombreux développeurs se retrouvent dans cette situation : la complexité du code s'accumule et tout devient un labyrinthe. Les erreurs sont plus difficiles à identifier, les bugs se multiplient, et chaque nouvelle fonctionnalité à ajouter devient un vrai casse-tête.",{"type":29,"tag":37,"props":6247,"children":6248},{},[6249,6251,6256,6258,6262],{"type":35,"value":6250},"C’est là que le principe ",{"type":29,"tag":55,"props":6252,"children":6253},{},[6254],{"type":35,"value":6255},"KISS",{"type":35,"value":6257}," intervient. ",{"type":29,"tag":55,"props":6259,"children":6260},{},[6261],{"type":35,"value":6255},{"type":35,"value":6263},", qui signifie \"Keep It Simple, Stupid\" (ou \"Gardez-le simple, imbécile\" en français), est un principe clé dans le développement logiciel qui nous rappelle que la simplicité est souvent la meilleure approche. Mais ne vous y trompez pas : il ne s’agit pas de simplifier à outrance et de sacrifier la performance ou la qualité. Il s’agit plutôt de garder un code clair, facile à comprendre, à maintenir et à faire évoluer.",{"type":29,"tag":37,"props":6265,"children":6266},{},[6267,6269,6273,6275,6280,6282,6287],{"type":35,"value":6268},"En tant que développeur, j’ai fait l’erreur, plus d’une fois, de rendre mes projets plus compliqués qu’ils ne devaient l’être. Je vais vous montrer comment j’ai appris à appliquer ",{"type":29,"tag":55,"props":6270,"children":6271},{},[6272],{"type":35,"value":6255},{"type":35,"value":6274}," pour écrire du code de meilleure qualité, en m’appuyant sur les principes de Robert C. Martin formalisés dans ",{"type":29,"tag":6276,"props":6277,"children":6278},"em",{},[6279],{"type":35,"value":5426},{"type":35,"value":6281},". Vous trouverez aussi quelques bonnes pratiques de ",{"type":29,"tag":55,"props":6283,"children":6284},{},[6285],{"type":35,"value":6286},"software craftsmanship",{"type":35,"value":6288},", et des exemples concrets en Java pour vous aider à simplifier votre code sans compromettre son efficacité. Dans mes missions chez des grandes DSI, ce point est systématiquement sous-estimé : la complexité inutile se traduit concrètement par des onboardings rallongés, des bugs en cascade et des coûts de maintenance qui explosent.",{"type":29,"tag":66,"props":6290,"children":6291},{},[],{"type":29,"tag":70,"props":6293,"children":6295},{"id":6294},"pourquoi-la-simplicité-ne-signifie-pas-médiocrité",[6296],{"type":35,"value":6297},"Pourquoi la simplicité ne signifie pas médiocrité",{"type":29,"tag":37,"props":6299,"children":6300},{},[6301],{"type":35,"value":6302},"Beaucoup de développeurs associent parfois la simplicité à de la médiocrité ou à un manque de sophistication. Pourtant, écrire du code simple ne signifie en aucun cas qu'il est moins performant ou moins réfléchi. En fait, il est souvent plus difficile d'écrire un code simple que d'ajouter une couche de complexité inutile. Pourquoi ? Parce que la simplicité demande une réflexion plus approfondie et une meilleure compréhension du problème que vous essayez de résoudre.",{"type":29,"tag":37,"props":6304,"children":6305},{},[6306,6308,6312],{"type":35,"value":6307},"L'idée derrière ",{"type":29,"tag":55,"props":6309,"children":6310},{},[6311],{"type":35,"value":6255},{"type":35,"value":6313}," est de toujours se demander : \"Comment puis-je résoudre ce problème de la manière la plus directe possible ?\" Bien sûr, il y a des moments où une certaine complexité est justifiée. Par exemple, lorsque vous travaillez avec des algorithmes de performance ou des systèmes distribués, la simplicité peut ne pas être immédiate. Mais même dans ces cas-là, chercher à éliminer les éléments superflus dans votre code peut vous éviter bien des ennuis par la suite.",{"type":29,"tag":106,"props":6315,"children":6317},{"id":6316},"léquilibre-entre-simplicité-et-performance",[6318],{"type":35,"value":6319},"L'équilibre entre simplicité et performance",{"type":29,"tag":37,"props":6321,"children":6322},{},[6323],{"type":35,"value":6324},"Vous vous demandez peut-être : \"D'accord, mais la simplicité ne risque-t-elle pas de rendre mon code moins performant ?\" Pas forcément. En réalité, un code simple est souvent plus performant à long terme, car il sera plus facile à maintenir, à optimiser et à déboguer.",{"type":29,"tag":37,"props":6326,"children":6327},{},[6328],{"type":35,"value":6329},"Prenons un exemple concret en Java : imaginez que vous avez écrit un système avec plusieurs classes qui interagissent entre elles. Cela peut sembler être une bonne approche en raison de la séparation des responsabilités, mais si ces classes ne sont pas vraiment nécessaires, vous compliquez inutilement votre code. En appliquant KISS, vous pourriez fusionner certaines de ces classes ou réduire le nombre d’interactions, ce qui simplifierait le code tout en le rendant plus facile à optimiser et à tester.",{"type":29,"tag":106,"props":6331,"children":6333},{"id":6332},"cas-où-la-complexité-est-justifiée",[6334],{"type":35,"value":6335},"Cas où la complexité est justifiée",{"type":29,"tag":37,"props":6337,"children":6338},{},[6339,6341,6345],{"type":35,"value":6340},"Il y aura des moments où la complexité sera inévitable. Par exemple, si vous devez implémenter un algorithme avancé ou gérer des systèmes interconnectés, une certaine complexité sera nécessaire. Cependant, même dans ces cas, vous pouvez appliquer ",{"type":29,"tag":55,"props":6342,"children":6343},{},[6344],{"type":35,"value":6255},{"type":35,"value":6346}," pour vous assurer que chaque morceau de code complexe est justifié et ne contient pas de logique superflue.",{"type":29,"tag":37,"props":6348,"children":6349},{},[6350],{"type":35,"value":6351},"Une astuce consiste à diviser la complexité en plusieurs petites parties simples et compréhensibles. Ainsi, chaque partie reste gérable, même si l’ensemble du projet reste complexe dans son ensemble.",{"type":29,"tag":66,"props":6353,"children":6354},{},[],{"type":29,"tag":166,"props":6356,"children":6358},{"cta":168,"href":169,"title":6357,"type":171},"Votre équipe sur-ingénière et ralentit tout le monde ?",[6359],{"type":29,"tag":37,"props":6360,"children":6361},{},[6362],{"type":35,"value":6363},"L’architecture est si complexe que les nouvelles recrues mettent des semaines à être opérationnelles, et chaque décision technique crée plus de frictions que de valeur. Réservons 30 minutes pour identifier les sources de complexité inutile et retrouver la fluidité de livraison.",{"type":29,"tag":70,"props":6365,"children":6367},{"id":6366},"les-bonnes-pratiques-du-software-craftsmanship",[6368],{"type":35,"value":6369},"Les bonnes pratiques du Software Craftsmanship",{"type":29,"tag":37,"props":6371,"children":6372},{},[6373,6374,6379,6381,6385],{"type":35,"value":5420},{"type":29,"tag":55,"props":6375,"children":6376},{},[6377],{"type":35,"value":6378},"Software Craftsmanship",{"type":35,"value":6380}," est une approche qui valorise la qualité et l'excellence dans l'écriture de logiciels. Il ne s'agit pas simplement de faire fonctionner un programme, mais de créer du code robuste, maintenable et évolutif. Le principe ",{"type":29,"tag":55,"props":6382,"children":6383},{},[6384],{"type":35,"value":6255},{"type":35,"value":6386}," s'intègre parfaitement dans cette démarche, car un code simple est souvent synonyme de qualité et de longévité.",{"type":29,"tag":37,"props":6388,"children":6389},{},[6390,6392,6396],{"type":35,"value":6391},"Voici quelques bonnes pratiques du ",{"type":29,"tag":55,"props":6393,"children":6394},{},[6395],{"type":35,"value":6378},{"type":35,"value":6397}," qui vous aideront à écrire du code de meilleure qualité, tout en respectant le principe KISS.",{"type":29,"tag":106,"props":6399,"children":6401},{"id":6400},"_1-respecter-la-lisibilité",[6402],{"type":35,"value":6403},"1. Respecter la lisibilité",{"type":29,"tag":37,"props":6405,"children":6406},{},[6407],{"type":35,"value":6408},"Un code lisible est un code que d'autres développeurs (et vous-même) peuvent facilement comprendre. La lisibilité ne se limite pas à bien nommer vos variables et méthodes, elle concerne également la structure du code, la manière dont vous organisez vos blocs logiques et la simplicité de votre logique.",{"type":29,"tag":37,"props":6410,"children":6411},{},[6412],{"type":29,"tag":55,"props":6413,"children":6414},{},[6415],{"type":35,"value":6416},"Exemple en Java :",{"type":29,"tag":5091,"props":6418,"children":6420},{"className":5093,"code":6419,"language":5095,"meta":8,"style":8},"// Code moins lisible\npublic void processData(String data) {\n    for (int i = 0; i \u003C data.length(); i++) {\n        if (data.charAt(i) == 'A') {\n            // ...\n        }\n    }\n}\n\n// Code plus lisible en appliquant KISS\npublic void processData(String data) {\n    for (char character : data.toCharArray()) {\n        if (isCharacterValid(character)) {\n            // ...\n        }\n    }\n}\n\nprivate boolean isCharacterValid(char character) {\n    return character == 'A';\n}\n",[6421],{"type":29,"tag":1716,"props":6422,"children":6423},{"__ignoreMap":8},[6424,6432,6472,6552,6609,6617,6625,6632,6639,6646,6654,6689,6736,6770,6777,6784,6791,6798,6805,6843,6868],{"type":29,"tag":2730,"props":6425,"children":6426},{"class":5102,"line":4267},[6427],{"type":29,"tag":2730,"props":6428,"children":6429},{"style":5106},[6430],{"type":35,"value":6431},"// Code moins lisible\n",{"type":29,"tag":2730,"props":6433,"children":6434},{"class":5102,"line":453},[6435,6439,6443,6448,6453,6459,6464,6468],{"type":29,"tag":2730,"props":6436,"children":6437},{"style":5115},[6438],{"type":35,"value":5218},{"type":29,"tag":2730,"props":6440,"children":6441},{"style":5115},[6442],{"type":35,"value":5223},{"type":29,"tag":2730,"props":6444,"children":6445},{"style":5226},[6446],{"type":35,"value":6447}," processData",{"type":29,"tag":2730,"props":6449,"children":6450},{"style":5139},[6451],{"type":35,"value":6452},"(",{"type":29,"tag":2730,"props":6454,"children":6456},{"style":6455},"--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8",[6457],{"type":35,"value":6458},"String",{"type":29,"tag":2730,"props":6460,"children":6461},{"style":5121},[6462],{"type":35,"value":6463}," data",{"type":29,"tag":2730,"props":6465,"children":6466},{"style":5139},[6467],{"type":35,"value":3849},{"type":29,"tag":2730,"props":6469,"children":6470},{"style":5139},[6471],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6473,"children":6474},{"class":5102,"line":459},[6475,6480,6484,6488,6493,6497,6502,6507,6511,6516,6520,6524,6529,6534,6539,6544,6548],{"type":29,"tag":2730,"props":6476,"children":6477},{"style":5115},[6478],{"type":35,"value":6479},"    for",{"type":29,"tag":2730,"props":6481,"children":6482},{"style":5139},[6483],{"type":35,"value":5293},{"type":29,"tag":2730,"props":6485,"children":6486},{"style":5115},[6487],{"type":35,"value":5118},{"type":29,"tag":2730,"props":6489,"children":6490},{"style":5121},[6491],{"type":35,"value":6492}," i ",{"type":29,"tag":2730,"props":6494,"children":6495},{"style":5127},[6496],{"type":35,"value":5130},{"type":29,"tag":2730,"props":6498,"children":6499},{"style":5133},[6500],{"type":35,"value":6501}," 0",{"type":29,"tag":2730,"props":6503,"children":6504},{"style":5139},[6505],{"type":35,"value":6506},";",{"type":29,"tag":2730,"props":6508,"children":6509},{"style":5121},[6510],{"type":35,"value":6492},{"type":29,"tag":2730,"props":6512,"children":6513},{"style":5127},[6514],{"type":35,"value":6515},"\u003C",{"type":29,"tag":2730,"props":6517,"children":6518},{"style":5121},[6519],{"type":35,"value":6463},{"type":29,"tag":2730,"props":6521,"children":6522},{"style":5139},[6523],{"type":35,"value":332},{"type":29,"tag":2730,"props":6525,"children":6526},{"style":5226},[6527],{"type":35,"value":6528},"length",{"type":29,"tag":2730,"props":6530,"children":6531},{"style":5139},[6532],{"type":35,"value":6533},"();",{"type":29,"tag":2730,"props":6535,"children":6536},{"style":5121},[6537],{"type":35,"value":6538}," i",{"type":29,"tag":2730,"props":6540,"children":6541},{"style":5127},[6542],{"type":35,"value":6543},"++",{"type":29,"tag":2730,"props":6545,"children":6546},{"style":5139},[6547],{"type":35,"value":3849},{"type":29,"tag":2730,"props":6549,"children":6550},{"style":5139},[6551],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6553,"children":6554},{"class":5102,"line":5153},[6555,6560,6564,6569,6573,6578,6582,6587,6591,6595,6601,6605],{"type":29,"tag":2730,"props":6556,"children":6557},{"style":5115},[6558],{"type":35,"value":6559},"        if",{"type":29,"tag":2730,"props":6561,"children":6562},{"style":5139},[6563],{"type":35,"value":5293},{"type":29,"tag":2730,"props":6565,"children":6566},{"style":5121},[6567],{"type":35,"value":6568},"data",{"type":29,"tag":2730,"props":6570,"children":6571},{"style":5139},[6572],{"type":35,"value":332},{"type":29,"tag":2730,"props":6574,"children":6575},{"style":5226},[6576],{"type":35,"value":6577},"charAt",{"type":29,"tag":2730,"props":6579,"children":6580},{"style":5139},[6581],{"type":35,"value":6452},{"type":29,"tag":2730,"props":6583,"children":6584},{"style":5121},[6585],{"type":35,"value":6586},"i",{"type":29,"tag":2730,"props":6588,"children":6589},{"style":5139},[6590],{"type":35,"value":3849},{"type":29,"tag":2730,"props":6592,"children":6593},{"style":5127},[6594],{"type":35,"value":5307},{"type":29,"tag":2730,"props":6596,"children":6598},{"style":6597},"--shiki-default:#A6D189;--shiki-dark:#9ECBFF",[6599],{"type":35,"value":6600}," 'A'",{"type":29,"tag":2730,"props":6602,"children":6603},{"style":5139},[6604],{"type":35,"value":3849},{"type":29,"tag":2730,"props":6606,"children":6607},{"style":5139},[6608],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6610,"children":6611},{"class":5102,"line":5162},[6612],{"type":29,"tag":2730,"props":6613,"children":6614},{"style":5106},[6615],{"type":35,"value":6616},"            // ...\n",{"type":29,"tag":2730,"props":6618,"children":6619},{"class":5102,"line":3553},[6620],{"type":29,"tag":2730,"props":6621,"children":6622},{"style":5139},[6623],{"type":35,"value":6624},"        }\n",{"type":29,"tag":2730,"props":6626,"children":6627},{"class":5102,"line":5539},[6628],{"type":29,"tag":2730,"props":6629,"children":6630},{"style":5139},[6631],{"type":35,"value":5536},{"type":29,"tag":2730,"props":6633,"children":6634},{"class":5102,"line":5547},[6635],{"type":29,"tag":2730,"props":6636,"children":6637},{"style":5139},[6638],{"type":35,"value":5255},{"type":29,"tag":2730,"props":6640,"children":6641},{"class":5102,"line":5555},[6642],{"type":29,"tag":2730,"props":6643,"children":6644},{"emptyLinePlaceholder":13},[6645],{"type":35,"value":5150},{"type":29,"tag":2730,"props":6647,"children":6648},{"class":5102,"line":5564},[6649],{"type":29,"tag":2730,"props":6650,"children":6651},{"style":5106},[6652],{"type":35,"value":6653},"// Code plus lisible en appliquant KISS\n",{"type":29,"tag":2730,"props":6655,"children":6656},{"class":5102,"line":2949},[6657,6661,6665,6669,6673,6677,6681,6685],{"type":29,"tag":2730,"props":6658,"children":6659},{"style":5115},[6660],{"type":35,"value":5218},{"type":29,"tag":2730,"props":6662,"children":6663},{"style":5115},[6664],{"type":35,"value":5223},{"type":29,"tag":2730,"props":6666,"children":6667},{"style":5226},[6668],{"type":35,"value":6447},{"type":29,"tag":2730,"props":6670,"children":6671},{"style":5139},[6672],{"type":35,"value":6452},{"type":29,"tag":2730,"props":6674,"children":6675},{"style":6455},[6676],{"type":35,"value":6458},{"type":29,"tag":2730,"props":6678,"children":6679},{"style":5121},[6680],{"type":35,"value":6463},{"type":29,"tag":2730,"props":6682,"children":6683},{"style":5139},[6684],{"type":35,"value":3849},{"type":29,"tag":2730,"props":6686,"children":6687},{"style":5139},[6688],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6690,"children":6691},{"class":5102,"line":5612},[6692,6696,6700,6705,6710,6715,6719,6723,6728,6732],{"type":29,"tag":2730,"props":6693,"children":6694},{"style":5115},[6695],{"type":35,"value":6479},{"type":29,"tag":2730,"props":6697,"children":6698},{"style":5139},[6699],{"type":35,"value":5293},{"type":29,"tag":2730,"props":6701,"children":6702},{"style":5115},[6703],{"type":35,"value":6704},"char",{"type":29,"tag":2730,"props":6706,"children":6707},{"style":5121},[6708],{"type":35,"value":6709}," character ",{"type":29,"tag":2730,"props":6711,"children":6712},{"style":5115},[6713],{"type":35,"value":6714},":",{"type":29,"tag":2730,"props":6716,"children":6717},{"style":5121},[6718],{"type":35,"value":6463},{"type":29,"tag":2730,"props":6720,"children":6721},{"style":5139},[6722],{"type":35,"value":332},{"type":29,"tag":2730,"props":6724,"children":6725},{"style":5226},[6726],{"type":35,"value":6727},"toCharArray",{"type":29,"tag":2730,"props":6729,"children":6730},{"style":5139},[6731],{"type":35,"value":5387},{"type":29,"tag":2730,"props":6733,"children":6734},{"style":5139},[6735],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6737,"children":6738},{"class":5102,"line":5620},[6739,6743,6747,6752,6756,6761,6766],{"type":29,"tag":2730,"props":6740,"children":6741},{"style":5115},[6742],{"type":35,"value":6559},{"type":29,"tag":2730,"props":6744,"children":6745},{"style":5139},[6746],{"type":35,"value":5293},{"type":29,"tag":2730,"props":6748,"children":6749},{"style":5226},[6750],{"type":35,"value":6751},"isCharacterValid",{"type":29,"tag":2730,"props":6753,"children":6754},{"style":5139},[6755],{"type":35,"value":6452},{"type":29,"tag":2730,"props":6757,"children":6758},{"style":5121},[6759],{"type":35,"value":6760},"character",{"type":29,"tag":2730,"props":6762,"children":6763},{"style":5139},[6764],{"type":35,"value":6765},"))",{"type":29,"tag":2730,"props":6767,"children":6768},{"style":5139},[6769],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6771,"children":6772},{"class":5102,"line":5628},[6773],{"type":29,"tag":2730,"props":6774,"children":6775},{"style":5106},[6776],{"type":35,"value":6616},{"type":29,"tag":2730,"props":6778,"children":6779},{"class":5102,"line":5636},[6780],{"type":29,"tag":2730,"props":6781,"children":6782},{"style":5139},[6783],{"type":35,"value":6624},{"type":29,"tag":2730,"props":6785,"children":6786},{"class":5102,"line":2142},[6787],{"type":29,"tag":2730,"props":6788,"children":6789},{"style":5139},[6790],{"type":35,"value":5536},{"type":29,"tag":2730,"props":6792,"children":6793},{"class":5102,"line":5670},[6794],{"type":29,"tag":2730,"props":6795,"children":6796},{"style":5139},[6797],{"type":35,"value":5255},{"type":29,"tag":2730,"props":6799,"children":6800},{"class":5102,"line":5696},[6801],{"type":29,"tag":2730,"props":6802,"children":6803},{"emptyLinePlaceholder":13},[6804],{"type":35,"value":5150},{"type":29,"tag":2730,"props":6806,"children":6808},{"class":5102,"line":6807},19,[6809,6813,6817,6822,6826,6830,6835,6839],{"type":29,"tag":2730,"props":6810,"children":6811},{"style":5115},[6812],{"type":35,"value":5649},{"type":29,"tag":2730,"props":6814,"children":6815},{"style":5115},[6816],{"type":35,"value":5654},{"type":29,"tag":2730,"props":6818,"children":6819},{"style":5226},[6820],{"type":35,"value":6821}," isCharacterValid",{"type":29,"tag":2730,"props":6823,"children":6824},{"style":5139},[6825],{"type":35,"value":6452},{"type":29,"tag":2730,"props":6827,"children":6828},{"style":5115},[6829],{"type":35,"value":6704},{"type":29,"tag":2730,"props":6831,"children":6832},{"style":5121},[6833],{"type":35,"value":6834}," character",{"type":29,"tag":2730,"props":6836,"children":6837},{"style":5139},[6838],{"type":35,"value":3849},{"type":29,"tag":2730,"props":6840,"children":6841},{"style":5139},[6842],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6844,"children":6846},{"class":5102,"line":6845},20,[6847,6851,6855,6860,6864],{"type":29,"tag":2730,"props":6848,"children":6849},{"style":5115},[6850],{"type":35,"value":5676},{"type":29,"tag":2730,"props":6852,"children":6853},{"style":5121},[6854],{"type":35,"value":6709},{"type":29,"tag":2730,"props":6856,"children":6857},{"style":5127},[6858],{"type":35,"value":6859},"==",{"type":29,"tag":2730,"props":6861,"children":6862},{"style":6597},[6863],{"type":35,"value":6600},{"type":29,"tag":2730,"props":6865,"children":6866},{"style":5139},[6867],{"type":35,"value":5142},{"type":29,"tag":2730,"props":6869,"children":6870},{"class":5102,"line":1649},[6871],{"type":29,"tag":2730,"props":6872,"children":6873},{"style":5139},[6874],{"type":35,"value":5255},{"type":29,"tag":37,"props":6876,"children":6877},{},[6878,6880,6885],{"type":35,"value":6879},"Dans cet exemple, le second morceau de code est plus lisible et respectueux du principe KISS. La logique est déléguée à une méthode claire et descriptive (",{"type":29,"tag":1716,"props":6881,"children":6883},{"className":6882},[],[6884],{"type":35,"value":6751},{"type":35,"value":6886},"), rendant l'ensemble du processus plus facile à comprendre et à maintenir.",{"type":29,"tag":106,"props":6888,"children":6890},{"id":6889},"_2-minimiser-les-dépendances",[6891],{"type":35,"value":6892},"2. Minimiser les dépendances",{"type":29,"tag":37,"props":6894,"children":6895},{},[6896],{"type":35,"value":6897},"Plus votre code dépend de bibliothèques ou de modules externes, plus il devient complexe à maintenir. Il est souvent préférable de limiter ces dépendances, surtout lorsqu'elles ne sont pas absolument nécessaires. Cela permet également de réduire le risque de conflits de version ou d'incompatibilités dans le futur.",{"type":29,"tag":106,"props":6899,"children":6901},{"id":6900},"_3-écrire-des-tests-automatisés",[6902],{"type":35,"value":6903},"3. Écrire des tests automatisés",{"type":29,"tag":37,"props":6905,"children":6906},{},[6907,6908,6913,6915,6919],{"type":35,"value":6000},{"type":29,"tag":43,"props":6909,"children":6910},{"href":1646},[6911],{"type":35,"value":6912},"tests unitaires et d'intégration",{"type":35,"value":6914}," font partie intégrante du ",{"type":29,"tag":55,"props":6916,"children":6917},{},[6918],{"type":35,"value":6378},{"type":35,"value":6920},". Un bon test est aussi simple que le code qu'il teste. Le principe KISS s'applique également ici : écrivez des tests qui sont faciles à comprendre et à maintenir.",{"type":29,"tag":37,"props":6922,"children":6923},{},[6924],{"type":29,"tag":55,"props":6925,"children":6926},{},[6927],{"type":35,"value":6928},"Exemple de test simple en Java avec JUnit :",{"type":29,"tag":5091,"props":6930,"children":6932},{"className":5093,"code":6931,"language":5095,"meta":8,"style":8},"@Test\npublic void shouldReturnTrueWhenCharacterIsValid() {\n    assertTrue(isCharacterValid('A'));\n}\n\n@Test\npublic void shouldReturnFalseWhenCharacterIsInvalid() {\n    assertFalse(isCharacterValid('B'));\n}\n",[6933],{"type":29,"tag":1716,"props":6934,"children":6935},{"__ignoreMap":8},[6936,6951,6975,7005,7012,7019,7030,7054,7083],{"type":29,"tag":2730,"props":6937,"children":6938},{"class":5102,"line":4267},[6939,6945],{"type":29,"tag":2730,"props":6940,"children":6942},{"style":6941},"--shiki-default:#EF9F76;--shiki-dark:#E1E4E8",[6943],{"type":35,"value":6944},"@",{"type":29,"tag":2730,"props":6946,"children":6948},{"style":6947},"--shiki-default:#EF9F76;--shiki-dark:#F97583",[6949],{"type":35,"value":6950},"Test\n",{"type":29,"tag":2730,"props":6952,"children":6953},{"class":5102,"line":453},[6954,6958,6962,6967,6971],{"type":29,"tag":2730,"props":6955,"children":6956},{"style":5115},[6957],{"type":35,"value":5218},{"type":29,"tag":2730,"props":6959,"children":6960},{"style":5115},[6961],{"type":35,"value":5223},{"type":29,"tag":2730,"props":6963,"children":6964},{"style":5226},[6965],{"type":35,"value":6966}," shouldReturnTrueWhenCharacterIsValid",{"type":29,"tag":2730,"props":6968,"children":6969},{"style":5139},[6970],{"type":35,"value":5234},{"type":29,"tag":2730,"props":6972,"children":6973},{"style":5139},[6974],{"type":35,"value":5239},{"type":29,"tag":2730,"props":6976,"children":6977},{"class":5102,"line":459},[6978,6983,6987,6991,6995,7000],{"type":29,"tag":2730,"props":6979,"children":6980},{"style":5226},[6981],{"type":35,"value":6982},"    assertTrue",{"type":29,"tag":2730,"props":6984,"children":6985},{"style":5139},[6986],{"type":35,"value":6452},{"type":29,"tag":2730,"props":6988,"children":6989},{"style":5226},[6990],{"type":35,"value":6751},{"type":29,"tag":2730,"props":6992,"children":6993},{"style":5139},[6994],{"type":35,"value":6452},{"type":29,"tag":2730,"props":6996,"children":6997},{"style":6597},[6998],{"type":35,"value":6999},"'A'",{"type":29,"tag":2730,"props":7001,"children":7002},{"style":5139},[7003],{"type":35,"value":7004},"));\n",{"type":29,"tag":2730,"props":7006,"children":7007},{"class":5102,"line":5153},[7008],{"type":29,"tag":2730,"props":7009,"children":7010},{"style":5139},[7011],{"type":35,"value":5255},{"type":29,"tag":2730,"props":7013,"children":7014},{"class":5102,"line":5162},[7015],{"type":29,"tag":2730,"props":7016,"children":7017},{"emptyLinePlaceholder":13},[7018],{"type":35,"value":5150},{"type":29,"tag":2730,"props":7020,"children":7021},{"class":5102,"line":3553},[7022,7026],{"type":29,"tag":2730,"props":7023,"children":7024},{"style":6941},[7025],{"type":35,"value":6944},{"type":29,"tag":2730,"props":7027,"children":7028},{"style":6947},[7029],{"type":35,"value":6950},{"type":29,"tag":2730,"props":7031,"children":7032},{"class":5102,"line":5539},[7033,7037,7041,7046,7050],{"type":29,"tag":2730,"props":7034,"children":7035},{"style":5115},[7036],{"type":35,"value":5218},{"type":29,"tag":2730,"props":7038,"children":7039},{"style":5115},[7040],{"type":35,"value":5223},{"type":29,"tag":2730,"props":7042,"children":7043},{"style":5226},[7044],{"type":35,"value":7045}," shouldReturnFalseWhenCharacterIsInvalid",{"type":29,"tag":2730,"props":7047,"children":7048},{"style":5139},[7049],{"type":35,"value":5234},{"type":29,"tag":2730,"props":7051,"children":7052},{"style":5139},[7053],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7055,"children":7056},{"class":5102,"line":5547},[7057,7062,7066,7070,7074,7079],{"type":29,"tag":2730,"props":7058,"children":7059},{"style":5226},[7060],{"type":35,"value":7061},"    assertFalse",{"type":29,"tag":2730,"props":7063,"children":7064},{"style":5139},[7065],{"type":35,"value":6452},{"type":29,"tag":2730,"props":7067,"children":7068},{"style":5226},[7069],{"type":35,"value":6751},{"type":29,"tag":2730,"props":7071,"children":7072},{"style":5139},[7073],{"type":35,"value":6452},{"type":29,"tag":2730,"props":7075,"children":7076},{"style":6597},[7077],{"type":35,"value":7078},"'B'",{"type":29,"tag":2730,"props":7080,"children":7081},{"style":5139},[7082],{"type":35,"value":7004},{"type":29,"tag":2730,"props":7084,"children":7085},{"class":5102,"line":5555},[7086],{"type":29,"tag":2730,"props":7087,"children":7088},{"style":5139},[7089],{"type":35,"value":5255},{"type":29,"tag":106,"props":7091,"children":7093},{"id":7092},"_4-refactoriser-régulièrement",[7094],{"type":35,"value":7095},"4. Refactoriser régulièrement",{"type":29,"tag":37,"props":7097,"children":7098},{},[7099,7101,7105,7107,7112],{"type":35,"value":7100},"L'un des piliers du ",{"type":29,"tag":55,"props":7102,"children":7103},{},[7104],{"type":35,"value":6378},{"type":35,"value":7106}," est la ",{"type":29,"tag":43,"props":7108,"children":7109},{"href":2139},[7110],{"type":35,"value":7111},"refactorisation régulière",{"type":35,"value":7113}," du code. Je vous recommande de prendre le temps de revoir et d'améliorer le code existant pour le simplifier et le rendre plus efficace. Cela inclut la suppression des redondances, l'élimination des classes inutiles et la simplification des méthodes.",{"type":29,"tag":106,"props":7115,"children":7117},{"id":7116},"_5-utiliser-des-patrons-de-conception-quand-ils-sont-nécessaires",[7118],{"type":35,"value":7119},"5. Utiliser des patrons de conception quand ils sont nécessaires",{"type":29,"tag":37,"props":7121,"children":7122},{},[7123,7124,7129],{"type":35,"value":6000},{"type":29,"tag":55,"props":7125,"children":7126},{},[7127],{"type":35,"value":7128},"patrons de conception",{"type":35,"value":7130}," (design patterns) peuvent être des outils puissants pour organiser le code. Cependant, je vous recommande de ne pas les utiliser de manière excessive ou là où ils ne sont pas nécessaires. En appliquant KISS, demandez-vous toujours si un patron de conception ajoute réellement de la valeur ou s'il complique inutilement le code.",{"type":29,"tag":66,"props":7132,"children":7133},{},[],{"type":29,"tag":70,"props":7135,"children":7137},{"id":7136},"exemples-pratiques-de-kiss-en-java",[7138],{"type":35,"value":7139},"Exemples pratiques de KISS en Java",{"type":29,"tag":37,"props":7141,"children":7142},{},[7143,7145,7149],{"type":35,"value":7144},"Appliquer ",{"type":29,"tag":55,"props":7146,"children":7147},{},[7148],{"type":35,"value":6255},{"type":35,"value":7150}," dans le développement logiciel ne signifie pas seulement écrire du code simple. Il s'agit d'éliminer la complexité inutile, de rendre le code plus lisible et plus maintenable tout en restant fonctionnel et performant. Voici quelques exemples pratiques en Java qui montrent comment simplifier le code tout en maintenant sa robustesse.",{"type":29,"tag":106,"props":7152,"children":7154},{"id":7153},"exemple-1-simplifier-une-logique-conditionnelle-complexe",[7155],{"type":35,"value":7156},"Exemple 1 : Simplifier une logique conditionnelle complexe",{"type":29,"tag":37,"props":7158,"children":7159},{},[7160],{"type":35,"value":7161},"Prenons une méthode qui valide plusieurs conditions dans un formulaire de saisie d'utilisateur. Voici une version complexe :",{"type":29,"tag":5091,"props":7163,"children":7165},{"className":5093,"code":7164,"language":5095,"meta":8,"style":8},"// Version complexe\npublic boolean isFormValid(UserForm form) {\n    if (form != null) {\n        if (form.getName() != null && !form.getName().isEmpty()) {\n            if (form.getAge() >= 18) {\n                if (form.getEmail() != null && form.getEmail().contains(\"@\")) {\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n",[7166],{"type":29,"tag":1716,"props":7167,"children":7168},{"__ignoreMap":8},[7169,7177,7215,7249,7327,7374,7453,7469,7477,7485,7492,7499,7515],{"type":29,"tag":2730,"props":7170,"children":7171},{"class":5102,"line":4267},[7172],{"type":29,"tag":2730,"props":7173,"children":7174},{"style":5106},[7175],{"type":35,"value":7176},"// Version complexe\n",{"type":29,"tag":2730,"props":7178,"children":7179},{"class":5102,"line":453},[7180,7184,7188,7193,7197,7202,7207,7211],{"type":29,"tag":2730,"props":7181,"children":7182},{"style":5115},[7183],{"type":35,"value":5218},{"type":29,"tag":2730,"props":7185,"children":7186},{"style":5115},[7187],{"type":35,"value":5654},{"type":29,"tag":2730,"props":7189,"children":7190},{"style":5226},[7191],{"type":35,"value":7192}," isFormValid",{"type":29,"tag":2730,"props":7194,"children":7195},{"style":5139},[7196],{"type":35,"value":6452},{"type":29,"tag":2730,"props":7198,"children":7199},{"style":6455},[7200],{"type":35,"value":7201},"UserForm",{"type":29,"tag":2730,"props":7203,"children":7204},{"style":5121},[7205],{"type":35,"value":7206}," form",{"type":29,"tag":2730,"props":7208,"children":7209},{"style":5139},[7210],{"type":35,"value":3849},{"type":29,"tag":2730,"props":7212,"children":7213},{"style":5139},[7214],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7216,"children":7217},{"class":5102,"line":459},[7218,7222,7226,7231,7236,7241,7245],{"type":29,"tag":2730,"props":7219,"children":7220},{"style":5115},[7221],{"type":35,"value":5493},{"type":29,"tag":2730,"props":7223,"children":7224},{"style":5139},[7225],{"type":35,"value":5293},{"type":29,"tag":2730,"props":7227,"children":7228},{"style":5121},[7229],{"type":35,"value":7230},"form ",{"type":29,"tag":2730,"props":7232,"children":7233},{"style":5127},[7234],{"type":35,"value":7235},"!=",{"type":29,"tag":2730,"props":7237,"children":7238},{"style":5310},[7239],{"type":35,"value":7240}," null",{"type":29,"tag":2730,"props":7242,"children":7243},{"style":5139},[7244],{"type":35,"value":3849},{"type":29,"tag":2730,"props":7246,"children":7247},{"style":5139},[7248],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7250,"children":7251},{"class":5102,"line":5153},[7252,7256,7260,7265,7269,7274,7278,7283,7287,7292,7297,7301,7305,7309,7314,7319,7323],{"type":29,"tag":2730,"props":7253,"children":7254},{"style":5115},[7255],{"type":35,"value":6559},{"type":29,"tag":2730,"props":7257,"children":7258},{"style":5139},[7259],{"type":35,"value":5293},{"type":29,"tag":2730,"props":7261,"children":7262},{"style":5121},[7263],{"type":35,"value":7264},"form",{"type":29,"tag":2730,"props":7266,"children":7267},{"style":5139},[7268],{"type":35,"value":332},{"type":29,"tag":2730,"props":7270,"children":7271},{"style":5226},[7272],{"type":35,"value":7273},"getName",{"type":29,"tag":2730,"props":7275,"children":7276},{"style":5139},[7277],{"type":35,"value":5234},{"type":29,"tag":2730,"props":7279,"children":7280},{"style":5127},[7281],{"type":35,"value":7282}," !=",{"type":29,"tag":2730,"props":7284,"children":7285},{"style":5310},[7286],{"type":35,"value":7240},{"type":29,"tag":2730,"props":7288,"children":7289},{"style":5127},[7290],{"type":35,"value":7291}," &&",{"type":29,"tag":2730,"props":7293,"children":7294},{"style":5127},[7295],{"type":35,"value":7296}," !",{"type":29,"tag":2730,"props":7298,"children":7299},{"style":5121},[7300],{"type":35,"value":7264},{"type":29,"tag":2730,"props":7302,"children":7303},{"style":5139},[7304],{"type":35,"value":332},{"type":29,"tag":2730,"props":7306,"children":7307},{"style":5226},[7308],{"type":35,"value":7273},{"type":29,"tag":2730,"props":7310,"children":7311},{"style":5139},[7312],{"type":35,"value":7313},"().",{"type":29,"tag":2730,"props":7315,"children":7316},{"style":5226},[7317],{"type":35,"value":7318},"isEmpty",{"type":29,"tag":2730,"props":7320,"children":7321},{"style":5139},[7322],{"type":35,"value":5387},{"type":29,"tag":2730,"props":7324,"children":7325},{"style":5139},[7326],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7328,"children":7329},{"class":5102,"line":5162},[7330,7335,7339,7343,7347,7352,7356,7361,7366,7370],{"type":29,"tag":2730,"props":7331,"children":7332},{"style":5115},[7333],{"type":35,"value":7334},"            if",{"type":29,"tag":2730,"props":7336,"children":7337},{"style":5139},[7338],{"type":35,"value":5293},{"type":29,"tag":2730,"props":7340,"children":7341},{"style":5121},[7342],{"type":35,"value":7264},{"type":29,"tag":2730,"props":7344,"children":7345},{"style":5139},[7346],{"type":35,"value":332},{"type":29,"tag":2730,"props":7348,"children":7349},{"style":5226},[7350],{"type":35,"value":7351},"getAge",{"type":29,"tag":2730,"props":7353,"children":7354},{"style":5139},[7355],{"type":35,"value":5234},{"type":29,"tag":2730,"props":7357,"children":7358},{"style":5127},[7359],{"type":35,"value":7360}," >=",{"type":29,"tag":2730,"props":7362,"children":7363},{"style":5133},[7364],{"type":35,"value":7365}," 18",{"type":29,"tag":2730,"props":7367,"children":7368},{"style":5139},[7369],{"type":35,"value":3849},{"type":29,"tag":2730,"props":7371,"children":7372},{"style":5139},[7373],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7375,"children":7376},{"class":5102,"line":3553},[7377,7382,7386,7390,7394,7399,7403,7407,7411,7415,7419,7423,7427,7431,7436,7440,7445,7449],{"type":29,"tag":2730,"props":7378,"children":7379},{"style":5115},[7380],{"type":35,"value":7381},"                if",{"type":29,"tag":2730,"props":7383,"children":7384},{"style":5139},[7385],{"type":35,"value":5293},{"type":29,"tag":2730,"props":7387,"children":7388},{"style":5121},[7389],{"type":35,"value":7264},{"type":29,"tag":2730,"props":7391,"children":7392},{"style":5139},[7393],{"type":35,"value":332},{"type":29,"tag":2730,"props":7395,"children":7396},{"style":5226},[7397],{"type":35,"value":7398},"getEmail",{"type":29,"tag":2730,"props":7400,"children":7401},{"style":5139},[7402],{"type":35,"value":5234},{"type":29,"tag":2730,"props":7404,"children":7405},{"style":5127},[7406],{"type":35,"value":7282},{"type":29,"tag":2730,"props":7408,"children":7409},{"style":5310},[7410],{"type":35,"value":7240},{"type":29,"tag":2730,"props":7412,"children":7413},{"style":5127},[7414],{"type":35,"value":7291},{"type":29,"tag":2730,"props":7416,"children":7417},{"style":5121},[7418],{"type":35,"value":7206},{"type":29,"tag":2730,"props":7420,"children":7421},{"style":5139},[7422],{"type":35,"value":332},{"type":29,"tag":2730,"props":7424,"children":7425},{"style":5226},[7426],{"type":35,"value":7398},{"type":29,"tag":2730,"props":7428,"children":7429},{"style":5139},[7430],{"type":35,"value":7313},{"type":29,"tag":2730,"props":7432,"children":7433},{"style":5226},[7434],{"type":35,"value":7435},"contains",{"type":29,"tag":2730,"props":7437,"children":7438},{"style":5139},[7439],{"type":35,"value":6452},{"type":29,"tag":2730,"props":7441,"children":7442},{"style":6597},[7443],{"type":35,"value":7444},"\"@\"",{"type":29,"tag":2730,"props":7446,"children":7447},{"style":5139},[7448],{"type":35,"value":6765},{"type":29,"tag":2730,"props":7450,"children":7451},{"style":5139},[7452],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7454,"children":7455},{"class":5102,"line":5539},[7456,7461,7465],{"type":29,"tag":2730,"props":7457,"children":7458},{"style":5115},[7459],{"type":35,"value":7460},"                    return",{"type":29,"tag":2730,"props":7462,"children":7463},{"style":5310},[7464],{"type":35,"value":5313},{"type":29,"tag":2730,"props":7466,"children":7467},{"style":5139},[7468],{"type":35,"value":5142},{"type":29,"tag":2730,"props":7470,"children":7471},{"class":5102,"line":5547},[7472],{"type":29,"tag":2730,"props":7473,"children":7474},{"style":5139},[7475],{"type":35,"value":7476},"                }\n",{"type":29,"tag":2730,"props":7478,"children":7479},{"class":5102,"line":5555},[7480],{"type":29,"tag":2730,"props":7481,"children":7482},{"style":5139},[7483],{"type":35,"value":7484},"            }\n",{"type":29,"tag":2730,"props":7486,"children":7487},{"class":5102,"line":5564},[7488],{"type":29,"tag":2730,"props":7489,"children":7490},{"style":5139},[7491],{"type":35,"value":6624},{"type":29,"tag":2730,"props":7493,"children":7494},{"class":5102,"line":2949},[7495],{"type":29,"tag":2730,"props":7496,"children":7497},{"style":5139},[7498],{"type":35,"value":5536},{"type":29,"tag":2730,"props":7500,"children":7501},{"class":5102,"line":5612},[7502,7506,7511],{"type":29,"tag":2730,"props":7503,"children":7504},{"style":5115},[7505],{"type":35,"value":5676},{"type":29,"tag":2730,"props":7507,"children":7508},{"style":5310},[7509],{"type":35,"value":7510}," false",{"type":29,"tag":2730,"props":7512,"children":7513},{"style":5139},[7514],{"type":35,"value":5142},{"type":29,"tag":2730,"props":7516,"children":7517},{"class":5102,"line":5620},[7518],{"type":29,"tag":2730,"props":7519,"children":7520},{"style":5139},[7521],{"type":35,"value":5255},{"type":29,"tag":37,"props":7523,"children":7524},{},[7525,7527,7531],{"type":35,"value":7526},"Cette méthode devient rapidement difficile à lire à cause des multiples niveaux d'imbrication. En appliquant ",{"type":29,"tag":55,"props":7528,"children":7529},{},[7530],{"type":35,"value":6255},{"type":35,"value":7532},", vous pouvez simplifier cela en éliminant les imbrications inutiles et en rendant le code plus lisible :",{"type":29,"tag":5091,"props":7534,"children":7536},{"className":5093,"code":7535,"language":5095,"meta":8,"style":8},"// Version simplifiée avec KISS\npublic boolean isFormValid(UserForm form) {\n    if (form == null || form.getName() == null || form.getName().isEmpty()) {\n        return false;\n    }\n\n    if (form.getAge() \u003C 18) {\n        return false;\n    }\n\n    return form.getEmail() != null && form.getEmail().contains(\"@\");\n}\n",[7537],{"type":29,"tag":1716,"props":7538,"children":7539},{"__ignoreMap":8},[7540,7548,7583,7667,7683,7690,7697,7741,7756,7763,7770,7838],{"type":29,"tag":2730,"props":7541,"children":7542},{"class":5102,"line":4267},[7543],{"type":29,"tag":2730,"props":7544,"children":7545},{"style":5106},[7546],{"type":35,"value":7547},"// Version simplifiée avec KISS\n",{"type":29,"tag":2730,"props":7549,"children":7550},{"class":5102,"line":453},[7551,7555,7559,7563,7567,7571,7575,7579],{"type":29,"tag":2730,"props":7552,"children":7553},{"style":5115},[7554],{"type":35,"value":5218},{"type":29,"tag":2730,"props":7556,"children":7557},{"style":5115},[7558],{"type":35,"value":5654},{"type":29,"tag":2730,"props":7560,"children":7561},{"style":5226},[7562],{"type":35,"value":7192},{"type":29,"tag":2730,"props":7564,"children":7565},{"style":5139},[7566],{"type":35,"value":6452},{"type":29,"tag":2730,"props":7568,"children":7569},{"style":6455},[7570],{"type":35,"value":7201},{"type":29,"tag":2730,"props":7572,"children":7573},{"style":5121},[7574],{"type":35,"value":7206},{"type":29,"tag":2730,"props":7576,"children":7577},{"style":5139},[7578],{"type":35,"value":3849},{"type":29,"tag":2730,"props":7580,"children":7581},{"style":5139},[7582],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7584,"children":7585},{"class":5102,"line":459},[7586,7590,7594,7598,7602,7606,7611,7615,7619,7623,7627,7631,7635,7639,7643,7647,7651,7655,7659,7663],{"type":29,"tag":2730,"props":7587,"children":7588},{"style":5115},[7589],{"type":35,"value":5493},{"type":29,"tag":2730,"props":7591,"children":7592},{"style":5139},[7593],{"type":35,"value":5293},{"type":29,"tag":2730,"props":7595,"children":7596},{"style":5121},[7597],{"type":35,"value":7230},{"type":29,"tag":2730,"props":7599,"children":7600},{"style":5127},[7601],{"type":35,"value":6859},{"type":29,"tag":2730,"props":7603,"children":7604},{"style":5310},[7605],{"type":35,"value":7240},{"type":29,"tag":2730,"props":7607,"children":7608},{"style":5127},[7609],{"type":35,"value":7610}," ||",{"type":29,"tag":2730,"props":7612,"children":7613},{"style":5121},[7614],{"type":35,"value":7206},{"type":29,"tag":2730,"props":7616,"children":7617},{"style":5139},[7618],{"type":35,"value":332},{"type":29,"tag":2730,"props":7620,"children":7621},{"style":5226},[7622],{"type":35,"value":7273},{"type":29,"tag":2730,"props":7624,"children":7625},{"style":5139},[7626],{"type":35,"value":5234},{"type":29,"tag":2730,"props":7628,"children":7629},{"style":5127},[7630],{"type":35,"value":5307},{"type":29,"tag":2730,"props":7632,"children":7633},{"style":5310},[7634],{"type":35,"value":7240},{"type":29,"tag":2730,"props":7636,"children":7637},{"style":5127},[7638],{"type":35,"value":7610},{"type":29,"tag":2730,"props":7640,"children":7641},{"style":5121},[7642],{"type":35,"value":7206},{"type":29,"tag":2730,"props":7644,"children":7645},{"style":5139},[7646],{"type":35,"value":332},{"type":29,"tag":2730,"props":7648,"children":7649},{"style":5226},[7650],{"type":35,"value":7273},{"type":29,"tag":2730,"props":7652,"children":7653},{"style":5139},[7654],{"type":35,"value":7313},{"type":29,"tag":2730,"props":7656,"children":7657},{"style":5226},[7658],{"type":35,"value":7318},{"type":29,"tag":2730,"props":7660,"children":7661},{"style":5139},[7662],{"type":35,"value":5387},{"type":29,"tag":2730,"props":7664,"children":7665},{"style":5139},[7666],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7668,"children":7669},{"class":5102,"line":5153},[7670,7675,7679],{"type":29,"tag":2730,"props":7671,"children":7672},{"style":5115},[7673],{"type":35,"value":7674},"        return",{"type":29,"tag":2730,"props":7676,"children":7677},{"style":5310},[7678],{"type":35,"value":7510},{"type":29,"tag":2730,"props":7680,"children":7681},{"style":5139},[7682],{"type":35,"value":5142},{"type":29,"tag":2730,"props":7684,"children":7685},{"class":5102,"line":5162},[7686],{"type":29,"tag":2730,"props":7687,"children":7688},{"style":5139},[7689],{"type":35,"value":5536},{"type":29,"tag":2730,"props":7691,"children":7692},{"class":5102,"line":3553},[7693],{"type":29,"tag":2730,"props":7694,"children":7695},{"emptyLinePlaceholder":13},[7696],{"type":35,"value":5150},{"type":29,"tag":2730,"props":7698,"children":7699},{"class":5102,"line":5539},[7700,7704,7708,7712,7716,7720,7724,7729,7733,7737],{"type":29,"tag":2730,"props":7701,"children":7702},{"style":5115},[7703],{"type":35,"value":5493},{"type":29,"tag":2730,"props":7705,"children":7706},{"style":5139},[7707],{"type":35,"value":5293},{"type":29,"tag":2730,"props":7709,"children":7710},{"style":5121},[7711],{"type":35,"value":7264},{"type":29,"tag":2730,"props":7713,"children":7714},{"style":5139},[7715],{"type":35,"value":332},{"type":29,"tag":2730,"props":7717,"children":7718},{"style":5226},[7719],{"type":35,"value":7351},{"type":29,"tag":2730,"props":7721,"children":7722},{"style":5139},[7723],{"type":35,"value":5234},{"type":29,"tag":2730,"props":7725,"children":7726},{"style":5127},[7727],{"type":35,"value":7728}," \u003C",{"type":29,"tag":2730,"props":7730,"children":7731},{"style":5133},[7732],{"type":35,"value":7365},{"type":29,"tag":2730,"props":7734,"children":7735},{"style":5139},[7736],{"type":35,"value":3849},{"type":29,"tag":2730,"props":7738,"children":7739},{"style":5139},[7740],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7742,"children":7743},{"class":5102,"line":5547},[7744,7748,7752],{"type":29,"tag":2730,"props":7745,"children":7746},{"style":5115},[7747],{"type":35,"value":7674},{"type":29,"tag":2730,"props":7749,"children":7750},{"style":5310},[7751],{"type":35,"value":7510},{"type":29,"tag":2730,"props":7753,"children":7754},{"style":5139},[7755],{"type":35,"value":5142},{"type":29,"tag":2730,"props":7757,"children":7758},{"class":5102,"line":5555},[7759],{"type":29,"tag":2730,"props":7760,"children":7761},{"style":5139},[7762],{"type":35,"value":5536},{"type":29,"tag":2730,"props":7764,"children":7765},{"class":5102,"line":5564},[7766],{"type":29,"tag":2730,"props":7767,"children":7768},{"emptyLinePlaceholder":13},[7769],{"type":35,"value":5150},{"type":29,"tag":2730,"props":7771,"children":7772},{"class":5102,"line":2949},[7773,7777,7781,7785,7789,7793,7797,7801,7805,7809,7813,7817,7821,7825,7829,7833],{"type":29,"tag":2730,"props":7774,"children":7775},{"style":5115},[7776],{"type":35,"value":5676},{"type":29,"tag":2730,"props":7778,"children":7779},{"style":5121},[7780],{"type":35,"value":7206},{"type":29,"tag":2730,"props":7782,"children":7783},{"style":5139},[7784],{"type":35,"value":332},{"type":29,"tag":2730,"props":7786,"children":7787},{"style":5226},[7788],{"type":35,"value":7398},{"type":29,"tag":2730,"props":7790,"children":7791},{"style":5139},[7792],{"type":35,"value":5234},{"type":29,"tag":2730,"props":7794,"children":7795},{"style":5127},[7796],{"type":35,"value":7282},{"type":29,"tag":2730,"props":7798,"children":7799},{"style":5310},[7800],{"type":35,"value":7240},{"type":29,"tag":2730,"props":7802,"children":7803},{"style":5127},[7804],{"type":35,"value":7291},{"type":29,"tag":2730,"props":7806,"children":7807},{"style":5121},[7808],{"type":35,"value":7206},{"type":29,"tag":2730,"props":7810,"children":7811},{"style":5139},[7812],{"type":35,"value":332},{"type":29,"tag":2730,"props":7814,"children":7815},{"style":5226},[7816],{"type":35,"value":7398},{"type":29,"tag":2730,"props":7818,"children":7819},{"style":5139},[7820],{"type":35,"value":7313},{"type":29,"tag":2730,"props":7822,"children":7823},{"style":5226},[7824],{"type":35,"value":7435},{"type":29,"tag":2730,"props":7826,"children":7827},{"style":5139},[7828],{"type":35,"value":6452},{"type":29,"tag":2730,"props":7830,"children":7831},{"style":6597},[7832],{"type":35,"value":7444},{"type":29,"tag":2730,"props":7834,"children":7835},{"style":5139},[7836],{"type":35,"value":7837},");\n",{"type":29,"tag":2730,"props":7839,"children":7840},{"class":5102,"line":5612},[7841],{"type":29,"tag":2730,"props":7842,"children":7843},{"style":5139},[7844],{"type":35,"value":5255},{"type":29,"tag":37,"props":7846,"children":7847},{},[7848],{"type":35,"value":7849},"Le code est maintenant plus linéaire et plus facile à comprendre. En évitant les imbrications excessives, il est plus clair ce qui est validé et dans quel ordre.",{"type":29,"tag":106,"props":7851,"children":7853},{"id":7852},"exemple-2-réduction-du-code-répétitif",[7854],{"type":35,"value":7855},"Exemple 2 : Réduction du code répétitif",{"type":29,"tag":37,"props":7857,"children":7858},{},[7859],{"type":35,"value":7860},"Voici un exemple où une méthode contient plusieurs lignes de code répétitives pour calculer la somme de nombres d'une liste.",{"type":29,"tag":5091,"props":7862,"children":7864},{"className":5093,"code":7863,"language":5095,"meta":8,"style":8},"// Code répétitif\npublic int sum(List\u003CInteger> numbers) {\n    int sum = 0;\n    for (int i = 0; i \u003C numbers.size();\n\n i++) {\n        sum += numbers.get(i);\n    }\n    return sum;\n}\n",[7865],{"type":29,"tag":1716,"props":7866,"children":7867},{"__ignoreMap":8},[7868,7876,7929,7954,8010,8017,8036,8074,8081,8096],{"type":29,"tag":2730,"props":7869,"children":7870},{"class":5102,"line":4267},[7871],{"type":29,"tag":2730,"props":7872,"children":7873},{"style":5106},[7874],{"type":35,"value":7875},"// Code répétitif\n",{"type":29,"tag":2730,"props":7877,"children":7878},{"class":5102,"line":453},[7879,7883,7888,7893,7897,7902,7906,7911,7916,7921,7925],{"type":29,"tag":2730,"props":7880,"children":7881},{"style":5115},[7882],{"type":35,"value":5218},{"type":29,"tag":2730,"props":7884,"children":7885},{"style":5115},[7886],{"type":35,"value":7887}," int",{"type":29,"tag":2730,"props":7889,"children":7890},{"style":5226},[7891],{"type":35,"value":7892}," sum",{"type":29,"tag":2730,"props":7894,"children":7895},{"style":5139},[7896],{"type":35,"value":6452},{"type":29,"tag":2730,"props":7898,"children":7899},{"style":6455},[7900],{"type":35,"value":7901},"List",{"type":29,"tag":2730,"props":7903,"children":7904},{"style":5127},[7905],{"type":35,"value":6515},{"type":29,"tag":2730,"props":7907,"children":7908},{"style":5121},[7909],{"type":35,"value":7910},"Integer",{"type":29,"tag":2730,"props":7912,"children":7913},{"style":5127},[7914],{"type":35,"value":7915},">",{"type":29,"tag":2730,"props":7917,"children":7918},{"style":5121},[7919],{"type":35,"value":7920}," numbers",{"type":29,"tag":2730,"props":7922,"children":7923},{"style":5139},[7924],{"type":35,"value":3849},{"type":29,"tag":2730,"props":7926,"children":7927},{"style":5139},[7928],{"type":35,"value":5239},{"type":29,"tag":2730,"props":7930,"children":7931},{"class":5102,"line":459},[7932,7937,7942,7946,7950],{"type":29,"tag":2730,"props":7933,"children":7934},{"style":5115},[7935],{"type":35,"value":7936},"    int",{"type":29,"tag":2730,"props":7938,"children":7939},{"style":5121},[7940],{"type":35,"value":7941}," sum ",{"type":29,"tag":2730,"props":7943,"children":7944},{"style":5127},[7945],{"type":35,"value":5130},{"type":29,"tag":2730,"props":7947,"children":7948},{"style":5133},[7949],{"type":35,"value":6501},{"type":29,"tag":2730,"props":7951,"children":7952},{"style":5139},[7953],{"type":35,"value":5142},{"type":29,"tag":2730,"props":7955,"children":7956},{"class":5102,"line":5153},[7957,7961,7965,7969,7973,7977,7981,7985,7989,7993,7997,8001,8006],{"type":29,"tag":2730,"props":7958,"children":7959},{"style":5115},[7960],{"type":35,"value":6479},{"type":29,"tag":2730,"props":7962,"children":7963},{"style":5139},[7964],{"type":35,"value":5293},{"type":29,"tag":2730,"props":7966,"children":7967},{"style":5115},[7968],{"type":35,"value":5118},{"type":29,"tag":2730,"props":7970,"children":7971},{"style":5121},[7972],{"type":35,"value":6492},{"type":29,"tag":2730,"props":7974,"children":7975},{"style":5127},[7976],{"type":35,"value":5130},{"type":29,"tag":2730,"props":7978,"children":7979},{"style":5133},[7980],{"type":35,"value":6501},{"type":29,"tag":2730,"props":7982,"children":7983},{"style":5139},[7984],{"type":35,"value":6506},{"type":29,"tag":2730,"props":7986,"children":7987},{"style":5121},[7988],{"type":35,"value":6492},{"type":29,"tag":2730,"props":7990,"children":7991},{"style":5127},[7992],{"type":35,"value":6515},{"type":29,"tag":2730,"props":7994,"children":7995},{"style":5121},[7996],{"type":35,"value":7920},{"type":29,"tag":2730,"props":7998,"children":7999},{"style":5139},[8000],{"type":35,"value":332},{"type":29,"tag":2730,"props":8002,"children":8003},{"style":5226},[8004],{"type":35,"value":8005},"size",{"type":29,"tag":2730,"props":8007,"children":8008},{"style":5139},[8009],{"type":35,"value":5334},{"type":29,"tag":2730,"props":8011,"children":8012},{"class":5102,"line":5162},[8013],{"type":29,"tag":2730,"props":8014,"children":8015},{"emptyLinePlaceholder":13},[8016],{"type":35,"value":5150},{"type":29,"tag":2730,"props":8018,"children":8019},{"class":5102,"line":3553},[8020,8024,8028,8032],{"type":29,"tag":2730,"props":8021,"children":8022},{"style":5121},[8023],{"type":35,"value":6538},{"type":29,"tag":2730,"props":8025,"children":8026},{"style":5127},[8027],{"type":35,"value":6543},{"type":29,"tag":2730,"props":8029,"children":8030},{"style":5139},[8031],{"type":35,"value":3849},{"type":29,"tag":2730,"props":8033,"children":8034},{"style":5139},[8035],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8037,"children":8038},{"class":5102,"line":5539},[8039,8044,8049,8053,8057,8062,8066,8070],{"type":29,"tag":2730,"props":8040,"children":8041},{"style":5121},[8042],{"type":35,"value":8043},"        sum ",{"type":29,"tag":2730,"props":8045,"children":8046},{"style":5127},[8047],{"type":35,"value":8048},"+=",{"type":29,"tag":2730,"props":8050,"children":8051},{"style":5121},[8052],{"type":35,"value":7920},{"type":29,"tag":2730,"props":8054,"children":8055},{"style":5139},[8056],{"type":35,"value":332},{"type":29,"tag":2730,"props":8058,"children":8059},{"style":5226},[8060],{"type":35,"value":8061},"get",{"type":29,"tag":2730,"props":8063,"children":8064},{"style":5139},[8065],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8067,"children":8068},{"style":5121},[8069],{"type":35,"value":6586},{"type":29,"tag":2730,"props":8071,"children":8072},{"style":5139},[8073],{"type":35,"value":7837},{"type":29,"tag":2730,"props":8075,"children":8076},{"class":5102,"line":5547},[8077],{"type":29,"tag":2730,"props":8078,"children":8079},{"style":5139},[8080],{"type":35,"value":5536},{"type":29,"tag":2730,"props":8082,"children":8083},{"class":5102,"line":5555},[8084,8088,8092],{"type":29,"tag":2730,"props":8085,"children":8086},{"style":5115},[8087],{"type":35,"value":5676},{"type":29,"tag":2730,"props":8089,"children":8090},{"style":5121},[8091],{"type":35,"value":7892},{"type":29,"tag":2730,"props":8093,"children":8094},{"style":5139},[8095],{"type":35,"value":5142},{"type":29,"tag":2730,"props":8097,"children":8098},{"class":5102,"line":5564},[8099],{"type":29,"tag":2730,"props":8100,"children":8101},{"style":5139},[8102],{"type":35,"value":5255},{"type":29,"tag":37,"props":8104,"children":8105},{},[8106],{"type":35,"value":8107},"On peut simplifier ce code en utilisant une méthode plus concise, telle que les streams de Java 8 :",{"type":29,"tag":5091,"props":8109,"children":8111},{"className":5093,"code":8110,"language":5095,"meta":8,"style":8},"// Version simplifiée avec KISS\npublic int sum(List\u003CInteger> numbers) {\n    return numbers.stream().mapToInt(Integer::intValue).sum();\n}\n",[8112],{"type":29,"tag":1716,"props":8113,"children":8114},{"__ignoreMap":8},[8115,8122,8169,8229],{"type":29,"tag":2730,"props":8116,"children":8117},{"class":5102,"line":4267},[8118],{"type":29,"tag":2730,"props":8119,"children":8120},{"style":5106},[8121],{"type":35,"value":7547},{"type":29,"tag":2730,"props":8123,"children":8124},{"class":5102,"line":453},[8125,8129,8133,8137,8141,8145,8149,8153,8157,8161,8165],{"type":29,"tag":2730,"props":8126,"children":8127},{"style":5115},[8128],{"type":35,"value":5218},{"type":29,"tag":2730,"props":8130,"children":8131},{"style":5115},[8132],{"type":35,"value":7887},{"type":29,"tag":2730,"props":8134,"children":8135},{"style":5226},[8136],{"type":35,"value":7892},{"type":29,"tag":2730,"props":8138,"children":8139},{"style":5139},[8140],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8142,"children":8143},{"style":6455},[8144],{"type":35,"value":7901},{"type":29,"tag":2730,"props":8146,"children":8147},{"style":5127},[8148],{"type":35,"value":6515},{"type":29,"tag":2730,"props":8150,"children":8151},{"style":5121},[8152],{"type":35,"value":7910},{"type":29,"tag":2730,"props":8154,"children":8155},{"style":5127},[8156],{"type":35,"value":7915},{"type":29,"tag":2730,"props":8158,"children":8159},{"style":5121},[8160],{"type":35,"value":7920},{"type":29,"tag":2730,"props":8162,"children":8163},{"style":5139},[8164],{"type":35,"value":3849},{"type":29,"tag":2730,"props":8166,"children":8167},{"style":5139},[8168],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8170,"children":8171},{"class":5102,"line":459},[8172,8176,8180,8184,8189,8193,8198,8202,8206,8211,8216,8220,8225],{"type":29,"tag":2730,"props":8173,"children":8174},{"style":5115},[8175],{"type":35,"value":5676},{"type":29,"tag":2730,"props":8177,"children":8178},{"style":5121},[8179],{"type":35,"value":7920},{"type":29,"tag":2730,"props":8181,"children":8182},{"style":5139},[8183],{"type":35,"value":332},{"type":29,"tag":2730,"props":8185,"children":8186},{"style":5226},[8187],{"type":35,"value":8188},"stream",{"type":29,"tag":2730,"props":8190,"children":8191},{"style":5139},[8192],{"type":35,"value":7313},{"type":29,"tag":2730,"props":8194,"children":8195},{"style":5226},[8196],{"type":35,"value":8197},"mapToInt",{"type":29,"tag":2730,"props":8199,"children":8200},{"style":5139},[8201],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8203,"children":8204},{"style":5121},[8205],{"type":35,"value":7910},{"type":29,"tag":2730,"props":8207,"children":8208},{"style":5115},[8209],{"type":35,"value":8210},"::",{"type":29,"tag":2730,"props":8212,"children":8213},{"style":5121},[8214],{"type":35,"value":8215},"intValue",{"type":29,"tag":2730,"props":8217,"children":8218},{"style":5139},[8219],{"type":35,"value":350},{"type":29,"tag":2730,"props":8221,"children":8222},{"style":5226},[8223],{"type":35,"value":8224},"sum",{"type":29,"tag":2730,"props":8226,"children":8227},{"style":5139},[8228],{"type":35,"value":5334},{"type":29,"tag":2730,"props":8230,"children":8231},{"class":5102,"line":5153},[8232],{"type":29,"tag":2730,"props":8233,"children":8234},{"style":5139},[8235],{"type":35,"value":5255},{"type":29,"tag":37,"props":8237,"children":8238},{},[8239],{"type":35,"value":8240},"Non seulement ce code est plus simple et plus lisible, mais il est aussi plus performant car il tire parti des fonctionnalités de Java 8 pour traiter les collections de manière efficace.",{"type":29,"tag":106,"props":8242,"children":8244},{"id":8243},"exemple-3-utilisation-de-classes-inutiles",[8245],{"type":35,"value":8246},"Exemple 3 : Utilisation de classes inutiles",{"type":29,"tag":37,"props":8248,"children":8249},{},[8250],{"type":35,"value":8251},"Il est fréquent de voir des projets où des classes ou des abstractions sont ajoutées sans réelle justification. Par exemple, imaginons que vous ayez deux classes pour gérer l'affichage d'un utilisateur dans un système.",{"type":29,"tag":5091,"props":8253,"children":8255},{"className":5093,"code":8254,"language":5095,"meta":8,"style":8},"// Complexité inutile\npublic class UserDisplayService {\n    public void displayUserInfo(User user) {\n        System.out.println(\"Name: \" + user.getName());\n        System.out.println(\"Email: \" + user.getEmail());\n    }\n}\n\npublic class AdminDisplayService {\n    public void displayAdminInfo(Admin admin) {\n        System.out.println(\"Admin Name: \" + admin.getName());\n        System.out.println(\"Admin Email: \" + admin.getEmail());\n    }\n}\n",[8256],{"type":29,"tag":1716,"props":8257,"children":8258},{"__ignoreMap":8},[8259,8267,8289,8329,8386,8438,8445,8452,8459,8479,8517,8569,8621,8628],{"type":29,"tag":2730,"props":8260,"children":8261},{"class":5102,"line":4267},[8262],{"type":29,"tag":2730,"props":8263,"children":8264},{"style":5106},[8265],{"type":35,"value":8266},"// Complexité inutile\n",{"type":29,"tag":2730,"props":8268,"children":8269},{"class":5102,"line":453},[8270,8274,8279,8285],{"type":29,"tag":2730,"props":8271,"children":8272},{"style":5115},[8273],{"type":35,"value":5218},{"type":29,"tag":2730,"props":8275,"children":8276},{"style":5115},[8277],{"type":35,"value":8278}," class",{"type":29,"tag":2730,"props":8280,"children":8282},{"style":8281},"--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit",[8283],{"type":35,"value":8284}," UserDisplayService",{"type":29,"tag":2730,"props":8286,"children":8287},{"style":5139},[8288],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8290,"children":8291},{"class":5102,"line":459},[8292,8297,8301,8306,8310,8315,8321,8325],{"type":29,"tag":2730,"props":8293,"children":8294},{"style":5115},[8295],{"type":35,"value":8296},"    public",{"type":29,"tag":2730,"props":8298,"children":8299},{"style":5115},[8300],{"type":35,"value":5223},{"type":29,"tag":2730,"props":8302,"children":8303},{"style":5226},[8304],{"type":35,"value":8305}," displayUserInfo",{"type":29,"tag":2730,"props":8307,"children":8308},{"style":5139},[8309],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8311,"children":8312},{"style":6455},[8313],{"type":35,"value":8314},"User",{"type":29,"tag":2730,"props":8316,"children":8318},{"style":8317},"--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit",[8319],{"type":35,"value":8320}," user",{"type":29,"tag":2730,"props":8322,"children":8323},{"style":5139},[8324],{"type":35,"value":3849},{"type":29,"tag":2730,"props":8326,"children":8327},{"style":5139},[8328],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8330,"children":8331},{"class":5102,"line":5153},[8332,8337,8341,8346,8350,8355,8359,8364,8369,8373,8377,8381],{"type":29,"tag":2730,"props":8333,"children":8334},{"style":5121},[8335],{"type":35,"value":8336},"        System",{"type":29,"tag":2730,"props":8338,"children":8339},{"style":5139},[8340],{"type":35,"value":332},{"type":29,"tag":2730,"props":8342,"children":8343},{"style":5121},[8344],{"type":35,"value":8345},"out",{"type":29,"tag":2730,"props":8347,"children":8348},{"style":5139},[8349],{"type":35,"value":332},{"type":29,"tag":2730,"props":8351,"children":8352},{"style":5226},[8353],{"type":35,"value":8354},"println",{"type":29,"tag":2730,"props":8356,"children":8357},{"style":5139},[8358],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8360,"children":8361},{"style":6597},[8362],{"type":35,"value":8363},"\"Name: \"",{"type":29,"tag":2730,"props":8365,"children":8366},{"style":5127},[8367],{"type":35,"value":8368}," +",{"type":29,"tag":2730,"props":8370,"children":8371},{"style":5121},[8372],{"type":35,"value":8320},{"type":29,"tag":2730,"props":8374,"children":8375},{"style":5139},[8376],{"type":35,"value":332},{"type":29,"tag":2730,"props":8378,"children":8379},{"style":5226},[8380],{"type":35,"value":7273},{"type":29,"tag":2730,"props":8382,"children":8383},{"style":5139},[8384],{"type":35,"value":8385},"());\n",{"type":29,"tag":2730,"props":8387,"children":8388},{"class":5102,"line":5162},[8389,8393,8397,8401,8405,8409,8413,8418,8422,8426,8430,8434],{"type":29,"tag":2730,"props":8390,"children":8391},{"style":5121},[8392],{"type":35,"value":8336},{"type":29,"tag":2730,"props":8394,"children":8395},{"style":5139},[8396],{"type":35,"value":332},{"type":29,"tag":2730,"props":8398,"children":8399},{"style":5121},[8400],{"type":35,"value":8345},{"type":29,"tag":2730,"props":8402,"children":8403},{"style":5139},[8404],{"type":35,"value":332},{"type":29,"tag":2730,"props":8406,"children":8407},{"style":5226},[8408],{"type":35,"value":8354},{"type":29,"tag":2730,"props":8410,"children":8411},{"style":5139},[8412],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8414,"children":8415},{"style":6597},[8416],{"type":35,"value":8417},"\"Email: \"",{"type":29,"tag":2730,"props":8419,"children":8420},{"style":5127},[8421],{"type":35,"value":8368},{"type":29,"tag":2730,"props":8423,"children":8424},{"style":5121},[8425],{"type":35,"value":8320},{"type":29,"tag":2730,"props":8427,"children":8428},{"style":5139},[8429],{"type":35,"value":332},{"type":29,"tag":2730,"props":8431,"children":8432},{"style":5226},[8433],{"type":35,"value":7398},{"type":29,"tag":2730,"props":8435,"children":8436},{"style":5139},[8437],{"type":35,"value":8385},{"type":29,"tag":2730,"props":8439,"children":8440},{"class":5102,"line":3553},[8441],{"type":29,"tag":2730,"props":8442,"children":8443},{"style":5139},[8444],{"type":35,"value":5536},{"type":29,"tag":2730,"props":8446,"children":8447},{"class":5102,"line":5539},[8448],{"type":29,"tag":2730,"props":8449,"children":8450},{"style":5139},[8451],{"type":35,"value":5255},{"type":29,"tag":2730,"props":8453,"children":8454},{"class":5102,"line":5547},[8455],{"type":29,"tag":2730,"props":8456,"children":8457},{"emptyLinePlaceholder":13},[8458],{"type":35,"value":5150},{"type":29,"tag":2730,"props":8460,"children":8461},{"class":5102,"line":5555},[8462,8466,8470,8475],{"type":29,"tag":2730,"props":8463,"children":8464},{"style":5115},[8465],{"type":35,"value":5218},{"type":29,"tag":2730,"props":8467,"children":8468},{"style":5115},[8469],{"type":35,"value":8278},{"type":29,"tag":2730,"props":8471,"children":8472},{"style":8281},[8473],{"type":35,"value":8474}," AdminDisplayService",{"type":29,"tag":2730,"props":8476,"children":8477},{"style":5139},[8478],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8480,"children":8481},{"class":5102,"line":5564},[8482,8486,8490,8495,8499,8504,8509,8513],{"type":29,"tag":2730,"props":8483,"children":8484},{"style":5115},[8485],{"type":35,"value":8296},{"type":29,"tag":2730,"props":8487,"children":8488},{"style":5115},[8489],{"type":35,"value":5223},{"type":29,"tag":2730,"props":8491,"children":8492},{"style":5226},[8493],{"type":35,"value":8494}," displayAdminInfo",{"type":29,"tag":2730,"props":8496,"children":8497},{"style":5139},[8498],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8500,"children":8501},{"style":6455},[8502],{"type":35,"value":8503},"Admin",{"type":29,"tag":2730,"props":8505,"children":8506},{"style":8317},[8507],{"type":35,"value":8508}," admin",{"type":29,"tag":2730,"props":8510,"children":8511},{"style":5139},[8512],{"type":35,"value":3849},{"type":29,"tag":2730,"props":8514,"children":8515},{"style":5139},[8516],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8518,"children":8519},{"class":5102,"line":2949},[8520,8524,8528,8532,8536,8540,8544,8549,8553,8557,8561,8565],{"type":29,"tag":2730,"props":8521,"children":8522},{"style":5121},[8523],{"type":35,"value":8336},{"type":29,"tag":2730,"props":8525,"children":8526},{"style":5139},[8527],{"type":35,"value":332},{"type":29,"tag":2730,"props":8529,"children":8530},{"style":5121},[8531],{"type":35,"value":8345},{"type":29,"tag":2730,"props":8533,"children":8534},{"style":5139},[8535],{"type":35,"value":332},{"type":29,"tag":2730,"props":8537,"children":8538},{"style":5226},[8539],{"type":35,"value":8354},{"type":29,"tag":2730,"props":8541,"children":8542},{"style":5139},[8543],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8545,"children":8546},{"style":6597},[8547],{"type":35,"value":8548},"\"Admin Name: \"",{"type":29,"tag":2730,"props":8550,"children":8551},{"style":5127},[8552],{"type":35,"value":8368},{"type":29,"tag":2730,"props":8554,"children":8555},{"style":5121},[8556],{"type":35,"value":8508},{"type":29,"tag":2730,"props":8558,"children":8559},{"style":5139},[8560],{"type":35,"value":332},{"type":29,"tag":2730,"props":8562,"children":8563},{"style":5226},[8564],{"type":35,"value":7273},{"type":29,"tag":2730,"props":8566,"children":8567},{"style":5139},[8568],{"type":35,"value":8385},{"type":29,"tag":2730,"props":8570,"children":8571},{"class":5102,"line":5612},[8572,8576,8580,8584,8588,8592,8596,8601,8605,8609,8613,8617],{"type":29,"tag":2730,"props":8573,"children":8574},{"style":5121},[8575],{"type":35,"value":8336},{"type":29,"tag":2730,"props":8577,"children":8578},{"style":5139},[8579],{"type":35,"value":332},{"type":29,"tag":2730,"props":8581,"children":8582},{"style":5121},[8583],{"type":35,"value":8345},{"type":29,"tag":2730,"props":8585,"children":8586},{"style":5139},[8587],{"type":35,"value":332},{"type":29,"tag":2730,"props":8589,"children":8590},{"style":5226},[8591],{"type":35,"value":8354},{"type":29,"tag":2730,"props":8593,"children":8594},{"style":5139},[8595],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8597,"children":8598},{"style":6597},[8599],{"type":35,"value":8600},"\"Admin Email: \"",{"type":29,"tag":2730,"props":8602,"children":8603},{"style":5127},[8604],{"type":35,"value":8368},{"type":29,"tag":2730,"props":8606,"children":8607},{"style":5121},[8608],{"type":35,"value":8508},{"type":29,"tag":2730,"props":8610,"children":8611},{"style":5139},[8612],{"type":35,"value":332},{"type":29,"tag":2730,"props":8614,"children":8615},{"style":5226},[8616],{"type":35,"value":7398},{"type":29,"tag":2730,"props":8618,"children":8619},{"style":5139},[8620],{"type":35,"value":8385},{"type":29,"tag":2730,"props":8622,"children":8623},{"class":5102,"line":5620},[8624],{"type":29,"tag":2730,"props":8625,"children":8626},{"style":5139},[8627],{"type":35,"value":5536},{"type":29,"tag":2730,"props":8629,"children":8630},{"class":5102,"line":5628},[8631],{"type":29,"tag":2730,"props":8632,"children":8633},{"style":5139},[8634],{"type":35,"value":5255},{"type":29,"tag":37,"props":8636,"children":8637},{},[8638,8640,8644],{"type":35,"value":8639},"Dans cet exemple, ces deux classes ont des fonctionnalités presque identiques. Appliquer ",{"type":29,"tag":55,"props":8641,"children":8642},{},[8643],{"type":35,"value":6255},{"type":35,"value":8645}," signifie que nous pouvons simplifier cette logique en utilisant une seule méthode générique.",{"type":29,"tag":5091,"props":8647,"children":8649},{"className":5093,"code":8648,"language":5095,"meta":8,"style":8},"// Version simplifiée avec KISS\npublic class UserDisplayService {\n    public void displayUserInfo(User user) {\n        System.out.println(\"Name: \" + user.getName());\n        System.out.println(\"Email: \" + user.getEmail());\n    }\n}\n",[8650],{"type":29,"tag":1716,"props":8651,"children":8652},{"__ignoreMap":8},[8653,8660,8679,8714,8765,8816,8823],{"type":29,"tag":2730,"props":8654,"children":8655},{"class":5102,"line":4267},[8656],{"type":29,"tag":2730,"props":8657,"children":8658},{"style":5106},[8659],{"type":35,"value":7547},{"type":29,"tag":2730,"props":8661,"children":8662},{"class":5102,"line":453},[8663,8667,8671,8675],{"type":29,"tag":2730,"props":8664,"children":8665},{"style":5115},[8666],{"type":35,"value":5218},{"type":29,"tag":2730,"props":8668,"children":8669},{"style":5115},[8670],{"type":35,"value":8278},{"type":29,"tag":2730,"props":8672,"children":8673},{"style":8281},[8674],{"type":35,"value":8284},{"type":29,"tag":2730,"props":8676,"children":8677},{"style":5139},[8678],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8680,"children":8681},{"class":5102,"line":459},[8682,8686,8690,8694,8698,8702,8706,8710],{"type":29,"tag":2730,"props":8683,"children":8684},{"style":5115},[8685],{"type":35,"value":8296},{"type":29,"tag":2730,"props":8687,"children":8688},{"style":5115},[8689],{"type":35,"value":5223},{"type":29,"tag":2730,"props":8691,"children":8692},{"style":5226},[8693],{"type":35,"value":8305},{"type":29,"tag":2730,"props":8695,"children":8696},{"style":5139},[8697],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8699,"children":8700},{"style":6455},[8701],{"type":35,"value":8314},{"type":29,"tag":2730,"props":8703,"children":8704},{"style":8317},[8705],{"type":35,"value":8320},{"type":29,"tag":2730,"props":8707,"children":8708},{"style":5139},[8709],{"type":35,"value":3849},{"type":29,"tag":2730,"props":8711,"children":8712},{"style":5139},[8713],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8715,"children":8716},{"class":5102,"line":5153},[8717,8721,8725,8729,8733,8737,8741,8745,8749,8753,8757,8761],{"type":29,"tag":2730,"props":8718,"children":8719},{"style":5121},[8720],{"type":35,"value":8336},{"type":29,"tag":2730,"props":8722,"children":8723},{"style":5139},[8724],{"type":35,"value":332},{"type":29,"tag":2730,"props":8726,"children":8727},{"style":5121},[8728],{"type":35,"value":8345},{"type":29,"tag":2730,"props":8730,"children":8731},{"style":5139},[8732],{"type":35,"value":332},{"type":29,"tag":2730,"props":8734,"children":8735},{"style":5226},[8736],{"type":35,"value":8354},{"type":29,"tag":2730,"props":8738,"children":8739},{"style":5139},[8740],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8742,"children":8743},{"style":6597},[8744],{"type":35,"value":8363},{"type":29,"tag":2730,"props":8746,"children":8747},{"style":5127},[8748],{"type":35,"value":8368},{"type":29,"tag":2730,"props":8750,"children":8751},{"style":5121},[8752],{"type":35,"value":8320},{"type":29,"tag":2730,"props":8754,"children":8755},{"style":5139},[8756],{"type":35,"value":332},{"type":29,"tag":2730,"props":8758,"children":8759},{"style":5226},[8760],{"type":35,"value":7273},{"type":29,"tag":2730,"props":8762,"children":8763},{"style":5139},[8764],{"type":35,"value":8385},{"type":29,"tag":2730,"props":8766,"children":8767},{"class":5102,"line":5162},[8768,8772,8776,8780,8784,8788,8792,8796,8800,8804,8808,8812],{"type":29,"tag":2730,"props":8769,"children":8770},{"style":5121},[8771],{"type":35,"value":8336},{"type":29,"tag":2730,"props":8773,"children":8774},{"style":5139},[8775],{"type":35,"value":332},{"type":29,"tag":2730,"props":8777,"children":8778},{"style":5121},[8779],{"type":35,"value":8345},{"type":29,"tag":2730,"props":8781,"children":8782},{"style":5139},[8783],{"type":35,"value":332},{"type":29,"tag":2730,"props":8785,"children":8786},{"style":5226},[8787],{"type":35,"value":8354},{"type":29,"tag":2730,"props":8789,"children":8790},{"style":5139},[8791],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8793,"children":8794},{"style":6597},[8795],{"type":35,"value":8417},{"type":29,"tag":2730,"props":8797,"children":8798},{"style":5127},[8799],{"type":35,"value":8368},{"type":29,"tag":2730,"props":8801,"children":8802},{"style":5121},[8803],{"type":35,"value":8320},{"type":29,"tag":2730,"props":8805,"children":8806},{"style":5139},[8807],{"type":35,"value":332},{"type":29,"tag":2730,"props":8809,"children":8810},{"style":5226},[8811],{"type":35,"value":7398},{"type":29,"tag":2730,"props":8813,"children":8814},{"style":5139},[8815],{"type":35,"value":8385},{"type":29,"tag":2730,"props":8817,"children":8818},{"class":5102,"line":3553},[8819],{"type":29,"tag":2730,"props":8820,"children":8821},{"style":5139},[8822],{"type":35,"value":5536},{"type":29,"tag":2730,"props":8824,"children":8825},{"class":5102,"line":5539},[8826],{"type":29,"tag":2730,"props":8827,"children":8828},{"style":5139},[8829],{"type":35,"value":5255},{"type":29,"tag":37,"props":8831,"children":8832},{},[8833],{"type":35,"value":8834},"Au lieu de dupliquer le code pour les utilisateurs normaux et les administrateurs, nous réutilisons une seule méthode qui accomplit la même tâche. Cela rend le code plus maintenable.",{"type":29,"tag":106,"props":8836,"children":8838},{"id":8837},"exemple-4-refactorisation-de-méthodes-longues",[8839],{"type":35,"value":8840},"Exemple 4 : Refactorisation de méthodes longues",{"type":29,"tag":37,"props":8842,"children":8843},{},[8844],{"type":35,"value":8845},"Voici un exemple d’une méthode qui fait beaucoup trop de choses à la fois, rendant le code difficile à comprendre et à maintenir :",{"type":29,"tag":5091,"props":8847,"children":8849},{"className":5093,"code":8848,"language":5095,"meta":8,"style":8},"// Méthode longue et complexe\npublic void processOrder(Order order) {\n    // Valider la commande\n    if (order.isValid()) {\n        // Calculer le total\n        double total = 0;\n        for (OrderItem item : order.getItems()) {\n            total += item.getPrice() * item.getQuantity();\n        }\n\n        // Appliquer une réduction\n        if (order.getDiscountCode() != null) {\n            total -= calculateDiscount(total, order.getDiscountCode());\n        }\n\n        // Envoi de la commande\n        sendOrder(order, total);\n    }\n}\n",[8850],{"type":29,"tag":1716,"props":8851,"children":8852},{"__ignoreMap":8},[8853,8861,8898,8906,8939,8947,8972,9019,9071,9078,9085,9093,9137,9184,9191,9198,9206,9235,9242],{"type":29,"tag":2730,"props":8854,"children":8855},{"class":5102,"line":4267},[8856],{"type":29,"tag":2730,"props":8857,"children":8858},{"style":5106},[8859],{"type":35,"value":8860},"// Méthode longue et complexe\n",{"type":29,"tag":2730,"props":8862,"children":8863},{"class":5102,"line":453},[8864,8868,8872,8876,8880,8885,8890,8894],{"type":29,"tag":2730,"props":8865,"children":8866},{"style":5115},[8867],{"type":35,"value":5218},{"type":29,"tag":2730,"props":8869,"children":8870},{"style":5115},[8871],{"type":35,"value":5223},{"type":29,"tag":2730,"props":8873,"children":8874},{"style":5226},[8875],{"type":35,"value":5469},{"type":29,"tag":2730,"props":8877,"children":8878},{"style":5139},[8879],{"type":35,"value":6452},{"type":29,"tag":2730,"props":8881,"children":8882},{"style":6455},[8883],{"type":35,"value":8884},"Order",{"type":29,"tag":2730,"props":8886,"children":8887},{"style":5121},[8888],{"type":35,"value":8889}," order",{"type":29,"tag":2730,"props":8891,"children":8892},{"style":5139},[8893],{"type":35,"value":3849},{"type":29,"tag":2730,"props":8895,"children":8896},{"style":5139},[8897],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8899,"children":8900},{"class":5102,"line":459},[8901],{"type":29,"tag":2730,"props":8902,"children":8903},{"style":5106},[8904],{"type":35,"value":8905},"    // Valider la commande\n",{"type":29,"tag":2730,"props":8907,"children":8908},{"class":5102,"line":5153},[8909,8913,8917,8922,8926,8931,8935],{"type":29,"tag":2730,"props":8910,"children":8911},{"style":5115},[8912],{"type":35,"value":5493},{"type":29,"tag":2730,"props":8914,"children":8915},{"style":5139},[8916],{"type":35,"value":5293},{"type":29,"tag":2730,"props":8918,"children":8919},{"style":5121},[8920],{"type":35,"value":8921},"order",{"type":29,"tag":2730,"props":8923,"children":8924},{"style":5139},[8925],{"type":35,"value":332},{"type":29,"tag":2730,"props":8927,"children":8928},{"style":5226},[8929],{"type":35,"value":8930},"isValid",{"type":29,"tag":2730,"props":8932,"children":8933},{"style":5139},[8934],{"type":35,"value":5387},{"type":29,"tag":2730,"props":8936,"children":8937},{"style":5139},[8938],{"type":35,"value":5239},{"type":29,"tag":2730,"props":8940,"children":8941},{"class":5102,"line":5162},[8942],{"type":29,"tag":2730,"props":8943,"children":8944},{"style":5106},[8945],{"type":35,"value":8946},"        // Calculer le total\n",{"type":29,"tag":2730,"props":8948,"children":8949},{"class":5102,"line":3553},[8950,8955,8960,8964,8968],{"type":29,"tag":2730,"props":8951,"children":8952},{"style":5115},[8953],{"type":35,"value":8954},"        double",{"type":29,"tag":2730,"props":8956,"children":8957},{"style":5121},[8958],{"type":35,"value":8959}," total ",{"type":29,"tag":2730,"props":8961,"children":8962},{"style":5127},[8963],{"type":35,"value":5130},{"type":29,"tag":2730,"props":8965,"children":8966},{"style":5133},[8967],{"type":35,"value":6501},{"type":29,"tag":2730,"props":8969,"children":8970},{"style":5139},[8971],{"type":35,"value":5142},{"type":29,"tag":2730,"props":8973,"children":8974},{"class":5102,"line":5539},[8975,8980,8984,8989,8994,8998,9002,9006,9011,9015],{"type":29,"tag":2730,"props":8976,"children":8977},{"style":5115},[8978],{"type":35,"value":8979},"        for",{"type":29,"tag":2730,"props":8981,"children":8982},{"style":5139},[8983],{"type":35,"value":5293},{"type":29,"tag":2730,"props":8985,"children":8986},{"style":6455},[8987],{"type":35,"value":8988},"OrderItem",{"type":29,"tag":2730,"props":8990,"children":8991},{"style":5121},[8992],{"type":35,"value":8993}," item ",{"type":29,"tag":2730,"props":8995,"children":8996},{"style":5115},[8997],{"type":35,"value":6714},{"type":29,"tag":2730,"props":8999,"children":9000},{"style":5121},[9001],{"type":35,"value":8889},{"type":29,"tag":2730,"props":9003,"children":9004},{"style":5139},[9005],{"type":35,"value":332},{"type":29,"tag":2730,"props":9007,"children":9008},{"style":5226},[9009],{"type":35,"value":9010},"getItems",{"type":29,"tag":2730,"props":9012,"children":9013},{"style":5139},[9014],{"type":35,"value":5387},{"type":29,"tag":2730,"props":9016,"children":9017},{"style":5139},[9018],{"type":35,"value":5239},{"type":29,"tag":2730,"props":9020,"children":9021},{"class":5102,"line":5547},[9022,9027,9031,9036,9040,9045,9049,9054,9058,9062,9067],{"type":29,"tag":2730,"props":9023,"children":9024},{"style":5121},[9025],{"type":35,"value":9026},"            total ",{"type":29,"tag":2730,"props":9028,"children":9029},{"style":5127},[9030],{"type":35,"value":8048},{"type":29,"tag":2730,"props":9032,"children":9033},{"style":5121},[9034],{"type":35,"value":9035}," item",{"type":29,"tag":2730,"props":9037,"children":9038},{"style":5139},[9039],{"type":35,"value":332},{"type":29,"tag":2730,"props":9041,"children":9042},{"style":5226},[9043],{"type":35,"value":9044},"getPrice",{"type":29,"tag":2730,"props":9046,"children":9047},{"style":5139},[9048],{"type":35,"value":5234},{"type":29,"tag":2730,"props":9050,"children":9051},{"style":5127},[9052],{"type":35,"value":9053}," *",{"type":29,"tag":2730,"props":9055,"children":9056},{"style":5121},[9057],{"type":35,"value":9035},{"type":29,"tag":2730,"props":9059,"children":9060},{"style":5139},[9061],{"type":35,"value":332},{"type":29,"tag":2730,"props":9063,"children":9064},{"style":5226},[9065],{"type":35,"value":9066},"getQuantity",{"type":29,"tag":2730,"props":9068,"children":9069},{"style":5139},[9070],{"type":35,"value":5334},{"type":29,"tag":2730,"props":9072,"children":9073},{"class":5102,"line":5555},[9074],{"type":29,"tag":2730,"props":9075,"children":9076},{"style":5139},[9077],{"type":35,"value":6624},{"type":29,"tag":2730,"props":9079,"children":9080},{"class":5102,"line":5564},[9081],{"type":29,"tag":2730,"props":9082,"children":9083},{"emptyLinePlaceholder":13},[9084],{"type":35,"value":5150},{"type":29,"tag":2730,"props":9086,"children":9087},{"class":5102,"line":2949},[9088],{"type":29,"tag":2730,"props":9089,"children":9090},{"style":5106},[9091],{"type":35,"value":9092},"        // Appliquer une réduction\n",{"type":29,"tag":2730,"props":9094,"children":9095},{"class":5102,"line":5612},[9096,9100,9104,9108,9112,9117,9121,9125,9129,9133],{"type":29,"tag":2730,"props":9097,"children":9098},{"style":5115},[9099],{"type":35,"value":6559},{"type":29,"tag":2730,"props":9101,"children":9102},{"style":5139},[9103],{"type":35,"value":5293},{"type":29,"tag":2730,"props":9105,"children":9106},{"style":5121},[9107],{"type":35,"value":8921},{"type":29,"tag":2730,"props":9109,"children":9110},{"style":5139},[9111],{"type":35,"value":332},{"type":29,"tag":2730,"props":9113,"children":9114},{"style":5226},[9115],{"type":35,"value":9116},"getDiscountCode",{"type":29,"tag":2730,"props":9118,"children":9119},{"style":5139},[9120],{"type":35,"value":5234},{"type":29,"tag":2730,"props":9122,"children":9123},{"style":5127},[9124],{"type":35,"value":7282},{"type":29,"tag":2730,"props":9126,"children":9127},{"style":5310},[9128],{"type":35,"value":7240},{"type":29,"tag":2730,"props":9130,"children":9131},{"style":5139},[9132],{"type":35,"value":3849},{"type":29,"tag":2730,"props":9134,"children":9135},{"style":5139},[9136],{"type":35,"value":5239},{"type":29,"tag":2730,"props":9138,"children":9139},{"class":5102,"line":5620},[9140,9144,9149,9154,9158,9163,9168,9172,9176,9180],{"type":29,"tag":2730,"props":9141,"children":9142},{"style":5121},[9143],{"type":35,"value":9026},{"type":29,"tag":2730,"props":9145,"children":9146},{"style":5127},[9147],{"type":35,"value":9148},"-=",{"type":29,"tag":2730,"props":9150,"children":9151},{"style":5226},[9152],{"type":35,"value":9153}," calculateDiscount",{"type":29,"tag":2730,"props":9155,"children":9156},{"style":5139},[9157],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9159,"children":9160},{"style":5121},[9161],{"type":35,"value":9162},"total",{"type":29,"tag":2730,"props":9164,"children":9165},{"style":5139},[9166],{"type":35,"value":9167},",",{"type":29,"tag":2730,"props":9169,"children":9170},{"style":5121},[9171],{"type":35,"value":8889},{"type":29,"tag":2730,"props":9173,"children":9174},{"style":5139},[9175],{"type":35,"value":332},{"type":29,"tag":2730,"props":9177,"children":9178},{"style":5226},[9179],{"type":35,"value":9116},{"type":29,"tag":2730,"props":9181,"children":9182},{"style":5139},[9183],{"type":35,"value":8385},{"type":29,"tag":2730,"props":9185,"children":9186},{"class":5102,"line":5628},[9187],{"type":29,"tag":2730,"props":9188,"children":9189},{"style":5139},[9190],{"type":35,"value":6624},{"type":29,"tag":2730,"props":9192,"children":9193},{"class":5102,"line":5636},[9194],{"type":29,"tag":2730,"props":9195,"children":9196},{"emptyLinePlaceholder":13},[9197],{"type":35,"value":5150},{"type":29,"tag":2730,"props":9199,"children":9200},{"class":5102,"line":2142},[9201],{"type":29,"tag":2730,"props":9202,"children":9203},{"style":5106},[9204],{"type":35,"value":9205},"        // Envoi de la commande\n",{"type":29,"tag":2730,"props":9207,"children":9208},{"class":5102,"line":5670},[9209,9214,9218,9222,9226,9231],{"type":29,"tag":2730,"props":9210,"children":9211},{"style":5226},[9212],{"type":35,"value":9213},"        sendOrder",{"type":29,"tag":2730,"props":9215,"children":9216},{"style":5139},[9217],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9219,"children":9220},{"style":5121},[9221],{"type":35,"value":8921},{"type":29,"tag":2730,"props":9223,"children":9224},{"style":5139},[9225],{"type":35,"value":9167},{"type":29,"tag":2730,"props":9227,"children":9228},{"style":5121},[9229],{"type":35,"value":9230}," total",{"type":29,"tag":2730,"props":9232,"children":9233},{"style":5139},[9234],{"type":35,"value":7837},{"type":29,"tag":2730,"props":9236,"children":9237},{"class":5102,"line":5696},[9238],{"type":29,"tag":2730,"props":9239,"children":9240},{"style":5139},[9241],{"type":35,"value":5536},{"type":29,"tag":2730,"props":9243,"children":9244},{"class":5102,"line":6807},[9245],{"type":29,"tag":2730,"props":9246,"children":9247},{"style":5139},[9248],{"type":35,"value":5255},{"type":29,"tag":37,"props":9250,"children":9251},{},[9252,9254,9258],{"type":35,"value":9253},"En appliquant ",{"type":29,"tag":55,"props":9255,"children":9256},{},[9257],{"type":35,"value":6255},{"type":35,"value":9259},", nous pouvons décomposer cette méthode en plusieurs petites méthodes avec des responsabilités claires :",{"type":29,"tag":5091,"props":9261,"children":9263},{"className":5093,"code":9262,"language":5095,"meta":8,"style":8},"// Version simplifiée avec KISS\npublic void processOrder(Order order) {\n    if (!order.isValid()) {\n        return;\n    }\n    \n    double total = calculateTotal(order);\n    total = applyDiscount(order, total);\n    \n    sendOrder(order, total);\n}\n\nprivate double calculateTotal(Order order) {\n    return order.getItems().stream()\n        .mapToDouble(item -> item.getPrice() * item.getQuantity())\n        .sum();\n}\n\nprivate double applyDiscount(Order order, double total) {\n    if (order.getDiscountCode() != null) {\n        return total - calculateDiscount(total, order.getDiscountCode());\n    }\n    return total;\n}\n",[9264],{"type":29,"tag":1716,"props":9265,"children":9266},{"__ignoreMap":8},[9267,9274,9309,9345,9356,9363,9371,9404,9441,9448,9476,9483,9490,9526,9558,9622,9637,9644,9651,9698,9741,9789,9797,9813],{"type":29,"tag":2730,"props":9268,"children":9269},{"class":5102,"line":4267},[9270],{"type":29,"tag":2730,"props":9271,"children":9272},{"style":5106},[9273],{"type":35,"value":7547},{"type":29,"tag":2730,"props":9275,"children":9276},{"class":5102,"line":453},[9277,9281,9285,9289,9293,9297,9301,9305],{"type":29,"tag":2730,"props":9278,"children":9279},{"style":5115},[9280],{"type":35,"value":5218},{"type":29,"tag":2730,"props":9282,"children":9283},{"style":5115},[9284],{"type":35,"value":5223},{"type":29,"tag":2730,"props":9286,"children":9287},{"style":5226},[9288],{"type":35,"value":5469},{"type":29,"tag":2730,"props":9290,"children":9291},{"style":5139},[9292],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9294,"children":9295},{"style":6455},[9296],{"type":35,"value":8884},{"type":29,"tag":2730,"props":9298,"children":9299},{"style":5121},[9300],{"type":35,"value":8889},{"type":29,"tag":2730,"props":9302,"children":9303},{"style":5139},[9304],{"type":35,"value":3849},{"type":29,"tag":2730,"props":9306,"children":9307},{"style":5139},[9308],{"type":35,"value":5239},{"type":29,"tag":2730,"props":9310,"children":9311},{"class":5102,"line":459},[9312,9316,9320,9325,9329,9333,9337,9341],{"type":29,"tag":2730,"props":9313,"children":9314},{"style":5115},[9315],{"type":35,"value":5493},{"type":29,"tag":2730,"props":9317,"children":9318},{"style":5139},[9319],{"type":35,"value":5293},{"type":29,"tag":2730,"props":9321,"children":9322},{"style":5127},[9323],{"type":35,"value":9324},"!",{"type":29,"tag":2730,"props":9326,"children":9327},{"style":5121},[9328],{"type":35,"value":8921},{"type":29,"tag":2730,"props":9330,"children":9331},{"style":5139},[9332],{"type":35,"value":332},{"type":29,"tag":2730,"props":9334,"children":9335},{"style":5226},[9336],{"type":35,"value":8930},{"type":29,"tag":2730,"props":9338,"children":9339},{"style":5139},[9340],{"type":35,"value":5387},{"type":29,"tag":2730,"props":9342,"children":9343},{"style":5139},[9344],{"type":35,"value":5239},{"type":29,"tag":2730,"props":9346,"children":9347},{"class":5102,"line":5153},[9348,9352],{"type":29,"tag":2730,"props":9349,"children":9350},{"style":5115},[9351],{"type":35,"value":7674},{"type":29,"tag":2730,"props":9353,"children":9354},{"style":5139},[9355],{"type":35,"value":5142},{"type":29,"tag":2730,"props":9357,"children":9358},{"class":5102,"line":5162},[9359],{"type":29,"tag":2730,"props":9360,"children":9361},{"style":5139},[9362],{"type":35,"value":5536},{"type":29,"tag":2730,"props":9364,"children":9365},{"class":5102,"line":3553},[9366],{"type":29,"tag":2730,"props":9367,"children":9368},{"style":5121},[9369],{"type":35,"value":9370},"    \n",{"type":29,"tag":2730,"props":9372,"children":9373},{"class":5102,"line":5539},[9374,9379,9383,9387,9392,9396,9400],{"type":29,"tag":2730,"props":9375,"children":9376},{"style":5115},[9377],{"type":35,"value":9378},"    double",{"type":29,"tag":2730,"props":9380,"children":9381},{"style":5121},[9382],{"type":35,"value":8959},{"type":29,"tag":2730,"props":9384,"children":9385},{"style":5127},[9386],{"type":35,"value":5130},{"type":29,"tag":2730,"props":9388,"children":9389},{"style":5226},[9390],{"type":35,"value":9391}," calculateTotal",{"type":29,"tag":2730,"props":9393,"children":9394},{"style":5139},[9395],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9397,"children":9398},{"style":5121},[9399],{"type":35,"value":8921},{"type":29,"tag":2730,"props":9401,"children":9402},{"style":5139},[9403],{"type":35,"value":7837},{"type":29,"tag":2730,"props":9405,"children":9406},{"class":5102,"line":5547},[9407,9412,9416,9421,9425,9429,9433,9437],{"type":29,"tag":2730,"props":9408,"children":9409},{"style":5121},[9410],{"type":35,"value":9411},"    total ",{"type":29,"tag":2730,"props":9413,"children":9414},{"style":5127},[9415],{"type":35,"value":5130},{"type":29,"tag":2730,"props":9417,"children":9418},{"style":5226},[9419],{"type":35,"value":9420}," applyDiscount",{"type":29,"tag":2730,"props":9422,"children":9423},{"style":5139},[9424],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9426,"children":9427},{"style":5121},[9428],{"type":35,"value":8921},{"type":29,"tag":2730,"props":9430,"children":9431},{"style":5139},[9432],{"type":35,"value":9167},{"type":29,"tag":2730,"props":9434,"children":9435},{"style":5121},[9436],{"type":35,"value":9230},{"type":29,"tag":2730,"props":9438,"children":9439},{"style":5139},[9440],{"type":35,"value":7837},{"type":29,"tag":2730,"props":9442,"children":9443},{"class":5102,"line":5555},[9444],{"type":29,"tag":2730,"props":9445,"children":9446},{"style":5121},[9447],{"type":35,"value":9370},{"type":29,"tag":2730,"props":9449,"children":9450},{"class":5102,"line":5564},[9451,9456,9460,9464,9468,9472],{"type":29,"tag":2730,"props":9452,"children":9453},{"style":5226},[9454],{"type":35,"value":9455},"    sendOrder",{"type":29,"tag":2730,"props":9457,"children":9458},{"style":5139},[9459],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9461,"children":9462},{"style":5121},[9463],{"type":35,"value":8921},{"type":29,"tag":2730,"props":9465,"children":9466},{"style":5139},[9467],{"type":35,"value":9167},{"type":29,"tag":2730,"props":9469,"children":9470},{"style":5121},[9471],{"type":35,"value":9230},{"type":29,"tag":2730,"props":9473,"children":9474},{"style":5139},[9475],{"type":35,"value":7837},{"type":29,"tag":2730,"props":9477,"children":9478},{"class":5102,"line":2949},[9479],{"type":29,"tag":2730,"props":9480,"children":9481},{"style":5139},[9482],{"type":35,"value":5255},{"type":29,"tag":2730,"props":9484,"children":9485},{"class":5102,"line":5612},[9486],{"type":29,"tag":2730,"props":9487,"children":9488},{"emptyLinePlaceholder":13},[9489],{"type":35,"value":5150},{"type":29,"tag":2730,"props":9491,"children":9492},{"class":5102,"line":5620},[9493,9497,9502,9506,9510,9514,9518,9522],{"type":29,"tag":2730,"props":9494,"children":9495},{"style":5115},[9496],{"type":35,"value":5649},{"type":29,"tag":2730,"props":9498,"children":9499},{"style":5115},[9500],{"type":35,"value":9501}," double",{"type":29,"tag":2730,"props":9503,"children":9504},{"style":5226},[9505],{"type":35,"value":9391},{"type":29,"tag":2730,"props":9507,"children":9508},{"style":5139},[9509],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9511,"children":9512},{"style":6455},[9513],{"type":35,"value":8884},{"type":29,"tag":2730,"props":9515,"children":9516},{"style":5121},[9517],{"type":35,"value":8889},{"type":29,"tag":2730,"props":9519,"children":9520},{"style":5139},[9521],{"type":35,"value":3849},{"type":29,"tag":2730,"props":9523,"children":9524},{"style":5139},[9525],{"type":35,"value":5239},{"type":29,"tag":2730,"props":9527,"children":9528},{"class":5102,"line":5628},[9529,9533,9537,9541,9545,9549,9553],{"type":29,"tag":2730,"props":9530,"children":9531},{"style":5115},[9532],{"type":35,"value":5676},{"type":29,"tag":2730,"props":9534,"children":9535},{"style":5121},[9536],{"type":35,"value":8889},{"type":29,"tag":2730,"props":9538,"children":9539},{"style":5139},[9540],{"type":35,"value":332},{"type":29,"tag":2730,"props":9542,"children":9543},{"style":5226},[9544],{"type":35,"value":9010},{"type":29,"tag":2730,"props":9546,"children":9547},{"style":5139},[9548],{"type":35,"value":7313},{"type":29,"tag":2730,"props":9550,"children":9551},{"style":5226},[9552],{"type":35,"value":8188},{"type":29,"tag":2730,"props":9554,"children":9555},{"style":5139},[9556],{"type":35,"value":9557},"()\n",{"type":29,"tag":2730,"props":9559,"children":9560},{"class":5102,"line":5636},[9561,9566,9571,9575,9580,9585,9589,9593,9597,9601,9605,9609,9613,9617],{"type":29,"tag":2730,"props":9562,"children":9563},{"style":5139},[9564],{"type":35,"value":9565},"        .",{"type":29,"tag":2730,"props":9567,"children":9568},{"style":5226},[9569],{"type":35,"value":9570},"mapToDouble",{"type":29,"tag":2730,"props":9572,"children":9573},{"style":5139},[9574],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9576,"children":9577},{"style":5121},[9578],{"type":35,"value":9579},"item ",{"type":29,"tag":2730,"props":9581,"children":9582},{"style":5115},[9583],{"type":35,"value":9584},"->",{"type":29,"tag":2730,"props":9586,"children":9587},{"style":5121},[9588],{"type":35,"value":9035},{"type":29,"tag":2730,"props":9590,"children":9591},{"style":5139},[9592],{"type":35,"value":332},{"type":29,"tag":2730,"props":9594,"children":9595},{"style":5226},[9596],{"type":35,"value":9044},{"type":29,"tag":2730,"props":9598,"children":9599},{"style":5139},[9600],{"type":35,"value":5234},{"type":29,"tag":2730,"props":9602,"children":9603},{"style":5127},[9604],{"type":35,"value":9053},{"type":29,"tag":2730,"props":9606,"children":9607},{"style":5121},[9608],{"type":35,"value":9035},{"type":29,"tag":2730,"props":9610,"children":9611},{"style":5139},[9612],{"type":35,"value":332},{"type":29,"tag":2730,"props":9614,"children":9615},{"style":5226},[9616],{"type":35,"value":9066},{"type":29,"tag":2730,"props":9618,"children":9619},{"style":5139},[9620],{"type":35,"value":9621},"())\n",{"type":29,"tag":2730,"props":9623,"children":9624},{"class":5102,"line":2142},[9625,9629,9633],{"type":29,"tag":2730,"props":9626,"children":9627},{"style":5139},[9628],{"type":35,"value":9565},{"type":29,"tag":2730,"props":9630,"children":9631},{"style":5226},[9632],{"type":35,"value":8224},{"type":29,"tag":2730,"props":9634,"children":9635},{"style":5139},[9636],{"type":35,"value":5334},{"type":29,"tag":2730,"props":9638,"children":9639},{"class":5102,"line":5670},[9640],{"type":29,"tag":2730,"props":9641,"children":9642},{"style":5139},[9643],{"type":35,"value":5255},{"type":29,"tag":2730,"props":9645,"children":9646},{"class":5102,"line":5696},[9647],{"type":29,"tag":2730,"props":9648,"children":9649},{"emptyLinePlaceholder":13},[9650],{"type":35,"value":5150},{"type":29,"tag":2730,"props":9652,"children":9653},{"class":5102,"line":6807},[9654,9658,9662,9666,9670,9674,9678,9682,9686,9690,9694],{"type":29,"tag":2730,"props":9655,"children":9656},{"style":5115},[9657],{"type":35,"value":5649},{"type":29,"tag":2730,"props":9659,"children":9660},{"style":5115},[9661],{"type":35,"value":9501},{"type":29,"tag":2730,"props":9663,"children":9664},{"style":5226},[9665],{"type":35,"value":9420},{"type":29,"tag":2730,"props":9667,"children":9668},{"style":5139},[9669],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9671,"children":9672},{"style":6455},[9673],{"type":35,"value":8884},{"type":29,"tag":2730,"props":9675,"children":9676},{"style":5121},[9677],{"type":35,"value":8889},{"type":29,"tag":2730,"props":9679,"children":9680},{"style":5139},[9681],{"type":35,"value":9167},{"type":29,"tag":2730,"props":9683,"children":9684},{"style":5115},[9685],{"type":35,"value":9501},{"type":29,"tag":2730,"props":9687,"children":9688},{"style":5121},[9689],{"type":35,"value":9230},{"type":29,"tag":2730,"props":9691,"children":9692},{"style":5139},[9693],{"type":35,"value":3849},{"type":29,"tag":2730,"props":9695,"children":9696},{"style":5139},[9697],{"type":35,"value":5239},{"type":29,"tag":2730,"props":9699,"children":9700},{"class":5102,"line":6845},[9701,9705,9709,9713,9717,9721,9725,9729,9733,9737],{"type":29,"tag":2730,"props":9702,"children":9703},{"style":5115},[9704],{"type":35,"value":5493},{"type":29,"tag":2730,"props":9706,"children":9707},{"style":5139},[9708],{"type":35,"value":5293},{"type":29,"tag":2730,"props":9710,"children":9711},{"style":5121},[9712],{"type":35,"value":8921},{"type":29,"tag":2730,"props":9714,"children":9715},{"style":5139},[9716],{"type":35,"value":332},{"type":29,"tag":2730,"props":9718,"children":9719},{"style":5226},[9720],{"type":35,"value":9116},{"type":29,"tag":2730,"props":9722,"children":9723},{"style":5139},[9724],{"type":35,"value":5234},{"type":29,"tag":2730,"props":9726,"children":9727},{"style":5127},[9728],{"type":35,"value":7282},{"type":29,"tag":2730,"props":9730,"children":9731},{"style":5310},[9732],{"type":35,"value":7240},{"type":29,"tag":2730,"props":9734,"children":9735},{"style":5139},[9736],{"type":35,"value":3849},{"type":29,"tag":2730,"props":9738,"children":9739},{"style":5139},[9740],{"type":35,"value":5239},{"type":29,"tag":2730,"props":9742,"children":9743},{"class":5102,"line":1649},[9744,9748,9752,9757,9761,9765,9769,9773,9777,9781,9785],{"type":29,"tag":2730,"props":9745,"children":9746},{"style":5115},[9747],{"type":35,"value":7674},{"type":29,"tag":2730,"props":9749,"children":9750},{"style":5121},[9751],{"type":35,"value":8959},{"type":29,"tag":2730,"props":9753,"children":9754},{"style":5127},[9755],{"type":35,"value":9756},"-",{"type":29,"tag":2730,"props":9758,"children":9759},{"style":5226},[9760],{"type":35,"value":9153},{"type":29,"tag":2730,"props":9762,"children":9763},{"style":5139},[9764],{"type":35,"value":6452},{"type":29,"tag":2730,"props":9766,"children":9767},{"style":5121},[9768],{"type":35,"value":9162},{"type":29,"tag":2730,"props":9770,"children":9771},{"style":5139},[9772],{"type":35,"value":9167},{"type":29,"tag":2730,"props":9774,"children":9775},{"style":5121},[9776],{"type":35,"value":8889},{"type":29,"tag":2730,"props":9778,"children":9779},{"style":5139},[9780],{"type":35,"value":332},{"type":29,"tag":2730,"props":9782,"children":9783},{"style":5226},[9784],{"type":35,"value":9116},{"type":29,"tag":2730,"props":9786,"children":9787},{"style":5139},[9788],{"type":35,"value":8385},{"type":29,"tag":2730,"props":9790,"children":9792},{"class":5102,"line":9791},22,[9793],{"type":29,"tag":2730,"props":9794,"children":9795},{"style":5139},[9796],{"type":35,"value":5536},{"type":29,"tag":2730,"props":9798,"children":9800},{"class":5102,"line":9799},23,[9801,9805,9809],{"type":29,"tag":2730,"props":9802,"children":9803},{"style":5115},[9804],{"type":35,"value":5676},{"type":29,"tag":2730,"props":9806,"children":9807},{"style":5121},[9808],{"type":35,"value":9230},{"type":29,"tag":2730,"props":9810,"children":9811},{"style":5139},[9812],{"type":35,"value":5142},{"type":29,"tag":2730,"props":9814,"children":9816},{"class":5102,"line":9815},24,[9817],{"type":29,"tag":2730,"props":9818,"children":9819},{"style":5139},[9820],{"type":35,"value":5255},{"type":29,"tag":37,"props":9822,"children":9823},{},[9824],{"type":35,"value":9825},"Ce code est désormais plus simple, plus lisible, et plus facile à tester, car chaque méthode a une responsabilité unique.",{"type":29,"tag":66,"props":9827,"children":9828},{},[],{"type":29,"tag":70,"props":9830,"children":9832},{"id":9831},"faq-réponses-aux-questions-courantes-sur-kiss",[9833],{"type":35,"value":9834},"FAQ : Réponses aux questions courantes sur KISS",{"type":29,"tag":371,"props":9836,"children":9837},{},[9838,9843],{"type":29,"tag":375,"props":9839,"children":9840},{},[9841],{"type":35,"value":9842},"1. Comment éviter la sur-simplification ?",{"type":29,"tag":37,"props":9844,"children":9845},{},[9846,9848,9852],{"type":35,"value":9847},"La sur-simplification peut être un piège si elle mène à des solutions incomplètes ou inefficaces. Pour éviter cela, assurez-vous que le code résout tous les cas d’utilisation nécessaires tout en restant simple. Appliquer ",{"type":29,"tag":55,"props":9849,"children":9850},{},[9851],{"type":35,"value":6255},{"type":35,"value":9853}," ne signifie pas ignorer les fonctionnalités importantes, mais plutôt éliminer ce qui est inutile. Une bonne pratique consiste à toujours se demander : \"Est-ce que cette abstraction ou cette complexité ajoute vraiment de la valeur ?\"",{"type":29,"tag":371,"props":9855,"children":9856},{},[9857,9862],{"type":29,"tag":375,"props":9858,"children":9859},{},[9860],{"type":35,"value":9861},"2. Comment convaincre mon équipe d’adopter KISS ?",{"type":29,"tag":37,"props":9863,"children":9864},{},[9865,9867,9871],{"type":35,"value":9866},"La meilleure façon de convaincre votre équipe est de montrer les avantages tangibles. Présentez des exemples concrets où un code simplifié a permis une meilleure maintenabilité, une réduction des bugs ou une plus grande clarté pour les nouveaux développeurs. Vous pouvez également introduire progressivement ",{"type":29,"tag":55,"props":9868,"children":9869},{},[9870],{"type":35,"value":6255},{"type":35,"value":9872}," dans les revues de code, en expliquant les raisons derrière les simplifications que vous proposez.",{"type":29,"tag":371,"props":9874,"children":9875},{},[9876,9881],{"type":29,"tag":375,"props":9877,"children":9878},{},[9879],{"type":35,"value":9880},"3. La simplicité réduit-elle la performance ?",{"type":29,"tag":37,"props":9882,"children":9883},{},[9884],{"type":35,"value":9885},"Pas forcément. La simplicité peut souvent améliorer la performance, car un code simple a tendance à faire moins de choses inutiles et est plus facile à optimiser. Cela dit, il y a des situations où la performance nécessite une certaine complexité, par exemple dans des algorithmes avancés. L’idée est de toujours chercher un équilibre et d’introduire la complexité seulement lorsque cela est absolument nécessaire.",{"type":29,"tag":371,"props":9887,"children":9888},{},[9889,9894],{"type":29,"tag":375,"props":9890,"children":9891},{},[9892],{"type":35,"value":9893},"4. Est-il toujours possible d’appliquer KISS ?",{"type":29,"tag":37,"props":9895,"children":9896},{},[9897,9899,9903],{"type":35,"value":9898},"Non, il y a des cas où une certaine complexité est inévitable. Par exemple, dans des systèmes distribués ou des applications critiques, certaines architectures peuvent nécessiter des niveaux d’abstraction élevés. Toutefois, même dans ces contextes, vous pouvez appliquer ",{"type":29,"tag":55,"props":9900,"children":9901},{},[9902],{"type":35,"value":6255},{"type":35,"value":9904}," en rendant chaque composant aussi simple que possible et en minimisant la complexité là où c’est possible.",{"type":29,"tag":371,"props":9906,"children":9907},{},[9908,9913],{"type":29,"tag":375,"props":9909,"children":9910},{},[9911],{"type":35,"value":9912},"5. Quels sont les avantages à long terme de KISS ?",{"type":29,"tag":37,"props":9914,"children":9915},{},[9916],{"type":35,"value":9917},"Le principal avantage est la maintenabilité. Un code simple est plus facile à lire, à comprendre et à mettre à jour, ce qui réduit les coûts à long terme. Il est également moins sujet aux bugs, car il est plus facile de raisonner sur un code simple. Enfin, en gardant votre code simple, vous facilitez également l’intégration de nouveaux développeurs dans votre projet, car ils comprendront plus rapidement le fonctionnement de votre application.",{"type":29,"tag":371,"props":9919,"children":9920},{},[9921,9926],{"type":29,"tag":375,"props":9922,"children":9923},{},[9924],{"type":35,"value":9925},"6. Que faire si mon code devient trop complexe avec le temps ?",{"type":29,"tag":37,"props":9927,"children":9928},{},[9929,9931,9935],{"type":35,"value":9930},"La complexité peut s’accumuler au fil du temps, surtout dans les grands projets. Je vous recommande de prévoir des phases de refactorisation régulières pour réduire cette complexité. Prenez le temps de revoir votre code existant, identifiez les parties trop complexes et appliquez ",{"type":29,"tag":55,"props":9932,"children":9933},{},[9934],{"type":35,"value":6255},{"type":35,"value":9936}," pour les simplifier. Une bonne règle est de toujours chercher à simplifier le code lorsque vous y revenez pour ajouter des fonctionnalités ou corriger des bugs.",{"type":29,"tag":66,"props":9938,"children":9939},{},[],{"type":29,"tag":37,"props":9941,"children":9942},{},[9943,9945,9949,9951,9955],{"type":35,"value":9944},"Le principe ",{"type":29,"tag":55,"props":9946,"children":9947},{},[9948],{"type":35,"value":6255},{"type":35,"value":9950},", les bonnes pratiques de ",{"type":29,"tag":55,"props":9952,"children":9953},{},[9954],{"type":35,"value":6378},{"type":35,"value":9956}," et les exemples Java que vous avez parcourus ici forment un ensemble cohérent. En les appliquant, vous pouvez rendre votre code plus simple, plus lisible et plus maintenable, tout en préservant ses performances et sa robustesse.",{"type":29,"tag":166,"props":9958,"children":9961},{"cta":9959,"href":443,"title":9960,"type":445},"Accéder au template gratuit →","Ressource gratuite : Faites votre propre audit engineering en 2 heures",[9962],{"type":29,"tag":37,"props":9963,"children":9964},{},[9965],{"type":35,"value":9966},"Le template Notion utilisé dans 15+ audits professionnels. 6 sections, 40 questions guidées, scoring visuel automatique — format décisionnel prêt à présenter à votre direction.",{"type":29,"tag":6195,"props":9968,"children":9969},{},[9970],{"type":35,"value":6199},{"title":8,"searchDepth":453,"depth":453,"links":9972},[9973,9974,9978,9985,9991],{"id":6237,"depth":453,"text":6240},{"id":6294,"depth":453,"text":6297,"children":9975},[9976,9977],{"id":6316,"depth":459,"text":6319},{"id":6332,"depth":459,"text":6335},{"id":6366,"depth":453,"text":6369,"children":9979},[9980,9981,9982,9983,9984],{"id":6400,"depth":459,"text":6403},{"id":6889,"depth":459,"text":6892},{"id":6900,"depth":459,"text":6903},{"id":7092,"depth":459,"text":7095},{"id":7116,"depth":459,"text":7119},{"id":7136,"depth":453,"text":7139,"children":9986},[9987,9988,9989,9990],{"id":7153,"depth":459,"text":7156},{"id":7852,"depth":459,"text":7855},{"id":8243,"depth":459,"text":8246},{"id":8837,"depth":459,"text":8840},{"id":9831,"depth":453,"text":9834},"content:fr:dette-technique:principe-kiss-bonnes-pratiques-java.md","fr/dette-technique/principe-kiss-bonnes-pratiques-java.md","fr/dette-technique/principe-kiss-bonnes-pratiques-java",{"_path":5423,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9996,"description":9997,"id":9998,"date":9999,"listed":13,"nocomments":7,"hidden":7,"categories":10000,"tags":10001,"--cover":10002,"readingTime":10003,"body":10008,"_type":466,"_id":14694,"_source":468,"_file":14695,"_stem":14696,"_extension":471},"Découvrir le Clean Code en Software Craftsmanship, Les Bonnes Pratiques en Java","Découvrez les principes du Clean Code et comment écrire du code propre et maintenable avec des exemples concrets en Java. Astuces, FAQ et bonnes pratiques pour...",49,"2024-07-17",[6],[4961,4962],"covers/articles/principe-clean-code.jpg",{"text":10004,"minutes":10005,"time":10006,"words":10007},"16 min read",15.43,925800,3086,{"type":26,"children":10009,"toc":14664},[10010,10019,10028,10033,10063,10072,10082,10091,10109,10112,10121,10132,10141,10159,10166,10244,10265,10275,10284,10296,10303,11105,11118,11126,11129,11138,11147,11165,11172,11469,11474,11477,11486,11503,11512,11523,11530,11608,11629,11664,11667,11676,11681,11688,12163,12168,12176,12179,12188,12193,12200,12543,12548,12564,12567,12576,12586,12595,12606,12613,13007,13012,13020,13023,13032,13037,13044,13515,13520,13528,13531,13540,13555,13562,13879,13891,13899,13902,13911,13922,13931,13950,13957,14255,14268,14276,14279,14288,14299,14310,14343,14351,14354,14363,14380,14388,14421,14435,14438,14447,14464,14482,14501,14571,14590,14609,14628,14631,14640,14650,14660],{"type":29,"tag":70,"props":10011,"children":10013},{"id":10012},"découvrir-le-clean-code-en-software-craftsmanship-les-bonnes-pratiques-en-java",[10014],{"type":29,"tag":55,"props":10015,"children":10016},{},[10017],{"type":35,"value":10018},"Découvrir le Clean Code en Software Craftsmanship : Les Bonnes Pratiques en Java",{"type":29,"tag":106,"props":10020,"children":10022},{"id":10021},"introduction-au-clean-code-pourquoi-écrire-du-code-propre-est-essentiel",[10023],{"type":29,"tag":55,"props":10024,"children":10025},{},[10026],{"type":35,"value":10027},"Introduction au Clean Code : Pourquoi écrire du code propre est essentiel",{"type":29,"tag":37,"props":10029,"children":10030},{},[10031],{"type":35,"value":10032},"Imaginez cette situation : vous revenez sur un projet sur lequel vous avez travaillé il y a six mois. À l’époque, vous aviez tout bouclé en vitesse pour respecter les délais. Mais aujourd’hui, en rouvrant ce code, c’est un véritable casse-tête. Des noms de variables incompréhensibles, des fonctions interminables... et maintenant, vous devez y ajouter une nouvelle fonctionnalité. Résultat ? Vous passez plus de temps à comprendre votre propre code qu’à le modifier.",{"type":29,"tag":37,"props":10034,"children":10035},{},[10036,10038,10042,10044,10049,10050,10055,10056,10061],{"type":35,"value":10037},"J’ai vu cette situation se répéter dans des dizaines d’équipes que j’ai accompagnées, notamment dans des DSI bancaires comme BNP Paribas CIB ou Agirc-Arrco. C’est là que le ",{"type":29,"tag":55,"props":10039,"children":10040},{},[10041],{"type":35,"value":5426},{"type":35,"value":10043}," entre en jeu. Plus qu’une simple méthodologie, c’est une philosophie de développement qui vise à rendre le code non seulement fonctionnel, mais aussi ",{"type":29,"tag":55,"props":10045,"children":10046},{},[10047],{"type":35,"value":10048},"clair",{"type":35,"value":3231},{"type":29,"tag":55,"props":10051,"children":10052},{},[10053],{"type":35,"value":10054},"lisible",{"type":35,"value":556},{"type":29,"tag":55,"props":10057,"children":10058},{},[10059],{"type":35,"value":10060},"facilement maintenable",{"type":35,"value":10062},". En d’autres termes, un code que vous (ou quelqu’un d’autre) pourrez modifier sereinement dans six mois, ou même dans un an.",{"type":29,"tag":106,"props":10064,"children":10066},{"id":10065},"pourquoi-vous-devez-vous-en-soucier",[10067],{"type":29,"tag":55,"props":10068,"children":10069},{},[10070],{"type":35,"value":10071},"Pourquoi vous devez vous en soucier ?",{"type":29,"tag":37,"props":10073,"children":10074},{},[10075,10076,10080],{"type":35,"value":5420},{"type":29,"tag":55,"props":10077,"children":10078},{},[10079],{"type":35,"value":5426},{"type":35,"value":10081},", ce n’est pas juste une question d’esthétique. C’est un moyen de garantir que votre code reste robuste, compréhensible et prêt à évoluer. En adoptant ces principes, vous allez réduire les bugs, faciliter la maintenance, et surtout, économiser énormément de temps sur le long terme. Ce qui se traduit concrètement par des cycles de livraison plus courts et un coût de maintenance réduit.",{"type":29,"tag":106,"props":10083,"children":10085},{"id":10084},"ce-que-vous-allez-apprendre-ici",[10086],{"type":29,"tag":55,"props":10087,"children":10088},{},[10089],{"type":35,"value":10090},"Ce que vous allez apprendre ici",{"type":29,"tag":37,"props":10092,"children":10093},{},[10094,10096,10100,10102,10107],{"type":35,"value":10095},"Vous allez découvrir les principes fondamentaux du ",{"type":29,"tag":55,"props":10097,"children":10098},{},[10099],{"type":35,"value":5426},{"type":35,"value":10101},", tels que les définit Robert C. Martin dans son ouvrage de référence, avec des exemples pratiques en ",{"type":29,"tag":55,"props":10103,"children":10104},{},[10105],{"type":35,"value":10106},"Java",{"type":35,"value":10108}," pour intégrer ces bonnes pratiques dans votre travail quotidien. Je vous donnerai aussi des astuces simples à appliquer, même lorsque vous êtes sous pression pour livrer rapidement.",{"type":29,"tag":66,"props":10110,"children":10111},{},[],{"type":29,"tag":70,"props":10113,"children":10115},{"id":10114},"les-principes-fondamentaux-du-clean-code",[10116],{"type":29,"tag":55,"props":10117,"children":10118},{},[10119],{"type":35,"value":10120},"Les principes fondamentaux du Clean Code",{"type":29,"tag":37,"props":10122,"children":10123},{},[10124,10126,10130],{"type":35,"value":10125},"Maintenant que vous comprenez pourquoi le ",{"type":29,"tag":55,"props":10127,"children":10128},{},[10129],{"type":35,"value":5426},{"type":35,"value":10131}," est si important, plongeons dans les principes clés qui vous permettront de l'appliquer efficacement dans votre code. Ces principes vous guideront pour écrire un code qui n'est pas seulement fonctionnel, mais aussi agréable à lire et à maintenir.",{"type":29,"tag":106,"props":10133,"children":10135},{"id":10134},"_1-des-noms-de-variables-et-de-fonctions-explicites",[10136],{"type":29,"tag":55,"props":10137,"children":10138},{},[10139],{"type":35,"value":10140},"1. Des noms de variables et de fonctions explicites",{"type":29,"tag":37,"props":10142,"children":10143},{},[10144,10146,10151,10152,10157],{"type":35,"value":10145},"L'un des premiers pas vers un code propre est de choisir des noms ",{"type":29,"tag":55,"props":10147,"children":10148},{},[10149],{"type":35,"value":10150},"clairs",{"type":35,"value":556},{"type":29,"tag":55,"props":10153,"children":10154},{},[10155],{"type":35,"value":10156},"significatifs",{"type":35,"value":10158}," pour vos variables, vos fonctions et vos classes. Si quelqu'un peut comprendre ce qu'une variable fait rien qu'en lisant son nom, alors vous êtes sur la bonne voie.",{"type":29,"tag":37,"props":10160,"children":10161},{},[10162],{"type":29,"tag":55,"props":10163,"children":10164},{},[10165],{"type":35,"value":6416},{"type":29,"tag":5091,"props":10167,"children":10169},{"className":5093,"code":10168,"language":5095,"meta":8,"style":8},"// Mauvais exemple\nint a = 5;\n\n// Meilleur exemple\nint nombreDeJours = 5;\n",[10170],{"type":29,"tag":1716,"props":10171,"children":10172},{"__ignoreMap":8},[10173,10181,10205,10212,10220],{"type":29,"tag":2730,"props":10174,"children":10175},{"class":5102,"line":4267},[10176],{"type":29,"tag":2730,"props":10177,"children":10178},{"style":5106},[10179],{"type":35,"value":10180},"// Mauvais exemple\n",{"type":29,"tag":2730,"props":10182,"children":10183},{"class":5102,"line":453},[10184,10188,10193,10197,10201],{"type":29,"tag":2730,"props":10185,"children":10186},{"style":5115},[10187],{"type":35,"value":5118},{"type":29,"tag":2730,"props":10189,"children":10190},{"style":5121},[10191],{"type":35,"value":10192}," a ",{"type":29,"tag":2730,"props":10194,"children":10195},{"style":5127},[10196],{"type":35,"value":5130},{"type":29,"tag":2730,"props":10198,"children":10199},{"style":5133},[10200],{"type":35,"value":5136},{"type":29,"tag":2730,"props":10202,"children":10203},{"style":5139},[10204],{"type":35,"value":5142},{"type":29,"tag":2730,"props":10206,"children":10207},{"class":5102,"line":459},[10208],{"type":29,"tag":2730,"props":10209,"children":10210},{"emptyLinePlaceholder":13},[10211],{"type":35,"value":5150},{"type":29,"tag":2730,"props":10213,"children":10214},{"class":5102,"line":5153},[10215],{"type":29,"tag":2730,"props":10216,"children":10217},{"style":5106},[10218],{"type":35,"value":10219},"// Meilleur exemple\n",{"type":29,"tag":2730,"props":10221,"children":10222},{"class":5102,"line":5162},[10223,10227,10232,10236,10240],{"type":29,"tag":2730,"props":10224,"children":10225},{"style":5115},[10226],{"type":35,"value":5118},{"type":29,"tag":2730,"props":10228,"children":10229},{"style":5121},[10230],{"type":35,"value":10231}," nombreDeJours ",{"type":29,"tag":2730,"props":10233,"children":10234},{"style":5127},[10235],{"type":35,"value":5130},{"type":29,"tag":2730,"props":10237,"children":10238},{"style":5133},[10239],{"type":35,"value":5136},{"type":29,"tag":2730,"props":10241,"children":10242},{"style":5139},[10243],{"type":35,"value":5142},{"type":29,"tag":37,"props":10245,"children":10246},{},[10247,10249,10255,10257,10263],{"type":35,"value":10248},"En nommant la variable ",{"type":29,"tag":1716,"props":10250,"children":10252},{"className":10251},[],[10253],{"type":35,"value":10254},"nombreDeJours",{"type":35,"value":10256},", on rend immédiatement évident ce que représente cette donnée, sans avoir besoin de commentaires ou de devinettes. De plus, évitez les abréviations trop courtes ou ambiguës comme ",{"type":29,"tag":1716,"props":10258,"children":10260},{"className":10259},[],[10261],{"type":35,"value":10262},"nbr",{"type":35,"value":10264},", qui peuvent prêter à confusion.",{"type":29,"tag":10266,"props":10267,"children":10269},"alert",{"type":10268},"TIP",[10270],{"type":29,"tag":37,"props":10271,"children":10272},{},[10273],{"type":35,"value":10274},"Pensez à vos noms de variables et fonctions comme à une conversation. Si vous deviez expliquer ce que fait votre code à un collègue, utiliseriez-vous ces noms ? Si la réponse est non, il est probablement temps de les améliorer.",{"type":29,"tag":106,"props":10276,"children":10278},{"id":10277},"_2-la-règle-des-fonctions-courtes",[10279],{"type":29,"tag":55,"props":10280,"children":10281},{},[10282],{"type":35,"value":10283},"2. La règle des fonctions courtes",{"type":29,"tag":37,"props":10285,"children":10286},{},[10287,10289,10294],{"type":35,"value":10288},"Une bonne fonction ne doit faire ",{"type":29,"tag":55,"props":10290,"children":10291},{},[10292],{"type":35,"value":10293},"qu'une seule chose",{"type":35,"value":10295}," et bien la faire. Si une fonction devient trop longue, il y a de fortes chances qu'elle fasse trop de choses à la fois. Un bon indicateur : si vous pouvez résumer ce que fait votre fonction en une seule phrase claire, elle est probablement assez concise.",{"type":29,"tag":37,"props":10297,"children":10298},{},[10299],{"type":29,"tag":55,"props":10300,"children":10301},{},[10302],{"type":35,"value":6416},{"type":29,"tag":5091,"props":10304,"children":10306},{"className":5093,"code":10305,"language":5095,"meta":8,"style":8},"// Mauvais exemple - Trop de responsabilités dans une seule fonction\npublic void processOrder(Order order) {\n    // Valider la commande\n    if (order.isValid()) {\n        // Calculer le total\n        double total = order.getAmount() + calculateTax(order);\n\n        // Traiter le paiement\n        processPayment(order, total);\n\n        // Envoyer une confirmation\n        sendConfirmationEmail(order);\n    } else {\n        System.out.println(\"Commande invalide\");\n    }\n}\n\n// Meilleur exemple - Chaque fonction a une responsabilité unique\npublic void processOrder(Order order) {\n    if (order.isValid()) {\n        double total = calculateTotal(order);\n        processPayment(order, total);\n        sendConfirmation(order);\n    } else {\n        handleInvalidOrder();\n    }\n}\n\nprivate double calculateTotal(Order order) {\n    return order.getAmount() + calculateTax(order);\n}\n\nprivate void processPayment(Order order, double total) {\n    // Code pour traiter le paiement\n}\n\nprivate void sendConfirmation(Order order) {\n    // Code pour envoyer l'email de confirmation\n}\n\nprivate void handleInvalidOrder() {\n    System.out.println(\"Commande invalide\");\n}\n",[10307],{"type":29,"tag":1716,"props":10308,"children":10309},{"__ignoreMap":8},[10310,10318,10353,10360,10391,10398,10451,10458,10466,10494,10501,10509,10529,10546,10582,10589,10596,10603,10611,10646,10677,10708,10735,10755,10770,10783,10790,10798,10806,10842,10886,10893,10901,10950,10959,10967,10974,11011,11020,11028,11035,11060,11097],{"type":29,"tag":2730,"props":10311,"children":10312},{"class":5102,"line":4267},[10313],{"type":29,"tag":2730,"props":10314,"children":10315},{"style":5106},[10316],{"type":35,"value":10317},"// Mauvais exemple - Trop de responsabilités dans une seule fonction\n",{"type":29,"tag":2730,"props":10319,"children":10320},{"class":5102,"line":453},[10321,10325,10329,10333,10337,10341,10345,10349],{"type":29,"tag":2730,"props":10322,"children":10323},{"style":5115},[10324],{"type":35,"value":5218},{"type":29,"tag":2730,"props":10326,"children":10327},{"style":5115},[10328],{"type":35,"value":5223},{"type":29,"tag":2730,"props":10330,"children":10331},{"style":5226},[10332],{"type":35,"value":5469},{"type":29,"tag":2730,"props":10334,"children":10335},{"style":5139},[10336],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10338,"children":10339},{"style":6455},[10340],{"type":35,"value":8884},{"type":29,"tag":2730,"props":10342,"children":10343},{"style":5121},[10344],{"type":35,"value":8889},{"type":29,"tag":2730,"props":10346,"children":10347},{"style":5139},[10348],{"type":35,"value":3849},{"type":29,"tag":2730,"props":10350,"children":10351},{"style":5139},[10352],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10354,"children":10355},{"class":5102,"line":459},[10356],{"type":29,"tag":2730,"props":10357,"children":10358},{"style":5106},[10359],{"type":35,"value":8905},{"type":29,"tag":2730,"props":10361,"children":10362},{"class":5102,"line":5153},[10363,10367,10371,10375,10379,10383,10387],{"type":29,"tag":2730,"props":10364,"children":10365},{"style":5115},[10366],{"type":35,"value":5493},{"type":29,"tag":2730,"props":10368,"children":10369},{"style":5139},[10370],{"type":35,"value":5293},{"type":29,"tag":2730,"props":10372,"children":10373},{"style":5121},[10374],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10376,"children":10377},{"style":5139},[10378],{"type":35,"value":332},{"type":29,"tag":2730,"props":10380,"children":10381},{"style":5226},[10382],{"type":35,"value":8930},{"type":29,"tag":2730,"props":10384,"children":10385},{"style":5139},[10386],{"type":35,"value":5387},{"type":29,"tag":2730,"props":10388,"children":10389},{"style":5139},[10390],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10392,"children":10393},{"class":5102,"line":5162},[10394],{"type":29,"tag":2730,"props":10395,"children":10396},{"style":5106},[10397],{"type":35,"value":8946},{"type":29,"tag":2730,"props":10399,"children":10400},{"class":5102,"line":3553},[10401,10405,10409,10413,10417,10421,10426,10430,10434,10439,10443,10447],{"type":29,"tag":2730,"props":10402,"children":10403},{"style":5115},[10404],{"type":35,"value":8954},{"type":29,"tag":2730,"props":10406,"children":10407},{"style":5121},[10408],{"type":35,"value":8959},{"type":29,"tag":2730,"props":10410,"children":10411},{"style":5127},[10412],{"type":35,"value":5130},{"type":29,"tag":2730,"props":10414,"children":10415},{"style":5121},[10416],{"type":35,"value":8889},{"type":29,"tag":2730,"props":10418,"children":10419},{"style":5139},[10420],{"type":35,"value":332},{"type":29,"tag":2730,"props":10422,"children":10423},{"style":5226},[10424],{"type":35,"value":10425},"getAmount",{"type":29,"tag":2730,"props":10427,"children":10428},{"style":5139},[10429],{"type":35,"value":5234},{"type":29,"tag":2730,"props":10431,"children":10432},{"style":5127},[10433],{"type":35,"value":8368},{"type":29,"tag":2730,"props":10435,"children":10436},{"style":5226},[10437],{"type":35,"value":10438}," calculateTax",{"type":29,"tag":2730,"props":10440,"children":10441},{"style":5139},[10442],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10444,"children":10445},{"style":5121},[10446],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10448,"children":10449},{"style":5139},[10450],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10452,"children":10453},{"class":5102,"line":5539},[10454],{"type":29,"tag":2730,"props":10455,"children":10456},{"emptyLinePlaceholder":13},[10457],{"type":35,"value":5150},{"type":29,"tag":2730,"props":10459,"children":10460},{"class":5102,"line":5547},[10461],{"type":29,"tag":2730,"props":10462,"children":10463},{"style":5106},[10464],{"type":35,"value":10465},"        // Traiter le paiement\n",{"type":29,"tag":2730,"props":10467,"children":10468},{"class":5102,"line":5555},[10469,10474,10478,10482,10486,10490],{"type":29,"tag":2730,"props":10470,"children":10471},{"style":5226},[10472],{"type":35,"value":10473},"        processPayment",{"type":29,"tag":2730,"props":10475,"children":10476},{"style":5139},[10477],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10479,"children":10480},{"style":5121},[10481],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10483,"children":10484},{"style":5139},[10485],{"type":35,"value":9167},{"type":29,"tag":2730,"props":10487,"children":10488},{"style":5121},[10489],{"type":35,"value":9230},{"type":29,"tag":2730,"props":10491,"children":10492},{"style":5139},[10493],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10495,"children":10496},{"class":5102,"line":5564},[10497],{"type":29,"tag":2730,"props":10498,"children":10499},{"emptyLinePlaceholder":13},[10500],{"type":35,"value":5150},{"type":29,"tag":2730,"props":10502,"children":10503},{"class":5102,"line":2949},[10504],{"type":29,"tag":2730,"props":10505,"children":10506},{"style":5106},[10507],{"type":35,"value":10508},"        // Envoyer une confirmation\n",{"type":29,"tag":2730,"props":10510,"children":10511},{"class":5102,"line":5612},[10512,10517,10521,10525],{"type":29,"tag":2730,"props":10513,"children":10514},{"style":5226},[10515],{"type":35,"value":10516},"        sendConfirmationEmail",{"type":29,"tag":2730,"props":10518,"children":10519},{"style":5139},[10520],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10522,"children":10523},{"style":5121},[10524],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10526,"children":10527},{"style":5139},[10528],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10530,"children":10531},{"class":5102,"line":5620},[10532,10537,10542],{"type":29,"tag":2730,"props":10533,"children":10534},{"style":5139},[10535],{"type":35,"value":10536},"    }",{"type":29,"tag":2730,"props":10538,"children":10539},{"style":5115},[10540],{"type":35,"value":10541}," else",{"type":29,"tag":2730,"props":10543,"children":10544},{"style":5139},[10545],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10547,"children":10548},{"class":5102,"line":5628},[10549,10553,10557,10561,10565,10569,10573,10578],{"type":29,"tag":2730,"props":10550,"children":10551},{"style":5121},[10552],{"type":35,"value":8336},{"type":29,"tag":2730,"props":10554,"children":10555},{"style":5139},[10556],{"type":35,"value":332},{"type":29,"tag":2730,"props":10558,"children":10559},{"style":5121},[10560],{"type":35,"value":8345},{"type":29,"tag":2730,"props":10562,"children":10563},{"style":5139},[10564],{"type":35,"value":332},{"type":29,"tag":2730,"props":10566,"children":10567},{"style":5226},[10568],{"type":35,"value":8354},{"type":29,"tag":2730,"props":10570,"children":10571},{"style":5139},[10572],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10574,"children":10575},{"style":6597},[10576],{"type":35,"value":10577},"\"Commande invalide\"",{"type":29,"tag":2730,"props":10579,"children":10580},{"style":5139},[10581],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10583,"children":10584},{"class":5102,"line":5636},[10585],{"type":29,"tag":2730,"props":10586,"children":10587},{"style":5139},[10588],{"type":35,"value":5536},{"type":29,"tag":2730,"props":10590,"children":10591},{"class":5102,"line":2142},[10592],{"type":29,"tag":2730,"props":10593,"children":10594},{"style":5139},[10595],{"type":35,"value":5255},{"type":29,"tag":2730,"props":10597,"children":10598},{"class":5102,"line":5670},[10599],{"type":29,"tag":2730,"props":10600,"children":10601},{"emptyLinePlaceholder":13},[10602],{"type":35,"value":5150},{"type":29,"tag":2730,"props":10604,"children":10605},{"class":5102,"line":5696},[10606],{"type":29,"tag":2730,"props":10607,"children":10608},{"style":5106},[10609],{"type":35,"value":10610},"// Meilleur exemple - Chaque fonction a une responsabilité unique\n",{"type":29,"tag":2730,"props":10612,"children":10613},{"class":5102,"line":6807},[10614,10618,10622,10626,10630,10634,10638,10642],{"type":29,"tag":2730,"props":10615,"children":10616},{"style":5115},[10617],{"type":35,"value":5218},{"type":29,"tag":2730,"props":10619,"children":10620},{"style":5115},[10621],{"type":35,"value":5223},{"type":29,"tag":2730,"props":10623,"children":10624},{"style":5226},[10625],{"type":35,"value":5469},{"type":29,"tag":2730,"props":10627,"children":10628},{"style":5139},[10629],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10631,"children":10632},{"style":6455},[10633],{"type":35,"value":8884},{"type":29,"tag":2730,"props":10635,"children":10636},{"style":5121},[10637],{"type":35,"value":8889},{"type":29,"tag":2730,"props":10639,"children":10640},{"style":5139},[10641],{"type":35,"value":3849},{"type":29,"tag":2730,"props":10643,"children":10644},{"style":5139},[10645],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10647,"children":10648},{"class":5102,"line":6845},[10649,10653,10657,10661,10665,10669,10673],{"type":29,"tag":2730,"props":10650,"children":10651},{"style":5115},[10652],{"type":35,"value":5493},{"type":29,"tag":2730,"props":10654,"children":10655},{"style":5139},[10656],{"type":35,"value":5293},{"type":29,"tag":2730,"props":10658,"children":10659},{"style":5121},[10660],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10662,"children":10663},{"style":5139},[10664],{"type":35,"value":332},{"type":29,"tag":2730,"props":10666,"children":10667},{"style":5226},[10668],{"type":35,"value":8930},{"type":29,"tag":2730,"props":10670,"children":10671},{"style":5139},[10672],{"type":35,"value":5387},{"type":29,"tag":2730,"props":10674,"children":10675},{"style":5139},[10676],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10678,"children":10679},{"class":5102,"line":1649},[10680,10684,10688,10692,10696,10700,10704],{"type":29,"tag":2730,"props":10681,"children":10682},{"style":5115},[10683],{"type":35,"value":8954},{"type":29,"tag":2730,"props":10685,"children":10686},{"style":5121},[10687],{"type":35,"value":8959},{"type":29,"tag":2730,"props":10689,"children":10690},{"style":5127},[10691],{"type":35,"value":5130},{"type":29,"tag":2730,"props":10693,"children":10694},{"style":5226},[10695],{"type":35,"value":9391},{"type":29,"tag":2730,"props":10697,"children":10698},{"style":5139},[10699],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10701,"children":10702},{"style":5121},[10703],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10705,"children":10706},{"style":5139},[10707],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10709,"children":10710},{"class":5102,"line":9791},[10711,10715,10719,10723,10727,10731],{"type":29,"tag":2730,"props":10712,"children":10713},{"style":5226},[10714],{"type":35,"value":10473},{"type":29,"tag":2730,"props":10716,"children":10717},{"style":5139},[10718],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10720,"children":10721},{"style":5121},[10722],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10724,"children":10725},{"style":5139},[10726],{"type":35,"value":9167},{"type":29,"tag":2730,"props":10728,"children":10729},{"style":5121},[10730],{"type":35,"value":9230},{"type":29,"tag":2730,"props":10732,"children":10733},{"style":5139},[10734],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10736,"children":10737},{"class":5102,"line":9799},[10738,10743,10747,10751],{"type":29,"tag":2730,"props":10739,"children":10740},{"style":5226},[10741],{"type":35,"value":10742},"        sendConfirmation",{"type":29,"tag":2730,"props":10744,"children":10745},{"style":5139},[10746],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10748,"children":10749},{"style":5121},[10750],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10752,"children":10753},{"style":5139},[10754],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10756,"children":10757},{"class":5102,"line":9815},[10758,10762,10766],{"type":29,"tag":2730,"props":10759,"children":10760},{"style":5139},[10761],{"type":35,"value":10536},{"type":29,"tag":2730,"props":10763,"children":10764},{"style":5115},[10765],{"type":35,"value":10541},{"type":29,"tag":2730,"props":10767,"children":10768},{"style":5139},[10769],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10771,"children":10773},{"class":5102,"line":10772},25,[10774,10779],{"type":29,"tag":2730,"props":10775,"children":10776},{"style":5226},[10777],{"type":35,"value":10778},"        handleInvalidOrder",{"type":29,"tag":2730,"props":10780,"children":10781},{"style":5139},[10782],{"type":35,"value":5334},{"type":29,"tag":2730,"props":10784,"children":10785},{"class":5102,"line":1015},[10786],{"type":29,"tag":2730,"props":10787,"children":10788},{"style":5139},[10789],{"type":35,"value":5536},{"type":29,"tag":2730,"props":10791,"children":10793},{"class":5102,"line":10792},27,[10794],{"type":29,"tag":2730,"props":10795,"children":10796},{"style":5139},[10797],{"type":35,"value":5255},{"type":29,"tag":2730,"props":10799,"children":10801},{"class":5102,"line":10800},28,[10802],{"type":29,"tag":2730,"props":10803,"children":10804},{"emptyLinePlaceholder":13},[10805],{"type":35,"value":5150},{"type":29,"tag":2730,"props":10807,"children":10809},{"class":5102,"line":10808},29,[10810,10814,10818,10822,10826,10830,10834,10838],{"type":29,"tag":2730,"props":10811,"children":10812},{"style":5115},[10813],{"type":35,"value":5649},{"type":29,"tag":2730,"props":10815,"children":10816},{"style":5115},[10817],{"type":35,"value":9501},{"type":29,"tag":2730,"props":10819,"children":10820},{"style":5226},[10821],{"type":35,"value":9391},{"type":29,"tag":2730,"props":10823,"children":10824},{"style":5139},[10825],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10827,"children":10828},{"style":6455},[10829],{"type":35,"value":8884},{"type":29,"tag":2730,"props":10831,"children":10832},{"style":5121},[10833],{"type":35,"value":8889},{"type":29,"tag":2730,"props":10835,"children":10836},{"style":5139},[10837],{"type":35,"value":3849},{"type":29,"tag":2730,"props":10839,"children":10840},{"style":5139},[10841],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10843,"children":10845},{"class":5102,"line":10844},30,[10846,10850,10854,10858,10862,10866,10870,10874,10878,10882],{"type":29,"tag":2730,"props":10847,"children":10848},{"style":5115},[10849],{"type":35,"value":5676},{"type":29,"tag":2730,"props":10851,"children":10852},{"style":5121},[10853],{"type":35,"value":8889},{"type":29,"tag":2730,"props":10855,"children":10856},{"style":5139},[10857],{"type":35,"value":332},{"type":29,"tag":2730,"props":10859,"children":10860},{"style":5226},[10861],{"type":35,"value":10425},{"type":29,"tag":2730,"props":10863,"children":10864},{"style":5139},[10865],{"type":35,"value":5234},{"type":29,"tag":2730,"props":10867,"children":10868},{"style":5127},[10869],{"type":35,"value":8368},{"type":29,"tag":2730,"props":10871,"children":10872},{"style":5226},[10873],{"type":35,"value":10438},{"type":29,"tag":2730,"props":10875,"children":10876},{"style":5139},[10877],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10879,"children":10880},{"style":5121},[10881],{"type":35,"value":8921},{"type":29,"tag":2730,"props":10883,"children":10884},{"style":5139},[10885],{"type":35,"value":7837},{"type":29,"tag":2730,"props":10887,"children":10888},{"class":5102,"line":475},[10889],{"type":29,"tag":2730,"props":10890,"children":10891},{"style":5139},[10892],{"type":35,"value":5255},{"type":29,"tag":2730,"props":10894,"children":10896},{"class":5102,"line":10895},32,[10897],{"type":29,"tag":2730,"props":10898,"children":10899},{"emptyLinePlaceholder":13},[10900],{"type":35,"value":5150},{"type":29,"tag":2730,"props":10902,"children":10904},{"class":5102,"line":10903},33,[10905,10909,10913,10918,10922,10926,10930,10934,10938,10942,10946],{"type":29,"tag":2730,"props":10906,"children":10907},{"style":5115},[10908],{"type":35,"value":5649},{"type":29,"tag":2730,"props":10910,"children":10911},{"style":5115},[10912],{"type":35,"value":5223},{"type":29,"tag":2730,"props":10914,"children":10915},{"style":5226},[10916],{"type":35,"value":10917}," processPayment",{"type":29,"tag":2730,"props":10919,"children":10920},{"style":5139},[10921],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10923,"children":10924},{"style":6455},[10925],{"type":35,"value":8884},{"type":29,"tag":2730,"props":10927,"children":10928},{"style":5121},[10929],{"type":35,"value":8889},{"type":29,"tag":2730,"props":10931,"children":10932},{"style":5139},[10933],{"type":35,"value":9167},{"type":29,"tag":2730,"props":10935,"children":10936},{"style":5115},[10937],{"type":35,"value":9501},{"type":29,"tag":2730,"props":10939,"children":10940},{"style":5121},[10941],{"type":35,"value":9230},{"type":29,"tag":2730,"props":10943,"children":10944},{"style":5139},[10945],{"type":35,"value":3849},{"type":29,"tag":2730,"props":10947,"children":10948},{"style":5139},[10949],{"type":35,"value":5239},{"type":29,"tag":2730,"props":10951,"children":10953},{"class":5102,"line":10952},34,[10954],{"type":29,"tag":2730,"props":10955,"children":10956},{"style":5106},[10957],{"type":35,"value":10958},"    // Code pour traiter le paiement\n",{"type":29,"tag":2730,"props":10960,"children":10962},{"class":5102,"line":10961},35,[10963],{"type":29,"tag":2730,"props":10964,"children":10965},{"style":5139},[10966],{"type":35,"value":5255},{"type":29,"tag":2730,"props":10968,"children":10969},{"class":5102,"line":11},[10970],{"type":29,"tag":2730,"props":10971,"children":10972},{"emptyLinePlaceholder":13},[10973],{"type":35,"value":5150},{"type":29,"tag":2730,"props":10975,"children":10977},{"class":5102,"line":10976},37,[10978,10982,10986,10991,10995,10999,11003,11007],{"type":29,"tag":2730,"props":10979,"children":10980},{"style":5115},[10981],{"type":35,"value":5649},{"type":29,"tag":2730,"props":10983,"children":10984},{"style":5115},[10985],{"type":35,"value":5223},{"type":29,"tag":2730,"props":10987,"children":10988},{"style":5226},[10989],{"type":35,"value":10990}," sendConfirmation",{"type":29,"tag":2730,"props":10992,"children":10993},{"style":5139},[10994],{"type":35,"value":6452},{"type":29,"tag":2730,"props":10996,"children":10997},{"style":6455},[10998],{"type":35,"value":8884},{"type":29,"tag":2730,"props":11000,"children":11001},{"style":5121},[11002],{"type":35,"value":8889},{"type":29,"tag":2730,"props":11004,"children":11005},{"style":5139},[11006],{"type":35,"value":3849},{"type":29,"tag":2730,"props":11008,"children":11009},{"style":5139},[11010],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11012,"children":11014},{"class":5102,"line":11013},38,[11015],{"type":29,"tag":2730,"props":11016,"children":11017},{"style":5106},[11018],{"type":35,"value":11019},"    // Code pour envoyer l'email de confirmation\n",{"type":29,"tag":2730,"props":11021,"children":11023},{"class":5102,"line":11022},39,[11024],{"type":29,"tag":2730,"props":11025,"children":11026},{"style":5139},[11027],{"type":35,"value":5255},{"type":29,"tag":2730,"props":11029,"children":11030},{"class":5102,"line":6223},[11031],{"type":29,"tag":2730,"props":11032,"children":11033},{"emptyLinePlaceholder":13},[11034],{"type":35,"value":5150},{"type":29,"tag":2730,"props":11036,"children":11038},{"class":5102,"line":11037},41,[11039,11043,11047,11052,11056],{"type":29,"tag":2730,"props":11040,"children":11041},{"style":5115},[11042],{"type":35,"value":5649},{"type":29,"tag":2730,"props":11044,"children":11045},{"style":5115},[11046],{"type":35,"value":5223},{"type":29,"tag":2730,"props":11048,"children":11049},{"style":5226},[11050],{"type":35,"value":11051}," handleInvalidOrder",{"type":29,"tag":2730,"props":11053,"children":11054},{"style":5139},[11055],{"type":35,"value":5234},{"type":29,"tag":2730,"props":11057,"children":11058},{"style":5139},[11059],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11061,"children":11063},{"class":5102,"line":11062},42,[11064,11069,11073,11077,11081,11085,11089,11093],{"type":29,"tag":2730,"props":11065,"children":11066},{"style":5121},[11067],{"type":35,"value":11068},"    System",{"type":29,"tag":2730,"props":11070,"children":11071},{"style":5139},[11072],{"type":35,"value":332},{"type":29,"tag":2730,"props":11074,"children":11075},{"style":5121},[11076],{"type":35,"value":8345},{"type":29,"tag":2730,"props":11078,"children":11079},{"style":5139},[11080],{"type":35,"value":332},{"type":29,"tag":2730,"props":11082,"children":11083},{"style":5226},[11084],{"type":35,"value":8354},{"type":29,"tag":2730,"props":11086,"children":11087},{"style":5139},[11088],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11090,"children":11091},{"style":6597},[11092],{"type":35,"value":10577},{"type":29,"tag":2730,"props":11094,"children":11095},{"style":5139},[11096],{"type":35,"value":7837},{"type":29,"tag":2730,"props":11098,"children":11100},{"class":5102,"line":11099},43,[11101],{"type":29,"tag":2730,"props":11102,"children":11103},{"style":5139},[11104],{"type":35,"value":5255},{"type":29,"tag":37,"props":11106,"children":11107},{},[11108,11110,11116],{"type":35,"value":11109},"Dans le second exemple, chaque étape du processus est divisée en fonctions plus petites et spécifiques. La fonction ",{"type":29,"tag":1716,"props":11111,"children":11113},{"className":11112},[],[11114],{"type":35,"value":11115},"processOrder",{"type":35,"value":11117}," ne fait plus qu'orchestrer les étapes, tandis que les détails comme le calcul du total ou l'envoi de l'email de confirmation sont délégués à des fonctions plus courtes et plus ciblées.",{"type":29,"tag":10266,"props":11119,"children":11120},{"type":10268},[11121],{"type":29,"tag":37,"props":11122,"children":11123},{},[11124],{"type":35,"value":11125},"Si vous voyez des commentaires dans votre code pour expliquer ce que fait une fonction, c'est souvent le signe que cette fonction fait trop de choses. Utilisez ce commentaire pour scinder la fonction en plusieurs petites.",{"type":29,"tag":66,"props":11127,"children":11128},{},[],{"type":29,"tag":166,"props":11130,"children":11132},{"cta":168,"href":169,"title":11131,"type":171},"Vous revenez sur du code écrit il y a 6 mois et vous ne comprenez plus rien ?",[11133],{"type":29,"tag":37,"props":11134,"children":11135},{},[11136],{"type":35,"value":11137},"Chaque bug fix prend 3x plus de temps que prévu, les nouvelles recrues mettent des semaines à être productives, et l'équipe passe plus de temps à décrypter qu'à créer. Réservons 30 minutes pour diagnostiquer les vrais blocages de qualité dans votre équipe et définir un plan de redressement.",{"type":29,"tag":106,"props":11139,"children":11141},{"id":11140},"_3-comment-structurer-le-code-pour-le-rendre-lisible",[11142],{"type":29,"tag":55,"props":11143,"children":11144},{},[11145],{"type":35,"value":11146},"3. Comment structurer le code pour le rendre lisible",{"type":29,"tag":37,"props":11148,"children":11149},{},[11150,11152,11156,11158,11163],{"type":35,"value":11151},"La lisibilité du code est essentielle pour un ",{"type":29,"tag":55,"props":11153,"children":11154},{},[11155],{"type":35,"value":5426},{"type":35,"value":11157},". Un code bien structuré est celui qui peut être compris facilement par un autre développeur, même sans explication supplémentaire. Pour cela, je vous recommande de suivre une ",{"type":29,"tag":55,"props":11159,"children":11160},{},[11161],{"type":35,"value":11162},"hiérarchie logique",{"type":35,"value":11164}," et d'éviter les longs blocs de code imbriqués.",{"type":29,"tag":37,"props":11166,"children":11167},{},[11168],{"type":29,"tag":55,"props":11169,"children":11170},{},[11171],{"type":35,"value":6416},{"type":29,"tag":5091,"props":11173,"children":11175},{"className":5093,"code":11174,"language":5095,"meta":8,"style":8},"// Mauvais exemple\nif (isValidUser(user)) {\n    if (hasSufficientBalance(user)) {\n        processPayment();\n    } else {\n        // ...\n    }\n} else {\n    // ...\n}\n\n// Meilleur exemple\nif (!isValidUser(user)) {\n    return;\n}\n\nif (!hasSufficientBalance(user)) {\n    return;\n}\n\nprocessPayment();\n",[11176],{"type":29,"tag":1716,"props":11177,"children":11178},{"__ignoreMap":8},[11179,11186,11219,11251,11262,11277,11285,11292,11308,11316,11323,11330,11337,11372,11383,11390,11397,11432,11443,11450,11457],{"type":29,"tag":2730,"props":11180,"children":11181},{"class":5102,"line":4267},[11182],{"type":29,"tag":2730,"props":11183,"children":11184},{"style":5106},[11185],{"type":35,"value":10180},{"type":29,"tag":2730,"props":11187,"children":11188},{"class":5102,"line":453},[11189,11193,11197,11202,11206,11211,11215],{"type":29,"tag":2730,"props":11190,"children":11191},{"style":5115},[11192],{"type":35,"value":5288},{"type":29,"tag":2730,"props":11194,"children":11195},{"style":5139},[11196],{"type":35,"value":5293},{"type":29,"tag":2730,"props":11198,"children":11199},{"style":5226},[11200],{"type":35,"value":11201},"isValidUser",{"type":29,"tag":2730,"props":11203,"children":11204},{"style":5139},[11205],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11207,"children":11208},{"style":5121},[11209],{"type":35,"value":11210},"user",{"type":29,"tag":2730,"props":11212,"children":11213},{"style":5139},[11214],{"type":35,"value":6765},{"type":29,"tag":2730,"props":11216,"children":11217},{"style":5139},[11218],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11220,"children":11221},{"class":5102,"line":459},[11222,11226,11230,11235,11239,11243,11247],{"type":29,"tag":2730,"props":11223,"children":11224},{"style":5115},[11225],{"type":35,"value":5493},{"type":29,"tag":2730,"props":11227,"children":11228},{"style":5139},[11229],{"type":35,"value":5293},{"type":29,"tag":2730,"props":11231,"children":11232},{"style":5226},[11233],{"type":35,"value":11234},"hasSufficientBalance",{"type":29,"tag":2730,"props":11236,"children":11237},{"style":5139},[11238],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11240,"children":11241},{"style":5121},[11242],{"type":35,"value":11210},{"type":29,"tag":2730,"props":11244,"children":11245},{"style":5139},[11246],{"type":35,"value":6765},{"type":29,"tag":2730,"props":11248,"children":11249},{"style":5139},[11250],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11252,"children":11253},{"class":5102,"line":5153},[11254,11258],{"type":29,"tag":2730,"props":11255,"children":11256},{"style":5226},[11257],{"type":35,"value":10473},{"type":29,"tag":2730,"props":11259,"children":11260},{"style":5139},[11261],{"type":35,"value":5334},{"type":29,"tag":2730,"props":11263,"children":11264},{"class":5102,"line":5162},[11265,11269,11273],{"type":29,"tag":2730,"props":11266,"children":11267},{"style":5139},[11268],{"type":35,"value":10536},{"type":29,"tag":2730,"props":11270,"children":11271},{"style":5115},[11272],{"type":35,"value":10541},{"type":29,"tag":2730,"props":11274,"children":11275},{"style":5139},[11276],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11278,"children":11279},{"class":5102,"line":3553},[11280],{"type":29,"tag":2730,"props":11281,"children":11282},{"style":5106},[11283],{"type":35,"value":11284},"        // ...\n",{"type":29,"tag":2730,"props":11286,"children":11287},{"class":5102,"line":5539},[11288],{"type":29,"tag":2730,"props":11289,"children":11290},{"style":5139},[11291],{"type":35,"value":5536},{"type":29,"tag":2730,"props":11293,"children":11294},{"class":5102,"line":5547},[11295,11300,11304],{"type":29,"tag":2730,"props":11296,"children":11297},{"style":5139},[11298],{"type":35,"value":11299},"}",{"type":29,"tag":2730,"props":11301,"children":11302},{"style":5115},[11303],{"type":35,"value":10541},{"type":29,"tag":2730,"props":11305,"children":11306},{"style":5139},[11307],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11309,"children":11310},{"class":5102,"line":5555},[11311],{"type":29,"tag":2730,"props":11312,"children":11313},{"style":5106},[11314],{"type":35,"value":11315},"    // ...\n",{"type":29,"tag":2730,"props":11317,"children":11318},{"class":5102,"line":5564},[11319],{"type":29,"tag":2730,"props":11320,"children":11321},{"style":5139},[11322],{"type":35,"value":5255},{"type":29,"tag":2730,"props":11324,"children":11325},{"class":5102,"line":2949},[11326],{"type":29,"tag":2730,"props":11327,"children":11328},{"emptyLinePlaceholder":13},[11329],{"type":35,"value":5150},{"type":29,"tag":2730,"props":11331,"children":11332},{"class":5102,"line":5612},[11333],{"type":29,"tag":2730,"props":11334,"children":11335},{"style":5106},[11336],{"type":35,"value":10219},{"type":29,"tag":2730,"props":11338,"children":11339},{"class":5102,"line":5620},[11340,11344,11348,11352,11356,11360,11364,11368],{"type":29,"tag":2730,"props":11341,"children":11342},{"style":5115},[11343],{"type":35,"value":5288},{"type":29,"tag":2730,"props":11345,"children":11346},{"style":5139},[11347],{"type":35,"value":5293},{"type":29,"tag":2730,"props":11349,"children":11350},{"style":5127},[11351],{"type":35,"value":9324},{"type":29,"tag":2730,"props":11353,"children":11354},{"style":5226},[11355],{"type":35,"value":11201},{"type":29,"tag":2730,"props":11357,"children":11358},{"style":5139},[11359],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11361,"children":11362},{"style":5121},[11363],{"type":35,"value":11210},{"type":29,"tag":2730,"props":11365,"children":11366},{"style":5139},[11367],{"type":35,"value":6765},{"type":29,"tag":2730,"props":11369,"children":11370},{"style":5139},[11371],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11373,"children":11374},{"class":5102,"line":5628},[11375,11379],{"type":29,"tag":2730,"props":11376,"children":11377},{"style":5115},[11378],{"type":35,"value":5676},{"type":29,"tag":2730,"props":11380,"children":11381},{"style":5139},[11382],{"type":35,"value":5142},{"type":29,"tag":2730,"props":11384,"children":11385},{"class":5102,"line":5636},[11386],{"type":29,"tag":2730,"props":11387,"children":11388},{"style":5139},[11389],{"type":35,"value":5255},{"type":29,"tag":2730,"props":11391,"children":11392},{"class":5102,"line":2142},[11393],{"type":29,"tag":2730,"props":11394,"children":11395},{"emptyLinePlaceholder":13},[11396],{"type":35,"value":5150},{"type":29,"tag":2730,"props":11398,"children":11399},{"class":5102,"line":5670},[11400,11404,11408,11412,11416,11420,11424,11428],{"type":29,"tag":2730,"props":11401,"children":11402},{"style":5115},[11403],{"type":35,"value":5288},{"type":29,"tag":2730,"props":11405,"children":11406},{"style":5139},[11407],{"type":35,"value":5293},{"type":29,"tag":2730,"props":11409,"children":11410},{"style":5127},[11411],{"type":35,"value":9324},{"type":29,"tag":2730,"props":11413,"children":11414},{"style":5226},[11415],{"type":35,"value":11234},{"type":29,"tag":2730,"props":11417,"children":11418},{"style":5139},[11419],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11421,"children":11422},{"style":5121},[11423],{"type":35,"value":11210},{"type":29,"tag":2730,"props":11425,"children":11426},{"style":5139},[11427],{"type":35,"value":6765},{"type":29,"tag":2730,"props":11429,"children":11430},{"style":5139},[11431],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11433,"children":11434},{"class":5102,"line":5696},[11435,11439],{"type":29,"tag":2730,"props":11436,"children":11437},{"style":5115},[11438],{"type":35,"value":5676},{"type":29,"tag":2730,"props":11440,"children":11441},{"style":5139},[11442],{"type":35,"value":5142},{"type":29,"tag":2730,"props":11444,"children":11445},{"class":5102,"line":6807},[11446],{"type":29,"tag":2730,"props":11447,"children":11448},{"style":5139},[11449],{"type":35,"value":5255},{"type":29,"tag":2730,"props":11451,"children":11452},{"class":5102,"line":6845},[11453],{"type":29,"tag":2730,"props":11454,"children":11455},{"emptyLinePlaceholder":13},[11456],{"type":35,"value":5150},{"type":29,"tag":2730,"props":11458,"children":11459},{"class":5102,"line":1649},[11460,11465],{"type":29,"tag":2730,"props":11461,"children":11462},{"style":5226},[11463],{"type":35,"value":11464},"processPayment",{"type":29,"tag":2730,"props":11466,"children":11467},{"style":5139},[11468],{"type":35,"value":5334},{"type":29,"tag":37,"props":11470,"children":11471},{},[11472],{"type":35,"value":11473},"Dans le deuxième exemple, la structure est plus claire : chaque condition est traitée séparément, et on élimine les cas d'erreur au début. Cela permet à celui qui lit le code de suivre le flux de manière plus fluide.",{"type":29,"tag":66,"props":11475,"children":11476},{},[],{"type":29,"tag":70,"props":11478,"children":11480},{"id":11479},"exemples-de-clean-code-en-java",[11481],{"type":29,"tag":55,"props":11482,"children":11483},{},[11484],{"type":35,"value":11485},"Exemples de Clean Code en Java",{"type":29,"tag":37,"props":11487,"children":11488},{},[11489,11491,11495,11497,11501],{"type":35,"value":11490},"Rien ne vaut des exemples concrets pour mieux comprendre comment appliquer les principes du ",{"type":29,"tag":55,"props":11492,"children":11493},{},[11494],{"type":35,"value":5426},{"type":35,"value":11496},". Voici quelques exemples pratiques en ",{"type":29,"tag":55,"props":11498,"children":11499},{},[11500],{"type":35,"value":10106},{"type":35,"value":11502},", basés sur les principes vus précédemment. Ces exemples vous montreront comment améliorer la clarté, la lisibilité et la maintenabilité de votre code.",{"type":29,"tag":106,"props":11504,"children":11506},{"id":11505},"_1-variables-bien-nommées",[11507],{"type":29,"tag":55,"props":11508,"children":11509},{},[11510],{"type":35,"value":11511},"1. Variables bien nommées",{"type":29,"tag":37,"props":11513,"children":11514},{},[11515,11517,11521],{"type":35,"value":11516},"Donner des noms explicites aux variables est l'une des bases du ",{"type":29,"tag":55,"props":11518,"children":11519},{},[11520],{"type":35,"value":5426},{"type":35,"value":11522},". Cela permet de rendre votre code compréhensible sans avoir besoin de commentaires supplémentaires.",{"type":29,"tag":37,"props":11524,"children":11525},{},[11526],{"type":29,"tag":55,"props":11527,"children":11528},{},[11529],{"type":35,"value":6416},{"type":29,"tag":5091,"props":11531,"children":11533},{"className":5093,"code":11532,"language":5095,"meta":8,"style":8},"// Mauvais exemple\ndouble v = getVolume();\n\n// Meilleur exemple\ndouble volumeDeLaBoite = getVolume();\n",[11534],{"type":29,"tag":1716,"props":11535,"children":11536},{"__ignoreMap":8},[11537,11544,11570,11577,11584],{"type":29,"tag":2730,"props":11538,"children":11539},{"class":5102,"line":4267},[11540],{"type":29,"tag":2730,"props":11541,"children":11542},{"style":5106},[11543],{"type":35,"value":10180},{"type":29,"tag":2730,"props":11545,"children":11546},{"class":5102,"line":453},[11547,11552,11557,11561,11566],{"type":29,"tag":2730,"props":11548,"children":11549},{"style":5115},[11550],{"type":35,"value":11551},"double",{"type":29,"tag":2730,"props":11553,"children":11554},{"style":5121},[11555],{"type":35,"value":11556}," v ",{"type":29,"tag":2730,"props":11558,"children":11559},{"style":5127},[11560],{"type":35,"value":5130},{"type":29,"tag":2730,"props":11562,"children":11563},{"style":5226},[11564],{"type":35,"value":11565}," getVolume",{"type":29,"tag":2730,"props":11567,"children":11568},{"style":5139},[11569],{"type":35,"value":5334},{"type":29,"tag":2730,"props":11571,"children":11572},{"class":5102,"line":459},[11573],{"type":29,"tag":2730,"props":11574,"children":11575},{"emptyLinePlaceholder":13},[11576],{"type":35,"value":5150},{"type":29,"tag":2730,"props":11578,"children":11579},{"class":5102,"line":5153},[11580],{"type":29,"tag":2730,"props":11581,"children":11582},{"style":5106},[11583],{"type":35,"value":10219},{"type":29,"tag":2730,"props":11585,"children":11586},{"class":5102,"line":5162},[11587,11591,11596,11600,11604],{"type":29,"tag":2730,"props":11588,"children":11589},{"style":5115},[11590],{"type":35,"value":11551},{"type":29,"tag":2730,"props":11592,"children":11593},{"style":5121},[11594],{"type":35,"value":11595}," volumeDeLaBoite ",{"type":29,"tag":2730,"props":11597,"children":11598},{"style":5127},[11599],{"type":35,"value":5130},{"type":29,"tag":2730,"props":11601,"children":11602},{"style":5226},[11603],{"type":35,"value":11565},{"type":29,"tag":2730,"props":11605,"children":11606},{"style":5139},[11607],{"type":35,"value":5334},{"type":29,"tag":37,"props":11609,"children":11610},{},[11611,11613,11619,11621,11627],{"type":35,"value":11612},"Dans le second exemple, le nom ",{"type":29,"tag":1716,"props":11614,"children":11616},{"className":11615},[],[11617],{"type":35,"value":11618},"volumeDeLaBoite",{"type":35,"value":11620}," explique clairement ce que représente cette donnée, tandis que ",{"type":29,"tag":1716,"props":11622,"children":11624},{"className":11623},[],[11625],{"type":35,"value":11626},"v",{"type":35,"value":11628}," est trop vague. On facilite ainsi la compréhension du code sans avoir besoin de lire toute la logique.",{"type":29,"tag":10266,"props":11630,"children":11631},{"type":10268},[11632],{"type":29,"tag":37,"props":11633,"children":11634},{},[11635,11637,11642,11644,11649,11651,11656,11658,11662],{"type":35,"value":11636},"Un bon nom de variable devrait dire ",{"type":29,"tag":55,"props":11638,"children":11639},{},[11640],{"type":35,"value":11641},"quoi",{"type":35,"value":11643},", pas ",{"type":29,"tag":55,"props":11645,"children":11646},{},[11647],{"type":35,"value":11648},"comment",{"type":35,"value":11650},". Par exemple, ",{"type":29,"tag":1716,"props":11652,"children":11654},{"className":11653},[],[11655],{"type":35,"value":11618},{"type":35,"value":11657}," explique ",{"type":29,"tag":55,"props":11659,"children":11660},{},[11661],{"type":35,"value":11641},{"type":35,"value":11663}," mesure cette variable, pas comment elle est calculée.",{"type":29,"tag":66,"props":11665,"children":11666},{},[],{"type":29,"tag":106,"props":11668,"children":11670},{"id":11669},"_2-fonctions-courtes-et-focalisées",[11671],{"type":29,"tag":55,"props":11672,"children":11673},{},[11674],{"type":35,"value":11675},"2. Fonctions courtes et focalisées",{"type":29,"tag":37,"props":11677,"children":11678},{},[11679],{"type":35,"value":11680},"Une bonne fonction doit être courte et se concentrer sur une seule responsabilité. Cela rend votre code plus lisible et plus facile à tester.",{"type":29,"tag":37,"props":11682,"children":11683},{},[11684],{"type":29,"tag":55,"props":11685,"children":11686},{},[11687],{"type":35,"value":6416},{"type":29,"tag":5091,"props":11689,"children":11691},{"className":5093,"code":11690,"language":5095,"meta":8,"style":8},"// Mauvais exemple\npublic void calculerEtEnvoyerFacture(Client client) {\n    // Calcul des montants\n    double montantHT = client.getPrixHT();\n    double taxe = montantHT * 0.2;\n    double montantTotal = montantHT + taxe;\n    \n    // Envoi du mail\n    String message = \"Facture envoyée\";\n    envoyerMail(client.getEmail(), message);\n}\n\n// Meilleur exemple\npublic double calculerMontantTotal(Client client) {\n    double montantHT = client.getPrixHT();\n    double taxe = montantHT * 0.2;\n    return montantHT + taxe;\n}\n\npublic void envoyerFacture(Client client) {\n    envoyerMail(client.getEmail(), \"Facture envoyée\");\n}\n",[11692],{"type":29,"tag":1716,"props":11693,"children":11694},{"__ignoreMap":8},[11695,11702,11740,11748,11781,11815,11849,11856,11864,11890,11929,11936,11943,11950,11986,12017,12048,12071,12078,12085,12121,12156],{"type":29,"tag":2730,"props":11696,"children":11697},{"class":5102,"line":4267},[11698],{"type":29,"tag":2730,"props":11699,"children":11700},{"style":5106},[11701],{"type":35,"value":10180},{"type":29,"tag":2730,"props":11703,"children":11704},{"class":5102,"line":453},[11705,11709,11713,11718,11722,11727,11732,11736],{"type":29,"tag":2730,"props":11706,"children":11707},{"style":5115},[11708],{"type":35,"value":5218},{"type":29,"tag":2730,"props":11710,"children":11711},{"style":5115},[11712],{"type":35,"value":5223},{"type":29,"tag":2730,"props":11714,"children":11715},{"style":5226},[11716],{"type":35,"value":11717}," calculerEtEnvoyerFacture",{"type":29,"tag":2730,"props":11719,"children":11720},{"style":5139},[11721],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11723,"children":11724},{"style":6455},[11725],{"type":35,"value":11726},"Client",{"type":29,"tag":2730,"props":11728,"children":11729},{"style":5121},[11730],{"type":35,"value":11731}," client",{"type":29,"tag":2730,"props":11733,"children":11734},{"style":5139},[11735],{"type":35,"value":3849},{"type":29,"tag":2730,"props":11737,"children":11738},{"style":5139},[11739],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11741,"children":11742},{"class":5102,"line":459},[11743],{"type":29,"tag":2730,"props":11744,"children":11745},{"style":5106},[11746],{"type":35,"value":11747},"    // Calcul des montants\n",{"type":29,"tag":2730,"props":11749,"children":11750},{"class":5102,"line":5153},[11751,11755,11760,11764,11768,11772,11777],{"type":29,"tag":2730,"props":11752,"children":11753},{"style":5115},[11754],{"type":35,"value":9378},{"type":29,"tag":2730,"props":11756,"children":11757},{"style":5121},[11758],{"type":35,"value":11759}," montantHT ",{"type":29,"tag":2730,"props":11761,"children":11762},{"style":5127},[11763],{"type":35,"value":5130},{"type":29,"tag":2730,"props":11765,"children":11766},{"style":5121},[11767],{"type":35,"value":11731},{"type":29,"tag":2730,"props":11769,"children":11770},{"style":5139},[11771],{"type":35,"value":332},{"type":29,"tag":2730,"props":11773,"children":11774},{"style":5226},[11775],{"type":35,"value":11776},"getPrixHT",{"type":29,"tag":2730,"props":11778,"children":11779},{"style":5139},[11780],{"type":35,"value":5334},{"type":29,"tag":2730,"props":11782,"children":11783},{"class":5102,"line":5162},[11784,11788,11793,11797,11801,11806,11811],{"type":29,"tag":2730,"props":11785,"children":11786},{"style":5115},[11787],{"type":35,"value":9378},{"type":29,"tag":2730,"props":11789,"children":11790},{"style":5121},[11791],{"type":35,"value":11792}," taxe ",{"type":29,"tag":2730,"props":11794,"children":11795},{"style":5127},[11796],{"type":35,"value":5130},{"type":29,"tag":2730,"props":11798,"children":11799},{"style":5121},[11800],{"type":35,"value":11759},{"type":29,"tag":2730,"props":11802,"children":11803},{"style":5127},[11804],{"type":35,"value":11805},"*",{"type":29,"tag":2730,"props":11807,"children":11808},{"style":5133},[11809],{"type":35,"value":11810}," 0.2",{"type":29,"tag":2730,"props":11812,"children":11813},{"style":5139},[11814],{"type":35,"value":5142},{"type":29,"tag":2730,"props":11816,"children":11817},{"class":5102,"line":3553},[11818,11822,11827,11831,11835,11840,11845],{"type":29,"tag":2730,"props":11819,"children":11820},{"style":5115},[11821],{"type":35,"value":9378},{"type":29,"tag":2730,"props":11823,"children":11824},{"style":5121},[11825],{"type":35,"value":11826}," montantTotal ",{"type":29,"tag":2730,"props":11828,"children":11829},{"style":5127},[11830],{"type":35,"value":5130},{"type":29,"tag":2730,"props":11832,"children":11833},{"style":5121},[11834],{"type":35,"value":11759},{"type":29,"tag":2730,"props":11836,"children":11837},{"style":5127},[11838],{"type":35,"value":11839},"+",{"type":29,"tag":2730,"props":11841,"children":11842},{"style":5121},[11843],{"type":35,"value":11844}," taxe",{"type":29,"tag":2730,"props":11846,"children":11847},{"style":5139},[11848],{"type":35,"value":5142},{"type":29,"tag":2730,"props":11850,"children":11851},{"class":5102,"line":5539},[11852],{"type":29,"tag":2730,"props":11853,"children":11854},{"style":5121},[11855],{"type":35,"value":9370},{"type":29,"tag":2730,"props":11857,"children":11858},{"class":5102,"line":5547},[11859],{"type":29,"tag":2730,"props":11860,"children":11861},{"style":5106},[11862],{"type":35,"value":11863},"    // Envoi du mail\n",{"type":29,"tag":2730,"props":11865,"children":11866},{"class":5102,"line":5555},[11867,11872,11877,11881,11886],{"type":29,"tag":2730,"props":11868,"children":11869},{"style":6455},[11870],{"type":35,"value":11871},"    String",{"type":29,"tag":2730,"props":11873,"children":11874},{"style":5121},[11875],{"type":35,"value":11876}," message ",{"type":29,"tag":2730,"props":11878,"children":11879},{"style":5127},[11880],{"type":35,"value":5130},{"type":29,"tag":2730,"props":11882,"children":11883},{"style":6597},[11884],{"type":35,"value":11885}," \"Facture envoyée\"",{"type":29,"tag":2730,"props":11887,"children":11888},{"style":5139},[11889],{"type":35,"value":5142},{"type":29,"tag":2730,"props":11891,"children":11892},{"class":5102,"line":5564},[11893,11898,11902,11907,11911,11915,11920,11925],{"type":29,"tag":2730,"props":11894,"children":11895},{"style":5226},[11896],{"type":35,"value":11897},"    envoyerMail",{"type":29,"tag":2730,"props":11899,"children":11900},{"style":5139},[11901],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11903,"children":11904},{"style":5121},[11905],{"type":35,"value":11906},"client",{"type":29,"tag":2730,"props":11908,"children":11909},{"style":5139},[11910],{"type":35,"value":332},{"type":29,"tag":2730,"props":11912,"children":11913},{"style":5226},[11914],{"type":35,"value":7398},{"type":29,"tag":2730,"props":11916,"children":11917},{"style":5139},[11918],{"type":35,"value":11919},"(),",{"type":29,"tag":2730,"props":11921,"children":11922},{"style":5121},[11923],{"type":35,"value":11924}," message",{"type":29,"tag":2730,"props":11926,"children":11927},{"style":5139},[11928],{"type":35,"value":7837},{"type":29,"tag":2730,"props":11930,"children":11931},{"class":5102,"line":2949},[11932],{"type":29,"tag":2730,"props":11933,"children":11934},{"style":5139},[11935],{"type":35,"value":5255},{"type":29,"tag":2730,"props":11937,"children":11938},{"class":5102,"line":5612},[11939],{"type":29,"tag":2730,"props":11940,"children":11941},{"emptyLinePlaceholder":13},[11942],{"type":35,"value":5150},{"type":29,"tag":2730,"props":11944,"children":11945},{"class":5102,"line":5620},[11946],{"type":29,"tag":2730,"props":11947,"children":11948},{"style":5106},[11949],{"type":35,"value":10219},{"type":29,"tag":2730,"props":11951,"children":11952},{"class":5102,"line":5628},[11953,11957,11961,11966,11970,11974,11978,11982],{"type":29,"tag":2730,"props":11954,"children":11955},{"style":5115},[11956],{"type":35,"value":5218},{"type":29,"tag":2730,"props":11958,"children":11959},{"style":5115},[11960],{"type":35,"value":9501},{"type":29,"tag":2730,"props":11962,"children":11963},{"style":5226},[11964],{"type":35,"value":11965}," calculerMontantTotal",{"type":29,"tag":2730,"props":11967,"children":11968},{"style":5139},[11969],{"type":35,"value":6452},{"type":29,"tag":2730,"props":11971,"children":11972},{"style":6455},[11973],{"type":35,"value":11726},{"type":29,"tag":2730,"props":11975,"children":11976},{"style":5121},[11977],{"type":35,"value":11731},{"type":29,"tag":2730,"props":11979,"children":11980},{"style":5139},[11981],{"type":35,"value":3849},{"type":29,"tag":2730,"props":11983,"children":11984},{"style":5139},[11985],{"type":35,"value":5239},{"type":29,"tag":2730,"props":11987,"children":11988},{"class":5102,"line":5636},[11989,11993,11997,12001,12005,12009,12013],{"type":29,"tag":2730,"props":11990,"children":11991},{"style":5115},[11992],{"type":35,"value":9378},{"type":29,"tag":2730,"props":11994,"children":11995},{"style":5121},[11996],{"type":35,"value":11759},{"type":29,"tag":2730,"props":11998,"children":11999},{"style":5127},[12000],{"type":35,"value":5130},{"type":29,"tag":2730,"props":12002,"children":12003},{"style":5121},[12004],{"type":35,"value":11731},{"type":29,"tag":2730,"props":12006,"children":12007},{"style":5139},[12008],{"type":35,"value":332},{"type":29,"tag":2730,"props":12010,"children":12011},{"style":5226},[12012],{"type":35,"value":11776},{"type":29,"tag":2730,"props":12014,"children":12015},{"style":5139},[12016],{"type":35,"value":5334},{"type":29,"tag":2730,"props":12018,"children":12019},{"class":5102,"line":2142},[12020,12024,12028,12032,12036,12040,12044],{"type":29,"tag":2730,"props":12021,"children":12022},{"style":5115},[12023],{"type":35,"value":9378},{"type":29,"tag":2730,"props":12025,"children":12026},{"style":5121},[12027],{"type":35,"value":11792},{"type":29,"tag":2730,"props":12029,"children":12030},{"style":5127},[12031],{"type":35,"value":5130},{"type":29,"tag":2730,"props":12033,"children":12034},{"style":5121},[12035],{"type":35,"value":11759},{"type":29,"tag":2730,"props":12037,"children":12038},{"style":5127},[12039],{"type":35,"value":11805},{"type":29,"tag":2730,"props":12041,"children":12042},{"style":5133},[12043],{"type":35,"value":11810},{"type":29,"tag":2730,"props":12045,"children":12046},{"style":5139},[12047],{"type":35,"value":5142},{"type":29,"tag":2730,"props":12049,"children":12050},{"class":5102,"line":5670},[12051,12055,12059,12063,12067],{"type":29,"tag":2730,"props":12052,"children":12053},{"style":5115},[12054],{"type":35,"value":5676},{"type":29,"tag":2730,"props":12056,"children":12057},{"style":5121},[12058],{"type":35,"value":11759},{"type":29,"tag":2730,"props":12060,"children":12061},{"style":5127},[12062],{"type":35,"value":11839},{"type":29,"tag":2730,"props":12064,"children":12065},{"style":5121},[12066],{"type":35,"value":11844},{"type":29,"tag":2730,"props":12068,"children":12069},{"style":5139},[12070],{"type":35,"value":5142},{"type":29,"tag":2730,"props":12072,"children":12073},{"class":5102,"line":5696},[12074],{"type":29,"tag":2730,"props":12075,"children":12076},{"style":5139},[12077],{"type":35,"value":5255},{"type":29,"tag":2730,"props":12079,"children":12080},{"class":5102,"line":6807},[12081],{"type":29,"tag":2730,"props":12082,"children":12083},{"emptyLinePlaceholder":13},[12084],{"type":35,"value":5150},{"type":29,"tag":2730,"props":12086,"children":12087},{"class":5102,"line":6845},[12088,12092,12096,12101,12105,12109,12113,12117],{"type":29,"tag":2730,"props":12089,"children":12090},{"style":5115},[12091],{"type":35,"value":5218},{"type":29,"tag":2730,"props":12093,"children":12094},{"style":5115},[12095],{"type":35,"value":5223},{"type":29,"tag":2730,"props":12097,"children":12098},{"style":5226},[12099],{"type":35,"value":12100}," envoyerFacture",{"type":29,"tag":2730,"props":12102,"children":12103},{"style":5139},[12104],{"type":35,"value":6452},{"type":29,"tag":2730,"props":12106,"children":12107},{"style":6455},[12108],{"type":35,"value":11726},{"type":29,"tag":2730,"props":12110,"children":12111},{"style":5121},[12112],{"type":35,"value":11731},{"type":29,"tag":2730,"props":12114,"children":12115},{"style":5139},[12116],{"type":35,"value":3849},{"type":29,"tag":2730,"props":12118,"children":12119},{"style":5139},[12120],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12122,"children":12123},{"class":5102,"line":1649},[12124,12128,12132,12136,12140,12144,12148,12152],{"type":29,"tag":2730,"props":12125,"children":12126},{"style":5226},[12127],{"type":35,"value":11897},{"type":29,"tag":2730,"props":12129,"children":12130},{"style":5139},[12131],{"type":35,"value":6452},{"type":29,"tag":2730,"props":12133,"children":12134},{"style":5121},[12135],{"type":35,"value":11906},{"type":29,"tag":2730,"props":12137,"children":12138},{"style":5139},[12139],{"type":35,"value":332},{"type":29,"tag":2730,"props":12141,"children":12142},{"style":5226},[12143],{"type":35,"value":7398},{"type":29,"tag":2730,"props":12145,"children":12146},{"style":5139},[12147],{"type":35,"value":11919},{"type":29,"tag":2730,"props":12149,"children":12150},{"style":6597},[12151],{"type":35,"value":11885},{"type":29,"tag":2730,"props":12153,"children":12154},{"style":5139},[12155],{"type":35,"value":7837},{"type":29,"tag":2730,"props":12157,"children":12158},{"class":5102,"line":9791},[12159],{"type":29,"tag":2730,"props":12160,"children":12161},{"style":5139},[12162],{"type":35,"value":5255},{"type":29,"tag":37,"props":12164,"children":12165},{},[12166],{"type":35,"value":12167},"Dans le second exemple, la logique de calcul est séparée de la logique d'envoi d'email, ce qui permet une meilleure lisibilité et une plus grande facilité pour tester chaque fonction individuellement.",{"type":29,"tag":10266,"props":12169,"children":12170},{"type":10268},[12171],{"type":29,"tag":37,"props":12172,"children":12173},{},[12174],{"type":35,"value":12175},"Si une fonction fait plus de 20 lignes, demandez-vous s'il est possible de la diviser en plusieurs fonctions plus petites. Cela aidera non seulement à la rendre plus lisible, mais aussi à isoler les responsabilités.",{"type":29,"tag":66,"props":12177,"children":12178},{},[],{"type":29,"tag":106,"props":12180,"children":12182},{"id":12181},"_3-bonne-gestion-des-exceptions",[12183],{"type":29,"tag":55,"props":12184,"children":12185},{},[12186],{"type":35,"value":12187},"3. Bonne gestion des exceptions",{"type":29,"tag":37,"props":12189,"children":12190},{},[12191],{"type":35,"value":12192},"La gestion des erreurs et des exceptions est souvent négligée, mais elle joue un rôle clé dans un code propre. Un bon code doit être capable de traiter les erreurs de manière claire et concise, sans masquer les problèmes.",{"type":29,"tag":37,"props":12194,"children":12195},{},[12196],{"type":29,"tag":55,"props":12197,"children":12198},{},[12199],{"type":35,"value":6416},{"type":29,"tag":5091,"props":12201,"children":12203},{"className":5093,"code":12202,"language":5095,"meta":8,"style":8},"// Mauvais exemple\ntry {\n    processOrder(order);\n} catch (Exception e) {\n    System.out.println(\"Erreur lors du traitement de la commande\");\n}\n\n// Meilleur exemple\ntry {\n    processOrder(order);\n} catch (InvalidOrderException e) {\n    System.out.println(\"Commande invalide : \" + e.getMessage());\n} catch (PaymentFailedException e) {\n    System.out.println(\"Échec du paiement : \" + e.getMessage());\n}\n",[12204],{"type":29,"tag":1716,"props":12205,"children":12206},{"__ignoreMap":8},[12207,12214,12226,12246,12280,12316,12323,12330,12337,12348,12367,12399,12452,12484,12536],{"type":29,"tag":2730,"props":12208,"children":12209},{"class":5102,"line":4267},[12210],{"type":29,"tag":2730,"props":12211,"children":12212},{"style":5106},[12213],{"type":35,"value":10180},{"type":29,"tag":2730,"props":12215,"children":12216},{"class":5102,"line":453},[12217,12222],{"type":29,"tag":2730,"props":12218,"children":12219},{"style":5115},[12220],{"type":35,"value":12221},"try",{"type":29,"tag":2730,"props":12223,"children":12224},{"style":5139},[12225],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12227,"children":12228},{"class":5102,"line":459},[12229,12234,12238,12242],{"type":29,"tag":2730,"props":12230,"children":12231},{"style":5226},[12232],{"type":35,"value":12233},"    processOrder",{"type":29,"tag":2730,"props":12235,"children":12236},{"style":5139},[12237],{"type":35,"value":6452},{"type":29,"tag":2730,"props":12239,"children":12240},{"style":5121},[12241],{"type":35,"value":8921},{"type":29,"tag":2730,"props":12243,"children":12244},{"style":5139},[12245],{"type":35,"value":7837},{"type":29,"tag":2730,"props":12247,"children":12248},{"class":5102,"line":5153},[12249,12253,12258,12262,12267,12272,12276],{"type":29,"tag":2730,"props":12250,"children":12251},{"style":5139},[12252],{"type":35,"value":11299},{"type":29,"tag":2730,"props":12254,"children":12255},{"style":5115},[12256],{"type":35,"value":12257}," catch",{"type":29,"tag":2730,"props":12259,"children":12260},{"style":5139},[12261],{"type":35,"value":5293},{"type":29,"tag":2730,"props":12263,"children":12264},{"style":6455},[12265],{"type":35,"value":12266},"Exception",{"type":29,"tag":2730,"props":12268,"children":12269},{"style":8317},[12270],{"type":35,"value":12271}," e",{"type":29,"tag":2730,"props":12273,"children":12274},{"style":5139},[12275],{"type":35,"value":3849},{"type":29,"tag":2730,"props":12277,"children":12278},{"style":5139},[12279],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12281,"children":12282},{"class":5102,"line":5162},[12283,12287,12291,12295,12299,12303,12307,12312],{"type":29,"tag":2730,"props":12284,"children":12285},{"style":5121},[12286],{"type":35,"value":11068},{"type":29,"tag":2730,"props":12288,"children":12289},{"style":5139},[12290],{"type":35,"value":332},{"type":29,"tag":2730,"props":12292,"children":12293},{"style":5121},[12294],{"type":35,"value":8345},{"type":29,"tag":2730,"props":12296,"children":12297},{"style":5139},[12298],{"type":35,"value":332},{"type":29,"tag":2730,"props":12300,"children":12301},{"style":5226},[12302],{"type":35,"value":8354},{"type":29,"tag":2730,"props":12304,"children":12305},{"style":5139},[12306],{"type":35,"value":6452},{"type":29,"tag":2730,"props":12308,"children":12309},{"style":6597},[12310],{"type":35,"value":12311},"\"Erreur lors du traitement de la commande\"",{"type":29,"tag":2730,"props":12313,"children":12314},{"style":5139},[12315],{"type":35,"value":7837},{"type":29,"tag":2730,"props":12317,"children":12318},{"class":5102,"line":3553},[12319],{"type":29,"tag":2730,"props":12320,"children":12321},{"style":5139},[12322],{"type":35,"value":5255},{"type":29,"tag":2730,"props":12324,"children":12325},{"class":5102,"line":5539},[12326],{"type":29,"tag":2730,"props":12327,"children":12328},{"emptyLinePlaceholder":13},[12329],{"type":35,"value":5150},{"type":29,"tag":2730,"props":12331,"children":12332},{"class":5102,"line":5547},[12333],{"type":29,"tag":2730,"props":12334,"children":12335},{"style":5106},[12336],{"type":35,"value":10219},{"type":29,"tag":2730,"props":12338,"children":12339},{"class":5102,"line":5555},[12340,12344],{"type":29,"tag":2730,"props":12341,"children":12342},{"style":5115},[12343],{"type":35,"value":12221},{"type":29,"tag":2730,"props":12345,"children":12346},{"style":5139},[12347],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12349,"children":12350},{"class":5102,"line":5564},[12351,12355,12359,12363],{"type":29,"tag":2730,"props":12352,"children":12353},{"style":5226},[12354],{"type":35,"value":12233},{"type":29,"tag":2730,"props":12356,"children":12357},{"style":5139},[12358],{"type":35,"value":6452},{"type":29,"tag":2730,"props":12360,"children":12361},{"style":5121},[12362],{"type":35,"value":8921},{"type":29,"tag":2730,"props":12364,"children":12365},{"style":5139},[12366],{"type":35,"value":7837},{"type":29,"tag":2730,"props":12368,"children":12369},{"class":5102,"line":2949},[12370,12374,12378,12382,12387,12391,12395],{"type":29,"tag":2730,"props":12371,"children":12372},{"style":5139},[12373],{"type":35,"value":11299},{"type":29,"tag":2730,"props":12375,"children":12376},{"style":5115},[12377],{"type":35,"value":12257},{"type":29,"tag":2730,"props":12379,"children":12380},{"style":5139},[12381],{"type":35,"value":5293},{"type":29,"tag":2730,"props":12383,"children":12384},{"style":6455},[12385],{"type":35,"value":12386},"InvalidOrderException",{"type":29,"tag":2730,"props":12388,"children":12389},{"style":8317},[12390],{"type":35,"value":12271},{"type":29,"tag":2730,"props":12392,"children":12393},{"style":5139},[12394],{"type":35,"value":3849},{"type":29,"tag":2730,"props":12396,"children":12397},{"style":5139},[12398],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12400,"children":12401},{"class":5102,"line":5612},[12402,12406,12410,12414,12418,12422,12426,12431,12435,12439,12443,12448],{"type":29,"tag":2730,"props":12403,"children":12404},{"style":5121},[12405],{"type":35,"value":11068},{"type":29,"tag":2730,"props":12407,"children":12408},{"style":5139},[12409],{"type":35,"value":332},{"type":29,"tag":2730,"props":12411,"children":12412},{"style":5121},[12413],{"type":35,"value":8345},{"type":29,"tag":2730,"props":12415,"children":12416},{"style":5139},[12417],{"type":35,"value":332},{"type":29,"tag":2730,"props":12419,"children":12420},{"style":5226},[12421],{"type":35,"value":8354},{"type":29,"tag":2730,"props":12423,"children":12424},{"style":5139},[12425],{"type":35,"value":6452},{"type":29,"tag":2730,"props":12427,"children":12428},{"style":6597},[12429],{"type":35,"value":12430},"\"Commande invalide : \"",{"type":29,"tag":2730,"props":12432,"children":12433},{"style":5127},[12434],{"type":35,"value":8368},{"type":29,"tag":2730,"props":12436,"children":12437},{"style":5121},[12438],{"type":35,"value":12271},{"type":29,"tag":2730,"props":12440,"children":12441},{"style":5139},[12442],{"type":35,"value":332},{"type":29,"tag":2730,"props":12444,"children":12445},{"style":5226},[12446],{"type":35,"value":12447},"getMessage",{"type":29,"tag":2730,"props":12449,"children":12450},{"style":5139},[12451],{"type":35,"value":8385},{"type":29,"tag":2730,"props":12453,"children":12454},{"class":5102,"line":5620},[12455,12459,12463,12467,12472,12476,12480],{"type":29,"tag":2730,"props":12456,"children":12457},{"style":5139},[12458],{"type":35,"value":11299},{"type":29,"tag":2730,"props":12460,"children":12461},{"style":5115},[12462],{"type":35,"value":12257},{"type":29,"tag":2730,"props":12464,"children":12465},{"style":5139},[12466],{"type":35,"value":5293},{"type":29,"tag":2730,"props":12468,"children":12469},{"style":6455},[12470],{"type":35,"value":12471},"PaymentFailedException",{"type":29,"tag":2730,"props":12473,"children":12474},{"style":8317},[12475],{"type":35,"value":12271},{"type":29,"tag":2730,"props":12477,"children":12478},{"style":5139},[12479],{"type":35,"value":3849},{"type":29,"tag":2730,"props":12481,"children":12482},{"style":5139},[12483],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12485,"children":12486},{"class":5102,"line":5628},[12487,12491,12495,12499,12503,12507,12511,12516,12520,12524,12528,12532],{"type":29,"tag":2730,"props":12488,"children":12489},{"style":5121},[12490],{"type":35,"value":11068},{"type":29,"tag":2730,"props":12492,"children":12493},{"style":5139},[12494],{"type":35,"value":332},{"type":29,"tag":2730,"props":12496,"children":12497},{"style":5121},[12498],{"type":35,"value":8345},{"type":29,"tag":2730,"props":12500,"children":12501},{"style":5139},[12502],{"type":35,"value":332},{"type":29,"tag":2730,"props":12504,"children":12505},{"style":5226},[12506],{"type":35,"value":8354},{"type":29,"tag":2730,"props":12508,"children":12509},{"style":5139},[12510],{"type":35,"value":6452},{"type":29,"tag":2730,"props":12512,"children":12513},{"style":6597},[12514],{"type":35,"value":12515},"\"Échec du paiement : \"",{"type":29,"tag":2730,"props":12517,"children":12518},{"style":5127},[12519],{"type":35,"value":8368},{"type":29,"tag":2730,"props":12521,"children":12522},{"style":5121},[12523],{"type":35,"value":12271},{"type":29,"tag":2730,"props":12525,"children":12526},{"style":5139},[12527],{"type":35,"value":332},{"type":29,"tag":2730,"props":12529,"children":12530},{"style":5226},[12531],{"type":35,"value":12447},{"type":29,"tag":2730,"props":12533,"children":12534},{"style":5139},[12535],{"type":35,"value":8385},{"type":29,"tag":2730,"props":12537,"children":12538},{"class":5102,"line":5636},[12539],{"type":29,"tag":2730,"props":12540,"children":12541},{"style":5139},[12542],{"type":35,"value":5255},{"type":29,"tag":37,"props":12544,"children":12545},{},[12546],{"type":35,"value":12547},"Dans le second exemple, chaque type d'erreur est traité de manière spécifique, ce qui permet de mieux comprendre ce qui ne va pas et de réagir en conséquence.",{"type":29,"tag":10266,"props":12549,"children":12550},{"type":10268},[12551],{"type":29,"tag":37,"props":12552,"children":12553},{},[12554,12556,12562],{"type":35,"value":12555},"Évitez de capturer toutes les exceptions avec un ",{"type":29,"tag":1716,"props":12557,"children":12559},{"className":12558},[],[12560],{"type":35,"value":12561},"catch (Exception e)",{"type":35,"value":12563},". Cela rend le débogage plus difficile et masque les problèmes spécifiques.",{"type":29,"tag":66,"props":12565,"children":12566},{},[],{"type":29,"tag":70,"props":12568,"children":12570},{"id":12569},"les-bonnes-pratiques-pour-écrire-du-code-maintenable",[12571],{"type":29,"tag":55,"props":12572,"children":12573},{},[12574],{"type":35,"value":12575},"Les bonnes pratiques pour écrire du code maintenable",{"type":29,"tag":37,"props":12577,"children":12578},{},[12579,12580,12584],{"type":35,"value":5420},{"type":29,"tag":55,"props":12581,"children":12582},{},[12583],{"type":35,"value":5426},{"type":35,"value":12585}," ne se limite pas à écrire du code lisible ; il doit aussi être facilement maintenable et évolutif. Voici quelques bonnes pratiques pour s'assurer que votre code reste propre même après plusieurs itérations.",{"type":29,"tag":106,"props":12587,"children":12589},{"id":12588},"_1-le-principe-de-responsabilité-unique-single-responsibility-principle-srp",[12590],{"type":29,"tag":55,"props":12591,"children":12592},{},[12593],{"type":35,"value":12594},"1. Le principe de responsabilité unique (Single Responsibility Principle - SRP)",{"type":29,"tag":37,"props":12596,"children":12597},{},[12598,12599,12604],{"type":35,"value":5420},{"type":29,"tag":55,"props":12600,"children":12601},{},[12602],{"type":35,"value":12603},"principe de responsabilité unique",{"type":35,"value":12605},", formalisé par Robert C. Martin dans \"Clean Code\", stipule qu'une classe ou une fonction ne doit avoir qu'une seule raison de changer, autrement dit, elle ne doit gérer qu'une seule responsabilité. Cela permet de réduire les dépendances et rend votre code plus facile à tester et à maintenir.",{"type":29,"tag":37,"props":12607,"children":12608},{},[12609],{"type":29,"tag":55,"props":12610,"children":12611},{},[12612],{"type":35,"value":6416},{"type":29,"tag":5091,"props":12614,"children":12616},{"className":5093,"code":12615,"language":5095,"meta":8,"style":8},"// Mauvais exemple - Une classe gère trop de responsabilités\npublic class GestionnaireDeCommande {\n    public void creerCommande() {\n        // Crée une commande\n    }\n    \n    public void calculerRemises() {\n        // Calcule les remises\n    }\n\n    public void envoyerEmailConfirmation() {\n        // Envoie un email de confirmation\n    }\n}\n\n// Meilleur exemple - Responsabilités divisées en plusieurs classes\npublic class CommandeService {\n    public void creerCommande() {\n        // Crée une commande\n    }\n}\n\npublic class RemiseService {\n    public void calculerRemises() {\n        // Calcule les remises\n    }\n}\n\npublic class NotificationService {\n    public void envoyerEmailConfirmation() {\n        // Envoie un email de confirmation\n    }\n}\n",[12617],{"type":29,"tag":1716,"props":12618,"children":12619},{"__ignoreMap":8},[12620,12628,12648,12672,12680,12687,12694,12718,12726,12733,12740,12764,12772,12779,12786,12793,12801,12821,12844,12851,12858,12865,12872,12892,12915,12922,12929,12936,12943,12963,12986,12993,13000],{"type":29,"tag":2730,"props":12621,"children":12622},{"class":5102,"line":4267},[12623],{"type":29,"tag":2730,"props":12624,"children":12625},{"style":5106},[12626],{"type":35,"value":12627},"// Mauvais exemple - Une classe gère trop de responsabilités\n",{"type":29,"tag":2730,"props":12629,"children":12630},{"class":5102,"line":453},[12631,12635,12639,12644],{"type":29,"tag":2730,"props":12632,"children":12633},{"style":5115},[12634],{"type":35,"value":5218},{"type":29,"tag":2730,"props":12636,"children":12637},{"style":5115},[12638],{"type":35,"value":8278},{"type":29,"tag":2730,"props":12640,"children":12641},{"style":8281},[12642],{"type":35,"value":12643}," GestionnaireDeCommande",{"type":29,"tag":2730,"props":12645,"children":12646},{"style":5139},[12647],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12649,"children":12650},{"class":5102,"line":459},[12651,12655,12659,12664,12668],{"type":29,"tag":2730,"props":12652,"children":12653},{"style":5115},[12654],{"type":35,"value":8296},{"type":29,"tag":2730,"props":12656,"children":12657},{"style":5115},[12658],{"type":35,"value":5223},{"type":29,"tag":2730,"props":12660,"children":12661},{"style":5226},[12662],{"type":35,"value":12663}," creerCommande",{"type":29,"tag":2730,"props":12665,"children":12666},{"style":5139},[12667],{"type":35,"value":5234},{"type":29,"tag":2730,"props":12669,"children":12670},{"style":5139},[12671],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12673,"children":12674},{"class":5102,"line":5153},[12675],{"type":29,"tag":2730,"props":12676,"children":12677},{"style":5106},[12678],{"type":35,"value":12679},"        // Crée une commande\n",{"type":29,"tag":2730,"props":12681,"children":12682},{"class":5102,"line":5162},[12683],{"type":29,"tag":2730,"props":12684,"children":12685},{"style":5139},[12686],{"type":35,"value":5536},{"type":29,"tag":2730,"props":12688,"children":12689},{"class":5102,"line":3553},[12690],{"type":29,"tag":2730,"props":12691,"children":12692},{"style":5121},[12693],{"type":35,"value":9370},{"type":29,"tag":2730,"props":12695,"children":12696},{"class":5102,"line":5539},[12697,12701,12705,12710,12714],{"type":29,"tag":2730,"props":12698,"children":12699},{"style":5115},[12700],{"type":35,"value":8296},{"type":29,"tag":2730,"props":12702,"children":12703},{"style":5115},[12704],{"type":35,"value":5223},{"type":29,"tag":2730,"props":12706,"children":12707},{"style":5226},[12708],{"type":35,"value":12709}," calculerRemises",{"type":29,"tag":2730,"props":12711,"children":12712},{"style":5139},[12713],{"type":35,"value":5234},{"type":29,"tag":2730,"props":12715,"children":12716},{"style":5139},[12717],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12719,"children":12720},{"class":5102,"line":5547},[12721],{"type":29,"tag":2730,"props":12722,"children":12723},{"style":5106},[12724],{"type":35,"value":12725},"        // Calcule les remises\n",{"type":29,"tag":2730,"props":12727,"children":12728},{"class":5102,"line":5555},[12729],{"type":29,"tag":2730,"props":12730,"children":12731},{"style":5139},[12732],{"type":35,"value":5536},{"type":29,"tag":2730,"props":12734,"children":12735},{"class":5102,"line":5564},[12736],{"type":29,"tag":2730,"props":12737,"children":12738},{"emptyLinePlaceholder":13},[12739],{"type":35,"value":5150},{"type":29,"tag":2730,"props":12741,"children":12742},{"class":5102,"line":2949},[12743,12747,12751,12756,12760],{"type":29,"tag":2730,"props":12744,"children":12745},{"style":5115},[12746],{"type":35,"value":8296},{"type":29,"tag":2730,"props":12748,"children":12749},{"style":5115},[12750],{"type":35,"value":5223},{"type":29,"tag":2730,"props":12752,"children":12753},{"style":5226},[12754],{"type":35,"value":12755}," envoyerEmailConfirmation",{"type":29,"tag":2730,"props":12757,"children":12758},{"style":5139},[12759],{"type":35,"value":5234},{"type":29,"tag":2730,"props":12761,"children":12762},{"style":5139},[12763],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12765,"children":12766},{"class":5102,"line":5612},[12767],{"type":29,"tag":2730,"props":12768,"children":12769},{"style":5106},[12770],{"type":35,"value":12771},"        // Envoie un email de confirmation\n",{"type":29,"tag":2730,"props":12773,"children":12774},{"class":5102,"line":5620},[12775],{"type":29,"tag":2730,"props":12776,"children":12777},{"style":5139},[12778],{"type":35,"value":5536},{"type":29,"tag":2730,"props":12780,"children":12781},{"class":5102,"line":5628},[12782],{"type":29,"tag":2730,"props":12783,"children":12784},{"style":5139},[12785],{"type":35,"value":5255},{"type":29,"tag":2730,"props":12787,"children":12788},{"class":5102,"line":5636},[12789],{"type":29,"tag":2730,"props":12790,"children":12791},{"emptyLinePlaceholder":13},[12792],{"type":35,"value":5150},{"type":29,"tag":2730,"props":12794,"children":12795},{"class":5102,"line":2142},[12796],{"type":29,"tag":2730,"props":12797,"children":12798},{"style":5106},[12799],{"type":35,"value":12800},"// Meilleur exemple - Responsabilités divisées en plusieurs classes\n",{"type":29,"tag":2730,"props":12802,"children":12803},{"class":5102,"line":5670},[12804,12808,12812,12817],{"type":29,"tag":2730,"props":12805,"children":12806},{"style":5115},[12807],{"type":35,"value":5218},{"type":29,"tag":2730,"props":12809,"children":12810},{"style":5115},[12811],{"type":35,"value":8278},{"type":29,"tag":2730,"props":12813,"children":12814},{"style":8281},[12815],{"type":35,"value":12816}," CommandeService",{"type":29,"tag":2730,"props":12818,"children":12819},{"style":5139},[12820],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12822,"children":12823},{"class":5102,"line":5696},[12824,12828,12832,12836,12840],{"type":29,"tag":2730,"props":12825,"children":12826},{"style":5115},[12827],{"type":35,"value":8296},{"type":29,"tag":2730,"props":12829,"children":12830},{"style":5115},[12831],{"type":35,"value":5223},{"type":29,"tag":2730,"props":12833,"children":12834},{"style":5226},[12835],{"type":35,"value":12663},{"type":29,"tag":2730,"props":12837,"children":12838},{"style":5139},[12839],{"type":35,"value":5234},{"type":29,"tag":2730,"props":12841,"children":12842},{"style":5139},[12843],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12845,"children":12846},{"class":5102,"line":6807},[12847],{"type":29,"tag":2730,"props":12848,"children":12849},{"style":5106},[12850],{"type":35,"value":12679},{"type":29,"tag":2730,"props":12852,"children":12853},{"class":5102,"line":6845},[12854],{"type":29,"tag":2730,"props":12855,"children":12856},{"style":5139},[12857],{"type":35,"value":5536},{"type":29,"tag":2730,"props":12859,"children":12860},{"class":5102,"line":1649},[12861],{"type":29,"tag":2730,"props":12862,"children":12863},{"style":5139},[12864],{"type":35,"value":5255},{"type":29,"tag":2730,"props":12866,"children":12867},{"class":5102,"line":9791},[12868],{"type":29,"tag":2730,"props":12869,"children":12870},{"emptyLinePlaceholder":13},[12871],{"type":35,"value":5150},{"type":29,"tag":2730,"props":12873,"children":12874},{"class":5102,"line":9799},[12875,12879,12883,12888],{"type":29,"tag":2730,"props":12876,"children":12877},{"style":5115},[12878],{"type":35,"value":5218},{"type":29,"tag":2730,"props":12880,"children":12881},{"style":5115},[12882],{"type":35,"value":8278},{"type":29,"tag":2730,"props":12884,"children":12885},{"style":8281},[12886],{"type":35,"value":12887}," RemiseService",{"type":29,"tag":2730,"props":12889,"children":12890},{"style":5139},[12891],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12893,"children":12894},{"class":5102,"line":9815},[12895,12899,12903,12907,12911],{"type":29,"tag":2730,"props":12896,"children":12897},{"style":5115},[12898],{"type":35,"value":8296},{"type":29,"tag":2730,"props":12900,"children":12901},{"style":5115},[12902],{"type":35,"value":5223},{"type":29,"tag":2730,"props":12904,"children":12905},{"style":5226},[12906],{"type":35,"value":12709},{"type":29,"tag":2730,"props":12908,"children":12909},{"style":5139},[12910],{"type":35,"value":5234},{"type":29,"tag":2730,"props":12912,"children":12913},{"style":5139},[12914],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12916,"children":12917},{"class":5102,"line":10772},[12918],{"type":29,"tag":2730,"props":12919,"children":12920},{"style":5106},[12921],{"type":35,"value":12725},{"type":29,"tag":2730,"props":12923,"children":12924},{"class":5102,"line":1015},[12925],{"type":29,"tag":2730,"props":12926,"children":12927},{"style":5139},[12928],{"type":35,"value":5536},{"type":29,"tag":2730,"props":12930,"children":12931},{"class":5102,"line":10792},[12932],{"type":29,"tag":2730,"props":12933,"children":12934},{"style":5139},[12935],{"type":35,"value":5255},{"type":29,"tag":2730,"props":12937,"children":12938},{"class":5102,"line":10800},[12939],{"type":29,"tag":2730,"props":12940,"children":12941},{"emptyLinePlaceholder":13},[12942],{"type":35,"value":5150},{"type":29,"tag":2730,"props":12944,"children":12945},{"class":5102,"line":10808},[12946,12950,12954,12959],{"type":29,"tag":2730,"props":12947,"children":12948},{"style":5115},[12949],{"type":35,"value":5218},{"type":29,"tag":2730,"props":12951,"children":12952},{"style":5115},[12953],{"type":35,"value":8278},{"type":29,"tag":2730,"props":12955,"children":12956},{"style":8281},[12957],{"type":35,"value":12958}," NotificationService",{"type":29,"tag":2730,"props":12960,"children":12961},{"style":5139},[12962],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12964,"children":12965},{"class":5102,"line":10844},[12966,12970,12974,12978,12982],{"type":29,"tag":2730,"props":12967,"children":12968},{"style":5115},[12969],{"type":35,"value":8296},{"type":29,"tag":2730,"props":12971,"children":12972},{"style":5115},[12973],{"type":35,"value":5223},{"type":29,"tag":2730,"props":12975,"children":12976},{"style":5226},[12977],{"type":35,"value":12755},{"type":29,"tag":2730,"props":12979,"children":12980},{"style":5139},[12981],{"type":35,"value":5234},{"type":29,"tag":2730,"props":12983,"children":12984},{"style":5139},[12985],{"type":35,"value":5239},{"type":29,"tag":2730,"props":12987,"children":12988},{"class":5102,"line":475},[12989],{"type":29,"tag":2730,"props":12990,"children":12991},{"style":5106},[12992],{"type":35,"value":12771},{"type":29,"tag":2730,"props":12994,"children":12995},{"class":5102,"line":10895},[12996],{"type":29,"tag":2730,"props":12997,"children":12998},{"style":5139},[12999],{"type":35,"value":5536},{"type":29,"tag":2730,"props":13001,"children":13002},{"class":5102,"line":10903},[13003],{"type":29,"tag":2730,"props":13004,"children":13005},{"style":5139},[13006],{"type":35,"value":5255},{"type":29,"tag":37,"props":13008,"children":13009},{},[13010],{"type":35,"value":13011},"Dans cet exemple, chaque classe a une responsabilité unique. Cela permet d'éviter des classes trop lourdes et facilite leur maintenance. En cas de modification, vous n'aurez qu'à changer une partie spécifique de votre code sans impacter le reste.",{"type":29,"tag":10266,"props":13013,"children":13014},{"type":10268},[13015],{"type":29,"tag":37,"props":13016,"children":13017},{},[13018],{"type":35,"value":13019},"Une bonne règle : si vous avez du mal à expliquer ce que fait une classe ou une fonction en une phrase claire et concise, c'est probablement qu'elle a plusieurs responsabilités et doit être découpée.",{"type":29,"tag":66,"props":13021,"children":13022},{},[],{"type":29,"tag":106,"props":13024,"children":13026},{"id":13025},"_2-éviter-les-duplications-de-code",[13027],{"type":29,"tag":55,"props":13028,"children":13029},{},[13030],{"type":35,"value":13031},"2. Éviter les duplications de code",{"type":29,"tag":37,"props":13033,"children":13034},{},[13035],{"type":35,"value":13036},"Le code dupliqué est un piège fréquent qui complique la maintenance. En éliminant les duplications, vous vous assurez qu'un changement à un endroit du code n'entraîne pas une cascade de modifications à différents endroits.",{"type":29,"tag":37,"props":13038,"children":13039},{},[13040],{"type":29,"tag":55,"props":13041,"children":13042},{},[13043],{"type":35,"value":6416},{"type":29,"tag":5091,"props":13045,"children":13047},{"className":5093,"code":13046,"language":5095,"meta":8,"style":8},"// Mauvais exemple - Duplication de logique\ndouble calculerRemiseClient(double montant) {\n    double remise = 0;\n    if (montant > 1000) {\n        remise = montant * 0.1;\n    }\n    return remise;\n}\n\ndouble calculerRemisePartenaire(double montant) {\n    double remise = 0;\n    if (montant > 1000) {\n        remise = montant * 0.1;\n    }\n    return remise;\n}\n\n// Meilleur exemple - Refactorisation pour éviter la duplication\ndouble calculerRemise(double montant) {\n    double remise = 0;\n    if (montant > 1000) {\n        remise = montant * 0.1;\n    }\n    return remise;\n}\n",[13048],{"type":29,"tag":1716,"props":13049,"children":13050},{"__ignoreMap":8},[13051,13059,13092,13116,13149,13179,13186,13202,13209,13216,13248,13271,13302,13329,13336,13351,13358,13365,13373,13405,13428,13459,13486,13493,13508],{"type":29,"tag":2730,"props":13052,"children":13053},{"class":5102,"line":4267},[13054],{"type":29,"tag":2730,"props":13055,"children":13056},{"style":5106},[13057],{"type":35,"value":13058},"// Mauvais exemple - Duplication de logique\n",{"type":29,"tag":2730,"props":13060,"children":13061},{"class":5102,"line":453},[13062,13066,13071,13075,13079,13084,13088],{"type":29,"tag":2730,"props":13063,"children":13064},{"style":5115},[13065],{"type":35,"value":11551},{"type":29,"tag":2730,"props":13067,"children":13068},{"style":5226},[13069],{"type":35,"value":13070}," calculerRemiseClient",{"type":29,"tag":2730,"props":13072,"children":13073},{"style":5139},[13074],{"type":35,"value":6452},{"type":29,"tag":2730,"props":13076,"children":13077},{"style":5115},[13078],{"type":35,"value":11551},{"type":29,"tag":2730,"props":13080,"children":13081},{"style":5121},[13082],{"type":35,"value":13083}," montant",{"type":29,"tag":2730,"props":13085,"children":13086},{"style":5139},[13087],{"type":35,"value":3849},{"type":29,"tag":2730,"props":13089,"children":13090},{"style":5139},[13091],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13093,"children":13094},{"class":5102,"line":459},[13095,13099,13104,13108,13112],{"type":29,"tag":2730,"props":13096,"children":13097},{"style":5115},[13098],{"type":35,"value":9378},{"type":29,"tag":2730,"props":13100,"children":13101},{"style":5121},[13102],{"type":35,"value":13103}," remise ",{"type":29,"tag":2730,"props":13105,"children":13106},{"style":5127},[13107],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13109,"children":13110},{"style":5133},[13111],{"type":35,"value":6501},{"type":29,"tag":2730,"props":13113,"children":13114},{"style":5139},[13115],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13117,"children":13118},{"class":5102,"line":5153},[13119,13123,13127,13132,13136,13141,13145],{"type":29,"tag":2730,"props":13120,"children":13121},{"style":5115},[13122],{"type":35,"value":5493},{"type":29,"tag":2730,"props":13124,"children":13125},{"style":5139},[13126],{"type":35,"value":5293},{"type":29,"tag":2730,"props":13128,"children":13129},{"style":5121},[13130],{"type":35,"value":13131},"montant ",{"type":29,"tag":2730,"props":13133,"children":13134},{"style":5127},[13135],{"type":35,"value":7915},{"type":29,"tag":2730,"props":13137,"children":13138},{"style":5133},[13139],{"type":35,"value":13140}," 1000",{"type":29,"tag":2730,"props":13142,"children":13143},{"style":5139},[13144],{"type":35,"value":3849},{"type":29,"tag":2730,"props":13146,"children":13147},{"style":5139},[13148],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13150,"children":13151},{"class":5102,"line":5162},[13152,13157,13161,13166,13170,13175],{"type":29,"tag":2730,"props":13153,"children":13154},{"style":5121},[13155],{"type":35,"value":13156},"        remise ",{"type":29,"tag":2730,"props":13158,"children":13159},{"style":5127},[13160],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13162,"children":13163},{"style":5121},[13164],{"type":35,"value":13165}," montant ",{"type":29,"tag":2730,"props":13167,"children":13168},{"style":5127},[13169],{"type":35,"value":11805},{"type":29,"tag":2730,"props":13171,"children":13172},{"style":5133},[13173],{"type":35,"value":13174}," 0.1",{"type":29,"tag":2730,"props":13176,"children":13177},{"style":5139},[13178],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13180,"children":13181},{"class":5102,"line":3553},[13182],{"type":29,"tag":2730,"props":13183,"children":13184},{"style":5139},[13185],{"type":35,"value":5536},{"type":29,"tag":2730,"props":13187,"children":13188},{"class":5102,"line":5539},[13189,13193,13198],{"type":29,"tag":2730,"props":13190,"children":13191},{"style":5115},[13192],{"type":35,"value":5676},{"type":29,"tag":2730,"props":13194,"children":13195},{"style":5121},[13196],{"type":35,"value":13197}," remise",{"type":29,"tag":2730,"props":13199,"children":13200},{"style":5139},[13201],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13203,"children":13204},{"class":5102,"line":5547},[13205],{"type":29,"tag":2730,"props":13206,"children":13207},{"style":5139},[13208],{"type":35,"value":5255},{"type":29,"tag":2730,"props":13210,"children":13211},{"class":5102,"line":5555},[13212],{"type":29,"tag":2730,"props":13213,"children":13214},{"emptyLinePlaceholder":13},[13215],{"type":35,"value":5150},{"type":29,"tag":2730,"props":13217,"children":13218},{"class":5102,"line":5564},[13219,13223,13228,13232,13236,13240,13244],{"type":29,"tag":2730,"props":13220,"children":13221},{"style":5115},[13222],{"type":35,"value":11551},{"type":29,"tag":2730,"props":13224,"children":13225},{"style":5226},[13226],{"type":35,"value":13227}," calculerRemisePartenaire",{"type":29,"tag":2730,"props":13229,"children":13230},{"style":5139},[13231],{"type":35,"value":6452},{"type":29,"tag":2730,"props":13233,"children":13234},{"style":5115},[13235],{"type":35,"value":11551},{"type":29,"tag":2730,"props":13237,"children":13238},{"style":5121},[13239],{"type":35,"value":13083},{"type":29,"tag":2730,"props":13241,"children":13242},{"style":5139},[13243],{"type":35,"value":3849},{"type":29,"tag":2730,"props":13245,"children":13246},{"style":5139},[13247],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13249,"children":13250},{"class":5102,"line":2949},[13251,13255,13259,13263,13267],{"type":29,"tag":2730,"props":13252,"children":13253},{"style":5115},[13254],{"type":35,"value":9378},{"type":29,"tag":2730,"props":13256,"children":13257},{"style":5121},[13258],{"type":35,"value":13103},{"type":29,"tag":2730,"props":13260,"children":13261},{"style":5127},[13262],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13264,"children":13265},{"style":5133},[13266],{"type":35,"value":6501},{"type":29,"tag":2730,"props":13268,"children":13269},{"style":5139},[13270],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13272,"children":13273},{"class":5102,"line":5612},[13274,13278,13282,13286,13290,13294,13298],{"type":29,"tag":2730,"props":13275,"children":13276},{"style":5115},[13277],{"type":35,"value":5493},{"type":29,"tag":2730,"props":13279,"children":13280},{"style":5139},[13281],{"type":35,"value":5293},{"type":29,"tag":2730,"props":13283,"children":13284},{"style":5121},[13285],{"type":35,"value":13131},{"type":29,"tag":2730,"props":13287,"children":13288},{"style":5127},[13289],{"type":35,"value":7915},{"type":29,"tag":2730,"props":13291,"children":13292},{"style":5133},[13293],{"type":35,"value":13140},{"type":29,"tag":2730,"props":13295,"children":13296},{"style":5139},[13297],{"type":35,"value":3849},{"type":29,"tag":2730,"props":13299,"children":13300},{"style":5139},[13301],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13303,"children":13304},{"class":5102,"line":5620},[13305,13309,13313,13317,13321,13325],{"type":29,"tag":2730,"props":13306,"children":13307},{"style":5121},[13308],{"type":35,"value":13156},{"type":29,"tag":2730,"props":13310,"children":13311},{"style":5127},[13312],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13314,"children":13315},{"style":5121},[13316],{"type":35,"value":13165},{"type":29,"tag":2730,"props":13318,"children":13319},{"style":5127},[13320],{"type":35,"value":11805},{"type":29,"tag":2730,"props":13322,"children":13323},{"style":5133},[13324],{"type":35,"value":13174},{"type":29,"tag":2730,"props":13326,"children":13327},{"style":5139},[13328],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13330,"children":13331},{"class":5102,"line":5628},[13332],{"type":29,"tag":2730,"props":13333,"children":13334},{"style":5139},[13335],{"type":35,"value":5536},{"type":29,"tag":2730,"props":13337,"children":13338},{"class":5102,"line":5636},[13339,13343,13347],{"type":29,"tag":2730,"props":13340,"children":13341},{"style":5115},[13342],{"type":35,"value":5676},{"type":29,"tag":2730,"props":13344,"children":13345},{"style":5121},[13346],{"type":35,"value":13197},{"type":29,"tag":2730,"props":13348,"children":13349},{"style":5139},[13350],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13352,"children":13353},{"class":5102,"line":2142},[13354],{"type":29,"tag":2730,"props":13355,"children":13356},{"style":5139},[13357],{"type":35,"value":5255},{"type":29,"tag":2730,"props":13359,"children":13360},{"class":5102,"line":5670},[13361],{"type":29,"tag":2730,"props":13362,"children":13363},{"emptyLinePlaceholder":13},[13364],{"type":35,"value":5150},{"type":29,"tag":2730,"props":13366,"children":13367},{"class":5102,"line":5696},[13368],{"type":29,"tag":2730,"props":13369,"children":13370},{"style":5106},[13371],{"type":35,"value":13372},"// Meilleur exemple - Refactorisation pour éviter la duplication\n",{"type":29,"tag":2730,"props":13374,"children":13375},{"class":5102,"line":6807},[13376,13380,13385,13389,13393,13397,13401],{"type":29,"tag":2730,"props":13377,"children":13378},{"style":5115},[13379],{"type":35,"value":11551},{"type":29,"tag":2730,"props":13381,"children":13382},{"style":5226},[13383],{"type":35,"value":13384}," calculerRemise",{"type":29,"tag":2730,"props":13386,"children":13387},{"style":5139},[13388],{"type":35,"value":6452},{"type":29,"tag":2730,"props":13390,"children":13391},{"style":5115},[13392],{"type":35,"value":11551},{"type":29,"tag":2730,"props":13394,"children":13395},{"style":5121},[13396],{"type":35,"value":13083},{"type":29,"tag":2730,"props":13398,"children":13399},{"style":5139},[13400],{"type":35,"value":3849},{"type":29,"tag":2730,"props":13402,"children":13403},{"style":5139},[13404],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13406,"children":13407},{"class":5102,"line":6845},[13408,13412,13416,13420,13424],{"type":29,"tag":2730,"props":13409,"children":13410},{"style":5115},[13411],{"type":35,"value":9378},{"type":29,"tag":2730,"props":13413,"children":13414},{"style":5121},[13415],{"type":35,"value":13103},{"type":29,"tag":2730,"props":13417,"children":13418},{"style":5127},[13419],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13421,"children":13422},{"style":5133},[13423],{"type":35,"value":6501},{"type":29,"tag":2730,"props":13425,"children":13426},{"style":5139},[13427],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13429,"children":13430},{"class":5102,"line":1649},[13431,13435,13439,13443,13447,13451,13455],{"type":29,"tag":2730,"props":13432,"children":13433},{"style":5115},[13434],{"type":35,"value":5493},{"type":29,"tag":2730,"props":13436,"children":13437},{"style":5139},[13438],{"type":35,"value":5293},{"type":29,"tag":2730,"props":13440,"children":13441},{"style":5121},[13442],{"type":35,"value":13131},{"type":29,"tag":2730,"props":13444,"children":13445},{"style":5127},[13446],{"type":35,"value":7915},{"type":29,"tag":2730,"props":13448,"children":13449},{"style":5133},[13450],{"type":35,"value":13140},{"type":29,"tag":2730,"props":13452,"children":13453},{"style":5139},[13454],{"type":35,"value":3849},{"type":29,"tag":2730,"props":13456,"children":13457},{"style":5139},[13458],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13460,"children":13461},{"class":5102,"line":9791},[13462,13466,13470,13474,13478,13482],{"type":29,"tag":2730,"props":13463,"children":13464},{"style":5121},[13465],{"type":35,"value":13156},{"type":29,"tag":2730,"props":13467,"children":13468},{"style":5127},[13469],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13471,"children":13472},{"style":5121},[13473],{"type":35,"value":13165},{"type":29,"tag":2730,"props":13475,"children":13476},{"style":5127},[13477],{"type":35,"value":11805},{"type":29,"tag":2730,"props":13479,"children":13480},{"style":5133},[13481],{"type":35,"value":13174},{"type":29,"tag":2730,"props":13483,"children":13484},{"style":5139},[13485],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13487,"children":13488},{"class":5102,"line":9799},[13489],{"type":29,"tag":2730,"props":13490,"children":13491},{"style":5139},[13492],{"type":35,"value":5536},{"type":29,"tag":2730,"props":13494,"children":13495},{"class":5102,"line":9815},[13496,13500,13504],{"type":29,"tag":2730,"props":13497,"children":13498},{"style":5115},[13499],{"type":35,"value":5676},{"type":29,"tag":2730,"props":13501,"children":13502},{"style":5121},[13503],{"type":35,"value":13197},{"type":29,"tag":2730,"props":13505,"children":13506},{"style":5139},[13507],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13509,"children":13510},{"class":5102,"line":10772},[13511],{"type":29,"tag":2730,"props":13512,"children":13513},{"style":5139},[13514],{"type":35,"value":5255},{"type":29,"tag":37,"props":13516,"children":13517},{},[13518],{"type":35,"value":13519},"En unifiant la logique de calcul de la remise dans une seule fonction, vous éliminez la duplication et simplifiez la maintenance. Si la logique doit changer (par exemple, le seuil de 1000), vous n'aurez à modifier qu'une seule fonction.",{"type":29,"tag":10266,"props":13521,"children":13522},{"type":10268},[13523],{"type":29,"tag":37,"props":13524,"children":13525},{},[13526],{"type":35,"value":13527},"Cherchez les répétitions dans votre code. Si vous vous retrouvez à écrire la même logique ou presque identique à plusieurs endroits, c'est le signe qu'il est temps de refactoriser.",{"type":29,"tag":66,"props":13529,"children":13530},{},[],{"type":29,"tag":106,"props":13532,"children":13534},{"id":13533},"_3-faciliter-les-tests-unitaires",[13535],{"type":29,"tag":55,"props":13536,"children":13537},{},[13538],{"type":35,"value":13539},"3. Faciliter les tests unitaires",{"type":29,"tag":37,"props":13541,"children":13542},{},[13543,13545,13553],{"type":35,"value":13544},"Un code propre doit être facilement testable. En d'autres termes, il doit être écrit de manière à permettre des ",{"type":29,"tag":55,"props":13546,"children":13547},{},[13548],{"type":29,"tag":43,"props":13549,"children":13550},{"href":1646},[13551],{"type":35,"value":13552},"tests unitaires",{"type":35,"value":13554}," simples et rapides. Cela passe par des fonctions courtes, des classes cohérentes et l'absence de dépendances cachées.",{"type":29,"tag":37,"props":13556,"children":13557},{},[13558],{"type":29,"tag":55,"props":13559,"children":13560},{},[13561],{"type":35,"value":6416},{"type":29,"tag":5091,"props":13563,"children":13565},{"className":5093,"code":13564,"language":5095,"meta":8,"style":8},"// Mauvais exemple - Difficulté à tester en raison des dépendances internes\npublic class CommandeService {\n    public void creerCommande() {\n        Database db = new Database();\n        db.save();\n    }\n}\n\n// Meilleur exemple - Injection de dépendance pour faciliter les tests\npublic class CommandeService {\n    private Database database;\n\n    public CommandeService(Database database) {\n        this.database = database;\n    }\n\n    public void creerCommande() {\n        database.save();\n    }\n}\n",[13566],{"type":29,"tag":1716,"props":13567,"children":13568},{"__ignoreMap":8},[13569,13577,13596,13619,13650,13671,13678,13685,13692,13700,13719,13740,13747,13779,13808,13815,13822,13845,13865,13872],{"type":29,"tag":2730,"props":13570,"children":13571},{"class":5102,"line":4267},[13572],{"type":29,"tag":2730,"props":13573,"children":13574},{"style":5106},[13575],{"type":35,"value":13576},"// Mauvais exemple - Difficulté à tester en raison des dépendances internes\n",{"type":29,"tag":2730,"props":13578,"children":13579},{"class":5102,"line":453},[13580,13584,13588,13592],{"type":29,"tag":2730,"props":13581,"children":13582},{"style":5115},[13583],{"type":35,"value":5218},{"type":29,"tag":2730,"props":13585,"children":13586},{"style":5115},[13587],{"type":35,"value":8278},{"type":29,"tag":2730,"props":13589,"children":13590},{"style":8281},[13591],{"type":35,"value":12816},{"type":29,"tag":2730,"props":13593,"children":13594},{"style":5139},[13595],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13597,"children":13598},{"class":5102,"line":459},[13599,13603,13607,13611,13615],{"type":29,"tag":2730,"props":13600,"children":13601},{"style":5115},[13602],{"type":35,"value":8296},{"type":29,"tag":2730,"props":13604,"children":13605},{"style":5115},[13606],{"type":35,"value":5223},{"type":29,"tag":2730,"props":13608,"children":13609},{"style":5226},[13610],{"type":35,"value":12663},{"type":29,"tag":2730,"props":13612,"children":13613},{"style":5139},[13614],{"type":35,"value":5234},{"type":29,"tag":2730,"props":13616,"children":13617},{"style":5139},[13618],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13620,"children":13621},{"class":5102,"line":5153},[13622,13627,13632,13636,13641,13646],{"type":29,"tag":2730,"props":13623,"children":13624},{"style":6455},[13625],{"type":35,"value":13626},"        Database",{"type":29,"tag":2730,"props":13628,"children":13629},{"style":5121},[13630],{"type":35,"value":13631}," db ",{"type":29,"tag":2730,"props":13633,"children":13634},{"style":5127},[13635],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13637,"children":13638},{"style":5115},[13639],{"type":35,"value":13640}," new",{"type":29,"tag":2730,"props":13642,"children":13643},{"style":5226},[13644],{"type":35,"value":13645}," Database",{"type":29,"tag":2730,"props":13647,"children":13648},{"style":5139},[13649],{"type":35,"value":5334},{"type":29,"tag":2730,"props":13651,"children":13652},{"class":5102,"line":5162},[13653,13658,13662,13667],{"type":29,"tag":2730,"props":13654,"children":13655},{"style":5121},[13656],{"type":35,"value":13657},"        db",{"type":29,"tag":2730,"props":13659,"children":13660},{"style":5139},[13661],{"type":35,"value":332},{"type":29,"tag":2730,"props":13663,"children":13664},{"style":5226},[13665],{"type":35,"value":13666},"save",{"type":29,"tag":2730,"props":13668,"children":13669},{"style":5139},[13670],{"type":35,"value":5334},{"type":29,"tag":2730,"props":13672,"children":13673},{"class":5102,"line":3553},[13674],{"type":29,"tag":2730,"props":13675,"children":13676},{"style":5139},[13677],{"type":35,"value":5536},{"type":29,"tag":2730,"props":13679,"children":13680},{"class":5102,"line":5539},[13681],{"type":29,"tag":2730,"props":13682,"children":13683},{"style":5139},[13684],{"type":35,"value":5255},{"type":29,"tag":2730,"props":13686,"children":13687},{"class":5102,"line":5547},[13688],{"type":29,"tag":2730,"props":13689,"children":13690},{"emptyLinePlaceholder":13},[13691],{"type":35,"value":5150},{"type":29,"tag":2730,"props":13693,"children":13694},{"class":5102,"line":5555},[13695],{"type":29,"tag":2730,"props":13696,"children":13697},{"style":5106},[13698],{"type":35,"value":13699},"// Meilleur exemple - Injection de dépendance pour faciliter les tests\n",{"type":29,"tag":2730,"props":13701,"children":13702},{"class":5102,"line":5564},[13703,13707,13711,13715],{"type":29,"tag":2730,"props":13704,"children":13705},{"style":5115},[13706],{"type":35,"value":5218},{"type":29,"tag":2730,"props":13708,"children":13709},{"style":5115},[13710],{"type":35,"value":8278},{"type":29,"tag":2730,"props":13712,"children":13713},{"style":8281},[13714],{"type":35,"value":12816},{"type":29,"tag":2730,"props":13716,"children":13717},{"style":5139},[13718],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13720,"children":13721},{"class":5102,"line":2949},[13722,13727,13731,13736],{"type":29,"tag":2730,"props":13723,"children":13724},{"style":5115},[13725],{"type":35,"value":13726},"    private",{"type":29,"tag":2730,"props":13728,"children":13729},{"style":6455},[13730],{"type":35,"value":13645},{"type":29,"tag":2730,"props":13732,"children":13733},{"style":5121},[13734],{"type":35,"value":13735}," database",{"type":29,"tag":2730,"props":13737,"children":13738},{"style":5139},[13739],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13741,"children":13742},{"class":5102,"line":5612},[13743],{"type":29,"tag":2730,"props":13744,"children":13745},{"emptyLinePlaceholder":13},[13746],{"type":35,"value":5150},{"type":29,"tag":2730,"props":13748,"children":13749},{"class":5102,"line":5620},[13750,13754,13758,13762,13767,13771,13775],{"type":29,"tag":2730,"props":13751,"children":13752},{"style":5115},[13753],{"type":35,"value":8296},{"type":29,"tag":2730,"props":13755,"children":13756},{"style":5226},[13757],{"type":35,"value":12816},{"type":29,"tag":2730,"props":13759,"children":13760},{"style":5139},[13761],{"type":35,"value":6452},{"type":29,"tag":2730,"props":13763,"children":13764},{"style":6455},[13765],{"type":35,"value":13766},"Database",{"type":29,"tag":2730,"props":13768,"children":13769},{"style":8317},[13770],{"type":35,"value":13735},{"type":29,"tag":2730,"props":13772,"children":13773},{"style":5139},[13774],{"type":35,"value":3849},{"type":29,"tag":2730,"props":13776,"children":13777},{"style":5139},[13778],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13780,"children":13781},{"class":5102,"line":5628},[13782,13787,13791,13796,13800,13804],{"type":29,"tag":2730,"props":13783,"children":13784},{"style":5310},[13785],{"type":35,"value":13786},"        this",{"type":29,"tag":2730,"props":13788,"children":13789},{"style":5139},[13790],{"type":35,"value":332},{"type":29,"tag":2730,"props":13792,"children":13793},{"style":5121},[13794],{"type":35,"value":13795},"database ",{"type":29,"tag":2730,"props":13797,"children":13798},{"style":5127},[13799],{"type":35,"value":5130},{"type":29,"tag":2730,"props":13801,"children":13802},{"style":5121},[13803],{"type":35,"value":13735},{"type":29,"tag":2730,"props":13805,"children":13806},{"style":5139},[13807],{"type":35,"value":5142},{"type":29,"tag":2730,"props":13809,"children":13810},{"class":5102,"line":5636},[13811],{"type":29,"tag":2730,"props":13812,"children":13813},{"style":5139},[13814],{"type":35,"value":5536},{"type":29,"tag":2730,"props":13816,"children":13817},{"class":5102,"line":2142},[13818],{"type":29,"tag":2730,"props":13819,"children":13820},{"emptyLinePlaceholder":13},[13821],{"type":35,"value":5150},{"type":29,"tag":2730,"props":13823,"children":13824},{"class":5102,"line":5670},[13825,13829,13833,13837,13841],{"type":29,"tag":2730,"props":13826,"children":13827},{"style":5115},[13828],{"type":35,"value":8296},{"type":29,"tag":2730,"props":13830,"children":13831},{"style":5115},[13832],{"type":35,"value":5223},{"type":29,"tag":2730,"props":13834,"children":13835},{"style":5226},[13836],{"type":35,"value":12663},{"type":29,"tag":2730,"props":13838,"children":13839},{"style":5139},[13840],{"type":35,"value":5234},{"type":29,"tag":2730,"props":13842,"children":13843},{"style":5139},[13844],{"type":35,"value":5239},{"type":29,"tag":2730,"props":13846,"children":13847},{"class":5102,"line":5696},[13848,13853,13857,13861],{"type":29,"tag":2730,"props":13849,"children":13850},{"style":5121},[13851],{"type":35,"value":13852},"        database",{"type":29,"tag":2730,"props":13854,"children":13855},{"style":5139},[13856],{"type":35,"value":332},{"type":29,"tag":2730,"props":13858,"children":13859},{"style":5226},[13860],{"type":35,"value":13666},{"type":29,"tag":2730,"props":13862,"children":13863},{"style":5139},[13864],{"type":35,"value":5334},{"type":29,"tag":2730,"props":13866,"children":13867},{"class":5102,"line":6807},[13868],{"type":29,"tag":2730,"props":13869,"children":13870},{"style":5139},[13871],{"type":35,"value":5536},{"type":29,"tag":2730,"props":13873,"children":13874},{"class":5102,"line":6845},[13875],{"type":29,"tag":2730,"props":13876,"children":13877},{"style":5139},[13878],{"type":35,"value":5255},{"type":29,"tag":37,"props":13880,"children":13881},{},[13882,13884,13889],{"type":35,"value":13883},"Dans le second exemple, l'injection de dépendance rend la classe plus testable. Au lieu de créer une instance de ",{"type":29,"tag":1716,"props":13885,"children":13887},{"className":13886},[],[13888],{"type":35,"value":13766},{"type":35,"value":13890}," en interne, vous pouvez passer une base de données fictive (mock) lors de vos tests unitaires.",{"type":29,"tag":10266,"props":13892,"children":13893},{"type":10268},[13894],{"type":29,"tag":37,"props":13895,"children":13896},{},[13897],{"type":35,"value":13898},"Rendez chaque classe indépendante de ses dépendances réelles en utilisant des interfaces ou des injections de dépendances. Cela vous permet de tester chaque partie du code de manière isolée.",{"type":29,"tag":66,"props":13900,"children":13901},{},[],{"type":29,"tag":70,"props":13903,"children":13905},{"id":13904},"conseils-et-astuces-pour-appliquer-le-clean-code-au-quotidien",[13906],{"type":29,"tag":55,"props":13907,"children":13908},{},[13909],{"type":35,"value":13910},"Conseils et astuces pour appliquer le Clean Code au quotidien",{"type":29,"tag":37,"props":13912,"children":13913},{},[13914,13916,13920],{"type":35,"value":13915},"Maintenant que vous connaissez les bases du ",{"type":29,"tag":55,"props":13917,"children":13918},{},[13919],{"type":35,"value":5426},{"type":35,"value":13921},", voyons comment intégrer ces bonnes pratiques dans votre travail quotidien, même lorsque vous êtes sous pression ou que vous devez travailler sur du code existant. Voici quelques astuces simples mais efficaces pour garder votre code propre, maintenable et lisible à long terme.",{"type":29,"tag":106,"props":13923,"children":13925},{"id":13924},"_1-réécrire-du-code-existant-le-refactoring-progressif",[13926],{"type":29,"tag":55,"props":13927,"children":13928},{},[13929],{"type":35,"value":13930},"1. Réécrire du code existant : le refactoring progressif",{"type":29,"tag":37,"props":13932,"children":13933},{},[13934,13936,13941,13943,13948],{"type":35,"value":13935},"Quand vous héritez d'un ",{"type":29,"tag":43,"props":13937,"children":13938},{"href":1945},[13939],{"type":35,"value":13940},"code legacy",{"type":35,"value":13942}," mal structuré ou difficile à comprendre, il peut être tentant de tout réécrire. Cependant, ce n'est pas toujours réaliste ou nécessaire. La meilleure approche est souvent le ",{"type":29,"tag":55,"props":13944,"children":13945},{},[13946],{"type":35,"value":13947},"refactoring progressif",{"type":35,"value":13949}," : au lieu de tout changer d'un coup, vous améliorez petit à petit le code à chaque modification ou ajout de fonctionnalité.",{"type":29,"tag":37,"props":13951,"children":13952},{},[13953],{"type":29,"tag":55,"props":13954,"children":13955},{},[13956],{"type":35,"value":6416},{"type":29,"tag":5091,"props":13958,"children":13960},{"className":5093,"code":13959,"language":5095,"meta":8,"style":8},"// Code hérité difficile à comprendre\npublic void traitementCommande(Commande commande) {\n    if (commande.isUrgent() && !commande.isValide()) {\n        System.out.println(\"Erreur\");\n    }\n    // Autres opérations\n}\n\n// Refactorisation progressive\npublic void verifierCommandeValide(Commande commande) {\n    if (!commande.isValide()) {\n        throw new IllegalArgumentException(\"Commande invalide\");\n    }\n}\n",[13961],{"type":29,"tag":1716,"props":13962,"children":13963},{"__ignoreMap":8},[13964,13972,14010,14068,14104,14111,14119,14126,14133,14141,14177,14212,14241,14248],{"type":29,"tag":2730,"props":13965,"children":13966},{"class":5102,"line":4267},[13967],{"type":29,"tag":2730,"props":13968,"children":13969},{"style":5106},[13970],{"type":35,"value":13971},"// Code hérité difficile à comprendre\n",{"type":29,"tag":2730,"props":13973,"children":13974},{"class":5102,"line":453},[13975,13979,13983,13988,13992,13997,14002,14006],{"type":29,"tag":2730,"props":13976,"children":13977},{"style":5115},[13978],{"type":35,"value":5218},{"type":29,"tag":2730,"props":13980,"children":13981},{"style":5115},[13982],{"type":35,"value":5223},{"type":29,"tag":2730,"props":13984,"children":13985},{"style":5226},[13986],{"type":35,"value":13987}," traitementCommande",{"type":29,"tag":2730,"props":13989,"children":13990},{"style":5139},[13991],{"type":35,"value":6452},{"type":29,"tag":2730,"props":13993,"children":13994},{"style":6455},[13995],{"type":35,"value":13996},"Commande",{"type":29,"tag":2730,"props":13998,"children":13999},{"style":5121},[14000],{"type":35,"value":14001}," commande",{"type":29,"tag":2730,"props":14003,"children":14004},{"style":5139},[14005],{"type":35,"value":3849},{"type":29,"tag":2730,"props":14007,"children":14008},{"style":5139},[14009],{"type":35,"value":5239},{"type":29,"tag":2730,"props":14011,"children":14012},{"class":5102,"line":459},[14013,14017,14021,14026,14030,14035,14039,14043,14047,14051,14055,14060,14064],{"type":29,"tag":2730,"props":14014,"children":14015},{"style":5115},[14016],{"type":35,"value":5493},{"type":29,"tag":2730,"props":14018,"children":14019},{"style":5139},[14020],{"type":35,"value":5293},{"type":29,"tag":2730,"props":14022,"children":14023},{"style":5121},[14024],{"type":35,"value":14025},"commande",{"type":29,"tag":2730,"props":14027,"children":14028},{"style":5139},[14029],{"type":35,"value":332},{"type":29,"tag":2730,"props":14031,"children":14032},{"style":5226},[14033],{"type":35,"value":14034},"isUrgent",{"type":29,"tag":2730,"props":14036,"children":14037},{"style":5139},[14038],{"type":35,"value":5234},{"type":29,"tag":2730,"props":14040,"children":14041},{"style":5127},[14042],{"type":35,"value":7291},{"type":29,"tag":2730,"props":14044,"children":14045},{"style":5127},[14046],{"type":35,"value":7296},{"type":29,"tag":2730,"props":14048,"children":14049},{"style":5121},[14050],{"type":35,"value":14025},{"type":29,"tag":2730,"props":14052,"children":14053},{"style":5139},[14054],{"type":35,"value":332},{"type":29,"tag":2730,"props":14056,"children":14057},{"style":5226},[14058],{"type":35,"value":14059},"isValide",{"type":29,"tag":2730,"props":14061,"children":14062},{"style":5139},[14063],{"type":35,"value":5387},{"type":29,"tag":2730,"props":14065,"children":14066},{"style":5139},[14067],{"type":35,"value":5239},{"type":29,"tag":2730,"props":14069,"children":14070},{"class":5102,"line":5153},[14071,14075,14079,14083,14087,14091,14095,14100],{"type":29,"tag":2730,"props":14072,"children":14073},{"style":5121},[14074],{"type":35,"value":8336},{"type":29,"tag":2730,"props":14076,"children":14077},{"style":5139},[14078],{"type":35,"value":332},{"type":29,"tag":2730,"props":14080,"children":14081},{"style":5121},[14082],{"type":35,"value":8345},{"type":29,"tag":2730,"props":14084,"children":14085},{"style":5139},[14086],{"type":35,"value":332},{"type":29,"tag":2730,"props":14088,"children":14089},{"style":5226},[14090],{"type":35,"value":8354},{"type":29,"tag":2730,"props":14092,"children":14093},{"style":5139},[14094],{"type":35,"value":6452},{"type":29,"tag":2730,"props":14096,"children":14097},{"style":6597},[14098],{"type":35,"value":14099},"\"Erreur\"",{"type":29,"tag":2730,"props":14101,"children":14102},{"style":5139},[14103],{"type":35,"value":7837},{"type":29,"tag":2730,"props":14105,"children":14106},{"class":5102,"line":5162},[14107],{"type":29,"tag":2730,"props":14108,"children":14109},{"style":5139},[14110],{"type":35,"value":5536},{"type":29,"tag":2730,"props":14112,"children":14113},{"class":5102,"line":3553},[14114],{"type":29,"tag":2730,"props":14115,"children":14116},{"style":5106},[14117],{"type":35,"value":14118},"    // Autres opérations\n",{"type":29,"tag":2730,"props":14120,"children":14121},{"class":5102,"line":5539},[14122],{"type":29,"tag":2730,"props":14123,"children":14124},{"style":5139},[14125],{"type":35,"value":5255},{"type":29,"tag":2730,"props":14127,"children":14128},{"class":5102,"line":5547},[14129],{"type":29,"tag":2730,"props":14130,"children":14131},{"emptyLinePlaceholder":13},[14132],{"type":35,"value":5150},{"type":29,"tag":2730,"props":14134,"children":14135},{"class":5102,"line":5555},[14136],{"type":29,"tag":2730,"props":14137,"children":14138},{"style":5106},[14139],{"type":35,"value":14140},"// Refactorisation progressive\n",{"type":29,"tag":2730,"props":14142,"children":14143},{"class":5102,"line":5564},[14144,14148,14152,14157,14161,14165,14169,14173],{"type":29,"tag":2730,"props":14145,"children":14146},{"style":5115},[14147],{"type":35,"value":5218},{"type":29,"tag":2730,"props":14149,"children":14150},{"style":5115},[14151],{"type":35,"value":5223},{"type":29,"tag":2730,"props":14153,"children":14154},{"style":5226},[14155],{"type":35,"value":14156}," verifierCommandeValide",{"type":29,"tag":2730,"props":14158,"children":14159},{"style":5139},[14160],{"type":35,"value":6452},{"type":29,"tag":2730,"props":14162,"children":14163},{"style":6455},[14164],{"type":35,"value":13996},{"type":29,"tag":2730,"props":14166,"children":14167},{"style":5121},[14168],{"type":35,"value":14001},{"type":29,"tag":2730,"props":14170,"children":14171},{"style":5139},[14172],{"type":35,"value":3849},{"type":29,"tag":2730,"props":14174,"children":14175},{"style":5139},[14176],{"type":35,"value":5239},{"type":29,"tag":2730,"props":14178,"children":14179},{"class":5102,"line":2949},[14180,14184,14188,14192,14196,14200,14204,14208],{"type":29,"tag":2730,"props":14181,"children":14182},{"style":5115},[14183],{"type":35,"value":5493},{"type":29,"tag":2730,"props":14185,"children":14186},{"style":5139},[14187],{"type":35,"value":5293},{"type":29,"tag":2730,"props":14189,"children":14190},{"style":5127},[14191],{"type":35,"value":9324},{"type":29,"tag":2730,"props":14193,"children":14194},{"style":5121},[14195],{"type":35,"value":14025},{"type":29,"tag":2730,"props":14197,"children":14198},{"style":5139},[14199],{"type":35,"value":332},{"type":29,"tag":2730,"props":14201,"children":14202},{"style":5226},[14203],{"type":35,"value":14059},{"type":29,"tag":2730,"props":14205,"children":14206},{"style":5139},[14207],{"type":35,"value":5387},{"type":29,"tag":2730,"props":14209,"children":14210},{"style":5139},[14211],{"type":35,"value":5239},{"type":29,"tag":2730,"props":14213,"children":14214},{"class":5102,"line":5612},[14215,14220,14224,14229,14233,14237],{"type":29,"tag":2730,"props":14216,"children":14217},{"style":5115},[14218],{"type":35,"value":14219},"        throw",{"type":29,"tag":2730,"props":14221,"children":14222},{"style":5115},[14223],{"type":35,"value":13640},{"type":29,"tag":2730,"props":14225,"children":14226},{"style":5226},[14227],{"type":35,"value":14228}," IllegalArgumentException",{"type":29,"tag":2730,"props":14230,"children":14231},{"style":5139},[14232],{"type":35,"value":6452},{"type":29,"tag":2730,"props":14234,"children":14235},{"style":6597},[14236],{"type":35,"value":10577},{"type":29,"tag":2730,"props":14238,"children":14239},{"style":5139},[14240],{"type":35,"value":7837},{"type":29,"tag":2730,"props":14242,"children":14243},{"class":5102,"line":5620},[14244],{"type":29,"tag":2730,"props":14245,"children":14246},{"style":5139},[14247],{"type":35,"value":5536},{"type":29,"tag":2730,"props":14249,"children":14250},{"class":5102,"line":5628},[14251],{"type":29,"tag":2730,"props":14252,"children":14253},{"style":5139},[14254],{"type":35,"value":5255},{"type":29,"tag":37,"props":14256,"children":14257},{},[14258,14260,14266],{"type":35,"value":14259},"Dans cet exemple, au lieu de réécrire toute la méthode ",{"type":29,"tag":1716,"props":14261,"children":14263},{"className":14262},[],[14264],{"type":35,"value":14265},"traitementCommande",{"type":35,"value":14267},", j’ai simplement extrait une partie du code dans une fonction dédiée, ce qui clarifie une portion du processus sans tout chambouler. Ce type de petit refactoring est une manière efficace de rendre le code plus propre à mesure que vous y travaillez.",{"type":29,"tag":10266,"props":14269,"children":14270},{"type":10268},[14271],{"type":29,"tag":37,"props":14272,"children":14273},{},[14274],{"type":35,"value":14275},"N'attendez pas de trouver du temps pour tout réécrire. Appliquez des petites améliorations à chaque passage sur du code existant. Petit à petit, vous verrez des résultats.",{"type":29,"tag":66,"props":14277,"children":14278},{},[],{"type":29,"tag":106,"props":14280,"children":14282},{"id":14281},"_2-prioriser-le-clean-code-sous-pression",[14283],{"type":29,"tag":55,"props":14284,"children":14285},{},[14286],{"type":35,"value":14287},"2. Prioriser le Clean Code sous pression",{"type":29,"tag":37,"props":14289,"children":14290},{},[14291,14293,14297],{"type":35,"value":14292},"Il est souvent tentant de sacrifier la qualité du code quand les délais sont serrés. Cependant, adopter les principes du ",{"type":29,"tag":55,"props":14294,"children":14295},{},[14296],{"type":35,"value":5426},{"type":35,"value":14298}," ne signifie pas que vous devez ralentir. Bien au contraire, ces principes, lorsqu’ils sont appliqués de manière cohérente, peuvent vous aider à être plus rapide, en vous permettant de comprendre et de modifier votre code plus facilement.",{"type":29,"tag":37,"props":14300,"children":14301},{},[14302,14304,14309],{"type":35,"value":14303},"Voici quelques astuces pour ",{"type":29,"tag":55,"props":14305,"children":14306},{},[14307],{"type":35,"value":14308},"garder votre code propre même sous pression",{"type":35,"value":1119},{"type":29,"tag":661,"props":14311,"children":14312},{},[14313,14323,14333],{"type":29,"tag":665,"props":14314,"children":14315},{},[14316,14321],{"type":29,"tag":55,"props":14317,"children":14318},{},[14319],{"type":35,"value":14320},"Utilisez des fonctions courtes et bien nommées.",{"type":35,"value":14322}," Même en mode rush, séparer les responsabilités vous permet de limiter les erreurs et d’accélérer le débogage.",{"type":29,"tag":665,"props":14324,"children":14325},{},[14326,14331],{"type":29,"tag":55,"props":14327,"children":14328},{},[14329],{"type":35,"value":14330},"Nommez les variables clairement.",{"type":35,"value":14332}," Prendre quelques secondes pour choisir un nom explicite peut vous faire gagner des heures plus tard en maintenance.",{"type":29,"tag":665,"props":14334,"children":14335},{},[14336,14341],{"type":29,"tag":55,"props":14337,"children":14338},{},[14339],{"type":35,"value":14340},"Évitez les solutions \"hacky\".",{"type":35,"value":14342}," Même si une solution rapide semble tentante, elle peut introduire des bugs difficiles à repérer plus tard.",{"type":29,"tag":10266,"props":14344,"children":14345},{"type":10268},[14346],{"type":29,"tag":37,"props":14347,"children":14348},{},[14349],{"type":35,"value":14350},"Fixez-vous une règle simple : \"Pas de code hacky\". Si vous vous trouvez sur le point d’ajouter une solution temporaire ou désordonnée, posez-vous la question : est-ce que vous vous souviendrez de ce hack dans 3 mois ? Si non, trouvez un moyen plus propre.",{"type":29,"tag":66,"props":14352,"children":14353},{},[],{"type":29,"tag":106,"props":14355,"children":14357},{"id":14356},"_3-collaborer-avec-dautres-développeurs-pour-améliorer-le-code",[14358],{"type":29,"tag":55,"props":14359,"children":14360},{},[14361],{"type":35,"value":14362},"3. Collaborer avec d’autres développeurs pour améliorer le code",{"type":29,"tag":37,"props":14364,"children":14365},{},[14366,14367,14371,14373,14378],{"type":35,"value":5420},{"type":29,"tag":55,"props":14368,"children":14369},{},[14370],{"type":35,"value":5426},{"type":35,"value":14372}," n’est pas seulement une affaire personnelle. Il est aussi essentiel d’inciter vos collègues à adopter ces bonnes pratiques. Une ",{"type":29,"tag":55,"props":14374,"children":14375},{},[14376],{"type":35,"value":14377},"revue de code",{"type":35,"value":14379}," régulière est un excellent moyen d’encourager une culture du Clean Code au sein de votre équipe. Chacun peut ainsi apprendre des autres et partager des conseils sur la façon d’améliorer la qualité du code.",{"type":29,"tag":37,"props":14381,"children":14382},{},[14383],{"type":29,"tag":55,"props":14384,"children":14385},{},[14386],{"type":35,"value":14387},"Quelques conseils pour une bonne collaboration :",{"type":29,"tag":661,"props":14389,"children":14390},{},[14391,14401,14411],{"type":29,"tag":665,"props":14392,"children":14393},{},[14394,14399],{"type":29,"tag":55,"props":14395,"children":14396},{},[14397],{"type":35,"value":14398},"Soyez constructif lors des revues de code.",{"type":35,"value":14400}," Au lieu de pointer du doigt les erreurs, proposez des solutions et expliquez pourquoi une modification rendrait le code plus clair.",{"type":29,"tag":665,"props":14402,"children":14403},{},[14404,14409],{"type":29,"tag":55,"props":14405,"children":14406},{},[14407],{"type":35,"value":14408},"Favorisez la documentation du code.",{"type":35,"value":14410}," Encouragez vos collègues à écrire des noms explicites, à bien structurer les fonctions, et à éviter les duplications.",{"type":29,"tag":665,"props":14412,"children":14413},{},[14414,14419],{"type":29,"tag":55,"props":14415,"children":14416},{},[14417],{"type":35,"value":14418},"Partagez les succès.",{"type":35,"value":14420}," Quand un bon refactoring ou une amélioration de la lisibilité est fait, mettez-le en avant lors de vos réunions d’équipe.",{"type":29,"tag":10266,"props":14422,"children":14423},{"type":10268},[14424],{"type":29,"tag":37,"props":14425,"children":14426},{},[14427,14429,14433],{"type":35,"value":14428},"Créez un guide interne de ",{"type":29,"tag":55,"props":14430,"children":14431},{},[14432],{"type":35,"value":5426},{"type":35,"value":14434}," avec des exemples de bonnes pratiques. Cela permet à tous les développeurs de se référer à des règles claires et d'améliorer progressivement la qualité du code.",{"type":29,"tag":66,"props":14436,"children":14437},{},[],{"type":29,"tag":70,"props":14439,"children":14441},{"id":14440},"faq-sur-le-clean-code",[14442],{"type":29,"tag":55,"props":14443,"children":14444},{},[14445],{"type":35,"value":14446},"FAQ sur le Clean Code",{"type":29,"tag":37,"props":14448,"children":14449},{},[14450,14452,14456,14458,14462],{"type":35,"value":14451},"Voici une section ",{"type":29,"tag":55,"props":14453,"children":14454},{},[14455],{"type":35,"value":6119},{"type":35,"value":14457}," qui répond aux questions les plus courantes sur le ",{"type":29,"tag":55,"props":14459,"children":14460},{},[14461],{"type":35,"value":5426},{"type":35,"value":14463},". Que vous débutiez ou que vous soyez déjà familier avec ces principes, vous trouverez ici des réponses claires à vos interrogations.",{"type":29,"tag":371,"props":14465,"children":14466},{},[14467,14472],{"type":29,"tag":375,"props":14468,"children":14469},{},[14470],{"type":35,"value":14471},"1. Qu'est-ce que le Clean Code exactement ?",{"type":29,"tag":37,"props":14473,"children":14474},{},[14475,14476,14480],{"type":35,"value":5420},{"type":29,"tag":55,"props":14477,"children":14478},{},[14479],{"type":35,"value":5426},{"type":35,"value":14481}," est un ensemble de pratiques visant à écrire un code qui soit lisible, maintenable, et compréhensible par d'autres développeurs. Il s'agit d'un code bien structuré, avec des noms explicites, des fonctions courtes, et des responsabilités clairement définies. L'objectif est de rendre le code facile à modifier et à faire évoluer au fil du temps, tout en réduisant les risques d'erreurs.",{"type":29,"tag":371,"props":14483,"children":14484},{},[14485,14490],{"type":29,"tag":375,"props":14486,"children":14487},{},[14488],{"type":35,"value":14489},"2. Pourquoi est-il important d'écrire du Clean Code ?",{"type":29,"tag":37,"props":14491,"children":14492},{},[14493,14495,14499],{"type":35,"value":14494},"Un code propre permet de gagner du temps à long terme. Même si écrire du ",{"type":29,"tag":55,"props":14496,"children":14497},{},[14498],{"type":35,"value":5426},{"type":35,"value":14500}," demande un effort initial, cela réduit considérablement le temps nécessaire pour comprendre, déboguer, et modifier votre code. Cela améliore également la collaboration au sein des équipes de développement, car tout le monde peut lire et comprendre le code rapidement.",{"type":29,"tag":371,"props":14502,"children":14503},{},[14504,14509,14520],{"type":29,"tag":375,"props":14505,"children":14506},{},[14507],{"type":35,"value":14508},"3. Quels sont les principaux principes du Clean Code ?",{"type":29,"tag":37,"props":14510,"children":14511},{},[14512,14514,14518],{"type":35,"value":14513},"Les principes du ",{"type":29,"tag":55,"props":14515,"children":14516},{},[14517],{"type":35,"value":5426},{"type":35,"value":14519}," incluent :",{"type":29,"tag":661,"props":14521,"children":14522},{},[14523,14533,14543,14553,14561],{"type":29,"tag":665,"props":14524,"children":14525},{},[14526,14531],{"type":29,"tag":55,"props":14527,"children":14528},{},[14529],{"type":35,"value":14530},"Noms explicites",{"type":35,"value":14532}," pour les variables, fonctions, et classes",{"type":29,"tag":665,"props":14534,"children":14535},{},[14536,14541],{"type":29,"tag":55,"props":14537,"children":14538},{},[14539],{"type":35,"value":14540},"Fonctions courtes",{"type":35,"value":14542},", qui se concentrent sur une seule responsabilité",{"type":29,"tag":665,"props":14544,"children":14545},{},[14546,14551],{"type":29,"tag":55,"props":14547,"children":14548},{},[14549],{"type":35,"value":14550},"Réduction des duplications",{"type":35,"value":14552}," dans le code",{"type":29,"tag":665,"props":14554,"children":14555},{},[14556],{"type":29,"tag":55,"props":14557,"children":14558},{},[14559],{"type":35,"value":14560},"Gestion claire des erreurs et des exceptions",{"type":29,"tag":665,"props":14562,"children":14563},{},[14564,14569],{"type":29,"tag":55,"props":14565,"children":14566},{},[14567],{"type":35,"value":14568},"Tests unitaires",{"type":35,"value":14570}," pour garantir la robustesse du code",{"type":29,"tag":371,"props":14572,"children":14573},{},[14574,14579],{"type":29,"tag":375,"props":14575,"children":14576},{},[14577],{"type":35,"value":14578},"4. Comment puis-je appliquer le Clean Code sur un projet déjà existant ?",{"type":29,"tag":37,"props":14580,"children":14581},{},[14582,14584,14588],{"type":35,"value":14583},"Si vous travaillez sur un projet existant avec du code désordonné, la meilleure approche est de faire du ",{"type":29,"tag":55,"props":14585,"children":14586},{},[14587],{"type":35,"value":13947},{"type":35,"value":14589},". Cela signifie que vous améliorez le code petit à petit à chaque fois que vous ajoutez de nouvelles fonctionnalités ou que vous corrigez des bugs. Cela permet d'améliorer la qualité sans tout réécrire d'un coup.",{"type":29,"tag":371,"props":14591,"children":14592},{},[14593,14598],{"type":29,"tag":375,"props":14594,"children":14595},{},[14596],{"type":35,"value":14597},"5. Est-il possible de suivre les principes du Clean Code tout en respectant des délais serrés ?",{"type":29,"tag":37,"props":14599,"children":14600},{},[14601,14603,14607],{"type":35,"value":14602},"Oui, absolument ! Suivre les principes du ",{"type":29,"tag":55,"props":14604,"children":14605},{},[14606],{"type":35,"value":5426},{"type":35,"value":14608}," ne ralentit pas votre travail, bien au contraire. En écrivant un code plus lisible et mieux structuré dès le départ, vous réduisez le temps passé à déboguer et à comprendre votre propre code plus tard. Même sous pression, privilégiez des fonctions courtes, des noms explicites, et évitez les solutions temporaires ou \"hacky\".",{"type":29,"tag":371,"props":14610,"children":14611},{},[14612,14617],{"type":29,"tag":375,"props":14613,"children":14614},{},[14615],{"type":35,"value":14616},"6. Comment convaincre mon équipe d'adopter le Clean Code ?",{"type":29,"tag":37,"props":14618,"children":14619},{},[14620,14622,14626],{"type":35,"value":14621},"Commencez par introduire des revues de code régulières où chaque développeur peut proposer des améliorations. Partagez les avantages du ",{"type":29,"tag":55,"props":14623,"children":14624},{},[14625],{"type":35,"value":5426},{"type":35,"value":14627}," en termes de maintenabilité et de productivité à long terme. Vous pouvez aussi créer un guide interne des bonnes pratiques pour que chacun sache à quoi se référer. Enfin, montrez par l'exemple en appliquant ces principes dans votre propre code.",{"type":29,"tag":66,"props":14629,"children":14630},{},[],{"type":29,"tag":106,"props":14632,"children":14634},{"id":14633},"conclusion",[14635],{"type":29,"tag":55,"props":14636,"children":14637},{},[14638],{"type":35,"value":14639},"Conclusion",{"type":29,"tag":37,"props":14641,"children":14642},{},[14643,14644,14648],{"type":35,"value":5420},{"type":29,"tag":55,"props":14645,"children":14646},{},[14647],{"type":35,"value":5426},{"type":35,"value":14649}," est bien plus qu'une simple pratique technique. C'est une manière de penser et de coder qui vous permettra d'être plus efficace, de travailler en équipe plus facilement, et de maintenir des projets sur le long terme sans vous noyer dans un code difficile à comprendre. En appliquant ces principes, vous améliorerez non seulement la qualité de votre code, mais aussi votre productivité et votre satisfaction en tant que développeur.",{"type":29,"tag":166,"props":14651,"children":14654},{"cta":14652,"href":443,"title":14653,"type":445},"Télécharger le diagnostic gratuit →","Ressource gratuite : 10 signaux que votre équipe tech est en danger",[14655],{"type":29,"tag":37,"props":14656,"children":14657},{},[14658],{"type":35,"value":14659},"10 signaux d'alarme pour identifier les problèmes systémiques cachés dans votre équipe avant qu'ils deviennent critiques. Auto-diagnostic inclus : 5 minutes pour savoir où vous en êtes.",{"type":29,"tag":6195,"props":14661,"children":14662},{},[14663],{"type":35,"value":6199},{"title":8,"searchDepth":453,"depth":453,"links":14665},[14666,14671,14676,14681,14686,14691],{"id":10012,"depth":453,"text":10018,"children":14667},[14668,14669,14670],{"id":10021,"depth":459,"text":10027},{"id":10065,"depth":459,"text":10071},{"id":10084,"depth":459,"text":10090},{"id":10114,"depth":453,"text":10120,"children":14672},[14673,14674,14675],{"id":10134,"depth":459,"text":10140},{"id":10277,"depth":459,"text":10283},{"id":11140,"depth":459,"text":11146},{"id":11479,"depth":453,"text":11485,"children":14677},[14678,14679,14680],{"id":11505,"depth":459,"text":11511},{"id":11669,"depth":459,"text":11675},{"id":12181,"depth":459,"text":12187},{"id":12569,"depth":453,"text":12575,"children":14682},[14683,14684,14685],{"id":12588,"depth":459,"text":12594},{"id":13025,"depth":459,"text":13031},{"id":13533,"depth":459,"text":13539},{"id":13904,"depth":453,"text":13910,"children":14687},[14688,14689,14690],{"id":13924,"depth":459,"text":13930},{"id":14281,"depth":459,"text":14287},{"id":14356,"depth":459,"text":14362},{"id":14440,"depth":453,"text":14446,"children":14692},[14693],{"id":14633,"depth":459,"text":14639},"content:fr:dette-technique:clean-code-software-craftsmanship-principes-java.md","fr/dette-technique/clean-code-software-craftsmanship-principes-java.md","fr/dette-technique/clean-code-software-craftsmanship-principes-java",{"_path":14698,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":14699,"description":14700,"id":11037,"date":14701,"listed":13,"nocomments":7,"hidden":7,"categories":14702,"tags":14703,"--cover":14704,"readingTime":14705,"body":14710,"_type":466,"_id":16237,"_source":468,"_file":16238,"_stem":16239,"_extension":471},"/fr/dette-technique/yagni-ecrire-code-qualite-sans-fonctionnalites-inutiles","Principe YAGNI, Comment écrire du code de qualité en évitant les fonctionnalités inutiles","Découvrez le principe YAGNI en software craftsmanship et apprenez à simplifier votre code en évitant d'anticiper des besoins futurs. Exemples concrets en Java inclus.","2024-06-18",[6],[4961,4962],"covers/articles/principe-yagni.jpg",{"text":14706,"minutes":14707,"time":14708,"words":14709},"13 min read",12.475,748500,2495,{"type":26,"children":14711,"toc":16226},[14712,14718,14724,14729,14740,14745,14748,14754,14759,14769,14774,14784,14796,14806,14811,14821,14826,14829,14838,14844,14849,14859,14871,14881,14886,14896,14901,14911,14916,14920,14925,15275,15288,15291,15297,15302,15312,15332,15339,15507,15525,15535,15540,15548,15793,15805,15915,15925,15930,15940,15945,15953,15961,15972,15977,15980,15986,15991,16001,16006,16014,16019,16029,16034,16041,16046,16056,16061,16071,16076,16086,16091,16094,16100,16119,16132,16145,16158,16171,16190,16203,16206,16210,16215,16222],{"type":29,"tag":70,"props":14713,"children":14715},{"id":14714},"yagni-comment-écrire-du-code-de-qualité-en-évitant-les-fonctionnalités-inutiles",[14716],{"type":35,"value":14717},"YAGNI : Comment écrire du code de qualité en évitant les fonctionnalités inutiles",{"type":29,"tag":106,"props":14719,"children":14721},{"id":14720},"introduction-quest-ce-que-yagni",[14722],{"type":35,"value":14723},"Introduction : Qu’est-ce que YAGNI ?",{"type":29,"tag":37,"props":14725,"children":14726},{},[14727],{"type":35,"value":14728},"Mise en situation : vous travaillez sur un projet de développement, et vous vous dites que ce serait une bonne idée d’anticiper certains besoins futurs. Vous décidez donc d’ajouter une ou deux fonctionnalités \"au cas où\". Mais voilà, des mois plus tard, ces fonctionnalités ne sont toujours pas utilisées, et pire, elles compliquent la lecture et la maintenance du code. Cela vous semble familier ?",{"type":29,"tag":37,"props":14730,"children":14731},{},[14732,14734,14738],{"type":35,"value":14733},"Si c’est le cas, vous n’êtes pas seul. Beaucoup de développeurs tombent dans ce piège : c’est là que le principe YAGNI (You Aren’t Gonna Need It) intervient. Formulé par Kent Beck dans le cadre de l’Extreme Programming, YAGNI est un des piliers du ",{"type":29,"tag":55,"props":14735,"children":14736},{},[14737],{"type":35,"value":6286},{"type":35,"value":14739},", conçu pour éviter l’ajout de fonctionnalités inutiles. En l’appliquant correctement, vous gardez votre code simple, évolutif et sans surcharge. C’est exactement ce que j’observe dans des équipes que j’accompagne : chez un client dans le secteur bancaire, une estimation a révélé que près de 30 % du code ne répondait à aucun besoin actif, ce qui ralentissait chaque livraison et chaque onboarding.",{"type":29,"tag":37,"props":14741,"children":14742},{},[14743],{"type":35,"value":14744},"Je vais vous montrer comment appliquer YAGNI de manière pratique dans votre code, avec des exemples concrets en Java. Vous comprendrez comment identifier et éviter les ajouts superflus pour écrire du code plus propre, plus rapide à tester et plus facile à maintenir.",{"type":29,"tag":66,"props":14746,"children":14747},{},[],{"type":29,"tag":106,"props":14749,"children":14751},{"id":14750},"pourquoi-appliquer-yagni",[14752],{"type":35,"value":14753},"Pourquoi appliquer YAGNI ?",{"type":29,"tag":37,"props":14755,"children":14756},{},[14757],{"type":35,"value":14758},"Le principe de YAGNI n’est pas juste un mantra pour les puristes du code propre, il a des avantages concrets qui impactent la qualité de votre code et la productivité de votre équipe. Voici pourquoi appliquer YAGNI peut vraiment transformer votre manière de développer :",{"type":29,"tag":5055,"props":14760,"children":14762},{"id":14761},"_1-réduction-de-la-complexité",[14763,14764],{"type":35,"value":5974},{"type":29,"tag":55,"props":14765,"children":14766},{},[14767],{"type":35,"value":14768},"Réduction de la complexité",{"type":29,"tag":37,"props":14770,"children":14771},{},[14772],{"type":35,"value":14773},"Chaque nouvelle fonctionnalité ajoutée au code, même si elle semble innocente, augmente la complexité globale. Cette complexité se traduit par plus de lignes de code à maintenir, des tests supplémentaires à écrire et un risque plus élevé de bugs. En évitant d'ajouter des fonctionnalités inutiles, vous simplifiez votre code et le rendez plus facile à comprendre pour vous et pour les autres développeurs qui le liront après vous.",{"type":29,"tag":5055,"props":14775,"children":14777},{"id":14776},"_2-diminution-de-la-dette-technique",[14778,14779],{"type":35,"value":5990},{"type":29,"tag":55,"props":14780,"children":14781},{},[14782],{"type":35,"value":14783},"Diminution de la dette technique",{"type":29,"tag":37,"props":14785,"children":14786},{},[14787,14789,14794],{"type":35,"value":14788},"Ajouter des fonctionnalités que vous n’utiliserez peut-être jamais, c’est créer une forme de ",{"type":29,"tag":43,"props":14790,"children":14791},{"href":1945},[14792],{"type":35,"value":14793},"dette technique",{"type":35,"value":14795},". Avec le temps, ces parties de code inutiles peuvent poser des problèmes : elles deviennent obsolètes, difficiles à maintenir ou doivent être adaptées pour fonctionner avec d’autres changements. En appliquant YAGNI, vous évitez d’accumuler cette dette, et vous restez concentré sur les fonctionnalités réellement nécessaires.",{"type":29,"tag":5055,"props":14797,"children":14799},{"id":14798},"_3-gagner-du-temps-et-des-ressources",[14800,14801],{"type":35,"value":1209},{"type":29,"tag":55,"props":14802,"children":14803},{},[14804],{"type":35,"value":14805},"Gagner du temps et des ressources",{"type":29,"tag":37,"props":14807,"children":14808},{},[14809],{"type":35,"value":14810},"Quand vous écrivez moins de code, vous gagnez du temps. Ce n’est pas seulement le temps passé à écrire, mais aussi celui passé à tester, déboguer et maintenir ce code. Cela permet à votre équipe de se concentrer sur des fonctionnalités qui apportent une réelle valeur au produit final, plutôt que de perdre du temps sur des éléments hypothétiques.",{"type":29,"tag":5055,"props":14812,"children":14814},{"id":14813},"_4-favoriser-la-flexibilité",[14815,14816],{"type":35,"value":6100},{"type":29,"tag":55,"props":14817,"children":14818},{},[14819],{"type":35,"value":14820},"Favoriser la flexibilité",{"type":29,"tag":37,"props":14822,"children":14823},{},[14824],{"type":35,"value":14825},"En vous concentrant uniquement sur ce qui est nécessaire, vous vous assurez que votre code est plus modulaire et prêt à évoluer. Un code simple est plus facile à adapter lorsqu’un nouveau besoin se présente réellement. YAGNI vous encourage à ne pas anticiper les besoins futurs, car ces besoins changent souvent avec le temps. En gardant votre code minimaliste, vous serez plus agile face aux demandes imprévues.",{"type":29,"tag":66,"props":14827,"children":14828},{},[],{"type":29,"tag":166,"props":14830,"children":14832},{"cta":168,"href":169,"title":14831,"type":171},"Votre équipe accumule des fonctionnalités que personne n’utilise ?",[14833],{"type":29,"tag":37,"props":14834,"children":14835},{},[14836],{"type":35,"value":14837},"La base de code grossit, la dette technique s’accumule et personne ne sait vraiment ce qui est encore actif. Résultat : chaque modification est un risque, et la vélocité chute sprint après sprint. Réservons 30 minutes pour identifier ce qui freine réellement votre équipe et construire un plan d’action concret.",{"type":29,"tag":106,"props":14839,"children":14841},{"id":14840},"comment-identifier-une-fonctionnalité-inutile",[14842],{"type":35,"value":14843},"Comment identifier une fonctionnalité inutile ?",{"type":29,"tag":37,"props":14845,"children":14846},{},[14847],{"type":35,"value":14848},"L’une des plus grandes difficultés dans l’application du principe YAGNI est de savoir si une fonctionnalité est réellement nécessaire ou non. La tentation d’ajouter des éléments \"au cas où\" peut être forte, mais voici quelques critères pour vous aider à identifier ce qui est superflu.",{"type":29,"tag":5055,"props":14850,"children":14852},{"id":14851},"_1-demande-immédiate-ou-hypothétique",[14853,14854],{"type":35,"value":5974},{"type":29,"tag":55,"props":14855,"children":14856},{},[14857],{"type":35,"value":14858},"Demande immédiate ou hypothétique ?",{"type":29,"tag":37,"props":14860,"children":14861},{},[14862,14864,14869],{"type":35,"value":14863},"Un des indicateurs les plus simples : est-ce que cette fonctionnalité répond à un besoin immédiat ? Si la réponse est non et qu’elle est seulement là pour anticiper un besoin futur potentiel, il est probable que vous n’en aurez pas besoin. YAGNI vous pousse à implémenter uniquement ce qui est nécessaire ",{"type":29,"tag":55,"props":14865,"children":14866},{},[14867],{"type":35,"value":14868},"aujourd’hui",{"type":35,"value":14870},". Si un jour ce besoin se présente, vous pourrez toujours l’ajouter au bon moment.",{"type":29,"tag":5055,"props":14872,"children":14874},{"id":14873},"_2-est-ce-que-cest-nécessaire-pour-la-fonctionnalité-actuelle",[14875,14876],{"type":35,"value":5990},{"type":29,"tag":55,"props":14877,"children":14878},{},[14879],{"type":35,"value":14880},"Est-ce que c’est nécessaire pour la fonctionnalité actuelle ?",{"type":29,"tag":37,"props":14882,"children":14883},{},[14884],{"type":35,"value":14885},"Si cette nouvelle fonctionnalité n’est pas essentielle pour le fonctionnement de ce que vous êtes en train de développer, alors elle est peut-être inutile. Posez-vous cette question : \"Est-ce que mon application marcherait toujours correctement sans cette fonctionnalité ?\" Si la réponse est oui, il est probablement sage de la laisser de côté pour l’instant.",{"type":29,"tag":5055,"props":14887,"children":14889},{"id":14888},"_3-est-ce-que-ça-complique-le-code",[14890,14891],{"type":35,"value":1209},{"type":29,"tag":55,"props":14892,"children":14893},{},[14894],{"type":35,"value":14895},"Est-ce que ça complique le code ?",{"type":29,"tag":37,"props":14897,"children":14898},{},[14899],{"type":35,"value":14900},"Un autre bon indicateur est de voir si cette nouvelle fonctionnalité ajoute de la complexité au code existant. Si elle rend votre code plus difficile à lire, à tester ou à maintenir, c’est un signe clair qu’elle pourrait être inutile. Le code simple est toujours plus facile à faire évoluer, et YAGNI vous encourage à garder votre code aussi léger que possible.",{"type":29,"tag":5055,"props":14902,"children":14904},{"id":14903},"_4-est-ce-que-cest-une-demande-externe-ou-interne",[14905,14906],{"type":35,"value":6100},{"type":29,"tag":55,"props":14907,"children":14908},{},[14909],{"type":35,"value":14910},"Est-ce que c’est une demande externe ou interne ?",{"type":29,"tag":37,"props":14912,"children":14913},{},[14914],{"type":35,"value":14915},"Parfois, la pression vient de l’extérieur : un client, un supérieur ou un collègue peut insister pour ajouter des fonctionnalités \"juste au cas où\". Dans ces situations, je vous recommande d'évaluer soigneusement si la demande est justifiée ou si elle repose sur des hypothèses. Expliquer les avantages du principe YAGNI peut aussi aider à éviter d’ajouter des fonctionnalités inutiles.",{"type":29,"tag":5055,"props":14917,"children":14918},{"id":5045},[14919],{"type":35,"value":5048},{"type":29,"tag":37,"props":14921,"children":14922},{},[14923],{"type":35,"value":14924},"Prenons un exemple simple en Java où vous pourriez être tenté d’ajouter une fonctionnalité inutile :",{"type":29,"tag":5091,"props":14926,"children":14928},{"className":5093,"code":14927,"language":5095,"meta":8,"style":8},"// Exemple où une fonctionnalité inutile est ajoutée\npublic class User {\n    private String name;\n    private int age;\n    private String address; // Cette information n'est pas encore utilisée\n\n    public User(String name, int age) {\n        this.name = name;\n        this.age = age;\n        // On pourrait être tenté d'ajouter l'adresse dès maintenant, mais YAGNI !\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n    \n    // On pourrait ajouter un getter pour l'adresse ici, mais ça serait prématuré.\n}\n",[14929],{"type":29,"tag":1716,"props":14930,"children":14931},{"__ignoreMap":8},[14932,14940,14960,14981,15001,15026,15033,15076,15104,15132,15140,15147,15154,15178,15193,15200,15207,15231,15246,15253,15260,15268],{"type":29,"tag":2730,"props":14933,"children":14934},{"class":5102,"line":4267},[14935],{"type":29,"tag":2730,"props":14936,"children":14937},{"style":5106},[14938],{"type":35,"value":14939},"// Exemple où une fonctionnalité inutile est ajoutée\n",{"type":29,"tag":2730,"props":14941,"children":14942},{"class":5102,"line":453},[14943,14947,14951,14956],{"type":29,"tag":2730,"props":14944,"children":14945},{"style":5115},[14946],{"type":35,"value":5218},{"type":29,"tag":2730,"props":14948,"children":14949},{"style":5115},[14950],{"type":35,"value":8278},{"type":29,"tag":2730,"props":14952,"children":14953},{"style":8281},[14954],{"type":35,"value":14955}," User",{"type":29,"tag":2730,"props":14957,"children":14958},{"style":5139},[14959],{"type":35,"value":5239},{"type":29,"tag":2730,"props":14961,"children":14962},{"class":5102,"line":459},[14963,14967,14972,14977],{"type":29,"tag":2730,"props":14964,"children":14965},{"style":5115},[14966],{"type":35,"value":13726},{"type":29,"tag":2730,"props":14968,"children":14969},{"style":6455},[14970],{"type":35,"value":14971}," String",{"type":29,"tag":2730,"props":14973,"children":14974},{"style":5121},[14975],{"type":35,"value":14976}," name",{"type":29,"tag":2730,"props":14978,"children":14979},{"style":5139},[14980],{"type":35,"value":5142},{"type":29,"tag":2730,"props":14982,"children":14983},{"class":5102,"line":5153},[14984,14988,14992,14997],{"type":29,"tag":2730,"props":14985,"children":14986},{"style":5115},[14987],{"type":35,"value":13726},{"type":29,"tag":2730,"props":14989,"children":14990},{"style":5115},[14991],{"type":35,"value":7887},{"type":29,"tag":2730,"props":14993,"children":14994},{"style":5121},[14995],{"type":35,"value":14996}," age",{"type":29,"tag":2730,"props":14998,"children":14999},{"style":5139},[15000],{"type":35,"value":5142},{"type":29,"tag":2730,"props":15002,"children":15003},{"class":5102,"line":5162},[15004,15008,15012,15017,15021],{"type":29,"tag":2730,"props":15005,"children":15006},{"style":5115},[15007],{"type":35,"value":13726},{"type":29,"tag":2730,"props":15009,"children":15010},{"style":6455},[15011],{"type":35,"value":14971},{"type":29,"tag":2730,"props":15013,"children":15014},{"style":5121},[15015],{"type":35,"value":15016}," address",{"type":29,"tag":2730,"props":15018,"children":15019},{"style":5139},[15020],{"type":35,"value":6506},{"type":29,"tag":2730,"props":15022,"children":15023},{"style":5106},[15024],{"type":35,"value":15025}," // Cette information n'est pas encore utilisée\n",{"type":29,"tag":2730,"props":15027,"children":15028},{"class":5102,"line":3553},[15029],{"type":29,"tag":2730,"props":15030,"children":15031},{"emptyLinePlaceholder":13},[15032],{"type":35,"value":5150},{"type":29,"tag":2730,"props":15034,"children":15035},{"class":5102,"line":5539},[15036,15040,15044,15048,15052,15056,15060,15064,15068,15072],{"type":29,"tag":2730,"props":15037,"children":15038},{"style":5115},[15039],{"type":35,"value":8296},{"type":29,"tag":2730,"props":15041,"children":15042},{"style":5226},[15043],{"type":35,"value":14955},{"type":29,"tag":2730,"props":15045,"children":15046},{"style":5139},[15047],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15049,"children":15050},{"style":6455},[15051],{"type":35,"value":6458},{"type":29,"tag":2730,"props":15053,"children":15054},{"style":8317},[15055],{"type":35,"value":14976},{"type":29,"tag":2730,"props":15057,"children":15058},{"style":5139},[15059],{"type":35,"value":9167},{"type":29,"tag":2730,"props":15061,"children":15062},{"style":5115},[15063],{"type":35,"value":7887},{"type":29,"tag":2730,"props":15065,"children":15066},{"style":8317},[15067],{"type":35,"value":14996},{"type":29,"tag":2730,"props":15069,"children":15070},{"style":5139},[15071],{"type":35,"value":3849},{"type":29,"tag":2730,"props":15073,"children":15074},{"style":5139},[15075],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15077,"children":15078},{"class":5102,"line":5547},[15079,15083,15087,15092,15096,15100],{"type":29,"tag":2730,"props":15080,"children":15081},{"style":5310},[15082],{"type":35,"value":13786},{"type":29,"tag":2730,"props":15084,"children":15085},{"style":5139},[15086],{"type":35,"value":332},{"type":29,"tag":2730,"props":15088,"children":15089},{"style":5121},[15090],{"type":35,"value":15091},"name ",{"type":29,"tag":2730,"props":15093,"children":15094},{"style":5127},[15095],{"type":35,"value":5130},{"type":29,"tag":2730,"props":15097,"children":15098},{"style":5121},[15099],{"type":35,"value":14976},{"type":29,"tag":2730,"props":15101,"children":15102},{"style":5139},[15103],{"type":35,"value":5142},{"type":29,"tag":2730,"props":15105,"children":15106},{"class":5102,"line":5555},[15107,15111,15115,15120,15124,15128],{"type":29,"tag":2730,"props":15108,"children":15109},{"style":5310},[15110],{"type":35,"value":13786},{"type":29,"tag":2730,"props":15112,"children":15113},{"style":5139},[15114],{"type":35,"value":332},{"type":29,"tag":2730,"props":15116,"children":15117},{"style":5121},[15118],{"type":35,"value":15119},"age ",{"type":29,"tag":2730,"props":15121,"children":15122},{"style":5127},[15123],{"type":35,"value":5130},{"type":29,"tag":2730,"props":15125,"children":15126},{"style":5121},[15127],{"type":35,"value":14996},{"type":29,"tag":2730,"props":15129,"children":15130},{"style":5139},[15131],{"type":35,"value":5142},{"type":29,"tag":2730,"props":15133,"children":15134},{"class":5102,"line":5564},[15135],{"type":29,"tag":2730,"props":15136,"children":15137},{"style":5106},[15138],{"type":35,"value":15139},"        // On pourrait être tenté d'ajouter l'adresse dès maintenant, mais YAGNI !\n",{"type":29,"tag":2730,"props":15141,"children":15142},{"class":5102,"line":2949},[15143],{"type":29,"tag":2730,"props":15144,"children":15145},{"style":5139},[15146],{"type":35,"value":5536},{"type":29,"tag":2730,"props":15148,"children":15149},{"class":5102,"line":5612},[15150],{"type":29,"tag":2730,"props":15151,"children":15152},{"emptyLinePlaceholder":13},[15153],{"type":35,"value":5150},{"type":29,"tag":2730,"props":15155,"children":15156},{"class":5102,"line":5620},[15157,15161,15165,15170,15174],{"type":29,"tag":2730,"props":15158,"children":15159},{"style":5115},[15160],{"type":35,"value":8296},{"type":29,"tag":2730,"props":15162,"children":15163},{"style":6455},[15164],{"type":35,"value":14971},{"type":29,"tag":2730,"props":15166,"children":15167},{"style":5226},[15168],{"type":35,"value":15169}," getName",{"type":29,"tag":2730,"props":15171,"children":15172},{"style":5139},[15173],{"type":35,"value":5234},{"type":29,"tag":2730,"props":15175,"children":15176},{"style":5139},[15177],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15179,"children":15180},{"class":5102,"line":5628},[15181,15185,15189],{"type":29,"tag":2730,"props":15182,"children":15183},{"style":5115},[15184],{"type":35,"value":7674},{"type":29,"tag":2730,"props":15186,"children":15187},{"style":5121},[15188],{"type":35,"value":14976},{"type":29,"tag":2730,"props":15190,"children":15191},{"style":5139},[15192],{"type":35,"value":5142},{"type":29,"tag":2730,"props":15194,"children":15195},{"class":5102,"line":5636},[15196],{"type":29,"tag":2730,"props":15197,"children":15198},{"style":5139},[15199],{"type":35,"value":5536},{"type":29,"tag":2730,"props":15201,"children":15202},{"class":5102,"line":2142},[15203],{"type":29,"tag":2730,"props":15204,"children":15205},{"emptyLinePlaceholder":13},[15206],{"type":35,"value":5150},{"type":29,"tag":2730,"props":15208,"children":15209},{"class":5102,"line":5670},[15210,15214,15218,15223,15227],{"type":29,"tag":2730,"props":15211,"children":15212},{"style":5115},[15213],{"type":35,"value":8296},{"type":29,"tag":2730,"props":15215,"children":15216},{"style":5115},[15217],{"type":35,"value":7887},{"type":29,"tag":2730,"props":15219,"children":15220},{"style":5226},[15221],{"type":35,"value":15222}," getAge",{"type":29,"tag":2730,"props":15224,"children":15225},{"style":5139},[15226],{"type":35,"value":5234},{"type":29,"tag":2730,"props":15228,"children":15229},{"style":5139},[15230],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15232,"children":15233},{"class":5102,"line":5696},[15234,15238,15242],{"type":29,"tag":2730,"props":15235,"children":15236},{"style":5115},[15237],{"type":35,"value":7674},{"type":29,"tag":2730,"props":15239,"children":15240},{"style":5121},[15241],{"type":35,"value":14996},{"type":29,"tag":2730,"props":15243,"children":15244},{"style":5139},[15245],{"type":35,"value":5142},{"type":29,"tag":2730,"props":15247,"children":15248},{"class":5102,"line":6807},[15249],{"type":29,"tag":2730,"props":15250,"children":15251},{"style":5139},[15252],{"type":35,"value":5536},{"type":29,"tag":2730,"props":15254,"children":15255},{"class":5102,"line":6845},[15256],{"type":29,"tag":2730,"props":15257,"children":15258},{"style":5121},[15259],{"type":35,"value":9370},{"type":29,"tag":2730,"props":15261,"children":15262},{"class":5102,"line":1649},[15263],{"type":29,"tag":2730,"props":15264,"children":15265},{"style":5106},[15266],{"type":35,"value":15267},"    // On pourrait ajouter un getter pour l'adresse ici, mais ça serait prématuré.\n",{"type":29,"tag":2730,"props":15269,"children":15270},{"class":5102,"line":9791},[15271],{"type":29,"tag":2730,"props":15272,"children":15273},{"style":5139},[15274],{"type":35,"value":5255},{"type":29,"tag":37,"props":15276,"children":15277},{},[15278,15280,15286],{"type":35,"value":15279},"Dans cet exemple, l’attribut ",{"type":29,"tag":1716,"props":15281,"children":15283},{"className":15282},[],[15284],{"type":35,"value":15285},"address",{"type":35,"value":15287}," est inutile tant que le programme n’en a pas besoin. Selon YAGNI, ne l’ajoutez pas avant d’avoir une demande précise pour cette fonctionnalité.",{"type":29,"tag":66,"props":15289,"children":15290},{},[],{"type":29,"tag":106,"props":15292,"children":15294},{"id":15293},"bonnes-pratiques-pour-appliquer-yagni-en-java",[15295],{"type":35,"value":15296},"Bonnes pratiques pour appliquer YAGNI en Java",{"type":29,"tag":37,"props":15298,"children":15299},{},[15300],{"type":35,"value":15301},"Appliquer YAGNI de manière efficace demande de la discipline et une certaine maîtrise des principes de base du développement. Voici quelques bonnes pratiques qui vous permettront d’intégrer YAGNI dans votre quotidien, en particulier lorsque vous écrivez du code Java.",{"type":29,"tag":5055,"props":15303,"children":15305},{"id":15304},"_1-utilisez-les-tests-pour-guider-votre-développement",[15306,15307],{"type":35,"value":5974},{"type":29,"tag":55,"props":15308,"children":15309},{},[15310],{"type":35,"value":15311},"Utilisez les tests pour guider votre développement",{"type":29,"tag":37,"props":15313,"children":15314},{},[15315,15317,15322,15324,15330],{"type":35,"value":15316},"L’une des meilleures manières de ne pas anticiper inutilement est d’adopter une approche ",{"type":29,"tag":55,"props":15318,"children":15319},{},[15320],{"type":35,"value":15321},"Test-Driven Development (TDD)",{"type":35,"value":15323},". En TDD, vous écrivez d’abord un ",{"type":29,"tag":43,"props":15325,"children":15327},{"href":15326},"/fr/dette-technique/decouvrir-frameworks-tests-java",[15328],{"type":35,"value":15329},"test",{"type":35,"value":15331}," pour la fonctionnalité spécifique que vous souhaitez implémenter, puis vous écrivez juste assez de code pour passer ce test. Cela vous oblige à vous concentrer uniquement sur ce qui est nécessaire pour faire fonctionner votre application.",{"type":29,"tag":37,"props":15333,"children":15334},{},[15335],{"type":29,"tag":55,"props":15336,"children":15337},{},[15338],{"type":35,"value":6416},{"type":29,"tag":5091,"props":15340,"children":15342},{"className":5093,"code":15341,"language":5095,"meta":8,"style":8},"@Test\npublic void testAddUser() {\n    User user = new User(\"Alice\", 30);\n    assertEquals(\"Alice\", user.getName());\n    assertEquals(30, user.getAge());\n}\n",[15343],{"type":29,"tag":1716,"props":15344,"children":15345},{"__ignoreMap":8},[15346,15357,15381,15428,15464,15500],{"type":29,"tag":2730,"props":15347,"children":15348},{"class":5102,"line":4267},[15349,15353],{"type":29,"tag":2730,"props":15350,"children":15351},{"style":6941},[15352],{"type":35,"value":6944},{"type":29,"tag":2730,"props":15354,"children":15355},{"style":6947},[15356],{"type":35,"value":6950},{"type":29,"tag":2730,"props":15358,"children":15359},{"class":5102,"line":453},[15360,15364,15368,15373,15377],{"type":29,"tag":2730,"props":15361,"children":15362},{"style":5115},[15363],{"type":35,"value":5218},{"type":29,"tag":2730,"props":15365,"children":15366},{"style":5115},[15367],{"type":35,"value":5223},{"type":29,"tag":2730,"props":15369,"children":15370},{"style":5226},[15371],{"type":35,"value":15372}," testAddUser",{"type":29,"tag":2730,"props":15374,"children":15375},{"style":5139},[15376],{"type":35,"value":5234},{"type":29,"tag":2730,"props":15378,"children":15379},{"style":5139},[15380],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15382,"children":15383},{"class":5102,"line":459},[15384,15389,15394,15398,15402,15406,15410,15415,15419,15424],{"type":29,"tag":2730,"props":15385,"children":15386},{"style":6455},[15387],{"type":35,"value":15388},"    User",{"type":29,"tag":2730,"props":15390,"children":15391},{"style":5121},[15392],{"type":35,"value":15393}," user ",{"type":29,"tag":2730,"props":15395,"children":15396},{"style":5127},[15397],{"type":35,"value":5130},{"type":29,"tag":2730,"props":15399,"children":15400},{"style":5115},[15401],{"type":35,"value":13640},{"type":29,"tag":2730,"props":15403,"children":15404},{"style":5226},[15405],{"type":35,"value":14955},{"type":29,"tag":2730,"props":15407,"children":15408},{"style":5139},[15409],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15411,"children":15412},{"style":6597},[15413],{"type":35,"value":15414},"\"Alice\"",{"type":29,"tag":2730,"props":15416,"children":15417},{"style":5139},[15418],{"type":35,"value":9167},{"type":29,"tag":2730,"props":15420,"children":15421},{"style":5133},[15422],{"type":35,"value":15423}," 30",{"type":29,"tag":2730,"props":15425,"children":15426},{"style":5139},[15427],{"type":35,"value":7837},{"type":29,"tag":2730,"props":15429,"children":15430},{"class":5102,"line":5153},[15431,15436,15440,15444,15448,15452,15456,15460],{"type":29,"tag":2730,"props":15432,"children":15433},{"style":5226},[15434],{"type":35,"value":15435},"    assertEquals",{"type":29,"tag":2730,"props":15437,"children":15438},{"style":5139},[15439],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15441,"children":15442},{"style":6597},[15443],{"type":35,"value":15414},{"type":29,"tag":2730,"props":15445,"children":15446},{"style":5139},[15447],{"type":35,"value":9167},{"type":29,"tag":2730,"props":15449,"children":15450},{"style":5121},[15451],{"type":35,"value":8320},{"type":29,"tag":2730,"props":15453,"children":15454},{"style":5139},[15455],{"type":35,"value":332},{"type":29,"tag":2730,"props":15457,"children":15458},{"style":5226},[15459],{"type":35,"value":7273},{"type":29,"tag":2730,"props":15461,"children":15462},{"style":5139},[15463],{"type":35,"value":8385},{"type":29,"tag":2730,"props":15465,"children":15466},{"class":5102,"line":5162},[15467,15471,15475,15480,15484,15488,15492,15496],{"type":29,"tag":2730,"props":15468,"children":15469},{"style":5226},[15470],{"type":35,"value":15435},{"type":29,"tag":2730,"props":15472,"children":15473},{"style":5139},[15474],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15476,"children":15477},{"style":5133},[15478],{"type":35,"value":15479},"30",{"type":29,"tag":2730,"props":15481,"children":15482},{"style":5139},[15483],{"type":35,"value":9167},{"type":29,"tag":2730,"props":15485,"children":15486},{"style":5121},[15487],{"type":35,"value":8320},{"type":29,"tag":2730,"props":15489,"children":15490},{"style":5139},[15491],{"type":35,"value":332},{"type":29,"tag":2730,"props":15493,"children":15494},{"style":5226},[15495],{"type":35,"value":7351},{"type":29,"tag":2730,"props":15497,"children":15498},{"style":5139},[15499],{"type":35,"value":8385},{"type":29,"tag":2730,"props":15501,"children":15502},{"class":5102,"line":3553},[15503],{"type":29,"tag":2730,"props":15504,"children":15505},{"style":5139},[15506],{"type":35,"value":5255},{"type":29,"tag":37,"props":15508,"children":15509},{},[15510,15512,15517,15519,15524],{"type":35,"value":15511},"Avec ce test, vous vous concentrez uniquement sur l’ajout de l’utilisateur avec un nom et un âge. Tant qu’il n’existe pas de test nécessitant l’adresse, n’ajoutez pas d’attribut ",{"type":29,"tag":1716,"props":15513,"children":15515},{"className":15514},[],[15516],{"type":35,"value":15285},{"type":35,"value":15518}," à la classe ",{"type":29,"tag":1716,"props":15520,"children":15522},{"className":15521},[],[15523],{"type":35,"value":8314},{"type":35,"value":332},{"type":29,"tag":5055,"props":15526,"children":15528},{"id":15527},"_2-évitez-de-généraliser-trop-tôt",[15529,15530],{"type":35,"value":5990},{"type":29,"tag":55,"props":15531,"children":15532},{},[15533],{"type":35,"value":15534},"Évitez de généraliser trop tôt",{"type":29,"tag":37,"props":15536,"children":15537},{},[15538],{"type":35,"value":15539},"Un autre piège commun est de vouloir tout de suite rendre votre code trop générique ou flexible. Par exemple, vous pourriez penser qu’une méthode pourrait être réutilisée plus tard et vouloir la rendre paramétrable. Mais en réalité, si cette flexibilité n’est pas nécessaire maintenant, elle pourrait ne jamais l’être.",{"type":29,"tag":37,"props":15541,"children":15542},{},[15543],{"type":29,"tag":55,"props":15544,"children":15545},{},[15546],{"type":35,"value":15547},"Exemple à éviter :",{"type":29,"tag":5091,"props":15549,"children":15551},{"className":5093,"code":15550,"language":5095,"meta":8,"style":8},"public class MathOperations {\n    // On pourrait être tenté de rendre cette méthode très générique\n    public int multiply(int a, int b, boolean absoluteValues) {\n        if (absoluteValues) {\n            return Math.abs(a) * Math.abs(b);\n        } else {\n            return a * b;\n        }\n    }\n}\n",[15552],{"type":29,"tag":1716,"props":15553,"children":15554},{"__ignoreMap":8},[15555,15575,15583,15646,15670,15733,15749,15772,15779,15786],{"type":29,"tag":2730,"props":15556,"children":15557},{"class":5102,"line":4267},[15558,15562,15566,15571],{"type":29,"tag":2730,"props":15559,"children":15560},{"style":5115},[15561],{"type":35,"value":5218},{"type":29,"tag":2730,"props":15563,"children":15564},{"style":5115},[15565],{"type":35,"value":8278},{"type":29,"tag":2730,"props":15567,"children":15568},{"style":8281},[15569],{"type":35,"value":15570}," MathOperations",{"type":29,"tag":2730,"props":15572,"children":15573},{"style":5139},[15574],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15576,"children":15577},{"class":5102,"line":453},[15578],{"type":29,"tag":2730,"props":15579,"children":15580},{"style":5106},[15581],{"type":35,"value":15582},"    // On pourrait être tenté de rendre cette méthode très générique\n",{"type":29,"tag":2730,"props":15584,"children":15585},{"class":5102,"line":459},[15586,15590,15594,15599,15603,15607,15612,15616,15620,15625,15629,15633,15638,15642],{"type":29,"tag":2730,"props":15587,"children":15588},{"style":5115},[15589],{"type":35,"value":8296},{"type":29,"tag":2730,"props":15591,"children":15592},{"style":5115},[15593],{"type":35,"value":7887},{"type":29,"tag":2730,"props":15595,"children":15596},{"style":5226},[15597],{"type":35,"value":15598}," multiply",{"type":29,"tag":2730,"props":15600,"children":15601},{"style":5139},[15602],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15604,"children":15605},{"style":5115},[15606],{"type":35,"value":5118},{"type":29,"tag":2730,"props":15608,"children":15609},{"style":8317},[15610],{"type":35,"value":15611}," a",{"type":29,"tag":2730,"props":15613,"children":15614},{"style":5139},[15615],{"type":35,"value":9167},{"type":29,"tag":2730,"props":15617,"children":15618},{"style":5115},[15619],{"type":35,"value":7887},{"type":29,"tag":2730,"props":15621,"children":15622},{"style":8317},[15623],{"type":35,"value":15624}," b",{"type":29,"tag":2730,"props":15626,"children":15627},{"style":5139},[15628],{"type":35,"value":9167},{"type":29,"tag":2730,"props":15630,"children":15631},{"style":5115},[15632],{"type":35,"value":5654},{"type":29,"tag":2730,"props":15634,"children":15635},{"style":8317},[15636],{"type":35,"value":15637}," absoluteValues",{"type":29,"tag":2730,"props":15639,"children":15640},{"style":5139},[15641],{"type":35,"value":3849},{"type":29,"tag":2730,"props":15643,"children":15644},{"style":5139},[15645],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15647,"children":15648},{"class":5102,"line":5153},[15649,15653,15657,15662,15666],{"type":29,"tag":2730,"props":15650,"children":15651},{"style":5115},[15652],{"type":35,"value":6559},{"type":29,"tag":2730,"props":15654,"children":15655},{"style":5139},[15656],{"type":35,"value":5293},{"type":29,"tag":2730,"props":15658,"children":15659},{"style":5121},[15660],{"type":35,"value":15661},"absoluteValues",{"type":29,"tag":2730,"props":15663,"children":15664},{"style":5139},[15665],{"type":35,"value":3849},{"type":29,"tag":2730,"props":15667,"children":15668},{"style":5139},[15669],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15671,"children":15672},{"class":5102,"line":5162},[15673,15678,15683,15687,15692,15696,15700,15704,15708,15712,15716,15720,15724,15729],{"type":29,"tag":2730,"props":15674,"children":15675},{"style":5115},[15676],{"type":35,"value":15677},"            return",{"type":29,"tag":2730,"props":15679,"children":15680},{"style":5121},[15681],{"type":35,"value":15682}," Math",{"type":29,"tag":2730,"props":15684,"children":15685},{"style":5139},[15686],{"type":35,"value":332},{"type":29,"tag":2730,"props":15688,"children":15689},{"style":5226},[15690],{"type":35,"value":15691},"abs",{"type":29,"tag":2730,"props":15693,"children":15694},{"style":5139},[15695],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15697,"children":15698},{"style":5121},[15699],{"type":35,"value":43},{"type":29,"tag":2730,"props":15701,"children":15702},{"style":5139},[15703],{"type":35,"value":3849},{"type":29,"tag":2730,"props":15705,"children":15706},{"style":5127},[15707],{"type":35,"value":9053},{"type":29,"tag":2730,"props":15709,"children":15710},{"style":5121},[15711],{"type":35,"value":15682},{"type":29,"tag":2730,"props":15713,"children":15714},{"style":5139},[15715],{"type":35,"value":332},{"type":29,"tag":2730,"props":15717,"children":15718},{"style":5226},[15719],{"type":35,"value":15691},{"type":29,"tag":2730,"props":15721,"children":15722},{"style":5139},[15723],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15725,"children":15726},{"style":5121},[15727],{"type":35,"value":15728},"b",{"type":29,"tag":2730,"props":15730,"children":15731},{"style":5139},[15732],{"type":35,"value":7837},{"type":29,"tag":2730,"props":15734,"children":15735},{"class":5102,"line":3553},[15736,15741,15745],{"type":29,"tag":2730,"props":15737,"children":15738},{"style":5139},[15739],{"type":35,"value":15740},"        }",{"type":29,"tag":2730,"props":15742,"children":15743},{"style":5115},[15744],{"type":35,"value":10541},{"type":29,"tag":2730,"props":15746,"children":15747},{"style":5139},[15748],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15750,"children":15751},{"class":5102,"line":5539},[15752,15756,15760,15764,15768],{"type":29,"tag":2730,"props":15753,"children":15754},{"style":5115},[15755],{"type":35,"value":15677},{"type":29,"tag":2730,"props":15757,"children":15758},{"style":5121},[15759],{"type":35,"value":10192},{"type":29,"tag":2730,"props":15761,"children":15762},{"style":5127},[15763],{"type":35,"value":11805},{"type":29,"tag":2730,"props":15765,"children":15766},{"style":5121},[15767],{"type":35,"value":15624},{"type":29,"tag":2730,"props":15769,"children":15770},{"style":5139},[15771],{"type":35,"value":5142},{"type":29,"tag":2730,"props":15773,"children":15774},{"class":5102,"line":5547},[15775],{"type":29,"tag":2730,"props":15776,"children":15777},{"style":5139},[15778],{"type":35,"value":6624},{"type":29,"tag":2730,"props":15780,"children":15781},{"class":5102,"line":5555},[15782],{"type":29,"tag":2730,"props":15783,"children":15784},{"style":5139},[15785],{"type":35,"value":5536},{"type":29,"tag":2730,"props":15787,"children":15788},{"class":5102,"line":5564},[15789],{"type":29,"tag":2730,"props":15790,"children":15791},{"style":5139},[15792],{"type":35,"value":5255},{"type":29,"tag":37,"props":15794,"children":15795},{},[15796,15798,15803],{"type":35,"value":15797},"Cette méthode introduit de la complexité inutile (avec le paramètre ",{"type":29,"tag":1716,"props":15799,"children":15801},{"className":15800},[],[15802],{"type":35,"value":15661},{"type":35,"value":15804},") si votre programme n'a besoin que de multiplier des nombres sans se préoccuper de leur signe. La solution YAGNI serait de garder la méthode simple :",{"type":29,"tag":5091,"props":15806,"children":15808},{"className":5093,"code":15807,"language":5095,"meta":8,"style":8},"public class MathOperations {\n    public int multiply(int a, int b) {\n        return a * b;\n    }\n}\n",[15809],{"type":29,"tag":1716,"props":15810,"children":15811},{"__ignoreMap":8},[15812,15831,15878,15901,15908],{"type":29,"tag":2730,"props":15813,"children":15814},{"class":5102,"line":4267},[15815,15819,15823,15827],{"type":29,"tag":2730,"props":15816,"children":15817},{"style":5115},[15818],{"type":35,"value":5218},{"type":29,"tag":2730,"props":15820,"children":15821},{"style":5115},[15822],{"type":35,"value":8278},{"type":29,"tag":2730,"props":15824,"children":15825},{"style":8281},[15826],{"type":35,"value":15570},{"type":29,"tag":2730,"props":15828,"children":15829},{"style":5139},[15830],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15832,"children":15833},{"class":5102,"line":453},[15834,15838,15842,15846,15850,15854,15858,15862,15866,15870,15874],{"type":29,"tag":2730,"props":15835,"children":15836},{"style":5115},[15837],{"type":35,"value":8296},{"type":29,"tag":2730,"props":15839,"children":15840},{"style":5115},[15841],{"type":35,"value":7887},{"type":29,"tag":2730,"props":15843,"children":15844},{"style":5226},[15845],{"type":35,"value":15598},{"type":29,"tag":2730,"props":15847,"children":15848},{"style":5139},[15849],{"type":35,"value":6452},{"type":29,"tag":2730,"props":15851,"children":15852},{"style":5115},[15853],{"type":35,"value":5118},{"type":29,"tag":2730,"props":15855,"children":15856},{"style":8317},[15857],{"type":35,"value":15611},{"type":29,"tag":2730,"props":15859,"children":15860},{"style":5139},[15861],{"type":35,"value":9167},{"type":29,"tag":2730,"props":15863,"children":15864},{"style":5115},[15865],{"type":35,"value":7887},{"type":29,"tag":2730,"props":15867,"children":15868},{"style":8317},[15869],{"type":35,"value":15624},{"type":29,"tag":2730,"props":15871,"children":15872},{"style":5139},[15873],{"type":35,"value":3849},{"type":29,"tag":2730,"props":15875,"children":15876},{"style":5139},[15877],{"type":35,"value":5239},{"type":29,"tag":2730,"props":15879,"children":15880},{"class":5102,"line":459},[15881,15885,15889,15893,15897],{"type":29,"tag":2730,"props":15882,"children":15883},{"style":5115},[15884],{"type":35,"value":7674},{"type":29,"tag":2730,"props":15886,"children":15887},{"style":5121},[15888],{"type":35,"value":10192},{"type":29,"tag":2730,"props":15890,"children":15891},{"style":5127},[15892],{"type":35,"value":11805},{"type":29,"tag":2730,"props":15894,"children":15895},{"style":5121},[15896],{"type":35,"value":15624},{"type":29,"tag":2730,"props":15898,"children":15899},{"style":5139},[15900],{"type":35,"value":5142},{"type":29,"tag":2730,"props":15902,"children":15903},{"class":5102,"line":5153},[15904],{"type":29,"tag":2730,"props":15905,"children":15906},{"style":5139},[15907],{"type":35,"value":5536},{"type":29,"tag":2730,"props":15909,"children":15910},{"class":5102,"line":5162},[15911],{"type":29,"tag":2730,"props":15912,"children":15913},{"style":5139},[15914],{"type":35,"value":5255},{"type":29,"tag":5055,"props":15916,"children":15918},{"id":15917},"_3-refactorisez-régulièrement-votre-code",[15919,15920],{"type":35,"value":1209},{"type":29,"tag":55,"props":15921,"children":15922},{},[15923],{"type":35,"value":15924},"Refactorisez régulièrement votre code",{"type":29,"tag":37,"props":15926,"children":15927},{},[15928],{"type":35,"value":15929},"Refactoriser régulièrement vous permet de retirer les fonctionnalités qui sont devenues inutiles au fil du temps. Parfois, un projet évolue et certaines parties du code, ajoutées dans l’anticipation de besoins futurs, ne sont jamais utilisées. Ce que j’observe sur le terrain : maintenir un code propre et minimal facilite les modifications et évite que du code non nécessaire ne s’accumule.",{"type":29,"tag":5055,"props":15931,"children":15933},{"id":15932},"_4-collaborez-avec-votre-équipe-sur-les-fonctionnalités",[15934,15935],{"type":35,"value":6100},{"type":29,"tag":55,"props":15936,"children":15937},{},[15938],{"type":35,"value":15939},"Collaborez avec votre équipe sur les fonctionnalités",{"type":29,"tag":37,"props":15941,"children":15942},{},[15943],{"type":35,"value":15944},"Travailler en équipe demande de la communication, surtout en ce qui concerne la prise de décision sur les fonctionnalités. Si quelqu’un propose d’ajouter une nouvelle fonctionnalité, assurez-vous qu’il existe un besoin clair et immédiat. Si c’est pour anticiper des besoins futurs, demandez si ces besoins sont confirmés ou s’il s’agit simplement d’une spéculation.",{"type":29,"tag":37,"props":15946,"children":15947},{},[15948],{"type":29,"tag":55,"props":15949,"children":15950},{},[15951],{"type":35,"value":15952},"Exemple de réflexion d’équipe :",{"type":29,"tag":1417,"props":15954,"children":15955},{},[15956],{"type":29,"tag":37,"props":15957,"children":15958},{},[15959],{"type":35,"value":15960},"\"Est-ce que cette fonctionnalité sera utilisée par les utilisateurs actuels ? Sinon, nous pourrions la développer plus tard si un besoin réel émerge.\"",{"type":29,"tag":5055,"props":15962,"children":15964},{"id":15963},"_5-ne-pas-coder-pour-des-fonctionnalités-hypothétiques",[15965,15967],{"type":35,"value":15966},"5. ",{"type":29,"tag":55,"props":15968,"children":15969},{},[15970],{"type":35,"value":15971},"Ne pas coder pour des fonctionnalités hypothétiques",{"type":29,"tag":37,"props":15973,"children":15974},{},[15975],{"type":35,"value":15976},"Souvent, vous vous dites que certaines fonctionnalités seront utiles dans le futur, mais bien souvent, ces hypothèses sont fausses. Pour appliquer YAGNI, codez uniquement pour répondre aux exigences actuelles du projet. Les fonctionnalités futures seront ajoutées en temps voulu, lorsque les besoins seront confirmés.",{"type":29,"tag":66,"props":15978,"children":15979},{},[],{"type":29,"tag":106,"props":15981,"children":15983},{"id":15982},"erreurs-courantes-et-objections-liées-à-yagni",[15984],{"type":35,"value":15985},"Erreurs courantes et objections liées à YAGNI",{"type":29,"tag":37,"props":15987,"children":15988},{},[15989],{"type":35,"value":15990},"Même si le principe YAGNI paraît simple en théorie, de nombreuses erreurs sont commises lorsqu’il est mis en pratique. De plus, certains développeurs expriment des réticences à l’appliquer strictement. Voici quelques erreurs courantes et les objections les plus fréquentes que j’entends au sujet de YAGNI dans les équipes que j’accompagne.",{"type":29,"tag":5055,"props":15992,"children":15994},{"id":15993},"_1-erreur-préparer-le-code-pour-des-scénarios-hypothétiques",[15995,15996],{"type":35,"value":5974},{"type":29,"tag":55,"props":15997,"children":15998},{},[15999],{"type":35,"value":16000},"Erreur : Préparer le code pour des scénarios hypothétiques",{"type":29,"tag":37,"props":16002,"children":16003},{},[16004],{"type":35,"value":16005},"L’une des erreurs les plus répandues est de croire que l’ajout d’une fonctionnalité \"juste au cas où\" est une bonne pratique. Cela part souvent d’une bonne intention, mais cela mène presque toujours à une complexité inutile. En réalité, la majorité des \"cas potentiels\" anticipés ne se présentent jamais.",{"type":29,"tag":37,"props":16007,"children":16008},{},[16009],{"type":29,"tag":55,"props":16010,"children":16011},{},[16012],{"type":35,"value":16013},"Exemple :",{"type":29,"tag":37,"props":16015,"children":16016},{},[16017],{"type":35,"value":16018},"Imaginons que vous ajoutez un traitement pour gérer des devises dans une application qui ne fait encore que des transactions en euros. En supposant que, peut-être un jour, l’application gérera plusieurs devises, vous commencez à ajouter du code pour les conversions monétaires. Pourtant, si ce besoin ne devient jamais concret, vous vous retrouvez avec du code qui alourdit votre application sans apporter de valeur.",{"type":29,"tag":5055,"props":16020,"children":16022},{"id":16021},"_2-erreur-ne-pas-sadapter-à-lévolution-des-besoins",[16023,16024],{"type":35,"value":5990},{"type":29,"tag":55,"props":16025,"children":16026},{},[16027],{"type":35,"value":16028},"Erreur : Ne pas s’adapter à l’évolution des besoins",{"type":29,"tag":37,"props":16030,"children":16031},{},[16032],{"type":35,"value":16033},"Certaines personnes confondent YAGNI avec un refus d’anticiper totalement. YAGNI ne signifie pas que vous ne devriez jamais changer ou adapter votre code aux nouvelles exigences. Il s’agit plutôt de ne pas écrire du code en prévision d’un besoin qui pourrait ne jamais exister. Si un nouveau besoin émerge effectivement, c’est alors le bon moment pour l’ajouter.",{"type":29,"tag":37,"props":16035,"children":16036},{},[16037],{"type":29,"tag":55,"props":16038,"children":16039},{},[16040],{"type":35,"value":16013},{"type":29,"tag":37,"props":16042,"children":16043},{},[16044],{"type":35,"value":16045},"Si, dans votre application, un nouveau client demande une fonctionnalité spécifique, il est tout à fait légitime de l’ajouter. L’important est de s’assurer que cette demande est confirmée, et non basée sur des spéculations.",{"type":29,"tag":5055,"props":16047,"children":16049},{"id":16048},"_3-objection-si-je-ne-lajoute-pas-maintenant-je-devrai-tout-refaire-plus-tard",[16050,16051],{"type":35,"value":1209},{"type":29,"tag":55,"props":16052,"children":16053},{},[16054],{"type":35,"value":16055},"Objection : \"Si je ne l’ajoute pas maintenant, je devrai tout refaire plus tard\"",{"type":29,"tag":37,"props":16057,"children":16058},{},[16059],{"type":35,"value":16060},"Cette peur est fréquente, surtout chez les développeurs qui souhaitent éviter de retourner sur des morceaux de code plus tard. Pourtant, YAGNI vous encourage à ne pas surcharger votre code en essayant d’anticiper tous les futurs possibles. Quand un besoin précis survient, vous pourrez y répondre avec une solution adaptée à la situation actuelle, et souvent cela sera bien plus efficace que si vous aviez tenté d’anticiper toutes les variables dès le départ.",{"type":29,"tag":5055,"props":16062,"children":16064},{"id":16063},"_4-objection-mon-client-ou-mon-chef-veut-toujours-plus-de-fonctionnalités",[16065,16066],{"type":35,"value":6100},{"type":29,"tag":55,"props":16067,"children":16068},{},[16069],{"type":35,"value":16070},"Objection : \"Mon client ou mon chef veut toujours plus de fonctionnalités\"",{"type":29,"tag":37,"props":16072,"children":16073},{},[16074],{"type":35,"value":16075},"Il arrive que des clients ou des supérieurs souhaitent des fonctionnalités supplémentaires \"au cas où\", sans vraiment savoir s’ils en auront besoin. Dans ce cas, je vous recommande d’expliquer pourquoi YAGNI est avantageux, à la fois pour réduire la complexité du produit et pour économiser du temps et des ressources. L’argument est simple : en évitant d’ajouter des fonctionnalités inutiles, vous réduisez les coûts de développement à court terme et vous gardez le code plus flexible pour l’avenir.",{"type":29,"tag":5055,"props":16077,"children":16079},{"id":16078},"_5-erreur-se-limiter-par-peur-de-manquer-danticipation",[16080,16081],{"type":35,"value":15966},{"type":29,"tag":55,"props":16082,"children":16083},{},[16084],{"type":35,"value":16085},"Erreur : Se limiter par peur de manquer d’anticipation",{"type":29,"tag":37,"props":16087,"children":16088},{},[16089],{"type":35,"value":16090},"À l’inverse, certains développeurs peuvent mal comprendre YAGNI et éviter de préparer le code à des extensions évidentes, même lorsque le besoin futur est bien identifié. YAGNI ne signifie pas d’ignorer complètement les futurs possibles, mais de les traiter uniquement lorsque le besoin est avéré. Si vous savez qu’une fonctionnalité sera nécessaire, ne pas l’implémenter pourrait être contre-productif. L’idée est d’avoir la souplesse de rajouter des fonctionnalités en temps voulu, pas d’éviter de faire évoluer le produit.",{"type":29,"tag":66,"props":16092,"children":16093},{},[],{"type":29,"tag":106,"props":16095,"children":16097},{"id":16096},"faq-réponses-aux-questions-fréquentes-sur-yagni",[16098],{"type":35,"value":16099},"FAQ : Réponses aux questions fréquentes sur YAGNI",{"type":29,"tag":371,"props":16101,"children":16102},{},[16103,16108],{"type":29,"tag":375,"props":16104,"children":16105},{},[16106],{"type":35,"value":16107},"1. Qu’est-ce que YAGNI ?",{"type":29,"tag":37,"props":16109,"children":16110},{},[16111,16113,16117],{"type":35,"value":16112},"YAGNI signifie \"You Aren’t Gonna Need It\" et fait partie des principes de ",{"type":29,"tag":55,"props":16114,"children":16115},{},[16116],{"type":35,"value":6286},{"type":35,"value":16118},". Il encourage les développeurs à ne pas ajouter de fonctionnalités inutiles ou prématurées dans leur code, en se concentrant uniquement sur les besoins actuels plutôt que sur des hypothèses de besoins futurs.",{"type":29,"tag":371,"props":16120,"children":16121},{},[16122,16127],{"type":29,"tag":375,"props":16123,"children":16124},{},[16125],{"type":35,"value":16126},"2. Quand devrais-je appliquer YAGNI ?",{"type":29,"tag":37,"props":16128,"children":16129},{},[16130],{"type":35,"value":16131},"Appliquez YAGNI dès que vous vous demandez si une fonctionnalité que vous êtes en train de coder sera réellement utilisée ou si vous l’ajoutez juste par anticipation. Si cette fonctionnalité ne répond pas à un besoin immédiat, elle est probablement superflue.",{"type":29,"tag":371,"props":16133,"children":16134},{},[16135,16140],{"type":29,"tag":375,"props":16136,"children":16137},{},[16138],{"type":35,"value":16139},"3. Comment puis-je expliquer YAGNI à mon équipe ou à mon client ?",{"type":29,"tag":37,"props":16141,"children":16142},{},[16143],{"type":35,"value":16144},"La meilleure façon d’expliquer YAGNI est de montrer comment ce principe aide à maintenir un code simple, évolutif, et moins coûteux à long terme. En ajoutant des fonctionnalités hypothétiques, vous augmentez la complexité, ce qui rend la maintenance plus difficile et coûteuse. En restant focalisé sur ce qui est nécessaire, vous économisez du temps et des ressources.",{"type":29,"tag":371,"props":16146,"children":16147},{},[16148,16153],{"type":29,"tag":375,"props":16149,"children":16150},{},[16151],{"type":35,"value":16152},"4. Et si j’ai vraiment besoin de cette fonctionnalité plus tard ?",{"type":29,"tag":37,"props":16154,"children":16155},{},[16156],{"type":35,"value":16157},"YAGNI ne vous empêche pas d’ajouter des fonctionnalités quand elles deviennent réellement nécessaires. Le principe encourage simplement à ne pas anticiper des besoins incertains. Si un besoin futur se concrétise, vous pourrez ajouter la fonctionnalité à ce moment-là, avec une meilleure compréhension des exigences.",{"type":29,"tag":371,"props":16159,"children":16160},{},[16161,16166],{"type":29,"tag":375,"props":16162,"children":16163},{},[16164],{"type":35,"value":16165},"5. YAGNI est-il compatible avec les méthodes agiles ?",{"type":29,"tag":37,"props":16167,"children":16168},{},[16169],{"type":35,"value":16170},"Absolument. YAGNI s’intègre parfaitement dans les méthodologies agiles qui mettent l’accent sur la livraison rapide de la valeur et l’adaptation aux besoins changeants. En vous concentrant sur les besoins actuels et en livrant des incréments de valeur fonctionnelle, vous répondez aux exigences du client sans surcharger le produit avec des fonctionnalités inutiles.",{"type":29,"tag":371,"props":16172,"children":16173},{},[16174,16179],{"type":29,"tag":375,"props":16175,"children":16176},{},[16177],{"type":35,"value":16178},"6. Comment éviter de coder pour des scénarios hypothétiques ?",{"type":29,"tag":37,"props":16180,"children":16181},{},[16182,16184,16188],{"type":35,"value":16183},"La meilleure manière est de s’en tenir strictement aux exigences du projet et d’utiliser des pratiques comme le ",{"type":29,"tag":55,"props":16185,"children":16186},{},[16187],{"type":35,"value":15321},{"type":35,"value":16189},". En n’écrivant que le code nécessaire pour faire passer les tests, vous restez focalisé sur l’essentiel sans vous égarer dans des fonctionnalités anticipées.",{"type":29,"tag":371,"props":16191,"children":16192},{},[16193,16198],{"type":29,"tag":375,"props":16194,"children":16195},{},[16196],{"type":35,"value":16197},"7. Quels sont les risques de ne pas appliquer YAGNI ?",{"type":29,"tag":37,"props":16199,"children":16200},{},[16201],{"type":35,"value":16202},"Ne pas appliquer YAGNI conduit à un code plus complexe et plus difficile à maintenir. Cela peut également augmenter la dette technique, car les fonctionnalités ajoutées prématurément peuvent devenir obsolètes, ou être mal adaptées lorsque les véritables besoins émergent.",{"type":29,"tag":66,"props":16204,"children":16205},{},[],{"type":29,"tag":106,"props":16207,"children":16208},{"id":14633},[16209],{"type":35,"value":14639},{"type":29,"tag":37,"props":16211,"children":16212},{},[16213],{"type":35,"value":16214},"Le principe YAGNI est un excellent guide pour garder votre code simple, propre et focalisé sur ce qui compte réellement : répondre aux besoins immédiats de votre projet. En l’appliquant correctement, vous éviterez d’ajouter des fonctionnalités inutiles qui compliquent la maintenance et augmentent la dette technique. J’espère que ces exemples en Java vous aideront à mieux intégrer YAGNI dans vos pratiques de développement au quotidien.",{"type":29,"tag":166,"props":16216,"children":16217},{"cta":442,"href":443,"title":6187,"type":445},[16218],{"type":29,"tag":37,"props":16219,"children":16220},{},[16221],{"type":35,"value":6193},{"type":29,"tag":6195,"props":16223,"children":16224},{},[16225],{"type":35,"value":6199},{"title":8,"searchDepth":453,"depth":453,"links":16227},[16228],{"id":14714,"depth":453,"text":14717,"children":16229},[16230,16231,16232,16233,16234,16235,16236],{"id":14720,"depth":459,"text":14723},{"id":14750,"depth":459,"text":14753},{"id":14840,"depth":459,"text":14843},{"id":15293,"depth":459,"text":15296},{"id":15982,"depth":459,"text":15985},{"id":16096,"depth":459,"text":16099},{"id":14633,"depth":459,"text":14639},"content:fr:dette-technique:yagni-ecrire-code-qualite-sans-fonctionnalites-inutiles.md","fr/dette-technique/yagni-ecrire-code-qualite-sans-fonctionnalites-inutiles.md","fr/dette-technique/yagni-ecrire-code-qualite-sans-fonctionnalites-inutiles",1775679766109]