[{"data":1,"prerenderedAt":37322},["ShallowReactive",2],{"search-api":-1,"listing-tag-qualite-page-1":3},[4,948,1764,2400,3900,4393,4997,5383,7065,7476,12664,13916,16371,22467,25821,28652,32775,34890],{"_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":942,"_id":943,"_source":944,"_file":945,"_stem":946,"_extension":947},"\u002Ffr\u002Fintelligence-artificielle\u002Fia-code-review-retour-experience","intelligence-artificielle",false,"","IA en code review : retour d'expérience après 6 mois avec Claude","Après 6 mois à utiliser Claude pour reviewer mes propres PR sur crmcoaching : ce qu'il trouve bien, ce qu'il rate, et comment l'intégrer dans une boucle de review solo sans perdre en rigueur.",37,"2026-03-20",true,[6],[16,17,18],"code-review","ia","qualite","covers\u002Farticles\u002Fia-code-review-retour-experience.jpg",{"text":21,"minutes":22,"time":23,"words":24},"11 min read",10.31,618600,2062,{"type":26,"children":27,"toc":933},"root",[28,36,41,50,54,61,66,74,79,87,92,100,105,388,417,420,426,434,439,447,461,469,474,482,487,490,496,501,509,514,522,527,535,540,548,553,561,566,579,582,588,593,603,613,623,626,632,738,751,754,760,770,780,790,800,803,815,818,824,847,860,873,886,899,912,915,927],{"type":29,"tag":30,"props":31,"children":32},"element","p",{},[33],{"type":34,"value":35},"text","Je développe seul crmcoaching (un CRM pour coachs professionnels) sur une stack NestJS 11, Prisma 7, PostgreSQL, Next.js 16 et architecture hexagonale. Pas d'équipe. Pas de reviewer humain disponible à chaque PR. Et pourtant, la qualité ne peut pas régresser : c'est un SaaS en production.",{"type":29,"tag":30,"props":37,"children":38},{},[39],{"type":34,"value":40},"Depuis décembre 2025, Claude est dans ma boucle de review systématique. Le bilan après 6 mois : le temps de review que je passe moi-même a baissé d'environ 40% sur les aspects mécaniques (sécurité, conventions, couverture de tests), et j'ai attrapé plusieurs bugs avant de les pousser en staging. Mais Claude rate aussi des choses de façon prévisible, et comprendre ces angles morts change tout à la façon dont on l'utilise.",{"type":29,"tag":30,"props":42,"children":43},{},[44],{"type":29,"tag":45,"props":46,"children":47},"strong",{},[48],{"type":34,"value":49},"Ce qui fait la différence, ce n'est pas l'outil. C'est la méthode d'intégration.",{"type":29,"tag":51,"props":52,"children":53},"hr",{},[],{"type":29,"tag":55,"props":56,"children":58},"h2",{"id":57},"les-trois-façons-dutiliser-claude-en-review",[59],{"type":34,"value":60},"Les trois façons d'utiliser Claude en review",{"type":29,"tag":30,"props":62,"children":63},{},[64],{"type":34,"value":65},"Avant d'entrer dans ce que Claude trouve ou rate, il faut clarifier le mode d'utilisation : les résultats varient significativement selon la façon dont on l'intègre.",{"type":29,"tag":30,"props":67,"children":68},{},[69],{"type":29,"tag":45,"props":70,"children":71},{},[72],{"type":34,"value":73},"Claude Code en local (mode interactif)",{"type":29,"tag":30,"props":75,"children":76},{},[77],{"type":34,"value":78},"C'est le mode que j'utilise le plus souvent. Après avoir implémenté une feature dans un worktree isolé, je demande à Claude Code de reviewer le diff avant de créer la PR. L'avantage : Claude a accès au repo complet, aux fichiers de contexte (CLAUDE.md, conventions hexagonales, règles biome), et peut naviguer dans le code adjacent pour vérifier la cohérence. Le coût est inclus dans l'abonnement Claude Pro : pas de calcul à la PR.",{"type":29,"tag":30,"props":80,"children":81},{},[82],{"type":29,"tag":45,"props":83,"children":84},{},[85],{"type":34,"value":86},"Claude via API avec le diff + contexte projet",{"type":29,"tag":30,"props":88,"children":89},{},[90],{"type":34,"value":91},"Pour les PR plus complexes ou quand je veux un avis \"extérieur\" sans contexte de session accumulé, j'envoie le diff complet avec un prompt système qui embarque les conventions crmcoaching. Le coût est environ 0,10 à 0,40 € par PR selon la taille du diff (claude-sonnet-4, ~800 tokens en input pour une PR moyenne + diff). Sur 20 PR par mois, c'est inférieur à 8 €.",{"type":29,"tag":30,"props":93,"children":94},{},[95],{"type":29,"tag":45,"props":96,"children":97},{},[98],{"type":34,"value":99},"Prompt système avec conventions intégrées (CI review automatique)",{"type":29,"tag":30,"props":101,"children":102},{},[103],{"type":34,"value":104},"Le mode le plus scalable si on veut une review systématique sans action manuelle. Un workflow GitHub Actions envoie le diff à l'API Claude dès l'ouverture d'une PR, avec le prompt système suivant :",{"type":29,"tag":106,"props":107,"children":111},"pre",{"className":108,"code":109,"language":110,"meta":8,"style":8},"language-typescript shiki shiki-themes catppuccin-frappe github-dark","\u002F\u002F apps\u002Fapi\u002Fsrc\u002Finfrastructure\u002Fclaude\u002Freview-prompt.ts\n\nexport const REVIEW_SYSTEM_PROMPT = `\nTu es un reviewer senior sur le projet crmcoaching.\n\nStack : NestJS 11, Prisma 7, PostgreSQL, Zod 4, architecture hexagonale, Vitest.\nFrontend : Next.js 16 App Router, React 19, Tailwind v4, TanStack Query.\n\nConventions obligatoires :\n- Architecture hexagonale stricte : domain\u002F ne dépend de rien, application\u002F dépend de domain\u002F, infrastructure\u002F implémente les ports\n- Pas de non-null assertion (!) sans justification explicite en commentaire\n- Fonctions > 50 lignes : extraire un helper avant de merger\n- Complexité cognitive > 15 : bloquant (biome noExcessiveCognitiveComplexity)\n- Conventional Commits : feat:, fix:, refactor:, test:, chore:\n- Tests obligatoires par couche : unit sur domain\u002F et application\u002F, integration sur infrastructure\u002F (vraie DB), Playwright sur les pages\n\nPour chaque finding, utilise le format :\n- [sécurité] pour les injections, secrets, vulnérabilités\n- [architecture] pour les violations hexagonales, couplage\n- [qualité] pour la complexité, les fonctions trop longues\n- [tests] pour la couverture manquante\n- [convention] pour le style et le nommage\n\nFaux positifs à éviter : ne signale pas les biome-ignore avec justification explicite.\n`.trim();\n","typescript",[112],{"type":29,"tag":113,"props":114,"children":115},"code",{"__ignoreMap":8},[116,128,137,170,179,187,196,205,213,222,231,240,249,258,267,276,284,293,302,311,320,329,338,346,355],{"type":29,"tag":117,"props":118,"children":121},"span",{"class":119,"line":120},"line",1,[122],{"type":29,"tag":117,"props":123,"children":125},{"style":124},"--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit",[126],{"type":34,"value":127},"\u002F\u002F apps\u002Fapi\u002Fsrc\u002Finfrastructure\u002Fclaude\u002Freview-prompt.ts\n",{"type":29,"tag":117,"props":129,"children":131},{"class":119,"line":130},2,[132],{"type":29,"tag":117,"props":133,"children":134},{"emptyLinePlaceholder":13},[135],{"type":34,"value":136},"\n",{"type":29,"tag":117,"props":138,"children":140},{"class":119,"line":139},3,[141,147,152,158,164],{"type":29,"tag":117,"props":142,"children":144},{"style":143},"--shiki-default:#CA9EE6;--shiki-dark:#F97583",[145],{"type":34,"value":146},"export",{"type":29,"tag":117,"props":148,"children":149},{"style":143},[150],{"type":34,"value":151}," const",{"type":29,"tag":117,"props":153,"children":155},{"style":154},"--shiki-default:#C6D0F5;--shiki-dark:#79B8FF",[156],{"type":34,"value":157}," REVIEW_SYSTEM_PROMPT",{"type":29,"tag":117,"props":159,"children":161},{"style":160},"--shiki-default:#81C8BE;--shiki-dark:#F97583",[162],{"type":34,"value":163}," =",{"type":29,"tag":117,"props":165,"children":167},{"style":166},"--shiki-default:#A6D189;--shiki-dark:#9ECBFF",[168],{"type":34,"value":169}," `\n",{"type":29,"tag":117,"props":171,"children":173},{"class":119,"line":172},4,[174],{"type":29,"tag":117,"props":175,"children":176},{"style":166},[177],{"type":34,"value":178},"Tu es un reviewer senior sur le projet crmcoaching.\n",{"type":29,"tag":117,"props":180,"children":182},{"class":119,"line":181},5,[183],{"type":29,"tag":117,"props":184,"children":185},{"emptyLinePlaceholder":13},[186],{"type":34,"value":136},{"type":29,"tag":117,"props":188,"children":190},{"class":119,"line":189},6,[191],{"type":29,"tag":117,"props":192,"children":193},{"style":166},[194],{"type":34,"value":195},"Stack : NestJS 11, Prisma 7, PostgreSQL, Zod 4, architecture hexagonale, Vitest.\n",{"type":29,"tag":117,"props":197,"children":199},{"class":119,"line":198},7,[200],{"type":29,"tag":117,"props":201,"children":202},{"style":166},[203],{"type":34,"value":204},"Frontend : Next.js 16 App Router, React 19, Tailwind v4, TanStack Query.\n",{"type":29,"tag":117,"props":206,"children":208},{"class":119,"line":207},8,[209],{"type":29,"tag":117,"props":210,"children":211},{"emptyLinePlaceholder":13},[212],{"type":34,"value":136},{"type":29,"tag":117,"props":214,"children":216},{"class":119,"line":215},9,[217],{"type":29,"tag":117,"props":218,"children":219},{"style":166},[220],{"type":34,"value":221},"Conventions obligatoires :\n",{"type":29,"tag":117,"props":223,"children":225},{"class":119,"line":224},10,[226],{"type":29,"tag":117,"props":227,"children":228},{"style":166},[229],{"type":34,"value":230},"- Architecture hexagonale stricte : domain\u002F ne dépend de rien, application\u002F dépend de domain\u002F, infrastructure\u002F implémente les ports\n",{"type":29,"tag":117,"props":232,"children":234},{"class":119,"line":233},11,[235],{"type":29,"tag":117,"props":236,"children":237},{"style":166},[238],{"type":34,"value":239},"- Pas de non-null assertion (!) sans justification explicite en commentaire\n",{"type":29,"tag":117,"props":241,"children":243},{"class":119,"line":242},12,[244],{"type":29,"tag":117,"props":245,"children":246},{"style":166},[247],{"type":34,"value":248},"- Fonctions > 50 lignes : extraire un helper avant de merger\n",{"type":29,"tag":117,"props":250,"children":252},{"class":119,"line":251},13,[253],{"type":29,"tag":117,"props":254,"children":255},{"style":166},[256],{"type":34,"value":257},"- Complexité cognitive > 15 : bloquant (biome noExcessiveCognitiveComplexity)\n",{"type":29,"tag":117,"props":259,"children":261},{"class":119,"line":260},14,[262],{"type":29,"tag":117,"props":263,"children":264},{"style":166},[265],{"type":34,"value":266},"- Conventional Commits : feat:, fix:, refactor:, test:, chore:\n",{"type":29,"tag":117,"props":268,"children":270},{"class":119,"line":269},15,[271],{"type":29,"tag":117,"props":272,"children":273},{"style":166},[274],{"type":34,"value":275},"- Tests obligatoires par couche : unit sur domain\u002F et application\u002F, integration sur infrastructure\u002F (vraie DB), Playwright sur les pages\n",{"type":29,"tag":117,"props":277,"children":279},{"class":119,"line":278},16,[280],{"type":29,"tag":117,"props":281,"children":282},{"emptyLinePlaceholder":13},[283],{"type":34,"value":136},{"type":29,"tag":117,"props":285,"children":287},{"class":119,"line":286},17,[288],{"type":29,"tag":117,"props":289,"children":290},{"style":166},[291],{"type":34,"value":292},"Pour chaque finding, utilise le format :\n",{"type":29,"tag":117,"props":294,"children":296},{"class":119,"line":295},18,[297],{"type":29,"tag":117,"props":298,"children":299},{"style":166},[300],{"type":34,"value":301},"- [sécurité] pour les injections, secrets, vulnérabilités\n",{"type":29,"tag":117,"props":303,"children":305},{"class":119,"line":304},19,[306],{"type":29,"tag":117,"props":307,"children":308},{"style":166},[309],{"type":34,"value":310},"- [architecture] pour les violations hexagonales, couplage\n",{"type":29,"tag":117,"props":312,"children":314},{"class":119,"line":313},20,[315],{"type":29,"tag":117,"props":316,"children":317},{"style":166},[318],{"type":34,"value":319},"- [qualité] pour la complexité, les fonctions trop longues\n",{"type":29,"tag":117,"props":321,"children":323},{"class":119,"line":322},21,[324],{"type":29,"tag":117,"props":325,"children":326},{"style":166},[327],{"type":34,"value":328},"- [tests] pour la couverture manquante\n",{"type":29,"tag":117,"props":330,"children":332},{"class":119,"line":331},22,[333],{"type":29,"tag":117,"props":334,"children":335},{"style":166},[336],{"type":34,"value":337},"- [convention] pour le style et le nommage\n",{"type":29,"tag":117,"props":339,"children":341},{"class":119,"line":340},23,[342],{"type":29,"tag":117,"props":343,"children":344},{"emptyLinePlaceholder":13},[345],{"type":34,"value":136},{"type":29,"tag":117,"props":347,"children":349},{"class":119,"line":348},24,[350],{"type":29,"tag":117,"props":351,"children":352},{"style":166},[353],{"type":34,"value":354},"Faux positifs à éviter : ne signale pas les biome-ignore avec justification explicite.\n",{"type":29,"tag":117,"props":356,"children":358},{"class":119,"line":357},25,[359,364,370,376,382],{"type":29,"tag":117,"props":360,"children":361},{"style":166},[362],{"type":34,"value":363},"`",{"type":29,"tag":117,"props":365,"children":367},{"style":366},"--shiki-default:#81C8BE;--shiki-dark:#E1E4E8",[368],{"type":34,"value":369},".",{"type":29,"tag":117,"props":371,"children":373},{"style":372},"--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit",[374],{"type":34,"value":375},"trim",{"type":29,"tag":117,"props":377,"children":379},{"style":378},"--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8",[380],{"type":34,"value":381},"()",{"type":29,"tag":117,"props":383,"children":385},{"style":384},"--shiki-default:#949CBB;--shiki-dark:#E1E4E8",[386],{"type":34,"value":387},";\n",{"type":29,"tag":30,"props":389,"children":390},{},[391,393,399,401,407,409,415],{"type":34,"value":392},"Ce prompt injecte directement les règles de ",{"type":29,"tag":113,"props":394,"children":396},{"className":395},[],[397],{"type":34,"value":398},".claude\u002Frules\u002F",{"type":34,"value":400}," dans le contexte de review. Le résultat : Claude signale les violations hexagonales (une couche ",{"type":29,"tag":113,"props":402,"children":404},{"className":403},[],[405],{"type":34,"value":406},"application\u002F",{"type":34,"value":408}," qui importe directement depuis ",{"type":29,"tag":113,"props":410,"children":412},{"className":411},[],[413],{"type":34,"value":414},"infrastructure\u002F",{"type":34,"value":416},"), les non-null assertions sans justification, et les fonctions qui dépassent le seuil biome, avec une précision que je n'aurais pas trouvé moi-même en relecture rapide.",{"type":29,"tag":51,"props":418,"children":419},{},[],{"type":29,"tag":55,"props":421,"children":423},{"id":422},"ce-que-claude-trouve-bien",[424],{"type":34,"value":425},"Ce que Claude trouve bien",{"type":29,"tag":30,"props":427,"children":428},{},[429],{"type":29,"tag":45,"props":430,"children":431},{},[432],{"type":34,"value":433},"Violations de l'architecture hexagonale",{"type":29,"tag":30,"props":435,"children":436},{},[437],{"type":34,"value":438},"C'est le finding le plus utile sur crmcoaching. Quand une use-case importe directement un service Prisma au lieu de passer par le Port, Claude le détecte fiablement si les conventions hexagonales sont dans le prompt système. Sur les 6 derniers mois, 7 violations de ce type ont été attrapées avant merge, dont 2 qui auraient créé des couplages difficiles à défaire ensuite.",{"type":29,"tag":30,"props":440,"children":441},{},[442],{"type":29,"tag":45,"props":443,"children":444},{},[445],{"type":34,"value":446},"Sécurité évidente",{"type":29,"tag":30,"props":448,"children":449},{},[450,452,459],{"type":34,"value":451},"Secrets hardcodés, logique d'autorisation absente sur un endpoint, JWT validé sans vérification de l'audience. Claude détecte ces patterns mieux que ma relecture humaine, non pas parce qu'il est plus intelligent, mais parce qu'il ne fatigue pas et applique le pattern systématiquement. Une ",{"type":29,"tag":453,"props":454,"children":456},"a",{"href":455},"\u002Ffr\u002Fintelligence-artificielle\u002Fllm-securite-code-vulnerabilites",[457],{"type":34,"value":458},"étude Stanford (2023)",{"type":34,"value":460}," documentait que 40% du code IA-généré contenait des vulnérabilités dans des contextes de sécurité spécifiques : Claude en review détecte précisément ces patterns dans le code qu'il a lui-même généré.",{"type":29,"tag":30,"props":462,"children":463},{},[464],{"type":29,"tag":45,"props":465,"children":466},{},[467],{"type":34,"value":468},"Couverture de tests manquante",{"type":29,"tag":30,"props":470,"children":471},{},[472],{"type":34,"value":473},"\"Ce use-case n'a pas de test pour le cas d'erreur quand le lead n'existe pas\" : ce type de finding revient régulièrement et me fait gagner du temps sur la lecture des specs de test. Claude identifie les branches non couvertes avec une précision correcte, surtout quand les conventions de test par couche sont dans le prompt.",{"type":29,"tag":30,"props":475,"children":476},{},[477],{"type":29,"tag":45,"props":478,"children":479},{},[480],{"type":34,"value":481},"Style et conventions mécaniques",{"type":29,"tag":30,"props":483,"children":484},{},[485],{"type":34,"value":486},"Nommage incohérent avec les conventions du projet, fonction trop longue sans extraction de helper, complexité cyclomatique élevée. Claude commente ces points avec une régularité que ma propre relecture n'a pas quand je suis dans le contexte de l'implémentation.",{"type":29,"tag":51,"props":488,"children":489},{},[],{"type":29,"tag":55,"props":491,"children":493},{"id":492},"ce-que-claude-rate-systématiquement",[494],{"type":34,"value":495},"Ce que Claude rate systématiquement",{"type":29,"tag":30,"props":497,"children":498},{},[499],{"type":34,"value":500},"Après 6 mois, j'ai identifié 5 angles morts récurrents.",{"type":29,"tag":30,"props":502,"children":503},{},[504],{"type":29,"tag":45,"props":505,"children":506},{},[507],{"type":34,"value":508},"La cohérence avec le reste du codebase quand le contexte est insuffisant",{"type":29,"tag":30,"props":510,"children":511},{},[512],{"type":34,"value":513},"Claude revoit le diff. Si le projet utilise un pattern de gestion d'erreur spécifique que je n'ai pas mis dans le prompt système, Claude peut suggérer un pattern différent, techniquement correct mais incohérent avec le reste. La solution : enrichir progressivement le prompt système avec les patterns qui reviennent. C'est un travail itératif, pas une config one-shot.",{"type":29,"tag":30,"props":515,"children":516},{},[517],{"type":29,"tag":45,"props":518,"children":519},{},[520],{"type":34,"value":521},"La logique métier incorrecte",{"type":29,"tag":30,"props":523,"children":524},{},[525],{"type":34,"value":526},"Un calcul de remise selon des règles coaching spécifiques à crmcoaching : si le code est techniquement correct mais que la règle métier est fausse, Claude ne voit pas le problème. Aucun outil IA ne peut combler ce gap : seule ma connaissance du domaine le peut. C'est le point le plus important à ne pas déléguer.",{"type":29,"tag":30,"props":528,"children":529},{},[530],{"type":29,"tag":45,"props":531,"children":532},{},[533],{"type":34,"value":534},"L'impact architectural à long terme",{"type":29,"tag":30,"props":536,"children":537},{},[538],{"type":34,"value":539},"Un changement qui respecte tous les patterns peut introduire un couplage problématique que je ne verrai que 3 mois plus tard. Claude analyse local. Il ne voit pas les implications systémiques d'un changement de modèle de données sur les 8 use-cases qui utilisent l'entité concernée.",{"type":29,"tag":30,"props":541,"children":542},{},[543],{"type":29,"tag":45,"props":544,"children":545},{},[546],{"type":34,"value":547},"La duplication de logique métier cross-domaines",{"type":29,"tag":30,"props":549,"children":550},{},[551],{"type":34,"value":552},"Deux modules qui implémentent la même règle de validation légèrement différemment. Claude revoit chaque diff en isolation et ne peut pas détecter la duplication sans contexte étendu du repo. Claude Code en mode local s'en sort mieux que l'API, parce qu'il peut naviguer activement dans le codebase.",{"type":29,"tag":30,"props":554,"children":555},{},[556],{"type":29,"tag":45,"props":557,"children":558},{},[559],{"type":34,"value":560},"L'intention derrière une constante ou une valeur",{"type":29,"tag":30,"props":562,"children":563},{},[564],{"type":34,"value":565},"Une PR qui modifie un timeout de 5000ms à 3000ms. Claude commente éventuellement sur le style. Il ne sait pas que ce timeout avait été calibré pour contourner un bug de l'API Brevo en production. Cette connaissance implicite ne peut pas être injectée dans un prompt système : elle n'existe que dans les ADRs ou la mémoire du développeur.",{"type":29,"tag":567,"props":568,"children":573},"cta",{"cta":569,"href":570,"title":571,"type":572},"Coder comme un senior →","https:\u002F\u002Fapp.kamanga.fr\u002Fforms\u002Fmentoring","Tu veux affûter ton œil de reviewer sur le code que l'IA te génère ?","call",[574],{"type":29,"tag":30,"props":575,"children":576},{},[577],{"type":34,"value":578},"Savoir ce que tu peux déléguer à Claude et ce que tu dois garder, ça se construit avec l'expérience, ou avec quelqu'un qui l'a déjà construite. En mentoring 1:1, on revoit tes vraies PR ensemble, je te montre où je coupe la délégation et pourquoi, et tu repars avec une boucle de review solo qui ne sacrifie rien à la rigueur.",{"type":29,"tag":51,"props":580,"children":581},{},[],{"type":29,"tag":55,"props":583,"children":585},{"id":584},"limpact-sur-ma-façon-de-travailler-en-solo",[586],{"type":34,"value":587},"L'impact sur ma façon de travailler en solo",{"type":29,"tag":30,"props":589,"children":590},{},[591],{"type":34,"value":592},"Ce que Claude change concrètement dans une boucle solo :",{"type":29,"tag":30,"props":594,"children":595},{},[596,601],{"type":29,"tag":45,"props":597,"children":598},{},[599],{"type":34,"value":600},"Ce qui s'améliore :",{"type":34,"value":602}," ma relecture humaine porte maintenant sur le fond (logique métier, impact architectural, cohérence avec les décisions passées) plutôt que sur la forme (conventions, sécurité mécanique, couverture de tests). Claude filtre ce bruit. Le \"time to first review\" passe à moins de 2 minutes en mode API, ce qui casse le cycle \"j'ai fini la feature, j'attends le feedback, je suis passé à autre chose\".",{"type":29,"tag":30,"props":604,"children":605},{},[606,611],{"type":29,"tag":45,"props":607,"children":608},{},[609],{"type":34,"value":610},"Le risque principal :",{"type":34,"value":612}," la délégation de responsabilité. \"Claude a reviewé, donc c'est bon.\" Ce pattern crée une fausse sécurité dangereuse sur les bugs de logique métier. Je l'ai vécu sur une PR de scoring Brevo en mars 2026 : Claude avait validé la structure, mais la règle de scoring était inversée. Bug détecté en staging, pas en production, mais le risque était réel.",{"type":29,"tag":30,"props":614,"children":615},{},[616,621],{"type":29,"tag":45,"props":617,"children":618},{},[619],{"type":34,"value":620},"La règle que j'applique :",{"type":34,"value":622}," Claude revoit les patterns connus (sécurité, conventions, architecture, tests). Moi je revois la logique métier, l'intention du changement, et les impacts cross-domaines. Cette séparation est explicite, pas implicite.",{"type":29,"tag":51,"props":624,"children":625},{},[],{"type":29,"tag":55,"props":627,"children":629},{"id":628},"la-séparation-des-responsabilités",[630],{"type":34,"value":631},"La séparation des responsabilités",{"type":29,"tag":633,"props":634,"children":635},"table",{},[636,655],{"type":29,"tag":637,"props":638,"children":639},"thead",{},[640],{"type":29,"tag":641,"props":642,"children":643},"tr",{},[644,650],{"type":29,"tag":645,"props":646,"children":647},"th",{},[648],{"type":34,"value":649},"Claude revoit",{"type":29,"tag":645,"props":651,"children":652},{},[653],{"type":34,"value":654},"Je revois moi-même",{"type":29,"tag":656,"props":657,"children":658},"tbody",{},[659,673,686,699,712,725],{"type":29,"tag":641,"props":660,"children":661},{},[662,668],{"type":29,"tag":663,"props":664,"children":665},"td",{},[666],{"type":34,"value":667},"Sécurité (injections, secrets, autorisations manquantes)",{"type":29,"tag":663,"props":669,"children":670},{},[671],{"type":34,"value":672},"Logique métier",{"type":29,"tag":641,"props":674,"children":675},{},[676,681],{"type":29,"tag":663,"props":677,"children":678},{},[679],{"type":34,"value":680},"Style et conventions crmcoaching",{"type":29,"tag":663,"props":682,"children":683},{},[684],{"type":34,"value":685},"Impact architectural",{"type":29,"tag":641,"props":687,"children":688},{},[689,694],{"type":29,"tag":663,"props":690,"children":691},{},[692],{"type":34,"value":693},"Tests manquants par couche",{"type":29,"tag":663,"props":695,"children":696},{},[697],{"type":34,"value":698},"Cohérence avec le codebase",{"type":29,"tag":641,"props":700,"children":701},{},[702,707],{"type":29,"tag":663,"props":703,"children":704},{},[705],{"type":34,"value":706},"Complexité excessive (biome)",{"type":29,"tag":663,"props":708,"children":709},{},[710],{"type":34,"value":711},"Intention du changement",{"type":29,"tag":641,"props":713,"children":714},{},[715,720],{"type":29,"tag":663,"props":716,"children":717},{},[718],{"type":34,"value":719},"Violations hexagonales",{"type":29,"tag":663,"props":721,"children":722},{},[723],{"type":34,"value":724},"Trade-offs de design",{"type":29,"tag":641,"props":726,"children":727},{},[728,733],{"type":29,"tag":663,"props":729,"children":730},{},[731],{"type":34,"value":732},"Documentation manquante",{"type":29,"tag":663,"props":734,"children":735},{},[736],{"type":34,"value":737},"Décisions implicites non documentées",{"type":29,"tag":30,"props":739,"children":740},{},[741,743,749],{"type":34,"value":742},"Complétez cette séparation avec la ",{"type":29,"tag":453,"props":744,"children":746},{"href":745},"\u002Ffr\u002Fintelligence-artificielle\u002Ftester-code-genere-ia-checklist",[747],{"type":34,"value":748},"checklist de validation du code IA",{"type":34,"value":750}," pour les PRs à fort contenu généré.",{"type":29,"tag":51,"props":752,"children":753},{},[],{"type":29,"tag":55,"props":755,"children":757},{"id":756},"les-métriques-que-je-suis",[758],{"type":34,"value":759},"Les métriques que je suis",{"type":29,"tag":30,"props":761,"children":762},{},[763,768],{"type":29,"tag":45,"props":764,"children":765},{},[766],{"type":34,"value":767},"Time to first review :",{"type":34,"value":769}," avec Claude en mode API, ce metric est inférieur à 2 minutes. C'est un gain réel pour rester dans le flux.",{"type":29,"tag":30,"props":771,"children":772},{},[773,778],{"type":29,"tag":45,"props":774,"children":775},{},[776],{"type":34,"value":777},"Taux de faux positifs :",{"type":34,"value":779}," le pourcentage de commentaires Claude que je rejette comme non-pertinents. Actuellement autour de 20% (en baisse depuis que j'ai enrichi le prompt système avec les patterns crmcoaching). Au-dessus de 30%, il faut retravailler le prompt ou les conventions injectées.",{"type":29,"tag":30,"props":781,"children":782},{},[783,788],{"type":29,"tag":45,"props":784,"children":785},{},[786],{"type":34,"value":787},"Bug escape rate :",{"type":34,"value":789}," bugs détectés en production divisé par bugs détectés en review. Si ce ratio se dégrade malgré Claude, l'IA crée une fausse sécurité. Sur les 6 mois, le ratio s'est amélioré sur les bugs de sécurité et d'architecture, pas sur les bugs de logique métier (cohérent avec les angles morts identifiés).",{"type":29,"tag":30,"props":791,"children":792},{},[793,798],{"type":29,"tag":45,"props":794,"children":795},{},[796],{"type":34,"value":797},"Coût API :",{"type":34,"value":799}," moins de 8 € par mois sur le volume actuel de PRs crmcoaching. Marginal par rapport au coût du temps de review humaine.",{"type":29,"tag":51,"props":801,"children":802},{},[],{"type":29,"tag":567,"props":804,"children":809},{"cta":805,"href":806,"title":807,"type":808},"Les 100 pratiques que l'IA n'enseigne pas →","https:\u002F\u002Fkamanga.fr\u002Freferentiel-craft","La séparation des responsabilités n'est qu'une des 100 pratiques craft","product",[810],{"type":29,"tag":30,"props":811,"children":812},{},[813],{"type":34,"value":814},"Savoir ce que l'IA revoit et ce qu'elle rate, c'est un réflexe craft parmi d'autres. Le Craft Bundle réunit les 100 pratiques que j'applique sur crmcoaching pour coder propre et garder la main sur la qualité : les jugements de senior que l'IA ne te transmettra jamais, parce qu'elle ne les a jamais appris.",{"type":29,"tag":51,"props":816,"children":817},{},[],{"type":29,"tag":55,"props":819,"children":821},{"id":820},"faq-sur-lia-en-code-review",[822],{"type":34,"value":823},"FAQ sur l'IA en code review",{"type":29,"tag":825,"props":826,"children":827},"details",{},[828,834],{"type":29,"tag":829,"props":830,"children":831},"summary",{},[832],{"type":34,"value":833},"1. Quelle est la différence entre un linter et Claude en review ?",{"type":29,"tag":30,"props":835,"children":836},{},[837,839,845],{"type":34,"value":838},"Un ",{"type":29,"tag":453,"props":840,"children":842},{"href":841},"\u002Ffr\u002Fdette-technique\u002Foutils-analyse-statique-2026",[843],{"type":34,"value":844},"linter",{"type":34,"value":846}," applique des règles déterministes prédéfinies : syntaxe, style, patterns interdits. Il est rapide, sans faux positifs sur ce qu'il est configuré à détecter. Claude applique un raisonnement contextuel : il peut détecter des problèmes que le linter ne peut pas formaliser en règles (ex : \"cette use-case viole le principe de responsabilité unique\"). La complémentarité est optimale : linter (biome dans mon cas) pour les règles déterministes, Claude pour les jugements contextuels qui nécessitent de comprendre l'intention.",{"type":29,"tag":825,"props":848,"children":849},{},[850,855],{"type":29,"tag":829,"props":851,"children":852},{},[853],{"type":34,"value":854},"2. Claude peut-il reviewer du code dans des langages ou frameworks peu courants ?",{"type":29,"tag":30,"props":856,"children":857},{},[858],{"type":34,"value":859},"Claude est entraîné sur TypeScript, NestJS, Prisma, React et toute la stack crmcoaching : pas de problème sur ce scope. Pour des langages peu courants ou des DSLs internes, la qualité du review se dégrade. Dans ce cas, utiliser Claude uniquement pour les aspects génériques (sécurité, documentation) et garder les aspects spécifiques au langage pour une review humaine ou outillée.",{"type":29,"tag":825,"props":861,"children":862},{},[863,868],{"type":29,"tag":829,"props":864,"children":865},{},[866],{"type":34,"value":867},"3. Comment gérer le coût des reviews Claude sur un volume important de PRs ?",{"type":29,"tag":30,"props":869,"children":870},{},[871],{"type":34,"value":872},"En mode Claude Code Pro, les reviews interactives sont incluses dans l'abonnement. En mode API (review automatique en CI), le coût est environ 0,10 à 0,40 € par PR selon la taille du diff avec claude-sonnet-4. Sur 50 PRs par semaine (volume équipe), c'est 5 à 20 € par semaine. Marginal par rapport au coût d'un développeur, et positif dès qu'une review prévient un seul bug en production.",{"type":29,"tag":825,"props":874,"children":875},{},[876,881],{"type":29,"tag":829,"props":877,"children":878},{},[879],{"type":34,"value":880},"4. Comment éviter que Claude donne des faux positifs qui créent du bruit ?",{"type":29,"tag":30,"props":882,"children":883},{},[884],{"type":34,"value":885},"En enrichissant progressivement le prompt système avec les conventions réelles du projet. Les faux positifs viennent quasi systématiquement d'une convention que Claude ne connaît pas : il signale un pattern valide génériquement mais incohérent avec le projet. Ajouter cette convention dans le prompt réduit le bruit de façon immédiate. Sur crmcoaching, le taux de faux positifs est passé de 32% à 20% en 3 mois d'enrichissement du prompt.",{"type":29,"tag":825,"props":887,"children":888},{},[889,894],{"type":29,"tag":829,"props":890,"children":891},{},[892],{"type":34,"value":893},"5. Claude peut-il nuire à l'apprentissage si on lui délègue trop ?",{"type":29,"tag":30,"props":895,"children":896},{},[897],{"type":34,"value":898},"Risque réel en solo ou en petite équipe. Si on laisse Claude décider sans challenger ses suggestions, on apprend les patterns que Claude connaît, pas les jugements contextuels qu'un senior aurait partagés. La règle : utiliser Claude comme premier filtre mécanique, mais prendre soi-même la décision finale sur chaque finding. Rejeter activement un faux positif en comprenant pourquoi il est faux est un apprentissage, pas une perte de temps.",{"type":29,"tag":825,"props":900,"children":901},{},[902,907],{"type":29,"tag":829,"props":903,"children":904},{},[905],{"type":34,"value":906},"6. Comment mesurer si Claude améliore réellement la qualité sur la durée ?",{"type":29,"tag":30,"props":908,"children":909},{},[910],{"type":34,"value":911},"Deux métriques combinées : le bug escape rate (bugs détectés en production \u002F bugs détectés en review) et la densité de défauts par KLOC sur le code produit depuis l'adoption. Si le bug escape rate diminue et que la densité de défauts diminue, Claude améliore la qualité. Si seulement le bug escape rate diminue, Claude détecte mieux mais ne change pas les pratiques : il faut renforcer la qualité des conventions injectées dans le prompt.",{"type":29,"tag":51,"props":913,"children":914},{},[],{"type":29,"tag":567,"props":916,"children":921},{"cta":917,"href":918,"title":919,"type":920},"Testez la readiness IA de votre équipe →","\u002Fmes-ressources","Ressource gratuite : AI-Ready Engineering Team Checklist","resource",[922],{"type":29,"tag":30,"props":923,"children":924},{},[925],{"type":34,"value":926},"La checklist AI-Ready inclut une section dédiée à l'adoption des outils IA en code review : critères d'intégration, règles de séparation des responsabilités, et métriques de suivi à 30 et 90 jours.",{"type":29,"tag":928,"props":929,"children":930},"style",{},[931],{"type":34,"value":932},"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":130,"depth":130,"links":934},[935,936,937,938,939,940,941],{"id":57,"depth":130,"text":60},{"id":422,"depth":130,"text":425},{"id":492,"depth":130,"text":495},{"id":584,"depth":130,"text":587},{"id":628,"depth":130,"text":631},{"id":756,"depth":130,"text":759},{"id":820,"depth":130,"text":823},"markdown","content:fr:intelligence-artificielle:ia-code-review-retour-experience.md","content","fr\u002Fintelligence-artificielle\u002Fia-code-review-retour-experience.md","fr\u002Fintelligence-artificielle\u002Fia-code-review-retour-experience","md",{"_path":949,"_dir":950,"_draft":7,"_partial":7,"_locale":8,"title":951,"description":952,"id":953,"date":954,"listed":13,"nocomments":7,"hidden":7,"categories":955,"tags":956,"cover":958,"readingTime":959,"body":964,"_type":942,"_id":1761,"_source":944,"_file":1762,"_stem":1763,"_extension":947},"\u002Ffr\u002Fpratiques-agiles\u002Fcontinuous-integration-fondamentaux","pratiques-agiles","Continuous Integration : les 5 fondamentaux non-négociables","Avoir Jenkins ou GitHub Actions n'est pas faire de la CI. La vraie CI implique des pratiques humaines que l'outil seul ne peut pas imposer.",27,"2026-03-06",[950],[957,18],"ci-cd","covers\u002Farticles\u002Fcontinuous-integration-fondamentaux.jpg",{"text":960,"minutes":961,"time":962,"words":963},"9 min read",8.29,497400,1658,{"type":26,"children":965,"toc":1751},[966,971,976,981,986,991,994,1000,1005,1015,1025,1035,1040,1043,1049,1054,1059,1064,1193,1198,1201,1207,1212,1217,1222,1493,1504,1507,1513,1518,1523,1528,1533,1536,1542,1547,1552,1557,1560,1566,1579,1584,1623,1628,1631,1637,1642,1647,1660,1663,1669,1682,1695,1708,1721,1734,1737,1747],{"type":29,"tag":30,"props":967,"children":968},{},[969],{"type":34,"value":970},"Dans un client dans le secteur bancaire que j'accompagnais (15 développeurs, produit financier B2B), le pipeline CI durait 28 minutes. Les branches vivaient en moyenne 4 jours avant d'être mergées. L'équipe avait GitHub Actions configuré depuis 18 mois. Elle pensait pratiquer la Continuous Integration.",{"type":29,"tag":30,"props":972,"children":973},{},[974],{"type":34,"value":975},"Elle pratiquait le contraire.",{"type":29,"tag":30,"props":977,"children":978},{},[979],{"type":34,"value":980},"Les merges de longues branches généraient des conflits quotidiens. Les builds rouges duraient parfois 6 heures avant d'être corrigés. Et les développeurs avaient arrêté de regarder les alertes du pipeline depuis longtemps : trop de faux positifs, trop de délai entre le commit et le feedback.",{"type":29,"tag":30,"props":982,"children":983},{},[984],{"type":34,"value":985},"La Continuous Integration est une discipline humaine autant qu'une infrastructure technique. La plupart des équipes ont l'outil, et pratiquent le contraire de la CI sans le savoir.",{"type":29,"tag":30,"props":987,"children":988},{},[989],{"type":34,"value":990},"La définition originale vient de Kent Beck (Extreme Programming, 1999) et Martin Fowler : intégrer ses changements dans la branche principale plusieurs fois par jour. Pas une fois par semaine lors de la \"merge PR\". Plusieurs fois par jour. Selon les recherches DORA, les équipes qui pratiquent la vraie CI ont un lead time 4 fois inférieur et un taux d'échec de déploiement 3 fois plus bas. Ce n'est pas l'outil qui fait la différence : c'est la discipline.",{"type":29,"tag":51,"props":992,"children":993},{},[],{"type":29,"tag":55,"props":995,"children":997},{"id":996},"ce-que-la-ci-nest-pas",[998],{"type":34,"value":999},"Ce que la CI n'est pas",{"type":29,"tag":30,"props":1001,"children":1002},{},[1003],{"type":34,"value":1004},"Trois confusions fréquentes méritent d'être clarifiées avant d'aller plus loin.",{"type":29,"tag":30,"props":1006,"children":1007},{},[1008,1013],{"type":29,"tag":45,"props":1009,"children":1010},{},[1011],{"type":34,"value":1012},"La CI n'est pas un pipeline de build automatisé.",{"type":34,"value":1014}," Lancer des tests automatiquement à chaque push n'est pas de la CI si les branches durent 2 semaines avant d'être mergées. L'automatisation sans intégration fréquente, c'est du quality assurance sur des changements isolés.",{"type":29,"tag":30,"props":1016,"children":1017},{},[1018,1023],{"type":29,"tag":45,"props":1019,"children":1020},{},[1021],{"type":34,"value":1022},"La CI n'est pas un gating de qualité.",{"type":34,"value":1024}," Utiliser le pipeline pour bloquer les PRs avec des tests qui échouent est utile, mais c'est de l'assurance qualité, pas de la CI au sens strict.",{"type":29,"tag":30,"props":1026,"children":1027},{},[1028,1033],{"type":29,"tag":45,"props":1029,"children":1030},{},[1031],{"type":34,"value":1032},"La CI n'est pas une histoire de fréquence de déploiement.",{"type":34,"value":1034}," Déployer souvent (CD) est différent d'intégrer souvent (CI). On peut déployer une fois par jour depuis une branche de longue durée : ce n'est pas de la CI.",{"type":29,"tag":30,"props":1036,"children":1037},{},[1038],{"type":34,"value":1039},"La définition précise de Martin Fowler : \"Continuous Integration is a practice where members of a team merge their work frequently, usually each person merges at least daily.\" L'accent est sur la fréquence d'intégration, pas sur l'automatisation.",{"type":29,"tag":51,"props":1041,"children":1042},{},[],{"type":29,"tag":55,"props":1044,"children":1046},{"id":1045},"fondamental-1-intégrer-dans-le-trunk-au-moins-une-fois-par-jour",[1047],{"type":34,"value":1048},"Fondamental 1 : Intégrer dans le trunk au moins une fois par jour",{"type":29,"tag":30,"props":1050,"children":1051},{},[1052],{"type":34,"value":1053},"Chaque développeur intègre son code dans la branche principale (main, master, trunk) au moins une fois toutes les 24 heures.",{"type":29,"tag":30,"props":1055,"children":1056},{},[1057],{"type":34,"value":1058},"Ce qui rend cela difficile : ça suppose que chaque commit soit dans un état qui ne casse pas la branche principale. Ce qui implique des feature flags pour les fonctionnalités incomplètes, et une culture de \"never break the trunk\".",{"type":29,"tag":30,"props":1060,"children":1061},{},[1062],{"type":34,"value":1063},"Les feature flags permettent d'intégrer du code incomplet sans l'exposer aux utilisateurs. C'est le mécanisme qui rend la CI viable pour des fonctionnalités qui prennent plus d'une journée :",{"type":29,"tag":106,"props":1065,"children":1069},{"className":1066,"code":1067,"language":1068,"meta":8,"style":8},"language-python shiki shiki-themes catppuccin-frappe github-dark","# La fonctionnalité n'est pas terminée mais le code est intégré\nif feature_flags.is_enabled('new_checkout_flow', user):\n    return new_checkout_flow(request)\nelse:\n    return legacy_checkout_flow(request)\n","python",[1070],{"type":29,"tag":113,"props":1071,"children":1072},{"__ignoreMap":8},[1073,1081,1129,1156,1169],{"type":29,"tag":117,"props":1074,"children":1075},{"class":119,"line":120},[1076],{"type":29,"tag":117,"props":1077,"children":1078},{"style":124},[1079],{"type":34,"value":1080},"# La fonctionnalité n'est pas terminée mais le code est intégré\n",{"type":29,"tag":117,"props":1082,"children":1083},{"class":119,"line":130},[1084,1089,1094,1098,1104,1109,1114,1119,1124],{"type":29,"tag":117,"props":1085,"children":1086},{"style":143},[1087],{"type":34,"value":1088},"if",{"type":29,"tag":117,"props":1090,"children":1091},{"style":378},[1092],{"type":34,"value":1093}," feature_flags",{"type":29,"tag":117,"props":1095,"children":1096},{"style":384},[1097],{"type":34,"value":369},{"type":29,"tag":117,"props":1099,"children":1101},{"style":1100},"--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8",[1102],{"type":34,"value":1103},"is_enabled",{"type":29,"tag":117,"props":1105,"children":1106},{"style":384},[1107],{"type":34,"value":1108},"(",{"type":29,"tag":117,"props":1110,"children":1111},{"style":166},[1112],{"type":34,"value":1113},"'new_checkout_flow'",{"type":29,"tag":117,"props":1115,"children":1116},{"style":384},[1117],{"type":34,"value":1118},",",{"type":29,"tag":117,"props":1120,"children":1121},{"style":378},[1122],{"type":34,"value":1123}," user",{"type":29,"tag":117,"props":1125,"children":1126},{"style":384},[1127],{"type":34,"value":1128},"):\n",{"type":29,"tag":117,"props":1130,"children":1131},{"class":119,"line":139},[1132,1137,1142,1146,1151],{"type":29,"tag":117,"props":1133,"children":1134},{"style":143},[1135],{"type":34,"value":1136},"    return",{"type":29,"tag":117,"props":1138,"children":1139},{"style":1100},[1140],{"type":34,"value":1141}," new_checkout_flow",{"type":29,"tag":117,"props":1143,"children":1144},{"style":384},[1145],{"type":34,"value":1108},{"type":29,"tag":117,"props":1147,"children":1148},{"style":378},[1149],{"type":34,"value":1150},"request",{"type":29,"tag":117,"props":1152,"children":1153},{"style":384},[1154],{"type":34,"value":1155},")\n",{"type":29,"tag":117,"props":1157,"children":1158},{"class":119,"line":172},[1159,1164],{"type":29,"tag":117,"props":1160,"children":1161},{"style":143},[1162],{"type":34,"value":1163},"else",{"type":29,"tag":117,"props":1165,"children":1166},{"style":384},[1167],{"type":34,"value":1168},":\n",{"type":29,"tag":117,"props":1170,"children":1171},{"class":119,"line":181},[1172,1176,1181,1185,1189],{"type":29,"tag":117,"props":1173,"children":1174},{"style":143},[1175],{"type":34,"value":1136},{"type":29,"tag":117,"props":1177,"children":1178},{"style":1100},[1179],{"type":34,"value":1180}," legacy_checkout_flow",{"type":29,"tag":117,"props":1182,"children":1183},{"style":384},[1184],{"type":34,"value":1108},{"type":29,"tag":117,"props":1186,"children":1187},{"style":378},[1188],{"type":34,"value":1150},{"type":29,"tag":117,"props":1190,"children":1191},{"style":384},[1192],{"type":34,"value":1155},{"type":29,"tag":30,"props":1194,"children":1195},{},[1196],{"type":34,"value":1197},"Le signal d'alerte est simple : si vos branches vivent plus de 2 jours, vous ne pratiquez pas la CI : vous faites du \"integrate when done.\"",{"type":29,"tag":51,"props":1199,"children":1200},{},[],{"type":29,"tag":55,"props":1202,"children":1204},{"id":1203},"fondamental-2-le-pipeline-de-build-doit-passer-en-moins-de-10-minutes",[1205],{"type":34,"value":1206},"Fondamental 2 : Le pipeline de build doit passer en moins de 10 minutes",{"type":29,"tag":30,"props":1208,"children":1209},{},[1210],{"type":34,"value":1211},"Si le feedback du pipeline prend plus de 10 minutes, les développeurs arrêtent d'attendre le résultat avant de passer à la tâche suivante. Le feedback loop se rompt.",{"type":29,"tag":30,"props":1213,"children":1214},{},[1215],{"type":34,"value":1216},"Cette règle vient des recherches sur la productivité des développeurs : au-delà de 10 minutes, le développeur a changé de contexte mental. Quand le pipeline échoue 15 minutes plus tard, le coût de retour au contexte est élevé.",{"type":29,"tag":30,"props":1218,"children":1219},{},[1220],{"type":34,"value":1221},"Pour maintenir un pipeline sous 10 minutes : tests unitaires en parallèle, tests d'intégration sélectifs basés sur les changements, cache agressif des dépendances, et séparation en stages, avec un fast feedback en moins de 5 minutes et un slow feedback déclenché séparément.",{"type":29,"tag":106,"props":1223,"children":1227},{"className":1224,"code":1225,"language":1226,"meta":8,"style":8},"language-yaml shiki shiki-themes catppuccin-frappe github-dark","# GitHub Actions - jobs parallèles\njobs:\n  unit-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - run: npm run test:unit    # \u003C 3 min\n\n  lint-typecheck:\n    runs-on: ubuntu-latest\n    steps:\n      - run: npm run lint && npm run typecheck    # \u003C 2 min\n\n  integration-tests:\n    needs: [unit-tests]    # Seulement si les unit tests passent\n    runs-on: ubuntu-latest\n    steps:\n      - run: npm run test:integration    # \u003C 10 min\n","yaml",[1228],{"type":29,"tag":113,"props":1229,"children":1230},{"__ignoreMap":8},[1231,1239,1252,1264,1282,1294,1321,1328,1340,1355,1366,1391,1398,1410,1442,1457,1468],{"type":29,"tag":117,"props":1232,"children":1233},{"class":119,"line":120},[1234],{"type":29,"tag":117,"props":1235,"children":1236},{"style":124},[1237],{"type":34,"value":1238},"# GitHub Actions - jobs parallèles\n",{"type":29,"tag":117,"props":1240,"children":1241},{"class":119,"line":130},[1242,1248],{"type":29,"tag":117,"props":1243,"children":1245},{"style":1244},"--shiki-default:#8CAAEE;--shiki-dark:#85E89D",[1246],{"type":34,"value":1247},"jobs",{"type":29,"tag":117,"props":1249,"children":1250},{"style":366},[1251],{"type":34,"value":1168},{"type":29,"tag":117,"props":1253,"children":1254},{"class":119,"line":139},[1255,1260],{"type":29,"tag":117,"props":1256,"children":1257},{"style":1244},[1258],{"type":34,"value":1259},"  unit-tests",{"type":29,"tag":117,"props":1261,"children":1262},{"style":366},[1263],{"type":34,"value":1168},{"type":29,"tag":117,"props":1265,"children":1266},{"class":119,"line":172},[1267,1272,1277],{"type":29,"tag":117,"props":1268,"children":1269},{"style":1244},[1270],{"type":34,"value":1271},"    runs-on",{"type":29,"tag":117,"props":1273,"children":1274},{"style":366},[1275],{"type":34,"value":1276},":",{"type":29,"tag":117,"props":1278,"children":1279},{"style":166},[1280],{"type":34,"value":1281}," ubuntu-latest\n",{"type":29,"tag":117,"props":1283,"children":1284},{"class":119,"line":181},[1285,1290],{"type":29,"tag":117,"props":1286,"children":1287},{"style":1244},[1288],{"type":34,"value":1289},"    steps",{"type":29,"tag":117,"props":1291,"children":1292},{"style":366},[1293],{"type":34,"value":1168},{"type":29,"tag":117,"props":1295,"children":1296},{"class":119,"line":189},[1297,1302,1307,1311,1316],{"type":29,"tag":117,"props":1298,"children":1299},{"style":384},[1300],{"type":34,"value":1301},"      -",{"type":29,"tag":117,"props":1303,"children":1304},{"style":1244},[1305],{"type":34,"value":1306}," run",{"type":29,"tag":117,"props":1308,"children":1309},{"style":366},[1310],{"type":34,"value":1276},{"type":29,"tag":117,"props":1312,"children":1313},{"style":166},[1314],{"type":34,"value":1315}," npm run test:unit",{"type":29,"tag":117,"props":1317,"children":1318},{"style":124},[1319],{"type":34,"value":1320},"    # \u003C 3 min\n",{"type":29,"tag":117,"props":1322,"children":1323},{"class":119,"line":198},[1324],{"type":29,"tag":117,"props":1325,"children":1326},{"emptyLinePlaceholder":13},[1327],{"type":34,"value":136},{"type":29,"tag":117,"props":1329,"children":1330},{"class":119,"line":207},[1331,1336],{"type":29,"tag":117,"props":1332,"children":1333},{"style":1244},[1334],{"type":34,"value":1335},"  lint-typecheck",{"type":29,"tag":117,"props":1337,"children":1338},{"style":366},[1339],{"type":34,"value":1168},{"type":29,"tag":117,"props":1341,"children":1342},{"class":119,"line":215},[1343,1347,1351],{"type":29,"tag":117,"props":1344,"children":1345},{"style":1244},[1346],{"type":34,"value":1271},{"type":29,"tag":117,"props":1348,"children":1349},{"style":366},[1350],{"type":34,"value":1276},{"type":29,"tag":117,"props":1352,"children":1353},{"style":166},[1354],{"type":34,"value":1281},{"type":29,"tag":117,"props":1356,"children":1357},{"class":119,"line":224},[1358,1362],{"type":29,"tag":117,"props":1359,"children":1360},{"style":1244},[1361],{"type":34,"value":1289},{"type":29,"tag":117,"props":1363,"children":1364},{"style":366},[1365],{"type":34,"value":1168},{"type":29,"tag":117,"props":1367,"children":1368},{"class":119,"line":233},[1369,1373,1377,1381,1386],{"type":29,"tag":117,"props":1370,"children":1371},{"style":384},[1372],{"type":34,"value":1301},{"type":29,"tag":117,"props":1374,"children":1375},{"style":1244},[1376],{"type":34,"value":1306},{"type":29,"tag":117,"props":1378,"children":1379},{"style":366},[1380],{"type":34,"value":1276},{"type":29,"tag":117,"props":1382,"children":1383},{"style":166},[1384],{"type":34,"value":1385}," npm run lint && npm run typecheck",{"type":29,"tag":117,"props":1387,"children":1388},{"style":124},[1389],{"type":34,"value":1390},"    # \u003C 2 min\n",{"type":29,"tag":117,"props":1392,"children":1393},{"class":119,"line":242},[1394],{"type":29,"tag":117,"props":1395,"children":1396},{"emptyLinePlaceholder":13},[1397],{"type":34,"value":136},{"type":29,"tag":117,"props":1399,"children":1400},{"class":119,"line":251},[1401,1406],{"type":29,"tag":117,"props":1402,"children":1403},{"style":1244},[1404],{"type":34,"value":1405},"  integration-tests",{"type":29,"tag":117,"props":1407,"children":1408},{"style":366},[1409],{"type":34,"value":1168},{"type":29,"tag":117,"props":1411,"children":1412},{"class":119,"line":260},[1413,1418,1422,1427,1432,1437],{"type":29,"tag":117,"props":1414,"children":1415},{"style":1244},[1416],{"type":34,"value":1417},"    needs",{"type":29,"tag":117,"props":1419,"children":1420},{"style":366},[1421],{"type":34,"value":1276},{"type":29,"tag":117,"props":1423,"children":1424},{"style":384},[1425],{"type":34,"value":1426}," [",{"type":29,"tag":117,"props":1428,"children":1429},{"style":166},[1430],{"type":34,"value":1431},"unit-tests",{"type":29,"tag":117,"props":1433,"children":1434},{"style":384},[1435],{"type":34,"value":1436},"]",{"type":29,"tag":117,"props":1438,"children":1439},{"style":124},[1440],{"type":34,"value":1441},"    # Seulement si les unit tests passent\n",{"type":29,"tag":117,"props":1443,"children":1444},{"class":119,"line":269},[1445,1449,1453],{"type":29,"tag":117,"props":1446,"children":1447},{"style":1244},[1448],{"type":34,"value":1271},{"type":29,"tag":117,"props":1450,"children":1451},{"style":366},[1452],{"type":34,"value":1276},{"type":29,"tag":117,"props":1454,"children":1455},{"style":166},[1456],{"type":34,"value":1281},{"type":29,"tag":117,"props":1458,"children":1459},{"class":119,"line":278},[1460,1464],{"type":29,"tag":117,"props":1461,"children":1462},{"style":1244},[1463],{"type":34,"value":1289},{"type":29,"tag":117,"props":1465,"children":1466},{"style":366},[1467],{"type":34,"value":1168},{"type":29,"tag":117,"props":1469,"children":1470},{"class":119,"line":286},[1471,1475,1479,1483,1488],{"type":29,"tag":117,"props":1472,"children":1473},{"style":384},[1474],{"type":34,"value":1301},{"type":29,"tag":117,"props":1476,"children":1477},{"style":1244},[1478],{"type":34,"value":1306},{"type":29,"tag":117,"props":1480,"children":1481},{"style":366},[1482],{"type":34,"value":1276},{"type":29,"tag":117,"props":1484,"children":1485},{"style":166},[1486],{"type":34,"value":1487}," npm run test:integration",{"type":29,"tag":117,"props":1489,"children":1490},{"style":124},[1491],{"type":34,"value":1492},"    # \u003C 10 min\n",{"type":29,"tag":567,"props":1494,"children":1498},{"cta":1495,"href":1496,"title":1497,"type":572},"Révéler les angles morts de mon équipe →","https:\u002F\u002Fapp.kamanga.fr\u002Fforms\u002Fdiscovery-call","Votre CI est verte, mais votre équipe intègre-t-elle vraiment plusieurs fois par jour ?",[1499],{"type":29,"tag":30,"props":1500,"children":1501},{},[1502],{"type":34,"value":1503},"La vraie maturité CI ne se lit pas dans le statut du pipeline : elle se cache dans la durée de vie des branches, les builds rouges qu'on ignore et les rituels qui ont décroché. En 30 minutes de diagnostic centré sur votre équipe, je vous aide à voir ce que vos métriques de delivery ne capturent pas et à prioriser les 2-3 leviers qui rapprocheront votre flux d'une intégration vraiment continue.",{"type":29,"tag":51,"props":1505,"children":1506},{},[],{"type":29,"tag":55,"props":1508,"children":1510},{"id":1509},"fondamental-3-les-tests-cassés-sont-la-priorité-absolue",[1511],{"type":34,"value":1512},"Fondamental 3 : Les tests cassés sont la priorité absolue",{"type":29,"tag":30,"props":1514,"children":1515},{},[1516],{"type":34,"value":1517},"Quand le pipeline est rouge, réparer le trunk est la priorité numéro un de toute l'équipe, avant les nouvelles features, avant les code reviews en attente, avant les réunions.",{"type":29,"tag":30,"props":1519,"children":1520},{},[1521],{"type":34,"value":1522},"Cette règle s'appelle le \"stop the line\", empruntée au Toyota Production System (Jidoka). Dans le TPS, quand un problème est détecté sur la ligne de production, la ligne s'arrête jusqu'à ce que le problème soit résolu. En CI, le trunk cassé est la ligne arrêtée.",{"type":29,"tag":30,"props":1524,"children":1525},{},[1526],{"type":34,"value":1527},"En pratique : pipeline rouge → alerte immédiate à toute l'équipe via Slack et dashboard. La personne qui a cassé le trunk a 10 minutes pour proposer un fix ou reverter. Si pas de fix en 10 minutes : revert automatique ou manuel. Pas de nouveaux commits sur trunk tant qu'il est rouge.",{"type":29,"tag":30,"props":1529,"children":1530},{},[1531],{"type":34,"value":1532},"Ce qui arrive sans cette règle : les builds cassés s'accumulent, les développeurs ignorent les alertes, et le pipeline devient du décor plutôt qu'un signal utile. J'ai vu des équipes avec un pipeline rouge depuis 3 semaines : tout le monde avait arrêté de regarder.",{"type":29,"tag":51,"props":1534,"children":1535},{},[],{"type":29,"tag":55,"props":1537,"children":1539},{"id":1538},"fondamental-4-tout-le-monde-voit-létat-du-pipeline",[1540],{"type":34,"value":1541},"Fondamental 4 : Tout le monde voit l'état du pipeline",{"type":29,"tag":30,"props":1543,"children":1544},{},[1545],{"type":34,"value":1546},"L'état du pipeline doit être visible passivement par toute l'équipe, pas seulement quand quelqu'un pense à aller le vérifier.",{"type":29,"tag":30,"props":1548,"children":1549},{},[1550],{"type":34,"value":1551},"Les mécanismes de visibilité : dashboard de build sur un écran visible dans l'espace de travail, notification Slack dans le canal de l'équipe (pas seulement à la personne qui a pushé), badge de statut sur le README du repo, statut visible dans l'IDE.",{"type":29,"tag":30,"props":1553,"children":1554},{},[1555],{"type":34,"value":1556},"La différence entre \"notification opt-in\" et \"visibilité passive\" est fondamentale : si le développeur doit aller chercher l'information, il ne le fera pas systématiquement. La visibilité passive crée une conscience collective de l'état de la CI sans effort individuel.",{"type":29,"tag":51,"props":1558,"children":1559},{},[],{"type":29,"tag":55,"props":1561,"children":1563},{"id":1562},"fondamental-5-les-tests-sont-la-définition-de-trunk-en-bonne-santé",[1564],{"type":34,"value":1565},"Fondamental 5 : Les tests sont la définition de \"trunk en bonne santé\"",{"type":29,"tag":30,"props":1567,"children":1568},{},[1569,1571,1577],{"type":34,"value":1570},"Les tests automatisés définissent ce que \"trunk en bonne santé\" signifie : intégrez ce critère dans votre ",{"type":29,"tag":453,"props":1572,"children":1574},{"href":1573},"\u002Ffr\u002Fdette-technique\u002Fdefinition-of-done-qualite",[1575],{"type":34,"value":1576},"Definition of Done",{"type":34,"value":1578},". Si un comportement n'est pas testé, la CI ne peut pas le protéger.",{"type":29,"tag":30,"props":1580,"children":1581},{},[1582],{"type":34,"value":1583},"La pyramide de tests en CI définit la structure optimale :",{"type":29,"tag":1585,"props":1586,"children":1587},"ul",{},[1588,1599,1613],{"type":29,"tag":1589,"props":1590,"children":1591},"li",{},[1592,1597],{"type":29,"tag":45,"props":1593,"children":1594},{},[1595],{"type":34,"value":1596},"Tests unitaires",{"type":34,"value":1598}," (70-80% des tests) : rapides, sans dépendances externes. Feedback en moins de 2 minutes.",{"type":29,"tag":1589,"props":1600,"children":1601},{},[1602,1611],{"type":29,"tag":45,"props":1603,"children":1604},{},[1605],{"type":29,"tag":453,"props":1606,"children":1608},{"href":1607},"\u002Ffr\u002Fdette-technique\u002Ftests-integration-legacy-pieges",[1609],{"type":34,"value":1610},"Tests d'intégration",{"type":34,"value":1612}," (15-20% des tests) : avec base de données ou services externes. Feedback en moins de 8 minutes.",{"type":29,"tag":1589,"props":1614,"children":1615},{},[1616,1621],{"type":29,"tag":45,"props":1617,"children":1618},{},[1619],{"type":34,"value":1620},"Tests end-to-end",{"type":34,"value":1622}," (5-10% des tests) : sur les flux critiques uniquement. Déclenchés moins fréquemment.",{"type":29,"tag":30,"props":1624,"children":1625},{},[1626],{"type":34,"value":1627},"Un pipeline vert ne garantit pas que le logiciel est correct : il garantit qu'il est cohérent avec ses tests. La qualité des tests détermine la qualité du signal.",{"type":29,"tag":51,"props":1629,"children":1630},{},[],{"type":29,"tag":55,"props":1632,"children":1634},{"id":1633},"ce-que-ça-change-concrètement",[1635],{"type":34,"value":1636},"Ce que ça change concrètement",{"type":29,"tag":30,"props":1638,"children":1639},{},[1640],{"type":34,"value":1641},"Dans l'équipe mentionnée en introduction, après 6 semaines de travail sur les 5 fondamentaux (parallélisation des tests, feature flags systématiques, règle du stop the line, dashboard visible, refonte de la pyramide de tests), le résultat était mesurable. Le pipeline est passé de 28 minutes à 8 minutes. La durée des branches est passée de 4 jours à 18 heures. Le lead time de delivery a baissé de 40%.",{"type":29,"tag":30,"props":1643,"children":1644},{},[1645],{"type":34,"value":1646},"Aucun recrutement. Aucun changement de framework. Seulement des pratiques humaines appliquées avec discipline.",{"type":29,"tag":30,"props":1648,"children":1649},{},[1650,1652,1658],{"type":34,"value":1651},"Les métriques de maturité CI à suivre (ces indicateurs font partie des ",{"type":29,"tag":453,"props":1653,"children":1655},{"href":1654},"\u002Ffr\u002Fmanagement\u002Fmetriques-management-developpeurs-motivation",[1656],{"type":34,"value":1657},"4 métriques DORA",{"type":34,"value":1659},") : fréquence d'intégration par développeur (cible : plus de 2 fois par jour), MTTR du pipeline en cas de rupture (cible : moins de 30 minutes), durée du pipeline en p95 (cible : moins de 10 minutes), taux de flakiness des tests (cible : moins de 5%).",{"type":29,"tag":51,"props":1661,"children":1662},{},[],{"type":29,"tag":55,"props":1664,"children":1666},{"id":1665},"faq-sur-la-continuous-integration",[1667],{"type":34,"value":1668},"FAQ sur la Continuous Integration",{"type":29,"tag":825,"props":1670,"children":1671},{},[1672,1677],{"type":29,"tag":829,"props":1673,"children":1674},{},[1675],{"type":34,"value":1676},"1. Quelle est la différence entre CI et CD (Continuous Delivery \u002F Deployment) ?",{"type":29,"tag":30,"props":1678,"children":1679},{},[1680],{"type":34,"value":1681},"La CI est l'intégration fréquente du code dans le trunk avec vérification automatique. La CD (Delivery) est la capacité à déployer n'importe quel commit en production de façon fiable à tout moment. La CD (Deployment) est le déploiement automatique de chaque commit qui passe la CI. La CI est un prérequis à la CD. On peut pratiquer la CI sans CD, mais pas l'inverse de façon viable.",{"type":29,"tag":825,"props":1683,"children":1684},{},[1685,1690],{"type":29,"tag":829,"props":1686,"children":1687},{},[1688],{"type":34,"value":1689},"2. Comment convaincre une équipe de passer des feature branches longues aux intégrations quotidiennes ?",{"type":29,"tag":30,"props":1691,"children":1692},{},[1693],{"type":34,"value":1694},"Par la data. Calculer le temps moyen passé à résoudre les conflits de merge sur les 3 derniers mois. Dans la plupart des équipes avec des branches de 1-2 semaines, les merge conflicts représentent 10 à 15% du temps de développement. Proposer un pilote de 4 sprints avec des branches courtes et feature flags, et mesurer. Le résultat parle de lui-même.",{"type":29,"tag":825,"props":1696,"children":1697},{},[1698,1703],{"type":29,"tag":829,"props":1699,"children":1700},{},[1701],{"type":34,"value":1702},"3. Les feature flags créent-ils une dette technique ?",{"type":29,"tag":30,"props":1704,"children":1705},{},[1706],{"type":34,"value":1707},"Oui, si mal gérés. Un feature flag non supprimé après le lancement de la feature est de la dette. La règle : chaque feature flag a une date d'expiration définie au moment de sa création. Un linter ou un test automatique vérifie que les flags expirés sont supprimés. En pratique, un backlog dédié à la suppression des flags (2 à 3 par sprint) suffit pour maintenir le stock sous contrôle.",{"type":29,"tag":825,"props":1709,"children":1710},{},[1711,1716],{"type":29,"tag":829,"props":1712,"children":1713},{},[1714],{"type":34,"value":1715},"4. Comment gérer la CI dans un monorepo avec de nombreux services ?",{"type":29,"tag":30,"props":1717,"children":1718},{},[1719],{"type":34,"value":1720},"Avec des pipelines sélectifs basés sur les changements. Les outils comme Nx pour JavaScript\u002FTypeScript, Bazel pour les environnements multi-langages, ou les \"path filters\" dans GitHub Actions permettent de ne lancer que les tests des services impactés par les changements. Cela maintient un pipeline sous 10 minutes même dans un monorepo de 20 services.",{"type":29,"tag":825,"props":1722,"children":1723},{},[1724,1729],{"type":29,"tag":829,"props":1725,"children":1726},{},[1727],{"type":34,"value":1728},"5. Que faire quand les tests sont trop lents pour permettre une intégration quotidienne ?",{"type":29,"tag":30,"props":1730,"children":1731},{},[1732],{"type":34,"value":1733},"C'est le signal pour revoir la pyramide de tests. Audit en 3 étapes : identifier les 20% de tests les plus lents qui représentent 80% du temps, évaluer si ces tests d'intégration pourraient être remplacés par des tests unitaires avec mocks, puis déplacer les tests lents dans un stage séparé déclenché toutes les 2 heures. Le pipeline fast feedback reste sous 10 minutes, le reste se vérifie en continu.",{"type":29,"tag":51,"props":1735,"children":1736},{},[],{"type":29,"tag":567,"props":1738,"children":1741},{"cta":1739,"href":918,"title":1740,"type":920},"Télécharger le guide gratuit →","Ressource gratuite : Guide Lead Time -50% en 90 jours",[1742],{"type":29,"tag":30,"props":1743,"children":1744},{},[1745],{"type":34,"value":1746},"Le guide complet pour réduire votre lead time en 90 jours inclut un chapitre sur l'optimisation du pipeline CI\u002FCD et les pratiques d'intégration qui font la différence sur la fréquence de delivery, avec les métriques DORA à suivre.",{"type":29,"tag":928,"props":1748,"children":1749},{},[1750],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":1752},[1753,1754,1755,1756,1757,1758,1759,1760],{"id":996,"depth":130,"text":999},{"id":1045,"depth":130,"text":1048},{"id":1203,"depth":130,"text":1206},{"id":1509,"depth":130,"text":1512},{"id":1538,"depth":130,"text":1541},{"id":1562,"depth":130,"text":1565},{"id":1633,"depth":130,"text":1636},{"id":1665,"depth":130,"text":1668},"content:fr:pratiques-agiles:continuous-integration-fondamentaux.md","fr\u002Fpratiques-agiles\u002Fcontinuous-integration-fondamentaux.md","fr\u002Fpratiques-agiles\u002Fcontinuous-integration-fondamentaux",{"_path":1573,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":1766,"description":1767,"id":1768,"date":1769,"listed":13,"nocomments":7,"hidden":7,"categories":1770,"tags":1771,"cover":1773,"readingTime":1774,"body":1779,"_type":942,"_id":2397,"_source":944,"_file":2398,"_stem":2399,"_extension":947},"dette-technique","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",[1765],[18,1772],"agile","covers\u002Farticles\u002Fdefinition-of-done-qualite.jpg",{"text":1775,"minutes":1776,"time":1777,"words":1778},"8 min read",7.71,462600,1542,{"type":26,"children":1780,"toc":2387},[1781,1786,1794,1799,1802,1808,1826,1829,1835,1852,1857,1867,1885,1890,1900,1903,1909,1924,1929,1939,1949,1966,1976,1986,1996,2006,2015,2018,2027,2030,2036,2041,2051,2061,2071,2081,2090,2093,2099,2104,2114,2132,2145,2154,2157,2163,2172,2175,2181,2280,2283,2292,2295,2301,2314,2327,2348,2361,2374,2377],{"type":29,"tag":30,"props":1782,"children":1783},{},[1784],{"type":34,"value":1785},"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":30,"props":1787,"children":1788},{},[1789],{"type":29,"tag":45,"props":1790,"children":1791},{},[1792],{"type":34,"value":1793},"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":30,"props":1795,"children":1796},{},[1797],{"type":34,"value":1798},"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":51,"props":1800,"children":1801},{},[],{"type":29,"tag":55,"props":1803,"children":1805},{"id":1804},"avant-de-commencer-les-prérequis",[1806],{"type":34,"value":1807},"Avant de commencer : les prérequis",{"type":29,"tag":1585,"props":1809,"children":1810},{},[1811,1816,1821],{"type":29,"tag":1589,"props":1812,"children":1813},{},[1814],{"type":34,"value":1815},"L'équipe a déjà une DoD existante (même minimale ou informelle) à partir de laquelle progresser",{"type":29,"tag":1589,"props":1817,"children":1818},{},[1819],{"type":34,"value":1820},"Le Product Owner et le Tech Lead sont impliqués dans la redéfinition",{"type":29,"tag":1589,"props":1822,"children":1823},{},[1824],{"type":34,"value":1825},"L'équipe a accès aux métriques de base : taux de bugs de prod, lead time, incidents récents",{"type":29,"tag":51,"props":1827,"children":1828},{},[],{"type":29,"tag":55,"props":1830,"children":1832},{"id":1831},"étape-1-auditer-la-dod-actuelle-ou-son-absence",[1833],{"type":34,"value":1834},"Étape 1 : Auditer la DoD actuelle (ou son absence)",{"type":29,"tag":30,"props":1836,"children":1837},{},[1838,1843,1845,1850],{"type":29,"tag":45,"props":1839,"children":1840},{},[1841],{"type":34,"value":1842},"Durée estimée",{"type":34,"value":1844}," : 2 heures en atelier équipe\n",{"type":29,"tag":45,"props":1846,"children":1847},{},[1848],{"type":34,"value":1849},"Qui",{"type":34,"value":1851}," : Toute l'équipe de développement + PO + Scrum Master",{"type":29,"tag":30,"props":1853,"children":1854},{},[1855],{"type":34,"value":1856},"Avant de construire une nouvelle DoD, comprendre pourquoi l'actuelle ne fonctionne pas.",{"type":29,"tag":30,"props":1858,"children":1859},{},[1860,1865],{"type":29,"tag":45,"props":1861,"children":1862},{},[1863],{"type":34,"value":1864},"Questions à poser en atelier",{"type":34,"value":1866}," :",{"type":29,"tag":1585,"props":1868,"children":1869},{},[1870,1875,1880],{"type":29,"tag":1589,"props":1871,"children":1872},{},[1873],{"type":34,"value":1874},"\"Quand considérez-vous qu'une story est vraiment terminée ?\" Recueillir les réponses individuelles avant la discussion.",{"type":29,"tag":1589,"props":1876,"children":1877},{},[1878],{"type":34,"value":1879},"\"Citez un bug récent de prod : quelle étape de la DoD aurait dû le détecter ?\"",{"type":29,"tag":1589,"props":1881,"children":1882},{},[1883],{"type":34,"value":1884},"\"Y a-t-il des items de notre DoD actuelle que personne ne vérifie vraiment ?\"",{"type":29,"tag":30,"props":1886,"children":1887},{},[1888],{"type":34,"value":1889},"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":30,"props":1891,"children":1892},{},[1893,1898],{"type":29,"tag":45,"props":1894,"children":1895},{},[1896],{"type":34,"value":1897},"Résultat attendu",{"type":34,"value":1899}," : une liste de ce qui fonctionne, ce qui est contourné, et ce qui manque.",{"type":29,"tag":51,"props":1901,"children":1902},{},[],{"type":29,"tag":55,"props":1904,"children":1906},{"id":1905},"étape-2-les-7-critères-non-négociables-dune-dod-solide",[1907],{"type":34,"value":1908},"Étape 2 : Les 7 critères non-négociables d'une DoD solide",{"type":29,"tag":30,"props":1910,"children":1911},{},[1912,1916,1918,1922],{"type":29,"tag":45,"props":1913,"children":1914},{},[1915],{"type":34,"value":1842},{"type":34,"value":1917}," : 1 heure de discussion\n",{"type":29,"tag":45,"props":1919,"children":1920},{},[1921],{"type":34,"value":1849},{"type":34,"value":1923}," : Tech Lead + PO",{"type":29,"tag":30,"props":1925,"children":1926},{},[1927],{"type":34,"value":1928},"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":30,"props":1930,"children":1931},{},[1932,1937],{"type":29,"tag":45,"props":1933,"children":1934},{},[1935],{"type":34,"value":1936},"1. Code reviewé par au moins un pair",{"type":34,"value":1938},"\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":30,"props":1940,"children":1941},{},[1942,1947],{"type":29,"tag":45,"props":1943,"children":1944},{},[1945],{"type":34,"value":1946},"2. Tests automatisés écrits ou mis à jour",{"type":34,"value":1948},"\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":30,"props":1950,"children":1951},{},[1952,1964],{"type":29,"tag":45,"props":1953,"children":1954},{},[1955,1957,1962],{"type":34,"value":1956},"3. ",{"type":29,"tag":453,"props":1958,"children":1959},{"href":949},[1960],{"type":34,"value":1961},"Build CI",{"type":34,"value":1963}," vert sur la branche",{"type":34,"value":1965},"\nÉvident mais souvent contourné \"pour gagner du temps\". Un build rouge = story non terminée, sans exception.",{"type":29,"tag":30,"props":1967,"children":1968},{},[1969,1974],{"type":29,"tag":45,"props":1970,"children":1971},{},[1972],{"type":34,"value":1973},"4. Critères d'acceptation vérifiés et documentés",{"type":34,"value":1975},"\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":30,"props":1977,"children":1978},{},[1979,1984],{"type":29,"tag":45,"props":1980,"children":1981},{},[1982],{"type":34,"value":1983},"5. Pas de régression identifiée sur les scénarios existants",{"type":34,"value":1985},"\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":30,"props":1987,"children":1988},{},[1989,1994],{"type":29,"tag":45,"props":1990,"children":1991},{},[1992],{"type":34,"value":1993},"6. Documentation mise à jour si applicable",{"type":34,"value":1995},"\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":30,"props":1997,"children":1998},{},[1999,2004],{"type":29,"tag":45,"props":2000,"children":2001},{},[2002],{"type":34,"value":2003},"7. Déployable en environnement de staging sans intervention manuelle",{"type":34,"value":2005},"\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":30,"props":2007,"children":2008},{},[2009,2013],{"type":29,"tag":45,"props":2010,"children":2011},{},[2012],{"type":34,"value":1897},{"type":34,"value":2014}," : une DoD de 7 items précis et actionnables.",{"type":29,"tag":51,"props":2016,"children":2017},{},[],{"type":29,"tag":567,"props":2019,"children":2021},{"cta":569,"href":570,"title":2020,"type":572},"Vous voulez savoir reconnaître le code qui n'est pas vraiment terminé, avant de le merger ?",[2022],{"type":29,"tag":30,"props":2023,"children":2024},{},[2025],{"type":34,"value":2026},"Juger si une PR est réellement \"Done\", ça ne se déduit pas d'une checklist : ça s'apprend à l'oeil, sur du vrai code. En mentoring 1:1, je relis vos PR avec vous et je vous montre ce qui manque (tests qui ne testent rien, cas limites oubliés, régressions silencieuses). Vous repartez avec le réflexe de voir ce qu'une DoD ne capture pas.",{"type":29,"tag":51,"props":2028,"children":2029},{},[],{"type":29,"tag":55,"props":2031,"children":2033},{"id":2032},"étape-3-lintégrer-dans-le-workflow-sans-friction",[2034],{"type":34,"value":2035},"Étape 3 : L'intégrer dans le workflow sans friction",{"type":29,"tag":30,"props":2037,"children":2038},{},[2039],{"type":34,"value":2040},"Une DoD que personne ne consulte n'existe pas. Elle doit être au bon endroit, au bon moment.",{"type":29,"tag":30,"props":2042,"children":2043},{},[2044,2049],{"type":29,"tag":45,"props":2045,"children":2046},{},[2047],{"type":34,"value":2048},"Dans Jira\u002FLinear",{"type":34,"value":2050}," : 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":30,"props":2052,"children":2053},{},[2054,2059],{"type":29,"tag":45,"props":2055,"children":2056},{},[2057],{"type":34,"value":2058},"Dans GitHub\u002FGitLab",{"type":34,"value":2060}," : 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":30,"props":2062,"children":2063},{},[2064,2069],{"type":29,"tag":45,"props":2065,"children":2066},{},[2067],{"type":34,"value":2068},"Dans le sprint review",{"type":34,"value":2070}," : 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":30,"props":2072,"children":2073},{},[2074,2079],{"type":29,"tag":45,"props":2075,"children":2076},{},[2077],{"type":34,"value":2078},"L'erreur à éviter",{"type":34,"value":2080}," : 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":30,"props":2082,"children":2083},{},[2084,2088],{"type":29,"tag":45,"props":2085,"children":2086},{},[2087],{"type":34,"value":1897},{"type":34,"value":2089}," : la DoD est intégrée dans les templates Jira et GitHub. Elle est visible au bon moment dans le workflow.",{"type":29,"tag":51,"props":2091,"children":2092},{},[],{"type":29,"tag":55,"props":2094,"children":2096},{"id":2095},"étape-4-la-faire-évoluer-chaque-trimestre",[2097],{"type":34,"value":2098},"Étape 4 : La faire évoluer chaque trimestre",{"type":29,"tag":30,"props":2100,"children":2101},{},[2102],{"type":34,"value":2103},"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":30,"props":2105,"children":2106},{},[2107,2112],{"type":29,"tag":45,"props":2108,"children":2109},{},[2110],{"type":34,"value":2111},"Rituel recommandé",{"type":34,"value":2113}," : une session de 1 heure par trimestre, en même temps que le trimestrial planning, pour réviser la DoD :",{"type":29,"tag":1585,"props":2115,"children":2116},{},[2117,2122,2127],{"type":29,"tag":1589,"props":2118,"children":2119},{},[2120],{"type":34,"value":2121},"Quels items sont systématiquement respectés ? (→ potentiellement automatisables dans la CI)",{"type":29,"tag":1589,"props":2123,"children":2124},{},[2125],{"type":34,"value":2126},"Quels items sont régulièrement contournés ? (→ soit les supprimer, soit identifier pourquoi et lever le blocage)",{"type":29,"tag":1589,"props":2128,"children":2129},{},[2130],{"type":34,"value":2131},"Quels items manquent compte tenu des problèmes rencontrés ce trimestre ?",{"type":29,"tag":30,"props":2133,"children":2134},{},[2135,2137,2143],{"type":34,"value":2136},"L'objectif à 12-18 mois : une DoD qui contient des items d'un ",{"type":29,"tag":453,"props":2138,"children":2140},{"href":2139},"\u002Ffr\u002Fdette-technique\u002Fintroduction-maturite-engineering-5-niveaux",[2141],{"type":34,"value":2142},"niveau 3 de maturité engineering",{"type":34,"value":2144}," : les standards de qualité sont ancrés dans les pratiques de l'équipe, pas seulement dans un document.",{"type":29,"tag":30,"props":2146,"children":2147},{},[2148,2152],{"type":29,"tag":45,"props":2149,"children":2150},{},[2151],{"type":34,"value":1897},{"type":34,"value":2153}," : une DoD vivante, révisée trimestriellement, qui progresse avec le niveau de maturité de l'équipe.",{"type":29,"tag":51,"props":2155,"children":2156},{},[],{"type":29,"tag":55,"props":2158,"children":2160},{"id":2159},"le-piège-à-éviter",[2161],{"type":34,"value":2162},"Le piège à éviter",{"type":29,"tag":2164,"props":2165,"children":2166},"blockquote",{},[2167],{"type":29,"tag":30,"props":2168,"children":2169},{},[2170],{"type":34,"value":2171},"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":51,"props":2173,"children":2174},{},[],{"type":29,"tag":55,"props":2176,"children":2178},{"id":2177},"en-résumé",[2179],{"type":34,"value":2180},"En résumé",{"type":29,"tag":633,"props":2182,"children":2183},{},[2184,2205],{"type":29,"tag":637,"props":2185,"children":2186},{},[2187],{"type":29,"tag":641,"props":2188,"children":2189},{},[2190,2195,2200],{"type":29,"tag":645,"props":2191,"children":2192},{},[2193],{"type":34,"value":2194},"Étape",{"type":29,"tag":645,"props":2196,"children":2197},{},[2198],{"type":34,"value":2199},"Action",{"type":29,"tag":645,"props":2201,"children":2202},{},[2203],{"type":34,"value":2204},"Résultat",{"type":29,"tag":656,"props":2206,"children":2207},{},[2208,2226,2244,2262],{"type":29,"tag":641,"props":2209,"children":2210},{},[2211,2216,2221],{"type":29,"tag":663,"props":2212,"children":2213},{},[2214],{"type":34,"value":2215},"1",{"type":29,"tag":663,"props":2217,"children":2218},{},[2219],{"type":34,"value":2220},"Auditer la DoD actuelle en atelier",{"type":29,"tag":663,"props":2222,"children":2223},{},[2224],{"type":34,"value":2225},"Identifier les items fantômes et les manques",{"type":29,"tag":641,"props":2227,"children":2228},{},[2229,2234,2239],{"type":29,"tag":663,"props":2230,"children":2231},{},[2232],{"type":34,"value":2233},"2",{"type":29,"tag":663,"props":2235,"children":2236},{},[2237],{"type":34,"value":2238},"Définir les 7 critères non-négociables",{"type":29,"tag":663,"props":2240,"children":2241},{},[2242],{"type":34,"value":2243},"DoD précise et actionnable",{"type":29,"tag":641,"props":2245,"children":2246},{},[2247,2252,2257],{"type":29,"tag":663,"props":2248,"children":2249},{},[2250],{"type":34,"value":2251},"3",{"type":29,"tag":663,"props":2253,"children":2254},{},[2255],{"type":34,"value":2256},"Intégrer dans Jira et GitHub",{"type":29,"tag":663,"props":2258,"children":2259},{},[2260],{"type":34,"value":2261},"DoD consultée au bon moment dans le workflow",{"type":29,"tag":641,"props":2263,"children":2264},{},[2265,2270,2275],{"type":29,"tag":663,"props":2266,"children":2267},{},[2268],{"type":34,"value":2269},"4",{"type":29,"tag":663,"props":2271,"children":2272},{},[2273],{"type":34,"value":2274},"Réviser chaque trimestre",{"type":29,"tag":663,"props":2276,"children":2277},{},[2278],{"type":34,"value":2279},"DoD qui progresse avec la maturité de l'équipe",{"type":29,"tag":51,"props":2281,"children":2282},{},[],{"type":29,"tag":567,"props":2284,"children":2286},{"cta":805,"href":806,"title":2285,"type":808},"Une DoD solide, c'est une pratique parmi 100 autres qui font le code propre",[2287],{"type":29,"tag":30,"props":2288,"children":2289},{},[2290],{"type":34,"value":2291},"Définir une Definition of Done qui tient vraiment, c'est un seul réflexe de craft parmi beaucoup d'autres. Le Craft Bundle réunit les 100 pratiques que j'applique au quotidien pour coder propre, de la revue de code au découpage de stories, celles que l'IA ne vous apprendra jamais parce qu'elle ne les a jamais vues protéger une mise en prod.",{"type":29,"tag":51,"props":2293,"children":2294},{},[],{"type":29,"tag":55,"props":2296,"children":2298},{"id":2297},"faq-sur-la-definition-of-done",[2299],{"type":34,"value":2300},"FAQ sur la Definition of Done",{"type":29,"tag":825,"props":2302,"children":2303},{},[2304,2309],{"type":29,"tag":829,"props":2305,"children":2306},{},[2307],{"type":34,"value":2308},"1. Quelle est la différence entre la DoD et les critères d'acceptation ?",{"type":29,"tag":30,"props":2310,"children":2311},{},[2312],{"type":34,"value":2313},"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":825,"props":2315,"children":2316},{},[2317,2322],{"type":29,"tag":829,"props":2318,"children":2319},{},[2320],{"type":34,"value":2321},"2. La DoD doit-elle être la même pour tous les types de stories ?",{"type":29,"tag":30,"props":2323,"children":2324},{},[2325],{"type":34,"value":2326},"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":825,"props":2328,"children":2329},{},[2330,2335],{"type":29,"tag":829,"props":2331,"children":2332},{},[2333],{"type":34,"value":2334},"3. Comment gérer la résistance de l'équipe à une DoD plus stricte ?",{"type":29,"tag":30,"props":2336,"children":2337},{},[2338,2340,2346],{"type":34,"value":2339},"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":453,"props":2341,"children":2343},{"href":2342},"\u002Ffr\u002Fpratiques-agiles\u002Fdefinition-of-ready-bugs-sprint",[2344],{"type":34,"value":2345},"Definition of Ready absente",{"type":34,"value":2347},", 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":825,"props":2349,"children":2350},{},[2351,2356],{"type":29,"tag":829,"props":2352,"children":2353},{},[2354],{"type":34,"value":2355},"4. Faut-il une DoD différente par équipe dans une organisation avec plusieurs équipes ?",{"type":29,"tag":30,"props":2357,"children":2358},{},[2359],{"type":34,"value":2360},"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":825,"props":2362,"children":2363},{},[2364,2369],{"type":29,"tag":829,"props":2365,"children":2366},{},[2367],{"type":34,"value":2368},"5. Comment mesurer si la DoD améliore réellement la qualité ?",{"type":29,"tag":30,"props":2370,"children":2371},{},[2372],{"type":34,"value":2373},"Trois métriques à suivre avant\u002Faprè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":51,"props":2375,"children":2376},{},[],{"type":29,"tag":567,"props":2378,"children":2381},{"cta":2379,"href":918,"title":2380,"type":920},"Accéder à l'assessment gratuit →","Ressource gratuite : Engineering Maturity Self-Assessment",[2382],{"type":29,"tag":30,"props":2383,"children":2384},{},[2385],{"type":34,"value":2386},"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":130,"depth":130,"links":2388},[2389,2390,2391,2392,2393,2394,2395,2396],{"id":1804,"depth":130,"text":1807},{"id":1831,"depth":130,"text":1834},{"id":1905,"depth":130,"text":1908},{"id":2032,"depth":130,"text":2035},{"id":2095,"depth":130,"text":2098},{"id":2159,"depth":130,"text":2162},{"id":2177,"depth":130,"text":2180},{"id":2297,"depth":130,"text":2300},"content:fr:dette-technique:definition-of-done-qualite.md","fr\u002Fdette-technique\u002Fdefinition-of-done-qualite.md","fr\u002Fdette-technique\u002Fdefinition-of-done-qualite",{"_path":745,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":2401,"description":2402,"id":340,"date":2403,"listed":13,"nocomments":7,"hidden":7,"categories":2404,"tags":2405,"cover":2407,"readingTime":2408,"body":2412,"_type":942,"_id":3897,"_source":944,"_file":3898,"_stem":3899,"_extension":947},"Tester du code généré par l'IA : la checklist en 12 points","Le code généré par l'IA passe les tests syntaxiques et rate les tests de logique métier. Une checklist pour valider du code IA avant de le merger.","2026-02-25",[6],[2406,17,18],"tests","covers\u002Farticles\u002Ftester-code-ia-checklist.jpg",{"text":960,"minutes":2409,"time":2410,"words":2411},8.55,513000,1710,{"type":26,"children":2413,"toc":3889},[2414,2427,2432,2447,2450,2456,2490,2502,2505,2511,2519,2524,2544,2552,2557,2580,2588,2593,2601,2606,2615,2618,2624,2632,2637,2645,2650,2663,3031,3039,3044,3052,3057,3083,3086,3092,3100,3105,3606,3614,3627,3635,3640,3648,3656,3661,3664,3670,3687,3697,3707,3710,3790,3799,3802,3808,3821,3834,3847,3860,3873,3876,3885],{"type":29,"tag":30,"props":2415,"children":2416},{},[2417,2419,2425],{"type":34,"value":2418},"En développant crmcoaching seul avec Claude, j'ai vécu exactement ça : Claude m'a généré l'implémentation d'une règle de calcul de disponibilité pour les slots d'un coach. Le code compilait. Les tests Vitest passaient, des tests que Claude avait également écrits. La PR a été mergée sur staging. Deux jours plus tard, en testant manuellement, j'ai découvert que certains créneaux étaient marqués disponibles alors qu'un ",{"type":29,"tag":113,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":34,"value":2424},"slot-hold",{"type":34,"value":2426}," actif les bloquait. La règle métier avait une condition de priorité que Claude avait silencieusement simplifiée.",{"type":29,"tag":30,"props":2428,"children":2429},{},[2430],{"type":34,"value":2431},"Ce n'était pas un bug de code. C'était un bug de jugement métier que Claude ne pouvait pas avoir sans mes spécifications complètes.",{"type":29,"tag":30,"props":2433,"children":2434},{},[2435],{"type":29,"tag":45,"props":2436,"children":2437},{},[2438,2440,2445],{"type":34,"value":2439},"Le code généré par un LLM compile, passe les tests de type, et peut même faire passer une suite de tests unitaires, tout en étant incorrect sur la logique métier. C'est la caractéristique la plus trompeuse du code IA-assisté : les ",{"type":29,"tag":453,"props":2441,"children":2442},{"href":455},[2443],{"type":34,"value":2444},"vulnérabilités de sécurité spécifiques aux LLMs",{"type":34,"value":2446}," s'y cachent de la même façon : il a l'air juste avant d'être évalué en profondeur.",{"type":29,"tag":51,"props":2448,"children":2449},{},[],{"type":29,"tag":55,"props":2451,"children":2453},{"id":2452},"pourquoi-claude-se-trompe-sur-le-métier",[2454],{"type":34,"value":2455},"Pourquoi Claude se trompe sur le métier",{"type":29,"tag":30,"props":2457,"children":2458},{},[2459,2461,2467,2469,2475,2476,2482,2483,2488],{"type":34,"value":2460},"Claude génère du code plausible basé sur des patterns statistiques. Il ne connaît pas les règles métier de crmcoaching : les contraintes entre ",{"type":29,"tag":113,"props":2462,"children":2464},{"className":2463},[],[2465],{"type":34,"value":2466},"lead",{"type":34,"value":2468},", ",{"type":29,"tag":113,"props":2470,"children":2472},{"className":2471},[],[2473],{"type":34,"value":2474},"client",{"type":34,"value":2468},{"type":29,"tag":113,"props":2477,"children":2479},{"className":2478},[],[2480],{"type":34,"value":2481},"offre",{"type":34,"value":2468},{"type":29,"tag":113,"props":2484,"children":2486},{"className":2485},[],[2487],{"type":34,"value":2424},{"type":34,"value":2489},", les invariants de domaine dans chaque bounded context. Il génère du code qui ressemble à du code qui gère des créneaux ou des paiements, mais pas du code qui gère mes créneaux, selon mes règles, dans mon contexte Prisma\u002FPostgreSQL.",{"type":29,"tag":30,"props":2491,"children":2492},{},[2493,2495,2500],{"type":34,"value":2494},"La conséquence est directe : le code IA-généré peut être techniquement impeccable (pas d'injection, pas de null assertion sauvage, bonne gestion des erreurs) et fonctionnellement incorrect (mauvaise règle de calcul, cas d'utilisation manqué, contrainte business ignorée). La recherche de ",{"type":29,"tag":45,"props":2496,"children":2497},{},[2498],{"type":34,"value":2499},"NYU (2023)",{"type":34,"value":2501}," sur le code IA-assisté confirme que les développeurs sous-estiment systématiquement les erreurs de logique dans le code généré, précisément parce que le code \"a l'air propre\".",{"type":29,"tag":51,"props":2503,"children":2504},{},[],{"type":29,"tag":55,"props":2506,"children":2508},{"id":2507},"checklist-partie-1-correction-logique-et-cas-limites-points-1-4",[2509],{"type":34,"value":2510},"Checklist partie 1 : Correction logique et cas limites (points 1-4)",{"type":29,"tag":30,"props":2512,"children":2513},{},[2514],{"type":29,"tag":45,"props":2515,"children":2516},{},[2517],{"type":34,"value":2518},"Point 1 : La logique métier correspond aux règles de votre domaine",{"type":29,"tag":30,"props":2520,"children":2521},{},[2522],{"type":34,"value":2523},"Ne pas se fier au fait que le code \"a l'air logique\". Vérifier explicitement que chaque règle métier implémentée correspond exactement à la spécification. Claude a tendance à implémenter des règles \"standard\" qui peuvent différer des règles spécifiques de votre domaine.",{"type":29,"tag":30,"props":2525,"children":2526},{},[2527,2529,2534,2536,2542],{"type":34,"value":2528},"Exemple concret sur crmcoaching : Claude peut implémenter la disponibilité d'un slot en ignorant la priorité d'un ",{"type":29,"tag":113,"props":2530,"children":2532},{"className":2531},[],[2533],{"type":34,"value":2424},{"type":34,"value":2535}," actif, ou gérer la conversion lead -> client sans propager le ",{"type":29,"tag":113,"props":2537,"children":2539},{"className":2538},[],[2540],{"type":34,"value":2541},"createdBy",{"type":34,"value":2543}," attendu par l'audit trail.",{"type":29,"tag":30,"props":2545,"children":2546},{},[2547],{"type":29,"tag":45,"props":2548,"children":2549},{},[2550],{"type":34,"value":2551},"Point 2 : Les cas limites sont couverts",{"type":29,"tag":30,"props":2553,"children":2554},{},[2555],{"type":34,"value":2556},"Vérifiez explicitement :",{"type":29,"tag":1585,"props":2558,"children":2559},{},[2560,2565,2570,2575],{"type":29,"tag":1589,"props":2561,"children":2562},{},[2563],{"type":34,"value":2564},"Que se passe-t-il si la collection est vide ?",{"type":29,"tag":1589,"props":2566,"children":2567},{},[2568],{"type":34,"value":2569},"Que se passe-t-il avec des valeurs nulles ou undefined ?",{"type":29,"tag":1589,"props":2571,"children":2572},{},[2573],{"type":34,"value":2574},"Que se passe-t-il avec les valeurs extrêmes (0, négatif, très grand nombre) ?",{"type":29,"tag":1589,"props":2576,"children":2577},{},[2578],{"type":34,"value":2579},"Que se passe-t-il si une opération concurrente modifie l'état entre deux étapes ?",{"type":29,"tag":30,"props":2581,"children":2582},{},[2583],{"type":29,"tag":45,"props":2584,"children":2585},{},[2586],{"type":34,"value":2587},"Point 3 : Les conditions métier sont correctement combinées",{"type":29,"tag":30,"props":2589,"children":2590},{},[2591],{"type":34,"value":2592},"Claude a tendance à simplifier les conditions logiques complexes. Une règle business comme \"eligible si (A ET B) OU (C ET PAS D)\" peut être simplifiée en \"eligible si A ET B OU C\", ce qui produit des résultats incorrects pour les cas qui impliquent D. C'est exactement le type d'erreur que j'ai rencontré sur le calcul de disponibilité des slots.",{"type":29,"tag":30,"props":2594,"children":2595},{},[2596],{"type":29,"tag":45,"props":2597,"children":2598},{},[2599],{"type":34,"value":2600},"Point 4 : Le comportement en cas d'erreur est métier-correct",{"type":29,"tag":30,"props":2602,"children":2603},{},[2604],{"type":34,"value":2605},"Le code généré peut gérer les erreurs techniques correctement (try\u002Fcatch, retours d'erreur) tout en gérant incorrectement les erreurs métier. Vérifiez : quelle est la réponse attendue quand une règle métier est violée ? Est-ce une exception ? Un résultat partiel ? Un état spécifique ?",{"type":29,"tag":567,"props":2607,"children":2609},{"cta":569,"href":570,"title":2608,"type":572},"Vous voulez développer le réflexe qui attrape les bugs de logique métier dans le code IA ?",[2610],{"type":29,"tag":30,"props":2611,"children":2612},{},[2613],{"type":34,"value":2614},"Repérer une règle métier silencieusement simplifiée par Claude, ça ne s'apprend pas en lisant une checklist : ça se travaille. En mentoring 1:1, je relis votre code IA-assisté avec vous, on confronte chaque branche aux invariants de votre domaine, et vous commencez à voir ce que le modèle ne voit pas avant que ça parte en prod.",{"type":29,"tag":51,"props":2616,"children":2617},{},[],{"type":29,"tag":55,"props":2619,"children":2621},{"id":2620},"checklist-partie-2-sécurité-et-gestion-des-erreurs-points-5-8",[2622],{"type":34,"value":2623},"Checklist partie 2 : Sécurité et gestion des erreurs (points 5-8)",{"type":29,"tag":30,"props":2625,"children":2626},{},[2627],{"type":29,"tag":45,"props":2628,"children":2629},{},[2630],{"type":34,"value":2631},"Point 5 : Les inputs utilisateurs sont validés et sanitisés",{"type":29,"tag":30,"props":2633,"children":2634},{},[2635],{"type":34,"value":2636},"Vérifiez systématiquement que tout input provenant de l'extérieur (utilisateur, API, message queue) est validé avant d'être utilisé. Claude oublie fréquemment la validation des types, des ranges, et des formats. Sur crmcoaching j'utilise Zod 4 pour parser et valider les DTOs à l'entrée de chaque controller NestJS : vérifier que Claude a bien branché le schéma Zod et qu'il ne fait pas confiance au type TypeScript seul.",{"type":29,"tag":30,"props":2638,"children":2639},{},[2640],{"type":29,"tag":45,"props":2641,"children":2642},{},[2643],{"type":34,"value":2644},"Point 6 : Aucune injection n'est possible",{"type":29,"tag":30,"props":2646,"children":2647},{},[2648],{"type":34,"value":2649},"Pour tout code qui génère des requêtes SQL brutes, des commandes shell, ou des requêtes LDAP : vérifiez que les valeurs dynamiques sont passées par des paramètres, jamais interpolées directement dans des strings.",{"type":29,"tag":30,"props":2651,"children":2652},{},[2653,2655,2661],{"type":34,"value":2654},"Avec Prisma, le client paramétrise automatiquement les requêtes. Le danger apparaît quand Claude utilise ",{"type":29,"tag":113,"props":2656,"children":2658},{"className":2657},[],[2659],{"type":34,"value":2660},"$queryRawUnsafe",{"type":34,"value":2662}," pour une requête qu'il ne sait pas exprimer avec le query builder :",{"type":29,"tag":106,"props":2664,"children":2666},{"code":2665,"language":110,"meta":8,"className":108,"style":8},"\u002F\u002F ❌ Injection possible : Claude a utilisé $queryRawUnsafe avec interpolation directe\nconst userId = req.params.id; \u002F\u002F non validé\nconst result = await prisma.$queryRawUnsafe(\n  `SELECT * FROM \"User\" WHERE id = '${userId}'`\n);\n\n\u002F\u002F ✅ Prisma paramétré : passer la valeur comme argument séparé\nconst result = await prisma.$queryRaw\u003CUser[]>`\n  SELECT * FROM \"User\" WHERE id = ${userId}\n`;\n\n\u002F\u002F ✅ Encore mieux : utiliser le query builder Prisma\nconst user = await prisma.user.findUnique({\n  where: { id: userId },\n});\n",[2667],{"type":29,"tag":113,"props":2668,"children":2669},{"__ignoreMap":8},[2670,2678,2728,2767,2796,2808,2815,2823,2883,2904,2915,2922,2930,2980,3016],{"type":29,"tag":117,"props":2671,"children":2672},{"class":119,"line":120},[2673],{"type":29,"tag":117,"props":2674,"children":2675},{"style":124},[2676],{"type":34,"value":2677},"\u002F\u002F ❌ Injection possible : Claude a utilisé $queryRawUnsafe avec interpolation directe\n",{"type":29,"tag":117,"props":2679,"children":2680},{"class":119,"line":130},[2681,2686,2691,2695,2700,2704,2709,2713,2718,2723],{"type":29,"tag":117,"props":2682,"children":2683},{"style":143},[2684],{"type":34,"value":2685},"const",{"type":29,"tag":117,"props":2687,"children":2688},{"style":154},[2689],{"type":34,"value":2690}," userId",{"type":29,"tag":117,"props":2692,"children":2693},{"style":160},[2694],{"type":34,"value":163},{"type":29,"tag":117,"props":2696,"children":2697},{"style":378},[2698],{"type":34,"value":2699}," req",{"type":29,"tag":117,"props":2701,"children":2702},{"style":366},[2703],{"type":34,"value":369},{"type":29,"tag":117,"props":2705,"children":2706},{"style":378},[2707],{"type":34,"value":2708},"params",{"type":29,"tag":117,"props":2710,"children":2711},{"style":366},[2712],{"type":34,"value":369},{"type":29,"tag":117,"props":2714,"children":2715},{"style":378},[2716],{"type":34,"value":2717},"id",{"type":29,"tag":117,"props":2719,"children":2720},{"style":384},[2721],{"type":34,"value":2722},";",{"type":29,"tag":117,"props":2724,"children":2725},{"style":124},[2726],{"type":34,"value":2727}," \u002F\u002F non validé\n",{"type":29,"tag":117,"props":2729,"children":2730},{"class":119,"line":139},[2731,2735,2740,2744,2749,2754,2758,2762],{"type":29,"tag":117,"props":2732,"children":2733},{"style":143},[2734],{"type":34,"value":2685},{"type":29,"tag":117,"props":2736,"children":2737},{"style":154},[2738],{"type":34,"value":2739}," result",{"type":29,"tag":117,"props":2741,"children":2742},{"style":160},[2743],{"type":34,"value":163},{"type":29,"tag":117,"props":2745,"children":2746},{"style":143},[2747],{"type":34,"value":2748}," await",{"type":29,"tag":117,"props":2750,"children":2751},{"style":378},[2752],{"type":34,"value":2753}," prisma",{"type":29,"tag":117,"props":2755,"children":2756},{"style":366},[2757],{"type":34,"value":369},{"type":29,"tag":117,"props":2759,"children":2760},{"style":372},[2761],{"type":34,"value":2660},{"type":29,"tag":117,"props":2763,"children":2764},{"style":378},[2765],{"type":34,"value":2766},"(\n",{"type":29,"tag":117,"props":2768,"children":2769},{"class":119,"line":172},[2770,2775,2781,2786,2791],{"type":29,"tag":117,"props":2771,"children":2772},{"style":166},[2773],{"type":34,"value":2774},"  `SELECT * FROM \"User\" WHERE id = '",{"type":29,"tag":117,"props":2776,"children":2778},{"style":2777},"--shiki-default:#949CBB;--shiki-dark:#9ECBFF",[2779],{"type":34,"value":2780},"${",{"type":29,"tag":117,"props":2782,"children":2783},{"style":378},[2784],{"type":34,"value":2785},"userId",{"type":29,"tag":117,"props":2787,"children":2788},{"style":2777},[2789],{"type":34,"value":2790},"}",{"type":29,"tag":117,"props":2792,"children":2793},{"style":166},[2794],{"type":34,"value":2795},"'`\n",{"type":29,"tag":117,"props":2797,"children":2798},{"class":119,"line":181},[2799,2804],{"type":29,"tag":117,"props":2800,"children":2801},{"style":378},[2802],{"type":34,"value":2803},")",{"type":29,"tag":117,"props":2805,"children":2806},{"style":384},[2807],{"type":34,"value":387},{"type":29,"tag":117,"props":2809,"children":2810},{"class":119,"line":189},[2811],{"type":29,"tag":117,"props":2812,"children":2813},{"emptyLinePlaceholder":13},[2814],{"type":34,"value":136},{"type":29,"tag":117,"props":2816,"children":2817},{"class":119,"line":198},[2818],{"type":29,"tag":117,"props":2819,"children":2820},{"style":124},[2821],{"type":34,"value":2822},"\u002F\u002F ✅ Prisma paramétré : passer la valeur comme argument séparé\n",{"type":29,"tag":117,"props":2824,"children":2825},{"class":119,"line":207},[2826,2830,2834,2838,2842,2846,2850,2855,2861,2867,2873,2878],{"type":29,"tag":117,"props":2827,"children":2828},{"style":143},[2829],{"type":34,"value":2685},{"type":29,"tag":117,"props":2831,"children":2832},{"style":154},[2833],{"type":34,"value":2739},{"type":29,"tag":117,"props":2835,"children":2836},{"style":160},[2837],{"type":34,"value":163},{"type":29,"tag":117,"props":2839,"children":2840},{"style":143},[2841],{"type":34,"value":2748},{"type":29,"tag":117,"props":2843,"children":2844},{"style":378},[2845],{"type":34,"value":2753},{"type":29,"tag":117,"props":2847,"children":2848},{"style":366},[2849],{"type":34,"value":369},{"type":29,"tag":117,"props":2851,"children":2852},{"style":372},[2853],{"type":34,"value":2854},"$queryRaw",{"type":29,"tag":117,"props":2856,"children":2858},{"style":2857},"--shiki-default:#99D1DB;--shiki-dark:#E1E4E8",[2859],{"type":34,"value":2860},"\u003C",{"type":29,"tag":117,"props":2862,"children":2864},{"style":2863},"--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit",[2865],{"type":34,"value":2866},"User",{"type":29,"tag":117,"props":2868,"children":2870},{"style":2869},"--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit",[2871],{"type":34,"value":2872},"[]",{"type":29,"tag":117,"props":2874,"children":2875},{"style":2857},[2876],{"type":34,"value":2877},">",{"type":29,"tag":117,"props":2879,"children":2880},{"style":166},[2881],{"type":34,"value":2882},"`\n",{"type":29,"tag":117,"props":2884,"children":2885},{"class":119,"line":215},[2886,2891,2895,2899],{"type":29,"tag":117,"props":2887,"children":2888},{"style":166},[2889],{"type":34,"value":2890},"  SELECT * FROM \"User\" WHERE id = ",{"type":29,"tag":117,"props":2892,"children":2893},{"style":2777},[2894],{"type":34,"value":2780},{"type":29,"tag":117,"props":2896,"children":2897},{"style":378},[2898],{"type":34,"value":2785},{"type":29,"tag":117,"props":2900,"children":2901},{"style":2777},[2902],{"type":34,"value":2903},"}\n",{"type":29,"tag":117,"props":2905,"children":2906},{"class":119,"line":224},[2907,2911],{"type":29,"tag":117,"props":2908,"children":2909},{"style":166},[2910],{"type":34,"value":363},{"type":29,"tag":117,"props":2912,"children":2913},{"style":384},[2914],{"type":34,"value":387},{"type":29,"tag":117,"props":2916,"children":2917},{"class":119,"line":233},[2918],{"type":29,"tag":117,"props":2919,"children":2920},{"emptyLinePlaceholder":13},[2921],{"type":34,"value":136},{"type":29,"tag":117,"props":2923,"children":2924},{"class":119,"line":242},[2925],{"type":29,"tag":117,"props":2926,"children":2927},{"style":124},[2928],{"type":34,"value":2929},"\u002F\u002F ✅ Encore mieux : utiliser le query builder Prisma\n",{"type":29,"tag":117,"props":2931,"children":2932},{"class":119,"line":251},[2933,2937,2941,2945,2949,2953,2957,2962,2966,2971,2975],{"type":29,"tag":117,"props":2934,"children":2935},{"style":143},[2936],{"type":34,"value":2685},{"type":29,"tag":117,"props":2938,"children":2939},{"style":154},[2940],{"type":34,"value":1123},{"type":29,"tag":117,"props":2942,"children":2943},{"style":160},[2944],{"type":34,"value":163},{"type":29,"tag":117,"props":2946,"children":2947},{"style":143},[2948],{"type":34,"value":2748},{"type":29,"tag":117,"props":2950,"children":2951},{"style":378},[2952],{"type":34,"value":2753},{"type":29,"tag":117,"props":2954,"children":2955},{"style":366},[2956],{"type":34,"value":369},{"type":29,"tag":117,"props":2958,"children":2959},{"style":378},[2960],{"type":34,"value":2961},"user",{"type":29,"tag":117,"props":2963,"children":2964},{"style":366},[2965],{"type":34,"value":369},{"type":29,"tag":117,"props":2967,"children":2968},{"style":372},[2969],{"type":34,"value":2970},"findUnique",{"type":29,"tag":117,"props":2972,"children":2973},{"style":378},[2974],{"type":34,"value":1108},{"type":29,"tag":117,"props":2976,"children":2977},{"style":384},[2978],{"type":34,"value":2979},"{\n",{"type":29,"tag":117,"props":2981,"children":2982},{"class":119,"line":260},[2983,2988,2992,2997,3002,3006,3011],{"type":29,"tag":117,"props":2984,"children":2985},{"style":378},[2986],{"type":34,"value":2987},"  where",{"type":29,"tag":117,"props":2989,"children":2990},{"style":366},[2991],{"type":34,"value":1276},{"type":29,"tag":117,"props":2993,"children":2994},{"style":384},[2995],{"type":34,"value":2996}," {",{"type":29,"tag":117,"props":2998,"children":2999},{"style":378},[3000],{"type":34,"value":3001}," id",{"type":29,"tag":117,"props":3003,"children":3004},{"style":366},[3005],{"type":34,"value":1276},{"type":29,"tag":117,"props":3007,"children":3008},{"style":378},[3009],{"type":34,"value":3010}," userId ",{"type":29,"tag":117,"props":3012,"children":3013},{"style":384},[3014],{"type":34,"value":3015},"},\n",{"type":29,"tag":117,"props":3017,"children":3018},{"class":119,"line":269},[3019,3023,3027],{"type":29,"tag":117,"props":3020,"children":3021},{"style":384},[3022],{"type":34,"value":2790},{"type":29,"tag":117,"props":3024,"children":3025},{"style":378},[3026],{"type":34,"value":2803},{"type":29,"tag":117,"props":3028,"children":3029},{"style":384},[3030],{"type":34,"value":387},{"type":29,"tag":30,"props":3032,"children":3033},{},[3034],{"type":29,"tag":45,"props":3035,"children":3036},{},[3037],{"type":34,"value":3038},"Point 7 : Les secrets ne sont pas hardcodés",{"type":29,"tag":30,"props":3040,"children":3041},{},[3042],{"type":34,"value":3043},"Recherchez dans le code généré : passwords, API keys, tokens, connection strings. Claude les hardcode fréquemment dans les exemples de code et les configurations, car c'est le pattern dominant dans le code d'exemple sur lequel il a été entraîné.",{"type":29,"tag":30,"props":3045,"children":3046},{},[3047],{"type":29,"tag":45,"props":3048,"children":3049},{},[3050],{"type":34,"value":3051},"Point 8 : La gestion des exceptions est appropriée",{"type":29,"tag":30,"props":3053,"children":3054},{},[3055],{"type":34,"value":3056},"Vérifiez que :",{"type":29,"tag":1585,"props":3058,"children":3059},{},[3060,3073,3078],{"type":29,"tag":1589,"props":3061,"children":3062},{},[3063,3065,3071],{"type":34,"value":3064},"Les exceptions sont capturées au bon niveau (pas de ",{"type":29,"tag":113,"props":3066,"children":3068},{"className":3067},[],[3069],{"type":34,"value":3070},"catch(e) {}",{"type":34,"value":3072}," vide qui avale les erreurs)",{"type":29,"tag":1589,"props":3074,"children":3075},{},[3076],{"type":34,"value":3077},"Les exceptions techniques ne leakent pas de détails d'implémentation dans les réponses API",{"type":29,"tag":1589,"props":3079,"children":3080},{},[3081],{"type":34,"value":3082},"Les ressources (connexions, fichiers, transactions Prisma) sont correctement fermées en cas d'exception",{"type":29,"tag":51,"props":3084,"children":3085},{},[],{"type":29,"tag":55,"props":3087,"children":3089},{"id":3088},"checklist-partie-3-performance-lisibilité-tests-points-9-12",[3090],{"type":34,"value":3091},"Checklist partie 3 : Performance, lisibilité, tests (points 9-12)",{"type":29,"tag":30,"props":3093,"children":3094},{},[3095],{"type":29,"tag":45,"props":3096,"children":3097},{},[3098],{"type":34,"value":3099},"Point 9 : Pas de N+1 query",{"type":29,"tag":30,"props":3101,"children":3102},{},[3103],{"type":34,"value":3104},"Le problème N+1 est l'un des patterns de performance les plus fréquemment générés par Claude : une query Prisma dans une boucle. Je l'ai rencontré plusieurs fois sur crmcoaching lors de la génération de listings agrégés.",{"type":29,"tag":106,"props":3106,"children":3108},{"code":3107,"language":110,"meta":8,"className":108,"style":8},"\u002F\u002F ❌ Pattern N+1 généré par Claude : 1 findUnique par client dans la boucle\nconst clients = await prisma.client.findMany();\nfor (const client of clients) {\n  \u002F\u002F 1 requête supplémentaire par client\n  const offres = await prisma.offre.findMany({\n    where: { clientId: client.id },\n  });\n  console.log(client.nom, offres.length);\n}\n\n\u002F\u002F ✅ Eager loading avec include : 1 seule requête JOIN\nconst clients = await prisma.client.findMany({\n  include: {\n    offres: true,\n  },\n});\nfor (const client of clients) {\n  console.log(client.nom, client.offres.length);\n}\n",[3109],{"type":29,"tag":113,"props":3110,"children":3111},{"__ignoreMap":8},[3112,3120,3169,3205,3213,3262,3304,3320,3376,3383,3390,3398,3445,3462,3485,3493,3508,3539,3599],{"type":29,"tag":117,"props":3113,"children":3114},{"class":119,"line":120},[3115],{"type":29,"tag":117,"props":3116,"children":3117},{"style":124},[3118],{"type":34,"value":3119},"\u002F\u002F ❌ Pattern N+1 généré par Claude : 1 findUnique par client dans la boucle\n",{"type":29,"tag":117,"props":3121,"children":3122},{"class":119,"line":130},[3123,3127,3132,3136,3140,3144,3148,3152,3156,3161,3165],{"type":29,"tag":117,"props":3124,"children":3125},{"style":143},[3126],{"type":34,"value":2685},{"type":29,"tag":117,"props":3128,"children":3129},{"style":154},[3130],{"type":34,"value":3131}," clients",{"type":29,"tag":117,"props":3133,"children":3134},{"style":160},[3135],{"type":34,"value":163},{"type":29,"tag":117,"props":3137,"children":3138},{"style":143},[3139],{"type":34,"value":2748},{"type":29,"tag":117,"props":3141,"children":3142},{"style":378},[3143],{"type":34,"value":2753},{"type":29,"tag":117,"props":3145,"children":3146},{"style":366},[3147],{"type":34,"value":369},{"type":29,"tag":117,"props":3149,"children":3150},{"style":378},[3151],{"type":34,"value":2474},{"type":29,"tag":117,"props":3153,"children":3154},{"style":366},[3155],{"type":34,"value":369},{"type":29,"tag":117,"props":3157,"children":3158},{"style":372},[3159],{"type":34,"value":3160},"findMany",{"type":29,"tag":117,"props":3162,"children":3163},{"style":378},[3164],{"type":34,"value":381},{"type":29,"tag":117,"props":3166,"children":3167},{"style":384},[3168],{"type":34,"value":387},{"type":29,"tag":117,"props":3170,"children":3171},{"class":119,"line":139},[3172,3177,3182,3186,3191,3196,3201],{"type":29,"tag":117,"props":3173,"children":3174},{"style":143},[3175],{"type":34,"value":3176},"for",{"type":29,"tag":117,"props":3178,"children":3179},{"style":378},[3180],{"type":34,"value":3181}," (",{"type":29,"tag":117,"props":3183,"children":3184},{"style":143},[3185],{"type":34,"value":2685},{"type":29,"tag":117,"props":3187,"children":3188},{"style":154},[3189],{"type":34,"value":3190}," client",{"type":29,"tag":117,"props":3192,"children":3193},{"style":143},[3194],{"type":34,"value":3195}," of",{"type":29,"tag":117,"props":3197,"children":3198},{"style":378},[3199],{"type":34,"value":3200}," clients) ",{"type":29,"tag":117,"props":3202,"children":3203},{"style":384},[3204],{"type":34,"value":2979},{"type":29,"tag":117,"props":3206,"children":3207},{"class":119,"line":172},[3208],{"type":29,"tag":117,"props":3209,"children":3210},{"style":124},[3211],{"type":34,"value":3212},"  \u002F\u002F 1 requête supplémentaire par client\n",{"type":29,"tag":117,"props":3214,"children":3215},{"class":119,"line":181},[3216,3221,3226,3230,3234,3238,3242,3246,3250,3254,3258],{"type":29,"tag":117,"props":3217,"children":3218},{"style":143},[3219],{"type":34,"value":3220},"  const",{"type":29,"tag":117,"props":3222,"children":3223},{"style":154},[3224],{"type":34,"value":3225}," offres",{"type":29,"tag":117,"props":3227,"children":3228},{"style":160},[3229],{"type":34,"value":163},{"type":29,"tag":117,"props":3231,"children":3232},{"style":143},[3233],{"type":34,"value":2748},{"type":29,"tag":117,"props":3235,"children":3236},{"style":378},[3237],{"type":34,"value":2753},{"type":29,"tag":117,"props":3239,"children":3240},{"style":366},[3241],{"type":34,"value":369},{"type":29,"tag":117,"props":3243,"children":3244},{"style":378},[3245],{"type":34,"value":2481},{"type":29,"tag":117,"props":3247,"children":3248},{"style":366},[3249],{"type":34,"value":369},{"type":29,"tag":117,"props":3251,"children":3252},{"style":372},[3253],{"type":34,"value":3160},{"type":29,"tag":117,"props":3255,"children":3256},{"style":378},[3257],{"type":34,"value":1108},{"type":29,"tag":117,"props":3259,"children":3260},{"style":384},[3261],{"type":34,"value":2979},{"type":29,"tag":117,"props":3263,"children":3264},{"class":119,"line":189},[3265,3270,3274,3278,3283,3287,3291,3295,3300],{"type":29,"tag":117,"props":3266,"children":3267},{"style":378},[3268],{"type":34,"value":3269},"    where",{"type":29,"tag":117,"props":3271,"children":3272},{"style":366},[3273],{"type":34,"value":1276},{"type":29,"tag":117,"props":3275,"children":3276},{"style":384},[3277],{"type":34,"value":2996},{"type":29,"tag":117,"props":3279,"children":3280},{"style":378},[3281],{"type":34,"value":3282}," clientId",{"type":29,"tag":117,"props":3284,"children":3285},{"style":366},[3286],{"type":34,"value":1276},{"type":29,"tag":117,"props":3288,"children":3289},{"style":378},[3290],{"type":34,"value":3190},{"type":29,"tag":117,"props":3292,"children":3293},{"style":366},[3294],{"type":34,"value":369},{"type":29,"tag":117,"props":3296,"children":3297},{"style":378},[3298],{"type":34,"value":3299},"id ",{"type":29,"tag":117,"props":3301,"children":3302},{"style":384},[3303],{"type":34,"value":3015},{"type":29,"tag":117,"props":3305,"children":3306},{"class":119,"line":198},[3307,3312,3316],{"type":29,"tag":117,"props":3308,"children":3309},{"style":384},[3310],{"type":34,"value":3311},"  }",{"type":29,"tag":117,"props":3313,"children":3314},{"style":378},[3315],{"type":34,"value":2803},{"type":29,"tag":117,"props":3317,"children":3318},{"style":384},[3319],{"type":34,"value":387},{"type":29,"tag":117,"props":3321,"children":3322},{"class":119,"line":207},[3323,3328,3332,3337,3342,3346,3351,3355,3359,3363,3368,3372],{"type":29,"tag":117,"props":3324,"children":3325},{"style":378},[3326],{"type":34,"value":3327},"  console",{"type":29,"tag":117,"props":3329,"children":3330},{"style":366},[3331],{"type":34,"value":369},{"type":29,"tag":117,"props":3333,"children":3334},{"style":372},[3335],{"type":34,"value":3336},"log",{"type":29,"tag":117,"props":3338,"children":3339},{"style":378},[3340],{"type":34,"value":3341},"(client",{"type":29,"tag":117,"props":3343,"children":3344},{"style":366},[3345],{"type":34,"value":369},{"type":29,"tag":117,"props":3347,"children":3348},{"style":378},[3349],{"type":34,"value":3350},"nom",{"type":29,"tag":117,"props":3352,"children":3353},{"style":384},[3354],{"type":34,"value":1118},{"type":29,"tag":117,"props":3356,"children":3357},{"style":378},[3358],{"type":34,"value":3225},{"type":29,"tag":117,"props":3360,"children":3361},{"style":366},[3362],{"type":34,"value":369},{"type":29,"tag":117,"props":3364,"children":3365},{"style":154},[3366],{"type":34,"value":3367},"length",{"type":29,"tag":117,"props":3369,"children":3370},{"style":378},[3371],{"type":34,"value":2803},{"type":29,"tag":117,"props":3373,"children":3374},{"style":384},[3375],{"type":34,"value":387},{"type":29,"tag":117,"props":3377,"children":3378},{"class":119,"line":215},[3379],{"type":29,"tag":117,"props":3380,"children":3381},{"style":384},[3382],{"type":34,"value":2903},{"type":29,"tag":117,"props":3384,"children":3385},{"class":119,"line":224},[3386],{"type":29,"tag":117,"props":3387,"children":3388},{"emptyLinePlaceholder":13},[3389],{"type":34,"value":136},{"type":29,"tag":117,"props":3391,"children":3392},{"class":119,"line":233},[3393],{"type":29,"tag":117,"props":3394,"children":3395},{"style":124},[3396],{"type":34,"value":3397},"\u002F\u002F ✅ Eager loading avec include : 1 seule requête JOIN\n",{"type":29,"tag":117,"props":3399,"children":3400},{"class":119,"line":242},[3401,3405,3409,3413,3417,3421,3425,3429,3433,3437,3441],{"type":29,"tag":117,"props":3402,"children":3403},{"style":143},[3404],{"type":34,"value":2685},{"type":29,"tag":117,"props":3406,"children":3407},{"style":154},[3408],{"type":34,"value":3131},{"type":29,"tag":117,"props":3410,"children":3411},{"style":160},[3412],{"type":34,"value":163},{"type":29,"tag":117,"props":3414,"children":3415},{"style":143},[3416],{"type":34,"value":2748},{"type":29,"tag":117,"props":3418,"children":3419},{"style":378},[3420],{"type":34,"value":2753},{"type":29,"tag":117,"props":3422,"children":3423},{"style":366},[3424],{"type":34,"value":369},{"type":29,"tag":117,"props":3426,"children":3427},{"style":378},[3428],{"type":34,"value":2474},{"type":29,"tag":117,"props":3430,"children":3431},{"style":366},[3432],{"type":34,"value":369},{"type":29,"tag":117,"props":3434,"children":3435},{"style":372},[3436],{"type":34,"value":3160},{"type":29,"tag":117,"props":3438,"children":3439},{"style":378},[3440],{"type":34,"value":1108},{"type":29,"tag":117,"props":3442,"children":3443},{"style":384},[3444],{"type":34,"value":2979},{"type":29,"tag":117,"props":3446,"children":3447},{"class":119,"line":251},[3448,3453,3457],{"type":29,"tag":117,"props":3449,"children":3450},{"style":378},[3451],{"type":34,"value":3452},"  include",{"type":29,"tag":117,"props":3454,"children":3455},{"style":366},[3456],{"type":34,"value":1276},{"type":29,"tag":117,"props":3458,"children":3459},{"style":384},[3460],{"type":34,"value":3461}," {\n",{"type":29,"tag":117,"props":3463,"children":3464},{"class":119,"line":260},[3465,3470,3474,3480],{"type":29,"tag":117,"props":3466,"children":3467},{"style":378},[3468],{"type":34,"value":3469},"    offres",{"type":29,"tag":117,"props":3471,"children":3472},{"style":366},[3473],{"type":34,"value":1276},{"type":29,"tag":117,"props":3475,"children":3477},{"style":3476},"--shiki-default:#EF9F76;--shiki-dark:#79B8FF",[3478],{"type":34,"value":3479}," true",{"type":29,"tag":117,"props":3481,"children":3482},{"style":384},[3483],{"type":34,"value":3484},",\n",{"type":29,"tag":117,"props":3486,"children":3487},{"class":119,"line":269},[3488],{"type":29,"tag":117,"props":3489,"children":3490},{"style":384},[3491],{"type":34,"value":3492},"  },\n",{"type":29,"tag":117,"props":3494,"children":3495},{"class":119,"line":278},[3496,3500,3504],{"type":29,"tag":117,"props":3497,"children":3498},{"style":384},[3499],{"type":34,"value":2790},{"type":29,"tag":117,"props":3501,"children":3502},{"style":378},[3503],{"type":34,"value":2803},{"type":29,"tag":117,"props":3505,"children":3506},{"style":384},[3507],{"type":34,"value":387},{"type":29,"tag":117,"props":3509,"children":3510},{"class":119,"line":286},[3511,3515,3519,3523,3527,3531,3535],{"type":29,"tag":117,"props":3512,"children":3513},{"style":143},[3514],{"type":34,"value":3176},{"type":29,"tag":117,"props":3516,"children":3517},{"style":378},[3518],{"type":34,"value":3181},{"type":29,"tag":117,"props":3520,"children":3521},{"style":143},[3522],{"type":34,"value":2685},{"type":29,"tag":117,"props":3524,"children":3525},{"style":154},[3526],{"type":34,"value":3190},{"type":29,"tag":117,"props":3528,"children":3529},{"style":143},[3530],{"type":34,"value":3195},{"type":29,"tag":117,"props":3532,"children":3533},{"style":378},[3534],{"type":34,"value":3200},{"type":29,"tag":117,"props":3536,"children":3537},{"style":384},[3538],{"type":34,"value":2979},{"type":29,"tag":117,"props":3540,"children":3541},{"class":119,"line":295},[3542,3546,3550,3554,3558,3562,3566,3570,3574,3578,3583,3587,3591,3595],{"type":29,"tag":117,"props":3543,"children":3544},{"style":378},[3545],{"type":34,"value":3327},{"type":29,"tag":117,"props":3547,"children":3548},{"style":366},[3549],{"type":34,"value":369},{"type":29,"tag":117,"props":3551,"children":3552},{"style":372},[3553],{"type":34,"value":3336},{"type":29,"tag":117,"props":3555,"children":3556},{"style":378},[3557],{"type":34,"value":3341},{"type":29,"tag":117,"props":3559,"children":3560},{"style":366},[3561],{"type":34,"value":369},{"type":29,"tag":117,"props":3563,"children":3564},{"style":378},[3565],{"type":34,"value":3350},{"type":29,"tag":117,"props":3567,"children":3568},{"style":384},[3569],{"type":34,"value":1118},{"type":29,"tag":117,"props":3571,"children":3572},{"style":378},[3573],{"type":34,"value":3190},{"type":29,"tag":117,"props":3575,"children":3576},{"style":366},[3577],{"type":34,"value":369},{"type":29,"tag":117,"props":3579,"children":3580},{"style":378},[3581],{"type":34,"value":3582},"offres",{"type":29,"tag":117,"props":3584,"children":3585},{"style":366},[3586],{"type":34,"value":369},{"type":29,"tag":117,"props":3588,"children":3589},{"style":154},[3590],{"type":34,"value":3367},{"type":29,"tag":117,"props":3592,"children":3593},{"style":378},[3594],{"type":34,"value":2803},{"type":29,"tag":117,"props":3596,"children":3597},{"style":384},[3598],{"type":34,"value":387},{"type":29,"tag":117,"props":3600,"children":3601},{"class":119,"line":304},[3602],{"type":29,"tag":117,"props":3603,"children":3604},{"style":384},[3605],{"type":34,"value":2903},{"type":29,"tag":30,"props":3607,"children":3608},{},[3609],{"type":29,"tag":45,"props":3610,"children":3611},{},[3612],{"type":34,"value":3613},"Point 10 : La complexité est acceptable",{"type":29,"tag":30,"props":3615,"children":3616},{},[3617,3619,3625],{"type":34,"value":3618},"Calculez mentalement (ou avec Biome via ",{"type":29,"tag":113,"props":3620,"children":3622},{"className":3621},[],[3623],{"type":34,"value":3624},"noExcessiveCognitiveComplexity",{"type":34,"value":3626},") la complexité du code généré. Claude peut générer des fonctions avec des imbrications de conditions très profondes difficiles à maintenir. Seuil d'alerte : complexité cyclomatique supérieure à 10, ou fonction de plus de 50 lignes sans extraction de helper.",{"type":29,"tag":30,"props":3628,"children":3629},{},[3630],{"type":29,"tag":45,"props":3631,"children":3632},{},[3633],{"type":34,"value":3634},"Point 11 : Le code est testé avec des tests indépendants",{"type":29,"tag":30,"props":3636,"children":3637},{},[3638],{"type":34,"value":3639},"Ne pas se contenter des tests Vitest générés par Claude pour valider le code de Claude. Écrire des tests indépendants, particulièrement pour les branches d'erreur et les cas limites identifiés au point 2.",{"type":29,"tag":106,"props":3641,"children":3643},{"code":3642},"Règle : au moins 1 test par branche métier critique\nRègle : au moins 1 test pour chaque cas d'erreur explicitement géré\n",[3644],{"type":29,"tag":113,"props":3645,"children":3646},{"__ignoreMap":8},[3647],{"type":34,"value":3642},{"type":29,"tag":30,"props":3649,"children":3650},{},[3651],{"type":29,"tag":45,"props":3652,"children":3653},{},[3654],{"type":34,"value":3655},"Point 12 : Le code est compréhensible par un humain sans explication",{"type":29,"tag":30,"props":3657,"children":3658},{},[3659],{"type":34,"value":3660},"Si vous devez lire le code 3 fois pour comprendre ce qu'il fait, le code est trop complexe. Claude peut générer du code \"intelligent\" avec des patterns avancés ou des one-liners obscurs qui réduisent la lisibilité. La lisibilité prévaut sur le \"clever code\". Toujours.",{"type":29,"tag":51,"props":3662,"children":3663},{},[],{"type":29,"tag":55,"props":3665,"children":3667},{"id":3666},"comment-intégrer-la-checklist-dans-le-workflow",[3668],{"type":34,"value":3669},"Comment intégrer la checklist dans le workflow",{"type":29,"tag":30,"props":3671,"children":3672},{},[3673,3678,3680,3685],{"type":29,"tag":45,"props":3674,"children":3675},{},[3676],{"type":34,"value":3677},"Option A : Dans le template de PR :",{"type":34,"value":3679}," ajouter la checklist comme section \"AI-generated code review\" dans le template de PR. Combinez-la avec un ",{"type":29,"tag":453,"props":3681,"children":3682},{"href":841},[3683],{"type":34,"value":3684},"outil d'analyse statique",{"type":34,"value":3686}," pour automatiser les vérifications de sécurité. Le reviewer coche les 12 points pour tout code généré par IA.",{"type":29,"tag":30,"props":3688,"children":3689},{},[3690,3695],{"type":29,"tag":45,"props":3691,"children":3692},{},[3693],{"type":34,"value":3694},"Option B : Dans le template de Story :",{"type":34,"value":3696}," pour les stories développées majoritairement avec assistance IA, ajouter la checklist comme critère de DoD. Le développeur self-review avant de créer la PR.",{"type":29,"tag":30,"props":3698,"children":3699},{},[3700,3705],{"type":29,"tag":45,"props":3701,"children":3702},{},[3703],{"type":34,"value":3704},"Option C : En session de travail solo :",{"type":34,"value":3706}," utiliser les 12 points comme checklist personnelle avant chaque merge. Identifier les patterns de lacune récurrents pour affiner les prompts et le contexte fourni à Claude.",{"type":29,"tag":51,"props":3708,"children":3709},{},[],{"type":29,"tag":633,"props":3711,"children":3712},{},[3713,3734],{"type":29,"tag":637,"props":3714,"children":3715},{},[3716],{"type":29,"tag":641,"props":3717,"children":3718},{},[3719,3724,3729],{"type":29,"tag":645,"props":3720,"children":3721},{},[3722],{"type":34,"value":3723},"Partie",{"type":29,"tag":645,"props":3725,"children":3726},{},[3727],{"type":34,"value":3728},"Points",{"type":29,"tag":645,"props":3730,"children":3731},{},[3732],{"type":34,"value":3733},"Focus",{"type":29,"tag":656,"props":3735,"children":3736},{},[3737,3754,3772],{"type":29,"tag":641,"props":3738,"children":3739},{},[3740,3744,3749],{"type":29,"tag":663,"props":3741,"children":3742},{},[3743],{"type":34,"value":672},{"type":29,"tag":663,"props":3745,"children":3746},{},[3747],{"type":34,"value":3748},"1-4",{"type":29,"tag":663,"props":3750,"children":3751},{},[3752],{"type":34,"value":3753},"Règles, cas limites, conditions, erreurs métier",{"type":29,"tag":641,"props":3755,"children":3756},{},[3757,3762,3767],{"type":29,"tag":663,"props":3758,"children":3759},{},[3760],{"type":34,"value":3761},"Sécurité",{"type":29,"tag":663,"props":3763,"children":3764},{},[3765],{"type":34,"value":3766},"5-8",{"type":29,"tag":663,"props":3768,"children":3769},{},[3770],{"type":34,"value":3771},"Validation, injections, secrets, exceptions",{"type":29,"tag":641,"props":3773,"children":3774},{},[3775,3780,3785],{"type":29,"tag":663,"props":3776,"children":3777},{},[3778],{"type":34,"value":3779},"Qualité",{"type":29,"tag":663,"props":3781,"children":3782},{},[3783],{"type":34,"value":3784},"9-12",{"type":29,"tag":663,"props":3786,"children":3787},{},[3788],{"type":34,"value":3789},"Performance, complexité, tests, lisibilité",{"type":29,"tag":567,"props":3791,"children":3793},{"cta":805,"href":806,"title":3792,"type":808},"Ces 12 points de vérification ne sont qu'une pratique parmi 100",[3794],{"type":29,"tag":30,"props":3795,"children":3796},{},[3797],{"type":34,"value":3798},"Valider du code IA-généré point par point, c'est une seule des pratiques craft que j'applique au quotidien. Le Craft Bundle réunit les 100 pratiques que j'utilise pour coder propre : juger la logique métier, repérer les angles morts, garder un code lisible. Celles que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues tourner en prod.",{"type":29,"tag":51,"props":3800,"children":3801},{},[],{"type":29,"tag":55,"props":3803,"children":3805},{"id":3804},"faq-sur-le-test-du-code-ia-généré",[3806],{"type":34,"value":3807},"FAQ sur le test du code IA-généré",{"type":29,"tag":825,"props":3809,"children":3810},{},[3811,3816],{"type":29,"tag":829,"props":3812,"children":3813},{},[3814],{"type":34,"value":3815},"1. Faut-il appliquer la checklist complète à tout le code IA-assisté ?",{"type":29,"tag":30,"props":3817,"children":3818},{},[3819],{"type":34,"value":3820},"Non. Les points 6 (injection), 7 (secrets), et 11 (tests) s'appliquent à tout le code IA-assisté sans exception. Les autres points s'appliquent en fonction du contexte : les points 1-4 (logique métier) sont critiques pour le code qui implémente des règles business ; les points 9-10 (performance) sont importants pour le code dans les chemins chauds.",{"type":29,"tag":825,"props":3822,"children":3823},{},[3824,3829],{"type":29,"tag":829,"props":3825,"children":3826},{},[3827],{"type":34,"value":3828},"2. Comment former rapidement une équipe à utiliser cette checklist ?",{"type":29,"tag":30,"props":3830,"children":3831},{},[3832],{"type":34,"value":3833},"Session de 2 heures avec des exemples réels de code IA-généré dans votre domaine. Pour chaque exemple, demandez à l'équipe d'identifier les problèmes sans la checklist d'abord, puis avec. La différence entre les deux passages révèle les angles morts de l'équipe, et ce sont précisément ces angles morts qu'il faut adresser en formation.",{"type":29,"tag":825,"props":3835,"children":3836},{},[3837,3842],{"type":29,"tag":829,"props":3838,"children":3839},{},[3840],{"type":34,"value":3841},"3. La checklist remplace-t-elle la [code review](\u002Ffr\u002Fintelligence-artificielle\u002Fia-code-review-retour-experience) standard ?",{"type":29,"tag":30,"props":3843,"children":3844},{},[3845],{"type":34,"value":3846},"Non, elle la complète. La review standard couvre l'architecture, le style, la cohérence avec les patterns de l'équipe. La checklist IA ajoute les vérifications spécifiques aux patterns de vulnérabilités et d'erreurs typiques du code LLM-généré. Les deux sont nécessaires.",{"type":29,"tag":825,"props":3848,"children":3849},{},[3850,3855],{"type":29,"tag":829,"props":3851,"children":3852},{},[3853],{"type":34,"value":3854},"4. Les LLMs s'améliorent. Cette checklist sera-t-elle obsolète dans 6 mois ?",{"type":29,"tag":30,"props":3856,"children":3857},{},[3858],{"type":34,"value":3859},"Elle évoluera, mais ne deviendra pas obsolète. Claude s'améliore sur les patterns de vulnérabilités bien documentés (injections basiques, hardcoded secrets). Il continue à se tromper sur les règles métier spécifiques à votre domaine, car ces règles ne sont pas dans ses données d'entraînement. Les points 1-4 resteront pertinents tant que Claude n'aura pas accès à vos spécifications métier propriétaires.",{"type":29,"tag":825,"props":3861,"children":3862},{},[3863,3868],{"type":29,"tag":829,"props":3864,"children":3865},{},[3866],{"type":34,"value":3867},"5. Comment décider qu'un morceau de code est \"IA-assisté\" et mérite la checklist ?",{"type":29,"tag":30,"props":3869,"children":3870},{},[3871],{"type":34,"value":3872},"La règle pragmatique : si plus de 30% du code d'une fonction a été généré par Claude, appliquer la checklist complète. Pour les petits snippets (autocomplétion d'une ligne), les points 6 et 7 suffisent. En cas de doute, appliquer la checklist : le coût d'une review supplémentaire est toujours inférieur au coût d'un bug en production.",{"type":29,"tag":51,"props":3874,"children":3875},{},[],{"type":29,"tag":567,"props":3877,"children":3879},{"cta":3878,"href":918,"title":919,"type":920},"Télécharger la checklist gratuite →",[3880],{"type":29,"tag":30,"props":3881,"children":3882},{},[3883],{"type":34,"value":3884},"La checklist AI-Ready inclut la checklist de validation du code IA-assisté, les critères de gouvernance des outils IA, et le framework d'évaluation d'adoption. Complète et adaptable à votre contexte d'équipe.",{"type":29,"tag":928,"props":3886,"children":3887},{},[3888],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":3890},[3891,3892,3893,3894,3895,3896],{"id":2452,"depth":130,"text":2455},{"id":2507,"depth":130,"text":2510},{"id":2620,"depth":130,"text":2623},{"id":3088,"depth":130,"text":3091},{"id":3666,"depth":130,"text":3669},{"id":3804,"depth":130,"text":3807},"content:fr:intelligence-artificielle:tester-code-genere-ia-checklist.md","fr\u002Fintelligence-artificielle\u002Ftester-code-genere-ia-checklist.md","fr\u002Fintelligence-artificielle\u002Ftester-code-genere-ia-checklist",{"_path":1607,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":3901,"description":3902,"id":322,"date":3903,"listed":13,"nocomments":7,"hidden":7,"categories":3904,"tags":3905,"cover":3907,"readingTime":3908,"body":3912,"_type":942,"_id":4390,"_source":944,"_file":4391,"_stem":4392,"_extension":947},"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.","2026-02-20",[1765],[2406,3906,18],"refactoring","covers\u002Farticles\u002Ftests-integration-legacy.jpg",{"text":1775,"minutes":3909,"time":3910,"words":3911},7.95,477000,1590,{"type":26,"children":3913,"toc":4381},[3914,3919,3927,3938,3941,3947,3952,3978,3983,3986,3992,3997,4007,4024,4027,4033,4038,4047,4063,4076,4079,4088,4091,4097,4102,4110,4133,4149,4154,4157,4163,4168,4177,4197,4202,4205,4211,4282,4287,4296,4299,4305,4318,4331,4344,4357,4370,4373],{"type":29,"tag":30,"props":3915,"children":3916},{},[3917],{"type":34,"value":3918},"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":30,"props":3920,"children":3921},{},[3922],{"type":29,"tag":45,"props":3923,"children":3924},{},[3925],{"type":34,"value":3926},"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":30,"props":3928,"children":3929},{},[3930,3932,3936],{"type":34,"value":3931},"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":453,"props":3933,"children":3934},{"href":1573},[3935],{"type":34,"value":1576},{"type":34,"value":3937}," 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":51,"props":3939,"children":3940},{},[],{"type":29,"tag":55,"props":3942,"children":3944},{"id":3943},"pourquoi-les-tests-unitaires-seuls-ne-suffisent-pas",[3945],{"type":34,"value":3946},"Pourquoi les tests unitaires seuls ne suffisent pas",{"type":29,"tag":30,"props":3948,"children":3949},{},[3950],{"type":34,"value":3951},"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":30,"props":3953,"children":3954},{},[3955,3960,3962,3968,3970,3976],{"type":29,"tag":45,"props":3956,"children":3957},{},[3958],{"type":34,"value":3959},"Exemple concret",{"type":34,"value":3961}," : deux classes parfaitement testées en isolation, l'une qui sérialise une date en ",{"type":29,"tag":113,"props":3963,"children":3965},{"className":3964},[],[3966],{"type":34,"value":3967},"MM\u002FDD\u002FYYYY",{"type":34,"value":3969}," et l'autre qui la désérialise en attendant ",{"type":29,"tag":113,"props":3971,"children":3973},{"className":3972},[],[3974],{"type":34,"value":3975},"YYYY-MM-DD",{"type":34,"value":3977},". Les tests unitaires passent. Le système plante en prod.",{"type":29,"tag":30,"props":3979,"children":3980},{},[3981],{"type":34,"value":3982},"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":51,"props":3984,"children":3985},{},[],{"type":29,"tag":55,"props":3987,"children":3989},{"id":3988},"piège-1-tester-sans-comprendre-le-comportement-attendu",[3990],{"type":34,"value":3991},"Piège 1 : Tester sans comprendre le comportement attendu",{"type":29,"tag":30,"props":3993,"children":3994},{},[3995],{"type":34,"value":3996},"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":30,"props":3998,"children":3999},{},[4000,4005],{"type":29,"tag":45,"props":4001,"children":4002},{},[4003],{"type":34,"value":4004},"Ce qui arrive",{"type":34,"value":4006}," : 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":30,"props":4008,"children":4009},{},[4010,4015,4017,4022],{"type":29,"tag":45,"props":4011,"children":4012},{},[4013],{"type":34,"value":4014},"La sortie",{"type":34,"value":4016}," : 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":45,"props":4018,"children":4019},{},[4020],{"type":34,"value":4021},"comportements de référence",{"type":34,"value":4023}," : 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":51,"props":4025,"children":4026},{},[],{"type":29,"tag":55,"props":4028,"children":4030},{"id":4029},"piège-2-commencer-par-le-code-le-plus-complexe",[4031],{"type":34,"value":4032},"Piège 2 : Commencer par le code le plus complexe",{"type":29,"tag":30,"props":4034,"children":4035},{},[4036],{"type":34,"value":4037},"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":30,"props":4039,"children":4040},{},[4041,4045],{"type":29,"tag":45,"props":4042,"children":4043},{},[4044],{"type":34,"value":4004},{"type":34,"value":4046}," : 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":30,"props":4048,"children":4049},{},[4050,4054,4056,4061],{"type":29,"tag":45,"props":4051,"children":4052},{},[4053],{"type":34,"value":4014},{"type":34,"value":4055}," : commencer par les modules ",{"type":29,"tag":45,"props":4057,"children":4058},{},[4059],{"type":34,"value":4060},"en bordure",{"type":34,"value":4062}," 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":2164,"props":4064,"children":4065},{},[4066],{"type":29,"tag":30,"props":4067,"children":4068},{},[4069,4074],{"type":29,"tag":45,"props":4070,"children":4071},{},[4072],{"type":34,"value":4073},"Retour sur l'équipe télécoms",{"type":34,"value":4075}," : 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":51,"props":4077,"children":4078},{},[],{"type":29,"tag":567,"props":4080,"children":4082},{"cta":569,"href":570,"title":4081,"type":572},"Vous voulez savoir par où attaquer un legacy sans tests, et tenir la séquence jusqu'au bout ?",[4083],{"type":29,"tag":30,"props":4084,"children":4085},{},[4086],{"type":34,"value":4087},"Choisir le bon point d'entrée, écrire un characterization test qui tient, savoir quand pivoter quand un module résiste : ça ne s'apprend pas en lisant un article, ça se travaille sur votre vrai code. En mentoring 1:1, on prend vos modules legacy et on construit ensemble la séquence de tests qui vous redonne confiance. Vous repartez avec le réflexe, pas juste avec la théorie.",{"type":29,"tag":51,"props":4089,"children":4090},{},[],{"type":29,"tag":55,"props":4092,"children":4094},{"id":4093},"piège-3-créer-une-dépendance-à-la-base-de-données-de-production",[4095],{"type":34,"value":4096},"Piège 3 : Créer une dépendance à la base de données de production",{"type":29,"tag":30,"props":4098,"children":4099},{},[4100],{"type":34,"value":4101},"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":30,"props":4103,"children":4104},{},[4105,4109],{"type":29,"tag":45,"props":4106,"children":4107},{},[4108],{"type":34,"value":4004},{"type":34,"value":1866},{"type":29,"tag":1585,"props":4111,"children":4112},{},[4113,4118,4123,4128],{"type":29,"tag":1589,"props":4114,"children":4115},{},[4116],{"type":34,"value":4117},"Les tests sont non-déterministes : ils dépendent de l'état des données, qui change",{"type":29,"tag":1589,"props":4119,"children":4120},{},[4121],{"type":34,"value":4122},"Les tests ralentissent avec le volume de données",{"type":29,"tag":1589,"props":4124,"children":4125},{},[4126],{"type":34,"value":4127},"Des tests mal écrits peuvent modifier des données réelles",{"type":29,"tag":1589,"props":4129,"children":4130},{},[4131],{"type":34,"value":4132},"La base de prod ne peut pas être réinitialisée entre les tests",{"type":29,"tag":30,"props":4134,"children":4135},{},[4136,4140,4142,4147],{"type":29,"tag":45,"props":4137,"children":4138},{},[4139],{"type":34,"value":4014},{"type":34,"value":4141}," : 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":45,"props":4143,"children":4144},{},[4145],{"type":34,"value":4146},"test containers",{"type":34,"value":4148}," (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":30,"props":4150,"children":4151},{},[4152],{"type":34,"value":4153},"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":51,"props":4155,"children":4156},{},[],{"type":29,"tag":55,"props":4158,"children":4160},{"id":4159},"piège-4-ignorer-les-tests-de-régression-comportementale",[4161],{"type":34,"value":4162},"Piège 4 : Ignorer les tests de régression comportementale",{"type":29,"tag":30,"props":4164,"children":4165},{},[4166],{"type":34,"value":4167},"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":30,"props":4169,"children":4170},{},[4171,4175],{"type":29,"tag":45,"props":4172,"children":4173},{},[4174],{"type":34,"value":4004},{"type":34,"value":4176}," : 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":30,"props":4178,"children":4179},{},[4180,4184,4186,4195],{"type":29,"tag":45,"props":4181,"children":4182},{},[4183],{"type":34,"value":4014},{"type":34,"value":4185}," : les ",{"type":29,"tag":45,"props":4187,"children":4188},{},[4189],{"type":29,"tag":453,"props":4190,"children":4192},{"href":4191},"\u002Ffr\u002Fdette-technique\u002Flegacy-code-evaluer-risque",[4193],{"type":34,"value":4194},"characterization tests",{"type":34,"value":4196}," 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":30,"props":4198,"children":4199},{},[4200],{"type":34,"value":4201},"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":51,"props":4203,"children":4204},{},[],{"type":29,"tag":55,"props":4206,"children":4208},{"id":4207},"la-séquence-qui-fonctionne",[4209],{"type":34,"value":4210},"La séquence qui fonctionne",{"type":29,"tag":4212,"props":4213,"children":4214},"ol",{},[4215,4225,4235,4252,4262,4272],{"type":29,"tag":1589,"props":4216,"children":4217},{},[4218,4223],{"type":29,"tag":45,"props":4219,"children":4220},{},[4221],{"type":34,"value":4222},"Session de définition des comportements de référence",{"type":34,"value":4224}," (2-3h avec expert métier) → liste des scénarios à garantir",{"type":29,"tag":1589,"props":4226,"children":4227},{},[4228,4233],{"type":29,"tag":45,"props":4229,"children":4230},{},[4231],{"type":34,"value":4232},"Audit des dépendances",{"type":34,"value":4234}," (1 jour) → cartographie des intégrations externes, DB, services tiers",{"type":29,"tag":1589,"props":4236,"children":4237},{},[4238,4243,4245,4250],{"type":29,"tag":45,"props":4239,"children":4240},{},[4241],{"type":34,"value":4242},"Infrastructure de test",{"type":34,"value":4244}," (2-3 jours) → test containers, fixtures de données, ",{"type":29,"tag":453,"props":4246,"children":4247},{"href":949},[4248],{"type":34,"value":4249},"CI",{"type":34,"value":4251}," configurée",{"type":29,"tag":1589,"props":4253,"children":4254},{},[4255,4260],{"type":29,"tag":45,"props":4256,"children":4257},{},[4258],{"type":34,"value":4259},"Characterization tests sur les chemins critiques",{"type":34,"value":4261}," (1-2 semaines) → documentation du comportement actuel",{"type":29,"tag":1589,"props":4263,"children":4264},{},[4265,4270],{"type":29,"tag":45,"props":4266,"children":4267},{},[4268],{"type":34,"value":4269},"Tests d'intégration de bordure",{"type":34,"value":4271}," (2-3 semaines) → points d'entrée et de sortie du système",{"type":29,"tag":1589,"props":4273,"children":4274},{},[4275,4280],{"type":29,"tag":45,"props":4276,"children":4277},{},[4278],{"type":34,"value":4279},"Progression vers le centre",{"type":34,"value":4281}," (continu) → module par module, en priorisant par criticité",{"type":29,"tag":30,"props":4283,"children":4284},{},[4285],{"type":34,"value":4286},"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":567,"props":4288,"children":4290},{"cta":805,"href":806,"title":4289,"type":808},"Tester un legacy proprement n'est qu'une des 100 pratiques qui font un dev senior",[4291],{"type":29,"tag":30,"props":4292,"children":4293},{},[4294],{"type":34,"value":4295},"La séquence décrite ici (comportements de référence, characterization tests, bordure avant le centre) fait partie d'un référentiel plus large : le Craft Bundle, les 100 pratiques que j'applique pour coder propre et garder un legacy sous contrôle. Ce sont celles que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues éviter un incident en prod.",{"type":29,"tag":51,"props":4297,"children":4298},{},[],{"type":29,"tag":55,"props":4300,"children":4302},{"id":4301},"faq-sur-les-tests-dintégration-en-legacy",[4303],{"type":34,"value":4304},"FAQ sur les tests d'intégration en legacy",{"type":29,"tag":825,"props":4306,"children":4307},{},[4308,4313],{"type":29,"tag":829,"props":4309,"children":4310},{},[4311],{"type":34,"value":4312},"1. Quelle est la différence entre un test d'intégration et un test end-to-end ?",{"type":29,"tag":30,"props":4314,"children":4315},{},[4316],{"type":34,"value":4317},"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":825,"props":4319,"children":4320},{},[4321,4326],{"type":29,"tag":829,"props":4322,"children":4323},{},[4324],{"type":34,"value":4325},"2. Combien de temps faut-il pour avoir une suite de tests d'intégration utile sur un legacy ?",{"type":29,"tag":30,"props":4327,"children":4328},{},[4329],{"type":34,"value":4330},"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":825,"props":4332,"children":4333},{},[4334,4339],{"type":29,"tag":829,"props":4335,"children":4336},{},[4337],{"type":34,"value":4338},"3. Faut-il des développeurs dédiés aux tests ou tous les développeurs participent ?",{"type":29,"tag":30,"props":4340,"children":4341},{},[4342],{"type":34,"value":4343},"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":825,"props":4345,"children":4346},{},[4347,4352],{"type":29,"tag":829,"props":4348,"children":4349},{},[4350],{"type":34,"value":4351},"4. Comment gérer les tests qui tombent de façon intermittente (flaky tests) ?",{"type":29,"tag":30,"props":4353,"children":4354},{},[4355],{"type":34,"value":4356},"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":825,"props":4358,"children":4359},{},[4360,4365],{"type":29,"tag":829,"props":4361,"children":4362},{},[4363],{"type":34,"value":4364},"5. Les test containers ralentissent-ils la CI de manière inacceptable ?",{"type":29,"tag":30,"props":4366,"children":4367},{},[4368],{"type":34,"value":4369},"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":51,"props":4371,"children":4372},{},[],{"type":29,"tag":567,"props":4374,"children":4375},{"cta":2379,"href":918,"title":2380,"type":920},[4376],{"type":29,"tag":30,"props":4377,"children":4378},{},[4379],{"type":34,"value":4380},"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":130,"depth":130,"links":4382},[4383,4384,4385,4386,4387,4388,4389],{"id":3943,"depth":130,"text":3946},{"id":3988,"depth":130,"text":3991},{"id":4029,"depth":130,"text":4032},{"id":4093,"depth":130,"text":4096},{"id":4159,"depth":130,"text":4162},{"id":4207,"depth":130,"text":4210},{"id":4301,"depth":130,"text":4304},"content:fr:dette-technique:tests-integration-legacy-pieges.md","fr\u002Fdette-technique\u002Ftests-integration-legacy-pieges.md","fr\u002Fdette-technique\u002Ftests-integration-legacy-pieges",{"_path":841,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":4394,"description":4395,"id":233,"date":4396,"listed":13,"nocomments":7,"hidden":7,"categories":4397,"tags":4398,"cover":4400,"readingTime":4401,"body":4405,"_type":942,"_id":4994,"_source":944,"_file":4995,"_stem":4996,"_extension":947},"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.","2026-01-28",[1765],[18,4399],"software-craftsmanship","covers\u002Farticles\u002Fanalyse-statique-outils.jpg",{"text":1775,"minutes":4402,"time":4403,"words":4404},7.745,464700,1549,{"type":26,"children":4406,"toc":4978},[4407,4412,4420,4432,4435,4441,4450,4483,4492,4515,4520,4523,4529,4536,4541,4551,4557,4562,4571,4577,4582,4591,4594,4600,4606,4616,4626,4636,4649,4655,4688,4698,4703,4713,4731,4749,4752,4761,4764,4770,4775,4783,4794,4802,4807,4815,4820,4823,4829,4834,4844,4854,4864,4877,4886,4889,4895,4908,4921,4934,4947,4967,4970],{"type":29,"tag":30,"props":4408,"children":4409},{},[4410],{"type":34,"value":4411},"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":30,"props":4413,"children":4414},{},[4415],{"type":29,"tag":45,"props":4416,"children":4417},{},[4418],{"type":34,"value":4419},"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":30,"props":4421,"children":4422},{},[4423,4425,4430],{"type":34,"value":4424},"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":453,"props":4426,"children":4427},{"href":5},[4428],{"type":34,"value":4429},"code review",{"type":34,"value":4431}," 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":51,"props":4433,"children":4434},{},[],{"type":29,"tag":55,"props":4436,"children":4438},{"id":4437},"ce-que-lanalyse-statique-peut-et-ne-peut-pas-faire",[4439],{"type":34,"value":4440},"Ce que l'analyse statique peut et ne peut pas faire",{"type":29,"tag":30,"props":4442,"children":4443},{},[4444,4449],{"type":29,"tag":45,"props":4445,"children":4446},{},[4447],{"type":34,"value":4448},"Ce qu'elle fait bien",{"type":34,"value":1866},{"type":29,"tag":1585,"props":4451,"children":4452},{},[4453,4458,4463,4468,4473,4478],{"type":29,"tag":1589,"props":4454,"children":4455},{},[4456],{"type":34,"value":4457},"Détecter les vulnérabilités de sécurité connues (injections, secrets hardcodés, dépendances vulnérables)",{"type":29,"tag":1589,"props":4459,"children":4460},{},[4461],{"type":34,"value":4462},"Mesurer la complexité cyclomatique et alerter sur les fonctions trop complexes",{"type":29,"tag":1589,"props":4464,"children":4465},{},[4466],{"type":34,"value":4467},"Identifier les duplications de code",{"type":29,"tag":1589,"props":4469,"children":4470},{},[4471],{"type":34,"value":4472},"Enforcer les conventions de style (sans discussions en review)",{"type":29,"tag":1589,"props":4474,"children":4475},{},[4476],{"type":34,"value":4477},"Détecter les bugs courants : null pointers potentiels, ressources non fermées, conditions toujours vraies",{"type":29,"tag":1589,"props":4479,"children":4480},{},[4481],{"type":34,"value":4482},"Mesurer la couverture de tests et bloquer si elle descend sous un seuil",{"type":29,"tag":30,"props":4484,"children":4485},{},[4486,4491],{"type":29,"tag":45,"props":4487,"children":4488},{},[4489],{"type":34,"value":4490},"Ce qu'elle ne fait pas",{"type":34,"value":1866},{"type":29,"tag":1585,"props":4493,"children":4494},{},[4495,4500,4505,4510],{"type":29,"tag":1589,"props":4496,"children":4497},{},[4498],{"type":34,"value":4499},"Comprendre l'intention du code",{"type":29,"tag":1589,"props":4501,"children":4502},{},[4503],{"type":34,"value":4504},"Évaluer si la logique métier est correcte",{"type":29,"tag":1589,"props":4506,"children":4507},{},[4508],{"type":34,"value":4509},"Détecter les problèmes d'architecture de haut niveau",{"type":29,"tag":1589,"props":4511,"children":4512},{},[4513],{"type":34,"value":4514},"Remplacer le jugement d'un senior sur un design pattern",{"type":29,"tag":30,"props":4516,"children":4517},{},[4518],{"type":34,"value":4519},"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":51,"props":4521,"children":4522},{},[],{"type":29,"tag":55,"props":4524,"children":4526},{"id":4525},"les-catégories-doutils",[4527],{"type":34,"value":4528},"Les catégories d'outils",{"type":29,"tag":4530,"props":4531,"children":4533},"h3",{"id":4532},"linters-et-formateurs",[4534],{"type":34,"value":4535},"Linters et formateurs",{"type":29,"tag":30,"props":4537,"children":4538},{},[4539],{"type":34,"value":4540},"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":30,"props":4542,"children":4543},{},[4544,4549],{"type":29,"tag":45,"props":4545,"children":4546},{},[4547],{"type":34,"value":4548},"Exemples",{"type":34,"value":4550}," : ESLint (JavaScript\u002FTypeScript), Checkstyle (Java), pylint\u002Fflake8 (Python), ktlint (Kotlin), SwiftLint (Swift).",{"type":29,"tag":4530,"props":4552,"children":4554},{"id":4553},"outils-sast-static-application-security-testing",[4555],{"type":34,"value":4556},"Outils SAST (Static Application Security Testing)",{"type":29,"tag":30,"props":4558,"children":4559},{},[4560],{"type":34,"value":4561},"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":30,"props":4563,"children":4564},{},[4565,4569],{"type":29,"tag":45,"props":4566,"children":4567},{},[4568],{"type":34,"value":4548},{"type":34,"value":4570}," : SonarQube, Semgrep, Snyk Code, GitHub Advanced Security, Checkmarx.",{"type":29,"tag":4530,"props":4572,"children":4574},{"id":4573},"outils-de-métriques-de-qualité",[4575],{"type":34,"value":4576},"Outils de métriques de qualité",{"type":29,"tag":30,"props":4578,"children":4579},{},[4580],{"type":34,"value":4581},"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":30,"props":4583,"children":4584},{},[4585,4589],{"type":29,"tag":45,"props":4586,"children":4587},{},[4588],{"type":34,"value":4548},{"type":34,"value":4590}," : SonarQube (métriques), CodeClimate, NDepend (.NET), Codacy.",{"type":29,"tag":51,"props":4592,"children":4593},{},[],{"type":29,"tag":55,"props":4595,"children":4597},{"id":4596},"les-outils-par-écosystème",[4598],{"type":34,"value":4599},"Les outils par écosystème",{"type":29,"tag":4530,"props":4601,"children":4603},{"id":4602},"java-kotlin",[4604],{"type":34,"value":4605},"Java \u002F Kotlin",{"type":29,"tag":30,"props":4607,"children":4608},{},[4609,4614],{"type":29,"tag":45,"props":4610,"children":4611},{},[4612],{"type":34,"value":4613},"SonarQube",{"type":34,"value":4615}," 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":30,"props":4617,"children":4618},{},[4619,4624],{"type":29,"tag":45,"props":4620,"children":4621},{},[4622],{"type":34,"value":4623},"Checkstyle + PMD + SpotBugs",{"type":34,"value":4625}," : 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":30,"props":4627,"children":4628},{},[4629,4634],{"type":29,"tag":45,"props":4630,"children":4631},{},[4632],{"type":34,"value":4633},"ktlint",{"type":34,"value":4635}," pour Kotlin : léger, opinionated, intégrable en 5 minutes dans Gradle.",{"type":29,"tag":2164,"props":4637,"children":4638},{},[4639],{"type":29,"tag":30,"props":4640,"children":4641},{},[4642,4647],{"type":29,"tag":45,"props":4643,"children":4644},{},[4645],{"type":34,"value":4646},"Configuration recommandée",{"type":34,"value":4648}," : SonarQube avec quality gate bloquant si le coverage descend sous le seuil de l'équipe ou si de nouveaux Security Hotspots Critical\u002FBlocker apparaissent.",{"type":29,"tag":4530,"props":4650,"children":4652},{"id":4651},"javascript-typescript",[4653],{"type":34,"value":4654},"JavaScript \u002F TypeScript",{"type":29,"tag":30,"props":4656,"children":4657},{},[4658,4663,4665,4671,4672,4678,4680,4686],{"type":29,"tag":45,"props":4659,"children":4660},{},[4661],{"type":34,"value":4662},"ESLint",{"type":34,"value":4664}," est incontournable. Avec les plugins ",{"type":29,"tag":113,"props":4666,"children":4668},{"className":4667},[],[4669],{"type":34,"value":4670},"@typescript-eslint",{"type":34,"value":2468},{"type":29,"tag":113,"props":4673,"children":4675},{"className":4674},[],[4676],{"type":34,"value":4677},"eslint-plugin-security",{"type":34,"value":4679},", et ",{"type":29,"tag":113,"props":4681,"children":4683},{"className":4682},[],[4684],{"type":34,"value":4685},"eslint-plugin-sonarjs",{"type":34,"value":4687},", 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":30,"props":4689,"children":4690},{},[4691,4696],{"type":29,"tag":45,"props":4692,"children":4693},{},[4694],{"type":34,"value":4695},"Semgrep",{"type":34,"value":4697}," 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":4530,"props":4699,"children":4700},{"id":1068},[4701],{"type":34,"value":4702},"Python",{"type":29,"tag":30,"props":4704,"children":4705},{},[4706,4711],{"type":29,"tag":45,"props":4707,"children":4708},{},[4709],{"type":34,"value":4710},"Ruff",{"type":34,"value":4712}," 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":30,"props":4714,"children":4715},{},[4716,4721,4723,4729],{"type":29,"tag":45,"props":4717,"children":4718},{},[4719],{"type":34,"value":4720},"mypy ou pyright",{"type":34,"value":4722}," pour le type checking statique. Sur un codebase sans annotations, introduire mypy progressivement (mode ",{"type":29,"tag":113,"props":4724,"children":4726},{"className":4725},[],[4727],{"type":34,"value":4728},"--ignore-missing-imports",{"type":34,"value":4730}," d'abord) produit des résultats en quelques semaines.",{"type":29,"tag":30,"props":4732,"children":4733},{},[4734,4739,4741,4747],{"type":29,"tag":45,"props":4735,"children":4736},{},[4737],{"type":34,"value":4738},"Bandit",{"type":34,"value":4740}," pour la sécurité : détecte les hardcoded passwords, les appels ",{"type":29,"tag":113,"props":4742,"children":4744},{"className":4743},[],[4745],{"type":34,"value":4746},"eval()",{"type":34,"value":4748},", les configurations TLS faibles.",{"type":29,"tag":51,"props":4750,"children":4751},{},[],{"type":29,"tag":567,"props":4753,"children":4755},{"cta":569,"href":570,"title":4754,"type":572},"Vous voulez savoir lire ce qu'un outil d'analyse statique vous remonte vraiment ?",[4756],{"type":29,"tag":30,"props":4757,"children":4758},{},[4759],{"type":34,"value":4760},"Une alerte de complexité ou un Security Hotspot, ça ne suffit pas de le voir : il faut comprendre pourquoi le code l'a déclenché et comment le refactorer proprement. En mentoring 1:1, je relis votre code avec vous, on trie les vrais signaux du bruit, et vous repartez avec le réflexe de produire du code qui passe ces checks du premier coup.",{"type":29,"tag":51,"props":4762,"children":4763},{},[],{"type":29,"tag":55,"props":4765,"children":4767},{"id":4766},"comment-intégrer-sans-ralentir-la-ci",[4768],{"type":34,"value":4769},"Comment intégrer sans ralentir la CI",{"type":29,"tag":30,"props":4771,"children":4772},{},[4773],{"type":34,"value":4774},"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":30,"props":4776,"children":4777},{},[4778],{"type":29,"tag":45,"props":4779,"children":4780},{},[4781],{"type":34,"value":4782},"Principe 1 : Séparer le feedback rapide du feedback complet",{"type":29,"tag":30,"props":4784,"children":4785},{},[4786,4788,4792],{"type":34,"value":4787},"Faire tourner le linter sur le diff (pas sur tout le codebase) en moins de 60 secondes dans la ",{"type":29,"tag":453,"props":4789,"children":4790},{"href":949},[4791],{"type":34,"value":4249},{"type":34,"value":4793},". 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":30,"props":4795,"children":4796},{},[4797],{"type":29,"tag":45,"props":4798,"children":4799},{},[4800],{"type":34,"value":4801},"Principe 2 : Commencer par \"warn\", passer à \"error\" progressivement",{"type":29,"tag":30,"props":4803,"children":4804},{},[4805],{"type":34,"value":4806},"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":30,"props":4808,"children":4809},{},[4810],{"type":29,"tag":45,"props":4811,"children":4812},{},[4813],{"type":34,"value":4814},"Principe 3 : Zero tolerance sur le nouveau code uniquement",{"type":29,"tag":30,"props":4816,"children":4817},{},[4818],{"type":34,"value":4819},"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":51,"props":4821,"children":4822},{},[],{"type":29,"tag":55,"props":4824,"children":4826},{"id":4825},"les-métriques-à-surveiller",[4827],{"type":34,"value":4828},"Les métriques à surveiller",{"type":29,"tag":30,"props":4830,"children":4831},{},[4832],{"type":34,"value":4833},"Une fois les outils en place, trois métriques donnent une vue claire de la santé du codebase :",{"type":29,"tag":30,"props":4835,"children":4836},{},[4837,4842],{"type":29,"tag":45,"props":4838,"children":4839},{},[4840],{"type":34,"value":4841},"Complexité cyclomatique moyenne",{"type":34,"value":4843}," : 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":30,"props":4845,"children":4846},{},[4847,4852],{"type":29,"tag":45,"props":4848,"children":4849},{},[4850],{"type":34,"value":4851},"Taux de duplication",{"type":34,"value":4853}," : 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":30,"props":4855,"children":4856},{},[4857,4862],{"type":29,"tag":45,"props":4858,"children":4859},{},[4860],{"type":34,"value":4861},"Technical Debt Ratio",{"type":34,"value":4863}," (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":2164,"props":4865,"children":4866},{},[4867],{"type":29,"tag":30,"props":4868,"children":4869},{},[4870,4875],{"type":29,"tag":45,"props":4871,"children":4872},{},[4873],{"type":34,"value":4874},"Ce que j'ai observé chez ce client",{"type":34,"value":4876}," : 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":567,"props":4878,"children":4880},{"cta":805,"href":806,"title":4879,"type":808},"L'analyse statique attrape une partie du bruit : les 100 autres réflexes, c'est vous qui les portez",[4881],{"type":29,"tag":30,"props":4882,"children":4883},{},[4884],{"type":34,"value":4885},"Un outil bien configuré enforce le style et signale les vulnérabilités connues, mais il ne vous apprend ni à concevoir une fonction simple à tester, ni à juger un design pattern. Le Craft Bundle réunit les 100 pratiques craft que j'applique pour coder propre, celles que l'IA ne vous montrera jamais parce qu'elle ne les a jamais vues tenir en production.",{"type":29,"tag":51,"props":4887,"children":4888},{},[],{"type":29,"tag":55,"props":4890,"children":4892},{"id":4891},"faq-sur-lanalyse-statique",[4893],{"type":34,"value":4894},"FAQ sur l'analyse statique",{"type":29,"tag":825,"props":4896,"children":4897},{},[4898,4903],{"type":29,"tag":829,"props":4899,"children":4900},{},[4901],{"type":34,"value":4902},"1. SonarQube ou Codacy ou CodeClimate : lequel choisir ?",{"type":29,"tag":30,"props":4904,"children":4905},{},[4906],{"type":34,"value":4907},"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\u002FGitLab 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":825,"props":4909,"children":4910},{},[4911,4916],{"type":29,"tag":829,"props":4912,"children":4913},{},[4914],{"type":34,"value":4915},"2. L'analyse statique ralentit notre CI. Comment l'accélérer ?",{"type":29,"tag":30,"props":4917,"children":4918},{},[4919],{"type":34,"value":4920},"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":825,"props":4922,"children":4923},{},[4924,4929],{"type":29,"tag":829,"props":4925,"children":4926},{},[4927],{"type":34,"value":4928},"3. Comment gérer la dette technique détectée par SonarQube sur un legacy ?",{"type":29,"tag":30,"props":4930,"children":4931},{},[4932],{"type":34,"value":4933},"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":825,"props":4935,"children":4936},{},[4937,4942],{"type":29,"tag":829,"props":4938,"children":4939},{},[4940],{"type":34,"value":4941},"4. Les développeurs résistent à l'analyse statique. Comment les convaincre ?",{"type":29,"tag":30,"props":4943,"children":4944},{},[4945],{"type":34,"value":4946},"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":825,"props":4948,"children":4949},{},[4950,4955],{"type":29,"tag":829,"props":4951,"children":4952},{},[4953],{"type":34,"value":4954},"5. Faut-il des outils différents pour le code IA-généré ?",{"type":29,"tag":30,"props":4956,"children":4957},{},[4958,4960,4965],{"type":34,"value":4959},"En 2026, le code généré par des LLMs comme Claude 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":453,"props":4961,"children":4962},{"href":455},[4963],{"type":34,"value":4964},"sécurité IA-spécifiques",{"type":34,"value":4966}," est une bonne addition à votre pipeline.",{"type":29,"tag":51,"props":4968,"children":4969},{},[],{"type":29,"tag":567,"props":4971,"children":4972},{"cta":2379,"href":918,"title":2380,"type":920},[4973],{"type":29,"tag":30,"props":4974,"children":4975},{},[4976],{"type":34,"value":4977},"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":130,"depth":130,"links":4979},[4980,4981,4986,4991,4992,4993],{"id":4437,"depth":130,"text":4440},{"id":4525,"depth":130,"text":4528,"children":4982},[4983,4984,4985],{"id":4532,"depth":139,"text":4535},{"id":4553,"depth":139,"text":4556},{"id":4573,"depth":139,"text":4576},{"id":4596,"depth":130,"text":4599,"children":4987},[4988,4989,4990],{"id":4602,"depth":139,"text":4605},{"id":4651,"depth":139,"text":4654},{"id":1068,"depth":139,"text":4702},{"id":4766,"depth":130,"text":4769},{"id":4825,"depth":130,"text":4828},{"id":4891,"depth":130,"text":4894},"content:fr:dette-technique:outils-analyse-statique-2026.md","fr\u002Fdette-technique\u002Foutils-analyse-statique-2026.md","fr\u002Fdette-technique\u002Foutils-analyse-statique-2026",{"_path":2342,"_dir":950,"_draft":7,"_partial":7,"_locale":8,"title":4998,"description":4999,"id":198,"date":5000,"listed":13,"nocomments":7,"hidden":7,"categories":5001,"tags":5002,"cover":5003,"readingTime":5004,"body":5008,"_type":942,"_id":5380,"_source":944,"_file":5381,"_stem":5382,"_extension":947},"Definition of Ready : l'outil qui réduit les bugs en sprint","Les bugs de sprint viennent rarement du code. Ils viennent de User Stories mal définies qui entrent en sprint. La Definition of Ready est le filtre qui change ça.","2026-01-19",[950],[18,1772],"covers\u002Farticles\u002Fdefinition-of-ready.jpg",{"text":1775,"minutes":5005,"time":5006,"words":5007},7.045,422700,1409,{"type":26,"children":5009,"toc":5372},[5010,5015,5020,5025,5030,5033,5039,5044,5049,5054,5059,5062,5068,5073,5083,5093,5103,5113,5123,5128,5137,5140,5146,5151,5156,5179,5192,5197,5200,5206,5211,5216,5221,5241,5246,5249,5255,5260,5270,5280,5283,5289,5309,5322,5335,5348,5361,5364],{"type":29,"tag":30,"props":5011,"children":5012},{},[5013],{"type":34,"value":5014},"Il y a quelques années, j'accompagnais une équipe de développement dans le secteur des médias. Chaque sprint, des stories revenaient en fin de revue avec le même commentaire du PO : \"Ce n'est pas ce que j'avais demandé.\" Les développeurs étaient frustrés. Le PO était frustré. Et pourtant, chacun avait l'impression d'avoir bien fait son travail.",{"type":29,"tag":30,"props":5016,"children":5017},{},[5018],{"type":34,"value":5019},"J'ai analysé les stories des trois derniers sprints. Aucune n'avait de critères d'acceptation écrits. Aucune. Les développeurs avaient interprété les spécifications. Le PO avait imaginé quelque chose d'autre. Le bug n'était pas dans le code : il était dans la story.",{"type":29,"tag":30,"props":5021,"children":5022},{},[5023],{"type":34,"value":5024},"Ce pattern, je l'ai vu dans toutes les organisations où j'ai travaillé : BNP Paribas, Canal+, Agirc-Arrco. Les bugs de sprint viennent rarement d'un code mal écrit. Ils viennent d'une spécification que tout le monde pensait comprendre, et que chacun avait interprétée différemment.",{"type":29,"tag":30,"props":5026,"children":5027},{},[5028],{"type":34,"value":5029},"La Definition of Ready est le filtre qui arrête ces bugs avant qu'ils coûtent.",{"type":29,"tag":51,"props":5031,"children":5032},{},[],{"type":29,"tag":55,"props":5034,"children":5036},{"id":5035},"ce-que-la-dor-résout-vraiment",[5037],{"type":34,"value":5038},"Ce que la DoR résout vraiment",{"type":29,"tag":30,"props":5040,"children":5041},{},[5042],{"type":34,"value":5043},"Dans les équipes que j'accompagne, 60 à 70% des bugs de sprint trouvent leur origine dans une story mal définie. Pas dans un développeur incompétent. Pas dans une architecture fragile. Dans l'ambiguïté d'une spécification.",{"type":29,"tag":30,"props":5045,"children":5046},{},[5047],{"type":34,"value":5048},"La DoR (Definition of Ready) est le contrat d'entrée en sprint. Elle pose une question simple : \"Cette story est-elle suffisamment claire pour que l'équipe puisse la développer sans devoir s'arrêter pour poser des questions ?\"",{"type":29,"tag":30,"props":5050,"children":5051},{},[5052],{"type":34,"value":5053},"Une story non-prête qui entre en sprint génère en moyenne 3 interruptions pour des clarifications (chacune coûtant 30 minutes de contexte-switching au développeur et 15 minutes au PO). À cela s'ajoute une probabilité de 40% que la story ne soit pas acceptée en fin de sprint, nécessitant un sprint supplémentaire. Coût total : 2 à 5 fois le coût d'une story bien préparée.",{"type":29,"tag":30,"props":5055,"children":5056},{},[5057],{"type":34,"value":5058},"Le calcul est simple. Les critères d'acceptation écrits en affinage prennent 15 minutes. Les aller-retours en cours de sprint coûtent 9 heures. La DoR n'est pas de la bureaucratie : c'est de l'économie.",{"type":29,"tag":51,"props":5060,"children":5061},{},[],{"type":29,"tag":55,"props":5063,"children":5065},{"id":5064},"les-5-critères-de-la-dor",[5066],{"type":34,"value":5067},"Les 5 critères de la DoR",{"type":29,"tag":30,"props":5069,"children":5070},{},[5071],{"type":34,"value":5072},"Une DoR n'est pas universelle : elle doit refléter les problèmes spécifiques de votre équipe. Mais 5 critères sont quasi-universels, et je commence toujours par ceux-là dans les ateliers que j'anime.",{"type":29,"tag":30,"props":5074,"children":5075},{},[5076,5081],{"type":29,"tag":45,"props":5077,"children":5078},{},[5079],{"type":34,"value":5080},"Critère 1 : L'objectif business est clair.",{"type":34,"value":5082}," \"Pourquoi livrons-nous cette story ? Quel problème utilisateur résout-elle ?\" Une story sans objectif business génère des décisions de design arbitraires : les développeurs inventent la valeur qu'ils n'ont pas reçue.",{"type":29,"tag":30,"props":5084,"children":5085},{},[5086,5091],{"type":29,"tag":45,"props":5087,"children":5088},{},[5089],{"type":34,"value":5090},"Critère 2 : Les critères d'acceptation sont écrits.",{"type":34,"value":5092}," Au moins 3 scénarios Gherkin (Given\u002FWhen\u002FThen) ou une liste de conditions vérifiables. \"L'utilisateur peut se connecter\" n'est pas un critère d'acceptation. \"Étant donné un utilisateur avec un email valide et un mot de passe correct, quand il soumet le formulaire, alors il est redirigé vers le dashboard\" en est un.",{"type":29,"tag":30,"props":5094,"children":5095},{},[5096,5101],{"type":29,"tag":45,"props":5097,"children":5098},{},[5099],{"type":34,"value":5100},"Critère 3 : Les dépendances sont identifiées.",{"type":34,"value":5102}," La story dépend-elle d'une API externe, d'un autre sprint, d'une décision non-prise ? Si oui, ces dépendances sont documentées et leur statut est connu. Une dépendance découverte en sprint crée un blocage non planifié.",{"type":29,"tag":30,"props":5104,"children":5105},{},[5106,5111],{"type":29,"tag":45,"props":5107,"children":5108},{},[5109],{"type":34,"value":5110},"Critère 4 : La story est estimable.",{"type":34,"value":5112}," L'équipe peut donner un ordre de grandeur après avoir lu la story. Si elle ne peut pas estimer, c'est qu'il manque de l'information, pas que l'équipe est incompétente.",{"type":29,"tag":30,"props":5114,"children":5115},{},[5116,5121],{"type":29,"tag":45,"props":5117,"children":5118},{},[5119],{"type":34,"value":5120},"Critère 5 : La story est indépendante et livrable.",{"type":34,"value":5122}," Elle peut être développée sans bloquer sur une autre story du même sprint, et elle produit de la valeur de façon autonome. Les stories qui s'enchaînent sans être livrables séparément créent des cascades de blocages.",{"type":29,"tag":30,"props":5124,"children":5125},{},[5126],{"type":34,"value":5127},"Ces 5 critères s'affichent dans l'espace de travail de l'équipe et s'intègrent dans le template de story Jira ou Linear. Deux heures en atelier suffisent pour les définir collectivement.",{"type":29,"tag":567,"props":5129,"children":5131},{"cta":1495,"href":1496,"title":5130,"type":572},"Vous suivez votre vélocité, mais voyez-vous d'où viennent vraiment les bugs de vos sprints ?",[5132],{"type":29,"tag":30,"props":5133,"children":5134},{},[5135],{"type":34,"value":5136},"Vos métriques de delivery comptent les stories livrées, pas les ambiguïtés qui entrent en sprint et explosent en bugs trois semaines plus tard. En 30 minutes de diagnostic, j'examine votre processus d'affinage et d'entrée en sprint avec vous pour faire remonter les angles morts que vos dashboards ne captent pas. Vous repartez avec les 2-3 leviers prioritaires qui réduiront concrètement les bugs de vos équipes.",{"type":29,"tag":51,"props":5138,"children":5139},{},[],{"type":29,"tag":55,"props":5141,"children":5143},{"id":5142},"le-rituel-de-validation-avant-le-sprint-planning",[5144],{"type":34,"value":5145},"Le rituel de validation avant le sprint planning",{"type":29,"tag":30,"props":5147,"children":5148},{},[5149],{"type":34,"value":5150},"Deux jours avant chaque sprint planning, le Scrum Master et le PO passent en revue les stories candidates et vérifient chaque critère de la DoR.",{"type":29,"tag":30,"props":5152,"children":5153},{},[5154],{"type":34,"value":5155},"Le résultat est binaire :",{"type":29,"tag":1585,"props":5157,"children":5158},{},[5159,5169],{"type":29,"tag":1589,"props":5160,"children":5161},{},[5162,5167],{"type":29,"tag":45,"props":5163,"children":5164},{},[5165],{"type":34,"value":5166},"Story prête",{"type":34,"value":5168}," : tous les critères sont satisfaits → elle peut entrer en sprint planning",{"type":29,"tag":1589,"props":5170,"children":5171},{},[5172,5177],{"type":29,"tag":45,"props":5173,"children":5174},{},[5175],{"type":34,"value":5176},"Story non-prête",{"type":34,"value":5178}," : au moins un critère manque → elle est exclue avec une note expliquant ce qui manque",{"type":29,"tag":30,"props":5180,"children":5181},{},[5182,5184,5190],{"type":34,"value":5183},"Cette étape prend 30 minutes maximum. Elle évite des heures de discussion pendant le sprint planning sur des stories qui ne sont pas prêtes. Quand j'ai introduit ce rituel dans une équipe Agirc-Arrco, le ",{"type":29,"tag":453,"props":5185,"children":5187},{"href":5186},"\u002Ffr\u002Fpratiques-agiles\u002Fsprint-planning-efficace",[5188],{"type":34,"value":5189},"sprint planning",{"type":34,"value":5191}," est passé de 3h30 à 1h45 en deux sprints.",{"type":29,"tag":30,"props":5193,"children":5194},{},[5195],{"type":34,"value":5196},"Le résultat de cette validation est une liste de stories \"DoR-validées\" qui entre au sprint planning, et une liste de stories \"DoR-en-attente\" avec les actions nécessaires pour les préparer au sprint suivant.",{"type":29,"tag":51,"props":5198,"children":5199},{},[],{"type":29,"tag":55,"props":5201,"children":5203},{"id":5202},"gérer-la-pression-de-remplir-le-sprint-malgré-tout",[5204],{"type":34,"value":5205},"Gérer la pression de \"remplir le sprint malgré tout\"",{"type":29,"tag":30,"props":5207,"children":5208},{},[5209],{"type":34,"value":5210},"La résistance principale à la DoR est prévisible : \"On ne peut pas laisser le sprint vide parce que quelques stories ne sont pas prêtes.\"",{"type":29,"tag":30,"props":5212,"children":5213},{},[5214],{"type":34,"value":5215},"Cette pression est compréhensible. Elle est aussi exactement ce qui crée les bugs. \"On verra en cours de sprint\" : c'est le moment où l'ambiguïté devient un bug de production.",{"type":29,"tag":30,"props":5217,"children":5218},{},[5219],{"type":34,"value":5220},"Si le sprint n'a pas assez de stories \"DoR-validées\" pour remplir la capacité de l'équipe, deux options valables :",{"type":29,"tag":4212,"props":5222,"children":5223},{},[5224,5236],{"type":29,"tag":1589,"props":5225,"children":5226},{},[5227,5229,5235],{"type":34,"value":5228},"Utiliser la capacité pour des stories techniques (refactoring, réduction de dette technique) qui n'ont pas besoin de spécification fonctionnelle (elles se trouvent dans un ",{"type":29,"tag":453,"props":5230,"children":5232},{"href":5231},"\u002Ffr\u002Fpratiques-agiles\u002Fanti-patterns-backlog",[5233],{"type":34,"value":5234},"backlog craft bien entretenu",{"type":34,"value":2803},{"type":29,"tag":1589,"props":5237,"children":5238},{},[5239],{"type":34,"value":5240},"Réduire le périmètre du sprint plutôt que d'accepter des stories non-prêtes",{"type":29,"tag":30,"props":5242,"children":5243},{},[5244],{"type":34,"value":5245},"Un accord d'équipe sur cette règle doit être établi dès l'introduction de la DoR, idéalement en rétro, avec le soutien du Tech Lead et du PO.",{"type":29,"tag":51,"props":5247,"children":5248},{},[],{"type":29,"tag":55,"props":5250,"children":5252},{"id":5251},"les-métriques-qui-mesurent-limpact",[5253],{"type":34,"value":5254},"Les métriques qui mesurent l'impact",{"type":29,"tag":30,"props":5256,"children":5257},{},[5258],{"type":34,"value":5259},"Deux métriques permettent de mesurer l'impact de la DoR sur la durée.",{"type":29,"tag":30,"props":5261,"children":5262},{},[5263,5268],{"type":29,"tag":45,"props":5264,"children":5265},{},[5266],{"type":34,"value":5267},"Taux de stories refusées au sprint planning",{"type":34,"value":5269}," : nombre de stories exclues parce qu'elles ne passaient pas la DoR, divisé par le nombre total de stories candidates. Objectif : descendre à moins de 10% après 3 mois. Un taux élevé révèle un problème en amont dans le processus d'affinage, pas dans la DoR elle-même.",{"type":29,"tag":30,"props":5271,"children":5272},{},[5273,5278],{"type":29,"tag":45,"props":5274,"children":5275},{},[5276],{"type":34,"value":5277},"Taux d'acceptation des stories en fin de sprint",{"type":34,"value":5279}," : nombre de stories acceptées par le PO, divisé par le nombre de stories engagées. Objectif : dépasser 90%. Ce taux augmente significativement dans les 6 à 8 premières semaines après introduction de la DoR quand le processus est bien suivi.",{"type":29,"tag":51,"props":5281,"children":5282},{},[],{"type":29,"tag":55,"props":5284,"children":5286},{"id":5285},"faq-sur-la-definition-of-ready",[5287],{"type":34,"value":5288},"FAQ sur la Definition of Ready",{"type":29,"tag":825,"props":5290,"children":5291},{},[5292,5297],{"type":29,"tag":829,"props":5293,"children":5294},{},[5295],{"type":34,"value":5296},"1. Quelle est la différence entre la DoR et la Definition of Done ?",{"type":29,"tag":30,"props":5298,"children":5299},{},[5300,5302,5307],{"type":34,"value":5301},"La DoR est un critère d'entrée en sprint : elle définit ce qu'une story doit contenir pour être développable. La ",{"type":29,"tag":453,"props":5303,"children":5304},{"href":1573},[5305],{"type":34,"value":5306},"DoD",{"type":34,"value":5308}," est un critère de sortie de sprint : elle définit ce que le code doit respecter pour être considéré terminé. Les deux sont nécessaires et complémentaires. Une DoR sans DoD produit des stories bien spécifiées mais mal développées. Une DoD sans DoR produit du bon code sur de mauvaises spécifications.",{"type":29,"tag":825,"props":5310,"children":5311},{},[5312,5317],{"type":29,"tag":829,"props":5313,"children":5314},{},[5315],{"type":34,"value":5316},"2. La DoR s'applique-t-elle aussi aux stories techniques (refactoring, infrastructure) ?",{"type":29,"tag":30,"props":5318,"children":5319},{},[5320],{"type":34,"value":5321},"Oui, avec des critères adaptés. Pour une story technique, les critères d'acceptation sont remplacés par des critères de succès mesurables : \"la couverture de tests du module X passe de 30% à 60%\", \"le build time est réduit de 8 min à 4 min\". L'objectif business est remplacé par l'impact technique quantifié. L'importance de la DoR est la même : une story technique ambiguë produit du travail mal orienté.",{"type":29,"tag":825,"props":5323,"children":5324},{},[5325,5330],{"type":29,"tag":829,"props":5326,"children":5327},{},[5328],{"type":34,"value":5329},"3. Que faire si le PO résiste à rédiger des critères d'acceptation détaillés ?",{"type":29,"tag":30,"props":5331,"children":5332},{},[5333],{"type":34,"value":5334},"Montrer le coût avec un exemple concret du sprint précédent. \"Cette story a nécessité 3 aller-retours avec toi en cours de sprint parce que le comportement attendu n'était pas spécifié. Chaque aller-retour a coûté 2h au développeur et 1h à toi. Rédiger des critères d'acceptation en affinage prend 15 minutes, et évite 9 heures de friction.\" Le chiffre parle mieux que l'argument de principe.",{"type":29,"tag":825,"props":5336,"children":5337},{},[5338,5343],{"type":29,"tag":829,"props":5339,"children":5340},{},[5341],{"type":34,"value":5342},"4. Comment combiner DoR et agilité dans un contexte de startup avec des requirements qui changent vite ?",{"type":29,"tag":30,"props":5344,"children":5345},{},[5346],{"type":34,"value":5347},"La DoR n'est pas incompatible avec l'agilité rapide : elle est compatible avec une agilité mature. Une startup en phase de discovery peut avoir une DoR allégée : le critère 2 est \"au moins 1 scénario défini\" au lieu de 3. L'essentiel est que l'équipe ne parte pas développer sans une compréhension partagée du \"quoi\" et du \"pourquoi\". Le reste peut rester flexible.",{"type":29,"tag":825,"props":5349,"children":5350},{},[5351,5356],{"type":29,"tag":829,"props":5352,"children":5353},{},[5354],{"type":34,"value":5355},"5. Quelle est la taille idéale d'une DoR ?",{"type":29,"tag":30,"props":5357,"children":5358},{},[5359],{"type":34,"value":5360},"Commencer avec 5 critères. Observer l'impact pendant 2 mois, puis ajouter des critères si des problèmes spécifiques persistent. J'ai vu des équipes créer des DoR de 15 critères qui rendaient chaque story impossible à préparer en moins de 2 heures. Une DoR trop longue devient une barrière bureaucratique, l'inverse du but recherché.",{"type":29,"tag":51,"props":5362,"children":5363},{},[],{"type":29,"tag":567,"props":5365,"children":5366},{"cta":1739,"href":918,"title":1740,"type":920},[5367],{"type":29,"tag":30,"props":5368,"children":5369},{},[5370],{"type":34,"value":5371},"Le framework complet pour réduire votre lead time de moitié en 90 jours, incluant une section dédiée à l'optimisation du processus d'affinage et à l'implémentation de la Definition of Ready avec les templates prêts à l'emploi.",{"title":8,"searchDepth":130,"depth":130,"links":5373},[5374,5375,5376,5377,5378,5379],{"id":5035,"depth":130,"text":5038},{"id":5064,"depth":130,"text":5067},{"id":5142,"depth":130,"text":5145},{"id":5202,"depth":130,"text":5205},{"id":5251,"depth":130,"text":5254},{"id":5285,"depth":130,"text":5288},"content:fr:pratiques-agiles:definition-of-ready-bugs-sprint.md","fr\u002Fpratiques-agiles\u002Fdefinition-of-ready-bugs-sprint.md","fr\u002Fpratiques-agiles\u002Fdefinition-of-ready-bugs-sprint",{"_path":5384,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":5385,"description":5386,"id":5387,"date":5388,"listed":13,"nocomments":7,"hidden":7,"categories":5389,"tags":5390,"cover":5392,"readingTime":5393,"body":5397,"_type":942,"_id":7062,"_source":944,"_file":7063,"_stem":7064,"_extension":947},"\u002Ffr\u002Fdette-technique\u002Frevue-de-code-java-guide-exemples","Comment Maîtriser la Revue de Code en Java, Guide Complet avec Exemples et Astuces","Découvrez comment tirer le meilleur parti des revues de code en Java grâce à ce guide complet. Inclut des exemples de code, des astuces pratiques, et une FAQ.",53,"2024-08-30",[1765],[5391,18,16],"solid","covers\u002Farticles\u002Frevue-de-code.jpg",{"text":1775,"minutes":5394,"time":5395,"words":5396},7.485,449100,1497,{"type":26,"children":5398,"toc":7040},[5399,5404,5417,5423,5428,5461,5471,5477,5483,5488,5506,5512,5517,5683,5689,5694,5703,5709,5714,5727,5743,5748,5756,5761,5767,5772,5778,5783,5789,5797,5886,5894,5947,5953,5960,6227,6234,6255,6438,6441,6446,6452,6459,6585,6592,6635,6773,6779,6785,6820,6826,6859,6865,6870,6887,6897,6907,6925,6935,6950,6959,6962,6968,6981,6994,7007,7026,7036],{"type":29,"tag":30,"props":5400,"children":5401},{},[5402],{"type":34,"value":5403},"Trois ans d'accompagnement chez BNP Paribas CIB sur la qualité du code, six mois chez Canal+ sur les pratiques d'équipe. Sur les deux missions, la même constatation : quand les revues de code passent du statut de formalité à celui de discipline rigoureuse, les bugs en production chutent de manière mesurable et les délais tiennent. La revue n'est pas un moment de jugement, ce n'est pas non plus une case à cocher dans Jira. C'est le moment où le code passe du statut \"fonctionne sur ma machine\" à celui de code partageable et maintenable.",{"type":29,"tag":30,"props":5405,"children":5406},{},[5407,5409,5415],{"type":34,"value":5408},"Robert C. Martin le rappelle dans ",{"type":29,"tag":5410,"props":5411,"children":5412},"em",{},[5413],{"type":34,"value":5414},"Clean Code",{"type":34,"value":5416}," : un code se lit bien plus souvent qu'il ne s'écrit. La revue est précisément le moment où cette asymétrie devient tangible, et coûteuse quand on la néglige. Cet article rassemble ce qui fait la différence entre une revue qui apporte de la valeur et une revue qui pollue le workflow : ce qu'on regarde, comment on formule, quels outils on utilise, et la checklist concrète à dérouler sur un projet Java sérieux.",{"type":29,"tag":55,"props":5418,"children":5420},{"id":5419},"ce-quune-revue-de-code-apporte-vraiment",[5421],{"type":34,"value":5422},"Ce qu'une revue de code apporte vraiment",{"type":29,"tag":30,"props":5424,"children":5425},{},[5426],{"type":34,"value":5427},"Une revue de code est l'examen du code d'un développeur par un ou plusieurs pairs avant intégration. La définition est simple, l'impact moins évident à percevoir. Trois bénéfices concrets justifient le temps investi :",{"type":29,"tag":1585,"props":5429,"children":5430},{},[5431,5441,5451],{"type":29,"tag":1589,"props":5432,"children":5433},{},[5434,5439],{"type":29,"tag":45,"props":5435,"children":5436},{},[5437],{"type":34,"value":5438},"Détection précoce.",{"type":34,"value":5440}," Les bugs repérés en revue ne se transforment pas en incidents production. Une deuxième paire d'yeux repère ce que l'auteur a manqué, c'est mécanique.",{"type":29,"tag":1589,"props":5442,"children":5443},{},[5444,5449],{"type":29,"tag":45,"props":5445,"children":5446},{},[5447],{"type":34,"value":5448},"Transmission.",{"type":34,"value":5450}," Chaque revue est un moment de partage technique : sur les patterns, sur les conventions, sur les pièges du domaine. Plus efficace qu'une formation, parce qu'ancré dans le code réel.",{"type":29,"tag":1589,"props":5452,"children":5453},{},[5454,5459],{"type":29,"tag":45,"props":5455,"children":5456},{},[5457],{"type":34,"value":5458},"Cohérence collective.",{"type":34,"value":5460}," Sans revue, chaque développeur écrit dans son style. Avec revue, l'équipe converge progressivement vers des standards partagés, ce qui rend la base maintenable sur la durée.",{"type":29,"tag":5462,"props":5463,"children":5465},"alert",{"type":5464},"TIP",[5466],{"type":29,"tag":30,"props":5467,"children":5468},{},[5469],{"type":34,"value":5470},"Avant de soumettre votre code pour revue, relisez-le comme si c'était celui de quelqu'un d'autre. La majorité des remarques évidentes apparaissent à cette lecture-là.",{"type":29,"tag":55,"props":5472,"children":5474},{"id":5473},"comment-préparer-son-code-pour-une-revue",[5475],{"type":34,"value":5476},"Comment Préparer son Code pour une Revue",{"type":29,"tag":4530,"props":5478,"children":5480},{"id":5479},"nettoyer-le-code",[5481],{"type":34,"value":5482},"Nettoyer le Code",{"type":29,"tag":30,"props":5484,"children":5485},{},[5486],{"type":34,"value":5487},"Avant de demander une revue, assurez-vous que votre code est propre et lisible. Cela signifie :",{"type":29,"tag":1585,"props":5489,"children":5490},{},[5491,5496,5501],{"type":29,"tag":1589,"props":5492,"children":5493},{},[5494],{"type":34,"value":5495},"Supprimer les morceaux de code inutiles ou commentés.",{"type":29,"tag":1589,"props":5497,"children":5498},{},[5499],{"type":34,"value":5500},"Utiliser des noms de variables et de fonctions explicites.",{"type":29,"tag":1589,"props":5502,"children":5503},{},[5504],{"type":34,"value":5505},"Organiser votre code de manière logique.",{"type":29,"tag":4530,"props":5507,"children":5509},{"id":5508},"commenter-les-parties-complexes",[5510],{"type":34,"value":5511},"Commenter les Parties Complexes",{"type":29,"tag":30,"props":5513,"children":5514},{},[5515],{"type":34,"value":5516},"Si une partie de votre code est complexe ou nécessite une explication particulière, ajoutez des commentaires. Cela aidera les autres développeurs à comprendre votre raisonnement et à faire des critiques plus pertinentes.",{"type":29,"tag":106,"props":5518,"children":5522},{"className":5519,"code":5520,"language":5521,"meta":8,"style":8},"language-java shiki shiki-themes catppuccin-frappe github-dark","\u002F\u002F This method calculates the factorial of a number recursively\npublic int factorial(int n) {\n    if (n \u003C= 1) {\n        return 1;\n    }\n    return n * factorial(n - 1);\n}\n","java",[5523],{"type":29,"tag":113,"props":5524,"children":5525},{"__ignoreMap":8},[5526,5534,5574,5609,5625,5633,5676],{"type":29,"tag":117,"props":5527,"children":5528},{"class":119,"line":120},[5529],{"type":29,"tag":117,"props":5530,"children":5531},{"style":124},[5532],{"type":34,"value":5533},"\u002F\u002F This method calculates the factorial of a number recursively\n",{"type":29,"tag":117,"props":5535,"children":5536},{"class":119,"line":130},[5537,5542,5547,5552,5556,5561,5566,5570],{"type":29,"tag":117,"props":5538,"children":5539},{"style":143},[5540],{"type":34,"value":5541},"public",{"type":29,"tag":117,"props":5543,"children":5544},{"style":143},[5545],{"type":34,"value":5546}," int",{"type":29,"tag":117,"props":5548,"children":5549},{"style":372},[5550],{"type":34,"value":5551}," factorial",{"type":29,"tag":117,"props":5553,"children":5554},{"style":384},[5555],{"type":34,"value":1108},{"type":29,"tag":117,"props":5557,"children":5558},{"style":143},[5559],{"type":34,"value":5560},"int",{"type":29,"tag":117,"props":5562,"children":5563},{"style":378},[5564],{"type":34,"value":5565}," n",{"type":29,"tag":117,"props":5567,"children":5568},{"style":384},[5569],{"type":34,"value":2803},{"type":29,"tag":117,"props":5571,"children":5572},{"style":384},[5573],{"type":34,"value":3461},{"type":29,"tag":117,"props":5575,"children":5576},{"class":119,"line":139},[5577,5582,5586,5591,5596,5601,5605],{"type":29,"tag":117,"props":5578,"children":5579},{"style":143},[5580],{"type":34,"value":5581},"    if",{"type":29,"tag":117,"props":5583,"children":5584},{"style":384},[5585],{"type":34,"value":3181},{"type":29,"tag":117,"props":5587,"children":5588},{"style":378},[5589],{"type":34,"value":5590},"n ",{"type":29,"tag":117,"props":5592,"children":5593},{"style":160},[5594],{"type":34,"value":5595},"\u003C=",{"type":29,"tag":117,"props":5597,"children":5598},{"style":3476},[5599],{"type":34,"value":5600}," 1",{"type":29,"tag":117,"props":5602,"children":5603},{"style":384},[5604],{"type":34,"value":2803},{"type":29,"tag":117,"props":5606,"children":5607},{"style":384},[5608],{"type":34,"value":3461},{"type":29,"tag":117,"props":5610,"children":5611},{"class":119,"line":172},[5612,5617,5621],{"type":29,"tag":117,"props":5613,"children":5614},{"style":143},[5615],{"type":34,"value":5616},"        return",{"type":29,"tag":117,"props":5618,"children":5619},{"style":3476},[5620],{"type":34,"value":5600},{"type":29,"tag":117,"props":5622,"children":5623},{"style":384},[5624],{"type":34,"value":387},{"type":29,"tag":117,"props":5626,"children":5627},{"class":119,"line":181},[5628],{"type":29,"tag":117,"props":5629,"children":5630},{"style":384},[5631],{"type":34,"value":5632},"    }\n",{"type":29,"tag":117,"props":5634,"children":5635},{"class":119,"line":189},[5636,5640,5645,5650,5654,5658,5662,5667,5671],{"type":29,"tag":117,"props":5637,"children":5638},{"style":143},[5639],{"type":34,"value":1136},{"type":29,"tag":117,"props":5641,"children":5642},{"style":378},[5643],{"type":34,"value":5644}," n ",{"type":29,"tag":117,"props":5646,"children":5647},{"style":160},[5648],{"type":34,"value":5649},"*",{"type":29,"tag":117,"props":5651,"children":5652},{"style":372},[5653],{"type":34,"value":5551},{"type":29,"tag":117,"props":5655,"children":5656},{"style":384},[5657],{"type":34,"value":1108},{"type":29,"tag":117,"props":5659,"children":5660},{"style":378},[5661],{"type":34,"value":5590},{"type":29,"tag":117,"props":5663,"children":5664},{"style":160},[5665],{"type":34,"value":5666},"-",{"type":29,"tag":117,"props":5668,"children":5669},{"style":3476},[5670],{"type":34,"value":5600},{"type":29,"tag":117,"props":5672,"children":5673},{"style":384},[5674],{"type":34,"value":5675},");\n",{"type":29,"tag":117,"props":5677,"children":5678},{"class":119,"line":198},[5679],{"type":29,"tag":117,"props":5680,"children":5681},{"style":384},[5682],{"type":34,"value":2903},{"type":29,"tag":4530,"props":5684,"children":5686},{"id":5685},"sassurer-que-le-code-est-fonctionnel",[5687],{"type":34,"value":5688},"S'assurer que le Code est Fonctionnel",{"type":29,"tag":30,"props":5690,"children":5691},{},[5692],{"type":34,"value":5693},"Testez votre code avant de le soumettre. Rien n'est plus frustrant pour un reviewer que de recevoir un code qui ne fonctionne pas ou qui génère des erreurs.",{"type":29,"tag":567,"props":5695,"children":5697},{"cta":569,"href":570,"title":5696,"type":572},"Vous voulez repérer ce que les autres laissent passer en revue ?",[5698],{"type":29,"tag":30,"props":5699,"children":5700},{},[5701],{"type":34,"value":5702},"Lire une PR et voir tout de suite ce qui cloche, le bug latent, le couplage évitable, le nommage qui ment, ça ne s'apprend pas en lisant un guide : ça se travaille. En mentoring 1:1, je relis votre code avec vous et je vous transmets les réflexes qui font la différence entre un reviewer qui valide et un reviewer qui élève la qualité de toute l'équipe.",{"type":29,"tag":55,"props":5704,"children":5706},{"id":5705},"formuler-des-feedbacks-qui-font-progresser",[5707],{"type":34,"value":5708},"Formuler des feedbacks qui font progresser",{"type":29,"tag":30,"props":5710,"children":5711},{},[5712],{"type":34,"value":5713},"Un feedback utile est précis, ancré dans le code et orienté vers une amélioration concrète. La différence entre une remarque qui fait avancer et une remarque qui crispe tient souvent à la formulation.",{"type":29,"tag":30,"props":5715,"children":5716},{},[5717,5719,5725],{"type":34,"value":5718},"Exemple sur une méthode ",{"type":29,"tag":113,"props":5720,"children":5722},{"className":5721},[],[5723],{"type":34,"value":5724},"calculateSum()",{"type":34,"value":5726}," qui pourrait utiliser un stream :",{"type":29,"tag":2164,"props":5728,"children":5729},{},[5730],{"type":29,"tag":30,"props":5731,"children":5732},{},[5733,5735,5741],{"type":34,"value":5734},"\"Cette boucle gagnerait en lisibilité avec un ",{"type":29,"tag":113,"props":5736,"children":5738},{"className":5737},[],[5739],{"type":34,"value":5740},"stream().sum()",{"type":34,"value":5742}," (gain mineur sur la perf, mais l'intention devient explicite).\"",{"type":29,"tag":30,"props":5744,"children":5745},{},[5746],{"type":34,"value":5747},"Plutôt que :",{"type":29,"tag":2164,"props":5749,"children":5750},{},[5751],{"type":29,"tag":30,"props":5752,"children":5753},{},[5754],{"type":34,"value":5755},"\"C'est moche, à refaire.\"",{"type":29,"tag":30,"props":5757,"children":5758},{},[5759],{"type":34,"value":5760},"La première remarque cible le code, propose une alternative et explique le bénéfice. La seconde n'apprend rien et déclenche une réaction défensive. Sur une équipe, multiplié par cinq revues par semaine, l'écart est considérable.",{"type":29,"tag":4530,"props":5762,"children":5764},{"id":5763},"recevoir-des-critiques-sans-senflammer",[5765],{"type":34,"value":5766},"Recevoir des critiques sans s'enflammer",{"type":29,"tag":30,"props":5768,"children":5769},{},[5770],{"type":34,"value":5771},"C'est l'autre moitié du contrat. Le feedback porte sur le code, pas sur le développeur : distinction simple à énoncer, plus difficile à intérioriser. Trois réflexes utiles : considérer chaque remarque comme une donnée à évaluer, ne pas prendre personnellement ce qui ne l'est pas, demander des clarifications quand un commentaire n'est pas clair plutôt que de l'interpréter.",{"type":29,"tag":55,"props":5773,"children":5775},{"id":5774},"exemples-de-revue-de-code-en-java",[5776],{"type":34,"value":5777},"Exemples de Revue de Code en Java",{"type":29,"tag":30,"props":5779,"children":5780},{},[5781],{"type":34,"value":5782},"Pour mieux comprendre le processus de revue de code, examinons trois exemples pratiques en Java.",{"type":29,"tag":4530,"props":5784,"children":5786},{"id":5785},"cas-1-code-simple",[5787],{"type":34,"value":5788},"Cas 1 : Code Simple",{"type":29,"tag":30,"props":5790,"children":5791},{},[5792],{"type":29,"tag":45,"props":5793,"children":5794},{},[5795],{"type":34,"value":5796},"Code à réviser :",{"type":29,"tag":106,"props":5798,"children":5800},{"className":5519,"code":5799,"language":5521,"meta":8,"style":8},"public int sum(int a, int b) {\n    return a + b;\n}\n",[5801],{"type":29,"tag":113,"props":5802,"children":5803},{"__ignoreMap":8},[5804,5854,5879],{"type":29,"tag":117,"props":5805,"children":5806},{"class":119,"line":120},[5807,5811,5815,5820,5824,5828,5833,5837,5841,5846,5850],{"type":29,"tag":117,"props":5808,"children":5809},{"style":143},[5810],{"type":34,"value":5541},{"type":29,"tag":117,"props":5812,"children":5813},{"style":143},[5814],{"type":34,"value":5546},{"type":29,"tag":117,"props":5816,"children":5817},{"style":372},[5818],{"type":34,"value":5819}," sum",{"type":29,"tag":117,"props":5821,"children":5822},{"style":384},[5823],{"type":34,"value":1108},{"type":29,"tag":117,"props":5825,"children":5826},{"style":143},[5827],{"type":34,"value":5560},{"type":29,"tag":117,"props":5829,"children":5830},{"style":378},[5831],{"type":34,"value":5832}," a",{"type":29,"tag":117,"props":5834,"children":5835},{"style":384},[5836],{"type":34,"value":1118},{"type":29,"tag":117,"props":5838,"children":5839},{"style":143},[5840],{"type":34,"value":5546},{"type":29,"tag":117,"props":5842,"children":5843},{"style":378},[5844],{"type":34,"value":5845}," b",{"type":29,"tag":117,"props":5847,"children":5848},{"style":384},[5849],{"type":34,"value":2803},{"type":29,"tag":117,"props":5851,"children":5852},{"style":384},[5853],{"type":34,"value":3461},{"type":29,"tag":117,"props":5855,"children":5856},{"class":119,"line":130},[5857,5861,5866,5871,5875],{"type":29,"tag":117,"props":5858,"children":5859},{"style":143},[5860],{"type":34,"value":1136},{"type":29,"tag":117,"props":5862,"children":5863},{"style":378},[5864],{"type":34,"value":5865}," a ",{"type":29,"tag":117,"props":5867,"children":5868},{"style":160},[5869],{"type":34,"value":5870},"+",{"type":29,"tag":117,"props":5872,"children":5873},{"style":378},[5874],{"type":34,"value":5845},{"type":29,"tag":117,"props":5876,"children":5877},{"style":384},[5878],{"type":34,"value":387},{"type":29,"tag":117,"props":5880,"children":5881},{"class":119,"line":139},[5882],{"type":29,"tag":117,"props":5883,"children":5884},{"style":384},[5885],{"type":34,"value":2903},{"type":29,"tag":30,"props":5887,"children":5888},{},[5889],{"type":29,"tag":45,"props":5890,"children":5891},{},[5892],{"type":34,"value":5893},"Feedback :",{"type":29,"tag":1585,"props":5895,"children":5896},{},[5897,5907],{"type":29,"tag":1589,"props":5898,"children":5899},{},[5900,5905],{"type":29,"tag":45,"props":5901,"children":5902},{},[5903],{"type":34,"value":5904},"Positif",{"type":34,"value":5906}," : \"Le code est simple et fonctionne bien pour l'addition de deux entiers.\"",{"type":29,"tag":1589,"props":5908,"children":5909},{},[5910,5915,5917,5922,5924,5930,5932,5938,5939,5945],{"type":29,"tag":45,"props":5911,"children":5912},{},[5913],{"type":34,"value":5914},"Amélioration",{"type":34,"value":5916}," : \"Vous pourriez renommer les variables ",{"type":29,"tag":113,"props":5918,"children":5920},{"className":5919},[],[5921],{"type":34,"value":453},{"type":34,"value":5923}," et ",{"type":29,"tag":113,"props":5925,"children":5927},{"className":5926},[],[5928],{"type":34,"value":5929},"b",{"type":34,"value":5931}," en ",{"type":29,"tag":113,"props":5933,"children":5935},{"className":5934},[],[5936],{"type":34,"value":5937},"firstNumber",{"type":34,"value":5923},{"type":29,"tag":113,"props":5940,"children":5942},{"className":5941},[],[5943],{"type":34,"value":5944},"secondNumber",{"type":34,"value":5946}," pour plus de clarté.\"",{"type":29,"tag":4530,"props":5948,"children":5950},{"id":5949},"cas-2-code-complexe",[5951],{"type":34,"value":5952},"Cas 2 : Code Complexe",{"type":29,"tag":30,"props":5954,"children":5955},{},[5956],{"type":29,"tag":45,"props":5957,"children":5958},{},[5959],{"type":34,"value":5796},{"type":29,"tag":106,"props":5961,"children":5963},{"className":5519,"code":5962,"language":5521,"meta":8,"style":8},"public List\u003CInteger> findEvenNumbers(List\u003CInteger> numbers) {\n    List\u003CInteger> evenNumbers = new ArrayList\u003C>();\n    for (int number : numbers) {\n        if (number % 2 == 0) {\n            evenNumbers.add(number);\n        }\n    }\n    return evenNumbers;\n}\n",[5964],{"type":29,"tag":113,"props":5965,"children":5966},{"__ignoreMap":8},[5967,6032,6077,6114,6159,6189,6197,6204,6220],{"type":29,"tag":117,"props":5968,"children":5969},{"class":119,"line":120},[5970,5974,5980,5984,5989,5993,5998,6002,6007,6011,6015,6019,6024,6028],{"type":29,"tag":117,"props":5971,"children":5972},{"style":143},[5973],{"type":34,"value":5541},{"type":29,"tag":117,"props":5975,"children":5977},{"style":5976},"--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8",[5978],{"type":34,"value":5979}," List",{"type":29,"tag":117,"props":5981,"children":5982},{"style":160},[5983],{"type":34,"value":2860},{"type":29,"tag":117,"props":5985,"children":5986},{"style":378},[5987],{"type":34,"value":5988},"Integer",{"type":29,"tag":117,"props":5990,"children":5991},{"style":160},[5992],{"type":34,"value":2877},{"type":29,"tag":117,"props":5994,"children":5995},{"style":372},[5996],{"type":34,"value":5997}," findEvenNumbers",{"type":29,"tag":117,"props":5999,"children":6000},{"style":384},[6001],{"type":34,"value":1108},{"type":29,"tag":117,"props":6003,"children":6004},{"style":5976},[6005],{"type":34,"value":6006},"List",{"type":29,"tag":117,"props":6008,"children":6009},{"style":160},[6010],{"type":34,"value":2860},{"type":29,"tag":117,"props":6012,"children":6013},{"style":378},[6014],{"type":34,"value":5988},{"type":29,"tag":117,"props":6016,"children":6017},{"style":160},[6018],{"type":34,"value":2877},{"type":29,"tag":117,"props":6020,"children":6021},{"style":378},[6022],{"type":34,"value":6023}," numbers",{"type":29,"tag":117,"props":6025,"children":6026},{"style":384},[6027],{"type":34,"value":2803},{"type":29,"tag":117,"props":6029,"children":6030},{"style":384},[6031],{"type":34,"value":3461},{"type":29,"tag":117,"props":6033,"children":6034},{"class":119,"line":130},[6035,6040,6044,6048,6052,6057,6062,6067,6072],{"type":29,"tag":117,"props":6036,"children":6037},{"style":5976},[6038],{"type":34,"value":6039},"    List",{"type":29,"tag":117,"props":6041,"children":6042},{"style":384},[6043],{"type":34,"value":2860},{"type":29,"tag":117,"props":6045,"children":6046},{"style":143},[6047],{"type":34,"value":5988},{"type":29,"tag":117,"props":6049,"children":6050},{"style":384},[6051],{"type":34,"value":2877},{"type":29,"tag":117,"props":6053,"children":6054},{"style":378},[6055],{"type":34,"value":6056}," evenNumbers ",{"type":29,"tag":117,"props":6058,"children":6059},{"style":160},[6060],{"type":34,"value":6061},"=",{"type":29,"tag":117,"props":6063,"children":6064},{"style":143},[6065],{"type":34,"value":6066}," new",{"type":29,"tag":117,"props":6068,"children":6069},{"style":5976},[6070],{"type":34,"value":6071}," ArrayList",{"type":29,"tag":117,"props":6073,"children":6074},{"style":384},[6075],{"type":34,"value":6076},"\u003C>();\n",{"type":29,"tag":117,"props":6078,"children":6079},{"class":119,"line":139},[6080,6085,6089,6093,6098,6102,6106,6110],{"type":29,"tag":117,"props":6081,"children":6082},{"style":143},[6083],{"type":34,"value":6084},"    for",{"type":29,"tag":117,"props":6086,"children":6087},{"style":384},[6088],{"type":34,"value":3181},{"type":29,"tag":117,"props":6090,"children":6091},{"style":143},[6092],{"type":34,"value":5560},{"type":29,"tag":117,"props":6094,"children":6095},{"style":378},[6096],{"type":34,"value":6097}," number ",{"type":29,"tag":117,"props":6099,"children":6100},{"style":143},[6101],{"type":34,"value":1276},{"type":29,"tag":117,"props":6103,"children":6104},{"style":378},[6105],{"type":34,"value":6023},{"type":29,"tag":117,"props":6107,"children":6108},{"style":384},[6109],{"type":34,"value":2803},{"type":29,"tag":117,"props":6111,"children":6112},{"style":384},[6113],{"type":34,"value":3461},{"type":29,"tag":117,"props":6115,"children":6116},{"class":119,"line":172},[6117,6122,6126,6131,6136,6141,6146,6151,6155],{"type":29,"tag":117,"props":6118,"children":6119},{"style":143},[6120],{"type":34,"value":6121},"        if",{"type":29,"tag":117,"props":6123,"children":6124},{"style":384},[6125],{"type":34,"value":3181},{"type":29,"tag":117,"props":6127,"children":6128},{"style":378},[6129],{"type":34,"value":6130},"number ",{"type":29,"tag":117,"props":6132,"children":6133},{"style":160},[6134],{"type":34,"value":6135},"%",{"type":29,"tag":117,"props":6137,"children":6138},{"style":3476},[6139],{"type":34,"value":6140}," 2",{"type":29,"tag":117,"props":6142,"children":6143},{"style":160},[6144],{"type":34,"value":6145}," ==",{"type":29,"tag":117,"props":6147,"children":6148},{"style":3476},[6149],{"type":34,"value":6150}," 0",{"type":29,"tag":117,"props":6152,"children":6153},{"style":384},[6154],{"type":34,"value":2803},{"type":29,"tag":117,"props":6156,"children":6157},{"style":384},[6158],{"type":34,"value":3461},{"type":29,"tag":117,"props":6160,"children":6161},{"class":119,"line":181},[6162,6167,6171,6176,6180,6185],{"type":29,"tag":117,"props":6163,"children":6164},{"style":378},[6165],{"type":34,"value":6166},"            evenNumbers",{"type":29,"tag":117,"props":6168,"children":6169},{"style":384},[6170],{"type":34,"value":369},{"type":29,"tag":117,"props":6172,"children":6173},{"style":372},[6174],{"type":34,"value":6175},"add",{"type":29,"tag":117,"props":6177,"children":6178},{"style":384},[6179],{"type":34,"value":1108},{"type":29,"tag":117,"props":6181,"children":6182},{"style":378},[6183],{"type":34,"value":6184},"number",{"type":29,"tag":117,"props":6186,"children":6187},{"style":384},[6188],{"type":34,"value":5675},{"type":29,"tag":117,"props":6190,"children":6191},{"class":119,"line":189},[6192],{"type":29,"tag":117,"props":6193,"children":6194},{"style":384},[6195],{"type":34,"value":6196},"        }\n",{"type":29,"tag":117,"props":6198,"children":6199},{"class":119,"line":198},[6200],{"type":29,"tag":117,"props":6201,"children":6202},{"style":384},[6203],{"type":34,"value":5632},{"type":29,"tag":117,"props":6205,"children":6206},{"class":119,"line":207},[6207,6211,6216],{"type":29,"tag":117,"props":6208,"children":6209},{"style":143},[6210],{"type":34,"value":1136},{"type":29,"tag":117,"props":6212,"children":6213},{"style":378},[6214],{"type":34,"value":6215}," evenNumbers",{"type":29,"tag":117,"props":6217,"children":6218},{"style":384},[6219],{"type":34,"value":387},{"type":29,"tag":117,"props":6221,"children":6222},{"class":119,"line":215},[6223],{"type":29,"tag":117,"props":6224,"children":6225},{"style":384},[6226],{"type":34,"value":2903},{"type":29,"tag":30,"props":6228,"children":6229},{},[6230],{"type":29,"tag":45,"props":6231,"children":6232},{},[6233],{"type":34,"value":5893},{"type":29,"tag":1585,"props":6235,"children":6236},{},[6237,6246],{"type":29,"tag":1589,"props":6238,"children":6239},{},[6240,6244],{"type":29,"tag":45,"props":6241,"children":6242},{},[6243],{"type":34,"value":5904},{"type":34,"value":6245}," : \"Le code remplit bien sa fonction en trouvant tous les nombres pairs d'une liste.\"",{"type":29,"tag":1589,"props":6247,"children":6248},{},[6249,6253],{"type":29,"tag":45,"props":6250,"children":6251},{},[6252],{"type":34,"value":5914},{"type":34,"value":6254}," : \"Pour simplifier, vous pourriez utiliser les streams en Java 8 :\"",{"type":29,"tag":106,"props":6256,"children":6258},{"className":5519,"code":6257,"language":5521,"meta":8,"style":8},"public List\u003CInteger> findEvenNumbers(List\u003CInteger> numbers) {\n    return numbers.stream()\n                  .filter(n -> n % 2 == 0)\n                  .collect(Collectors.toList());\n}\n",[6259],{"type":29,"tag":113,"props":6260,"children":6261},{"__ignoreMap":8},[6262,6321,6346,6396,6431],{"type":29,"tag":117,"props":6263,"children":6264},{"class":119,"line":120},[6265,6269,6273,6277,6281,6285,6289,6293,6297,6301,6305,6309,6313,6317],{"type":29,"tag":117,"props":6266,"children":6267},{"style":143},[6268],{"type":34,"value":5541},{"type":29,"tag":117,"props":6270,"children":6271},{"style":5976},[6272],{"type":34,"value":5979},{"type":29,"tag":117,"props":6274,"children":6275},{"style":160},[6276],{"type":34,"value":2860},{"type":29,"tag":117,"props":6278,"children":6279},{"style":378},[6280],{"type":34,"value":5988},{"type":29,"tag":117,"props":6282,"children":6283},{"style":160},[6284],{"type":34,"value":2877},{"type":29,"tag":117,"props":6286,"children":6287},{"style":372},[6288],{"type":34,"value":5997},{"type":29,"tag":117,"props":6290,"children":6291},{"style":384},[6292],{"type":34,"value":1108},{"type":29,"tag":117,"props":6294,"children":6295},{"style":5976},[6296],{"type":34,"value":6006},{"type":29,"tag":117,"props":6298,"children":6299},{"style":160},[6300],{"type":34,"value":2860},{"type":29,"tag":117,"props":6302,"children":6303},{"style":378},[6304],{"type":34,"value":5988},{"type":29,"tag":117,"props":6306,"children":6307},{"style":160},[6308],{"type":34,"value":2877},{"type":29,"tag":117,"props":6310,"children":6311},{"style":378},[6312],{"type":34,"value":6023},{"type":29,"tag":117,"props":6314,"children":6315},{"style":384},[6316],{"type":34,"value":2803},{"type":29,"tag":117,"props":6318,"children":6319},{"style":384},[6320],{"type":34,"value":3461},{"type":29,"tag":117,"props":6322,"children":6323},{"class":119,"line":130},[6324,6328,6332,6336,6341],{"type":29,"tag":117,"props":6325,"children":6326},{"style":143},[6327],{"type":34,"value":1136},{"type":29,"tag":117,"props":6329,"children":6330},{"style":378},[6331],{"type":34,"value":6023},{"type":29,"tag":117,"props":6333,"children":6334},{"style":384},[6335],{"type":34,"value":369},{"type":29,"tag":117,"props":6337,"children":6338},{"style":372},[6339],{"type":34,"value":6340},"stream",{"type":29,"tag":117,"props":6342,"children":6343},{"style":384},[6344],{"type":34,"value":6345},"()\n",{"type":29,"tag":117,"props":6347,"children":6348},{"class":119,"line":139},[6349,6354,6359,6363,6367,6372,6376,6380,6384,6388,6392],{"type":29,"tag":117,"props":6350,"children":6351},{"style":384},[6352],{"type":34,"value":6353},"                  .",{"type":29,"tag":117,"props":6355,"children":6356},{"style":372},[6357],{"type":34,"value":6358},"filter",{"type":29,"tag":117,"props":6360,"children":6361},{"style":384},[6362],{"type":34,"value":1108},{"type":29,"tag":117,"props":6364,"children":6365},{"style":378},[6366],{"type":34,"value":5590},{"type":29,"tag":117,"props":6368,"children":6369},{"style":143},[6370],{"type":34,"value":6371},"->",{"type":29,"tag":117,"props":6373,"children":6374},{"style":378},[6375],{"type":34,"value":5644},{"type":29,"tag":117,"props":6377,"children":6378},{"style":160},[6379],{"type":34,"value":6135},{"type":29,"tag":117,"props":6381,"children":6382},{"style":3476},[6383],{"type":34,"value":6140},{"type":29,"tag":117,"props":6385,"children":6386},{"style":160},[6387],{"type":34,"value":6145},{"type":29,"tag":117,"props":6389,"children":6390},{"style":3476},[6391],{"type":34,"value":6150},{"type":29,"tag":117,"props":6393,"children":6394},{"style":384},[6395],{"type":34,"value":1155},{"type":29,"tag":117,"props":6397,"children":6398},{"class":119,"line":172},[6399,6403,6408,6412,6417,6421,6426],{"type":29,"tag":117,"props":6400,"children":6401},{"style":384},[6402],{"type":34,"value":6353},{"type":29,"tag":117,"props":6404,"children":6405},{"style":372},[6406],{"type":34,"value":6407},"collect",{"type":29,"tag":117,"props":6409,"children":6410},{"style":384},[6411],{"type":34,"value":1108},{"type":29,"tag":117,"props":6413,"children":6414},{"style":378},[6415],{"type":34,"value":6416},"Collectors",{"type":29,"tag":117,"props":6418,"children":6419},{"style":384},[6420],{"type":34,"value":369},{"type":29,"tag":117,"props":6422,"children":6423},{"style":372},[6424],{"type":34,"value":6425},"toList",{"type":29,"tag":117,"props":6427,"children":6428},{"style":384},[6429],{"type":34,"value":6430},"());\n",{"type":29,"tag":117,"props":6432,"children":6433},{"class":119,"line":181},[6434],{"type":29,"tag":117,"props":6435,"children":6436},{"style":384},[6437],{"type":34,"value":2903},{"type":29,"tag":51,"props":6439,"children":6440},{},[],{"type":29,"tag":30,"props":6442,"children":6443},{},[6444],{"type":34,"value":6445},"Sur ce type de transformation, les streams Java gagnent presque toujours en lisibilité.",{"type":29,"tag":4530,"props":6447,"children":6449},{"id":6448},"cas-3-détection-de-bugs",[6450],{"type":34,"value":6451},"Cas 3 : Détection de Bugs",{"type":29,"tag":30,"props":6453,"children":6454},{},[6455],{"type":29,"tag":45,"props":6456,"children":6457},{},[6458],{"type":34,"value":5796},{"type":29,"tag":106,"props":6460,"children":6462},{"className":5519,"code":6461,"language":5521,"meta":8,"style":8},"public String getEmployeeStatus(Employee emp) {\n    if (emp.isActive()) {\n        return \"Active\";\n    }\n    return \"Inactive\";\n}\n",[6463],{"type":29,"tag":113,"props":6464,"children":6465},{"__ignoreMap":8},[6466,6505,6539,6555,6562,6578],{"type":29,"tag":117,"props":6467,"children":6468},{"class":119,"line":120},[6469,6473,6478,6483,6487,6492,6497,6501],{"type":29,"tag":117,"props":6470,"children":6471},{"style":143},[6472],{"type":34,"value":5541},{"type":29,"tag":117,"props":6474,"children":6475},{"style":5976},[6476],{"type":34,"value":6477}," String",{"type":29,"tag":117,"props":6479,"children":6480},{"style":372},[6481],{"type":34,"value":6482}," getEmployeeStatus",{"type":29,"tag":117,"props":6484,"children":6485},{"style":384},[6486],{"type":34,"value":1108},{"type":29,"tag":117,"props":6488,"children":6489},{"style":5976},[6490],{"type":34,"value":6491},"Employee",{"type":29,"tag":117,"props":6493,"children":6494},{"style":378},[6495],{"type":34,"value":6496}," emp",{"type":29,"tag":117,"props":6498,"children":6499},{"style":384},[6500],{"type":34,"value":2803},{"type":29,"tag":117,"props":6502,"children":6503},{"style":384},[6504],{"type":34,"value":3461},{"type":29,"tag":117,"props":6506,"children":6507},{"class":119,"line":130},[6508,6512,6516,6521,6525,6530,6535],{"type":29,"tag":117,"props":6509,"children":6510},{"style":143},[6511],{"type":34,"value":5581},{"type":29,"tag":117,"props":6513,"children":6514},{"style":384},[6515],{"type":34,"value":3181},{"type":29,"tag":117,"props":6517,"children":6518},{"style":378},[6519],{"type":34,"value":6520},"emp",{"type":29,"tag":117,"props":6522,"children":6523},{"style":384},[6524],{"type":34,"value":369},{"type":29,"tag":117,"props":6526,"children":6527},{"style":372},[6528],{"type":34,"value":6529},"isActive",{"type":29,"tag":117,"props":6531,"children":6532},{"style":384},[6533],{"type":34,"value":6534},"())",{"type":29,"tag":117,"props":6536,"children":6537},{"style":384},[6538],{"type":34,"value":3461},{"type":29,"tag":117,"props":6540,"children":6541},{"class":119,"line":139},[6542,6546,6551],{"type":29,"tag":117,"props":6543,"children":6544},{"style":143},[6545],{"type":34,"value":5616},{"type":29,"tag":117,"props":6547,"children":6548},{"style":166},[6549],{"type":34,"value":6550}," \"Active\"",{"type":29,"tag":117,"props":6552,"children":6553},{"style":384},[6554],{"type":34,"value":387},{"type":29,"tag":117,"props":6556,"children":6557},{"class":119,"line":172},[6558],{"type":29,"tag":117,"props":6559,"children":6560},{"style":384},[6561],{"type":34,"value":5632},{"type":29,"tag":117,"props":6563,"children":6564},{"class":119,"line":181},[6565,6569,6574],{"type":29,"tag":117,"props":6566,"children":6567},{"style":143},[6568],{"type":34,"value":1136},{"type":29,"tag":117,"props":6570,"children":6571},{"style":166},[6572],{"type":34,"value":6573}," \"Inactive\"",{"type":29,"tag":117,"props":6575,"children":6576},{"style":384},[6577],{"type":34,"value":387},{"type":29,"tag":117,"props":6579,"children":6580},{"class":119,"line":189},[6581],{"type":29,"tag":117,"props":6582,"children":6583},{"style":384},[6584],{"type":34,"value":2903},{"type":29,"tag":30,"props":6586,"children":6587},{},[6588],{"type":29,"tag":45,"props":6589,"children":6590},{},[6591],{"type":34,"value":5893},{"type":29,"tag":1585,"props":6593,"children":6594},{},[6595,6604],{"type":29,"tag":1589,"props":6596,"children":6597},{},[6598,6602],{"type":29,"tag":45,"props":6599,"children":6600},{},[6601],{"type":34,"value":5904},{"type":34,"value":6603}," : \"Le code distingue correctement les employés actifs des inactifs.\"",{"type":29,"tag":1589,"props":6605,"children":6606},{},[6607,6611,6613,6618,6620,6625,6627,6633],{"type":29,"tag":45,"props":6608,"children":6609},{},[6610],{"type":34,"value":5914},{"type":34,"value":6612}," : \"Attention à la nullité possible de l'objet ",{"type":29,"tag":113,"props":6614,"children":6616},{"className":6615},[],[6617],{"type":34,"value":6520},{"type":34,"value":6619},". Vous devriez vérifier si ",{"type":29,"tag":113,"props":6621,"children":6623},{"className":6622},[],[6624],{"type":34,"value":6520},{"type":34,"value":6626}," est non nul avant d'appeler ",{"type":29,"tag":113,"props":6628,"children":6630},{"className":6629},[],[6631],{"type":34,"value":6632},"emp.isActive()",{"type":34,"value":6634},".\"",{"type":29,"tag":106,"props":6636,"children":6638},{"className":5519,"code":6637,"language":5521,"meta":8,"style":8},"public String getEmployeeStatus(Employee emp) {\n    if (emp != null && emp.isActive()) {\n        return \"Active\";\n    }\n    return \"Inactive\";\n}\n",[6639],{"type":29,"tag":113,"props":6640,"children":6641},{"__ignoreMap":8},[6642,6677,6729,6744,6751,6766],{"type":29,"tag":117,"props":6643,"children":6644},{"class":119,"line":120},[6645,6649,6653,6657,6661,6665,6669,6673],{"type":29,"tag":117,"props":6646,"children":6647},{"style":143},[6648],{"type":34,"value":5541},{"type":29,"tag":117,"props":6650,"children":6651},{"style":5976},[6652],{"type":34,"value":6477},{"type":29,"tag":117,"props":6654,"children":6655},{"style":372},[6656],{"type":34,"value":6482},{"type":29,"tag":117,"props":6658,"children":6659},{"style":384},[6660],{"type":34,"value":1108},{"type":29,"tag":117,"props":6662,"children":6663},{"style":5976},[6664],{"type":34,"value":6491},{"type":29,"tag":117,"props":6666,"children":6667},{"style":378},[6668],{"type":34,"value":6496},{"type":29,"tag":117,"props":6670,"children":6671},{"style":384},[6672],{"type":34,"value":2803},{"type":29,"tag":117,"props":6674,"children":6675},{"style":384},[6676],{"type":34,"value":3461},{"type":29,"tag":117,"props":6678,"children":6679},{"class":119,"line":130},[6680,6684,6688,6693,6698,6704,6709,6713,6717,6721,6725],{"type":29,"tag":117,"props":6681,"children":6682},{"style":143},[6683],{"type":34,"value":5581},{"type":29,"tag":117,"props":6685,"children":6686},{"style":384},[6687],{"type":34,"value":3181},{"type":29,"tag":117,"props":6689,"children":6690},{"style":378},[6691],{"type":34,"value":6692},"emp ",{"type":29,"tag":117,"props":6694,"children":6695},{"style":160},[6696],{"type":34,"value":6697},"!=",{"type":29,"tag":117,"props":6699,"children":6701},{"style":6700},"--shiki-default:#E78284;--shiki-dark:#79B8FF",[6702],{"type":34,"value":6703}," null",{"type":29,"tag":117,"props":6705,"children":6706},{"style":160},[6707],{"type":34,"value":6708}," &&",{"type":29,"tag":117,"props":6710,"children":6711},{"style":378},[6712],{"type":34,"value":6496},{"type":29,"tag":117,"props":6714,"children":6715},{"style":384},[6716],{"type":34,"value":369},{"type":29,"tag":117,"props":6718,"children":6719},{"style":372},[6720],{"type":34,"value":6529},{"type":29,"tag":117,"props":6722,"children":6723},{"style":384},[6724],{"type":34,"value":6534},{"type":29,"tag":117,"props":6726,"children":6727},{"style":384},[6728],{"type":34,"value":3461},{"type":29,"tag":117,"props":6730,"children":6731},{"class":119,"line":139},[6732,6736,6740],{"type":29,"tag":117,"props":6733,"children":6734},{"style":143},[6735],{"type":34,"value":5616},{"type":29,"tag":117,"props":6737,"children":6738},{"style":166},[6739],{"type":34,"value":6550},{"type":29,"tag":117,"props":6741,"children":6742},{"style":384},[6743],{"type":34,"value":387},{"type":29,"tag":117,"props":6745,"children":6746},{"class":119,"line":172},[6747],{"type":29,"tag":117,"props":6748,"children":6749},{"style":384},[6750],{"type":34,"value":5632},{"type":29,"tag":117,"props":6752,"children":6753},{"class":119,"line":181},[6754,6758,6762],{"type":29,"tag":117,"props":6755,"children":6756},{"style":143},[6757],{"type":34,"value":1136},{"type":29,"tag":117,"props":6759,"children":6760},{"style":166},[6761],{"type":34,"value":6573},{"type":29,"tag":117,"props":6763,"children":6764},{"style":384},[6765],{"type":34,"value":387},{"type":29,"tag":117,"props":6767,"children":6768},{"class":119,"line":189},[6769],{"type":29,"tag":117,"props":6770,"children":6771},{"style":384},[6772],{"type":34,"value":2903},{"type":29,"tag":55,"props":6774,"children":6776},{"id":6775},"tips-et-astuces-pour-une-revue-de-code-efficace",[6777],{"type":34,"value":6778},"Tips et Astuces pour une Revue de Code Efficace",{"type":29,"tag":4530,"props":6780,"children":6782},{"id":6781},"outils-recommandés",[6783],{"type":34,"value":6784},"Outils Recommandés",{"type":29,"tag":1585,"props":6786,"children":6787},{},[6788,6798,6808],{"type":29,"tag":1589,"props":6789,"children":6790},{},[6791,6796],{"type":29,"tag":45,"props":6792,"children":6793},{},[6794],{"type":34,"value":6795},"GitHub",{"type":34,"value":6797}," : Parfait pour la gestion de versions et les revues de code intégrées.",{"type":29,"tag":1589,"props":6799,"children":6800},{},[6801,6806],{"type":29,"tag":45,"props":6802,"children":6803},{},[6804],{"type":34,"value":6805},"Crucible",{"type":34,"value":6807}," : Un outil de revue de code collaboratif, souvent utilisé dans les équipes.",{"type":29,"tag":1589,"props":6809,"children":6810},{},[6811,6818],{"type":29,"tag":45,"props":6812,"children":6813},{},[6814],{"type":29,"tag":453,"props":6815,"children":6816},{"href":841},[6817],{"type":34,"value":4613},{"type":34,"value":6819}," : Idéal pour l'analyse statique du code et la détection automatique des erreurs.",{"type":29,"tag":4530,"props":6821,"children":6823},{"id":6822},"stratégies-pour-une-revue-de-code-réussie",[6824],{"type":34,"value":6825},"Stratégies pour une Revue de Code Réussie",{"type":29,"tag":1585,"props":6827,"children":6828},{},[6829,6839,6849],{"type":29,"tag":1589,"props":6830,"children":6831},{},[6832,6837],{"type":29,"tag":45,"props":6833,"children":6834},{},[6835],{"type":34,"value":6836},"Fixez des limites de temps",{"type":34,"value":6838}," : Ne passez pas trop de temps sur une seule revue de code. 30 minutes est un bon point de départ.",{"type":29,"tag":1589,"props":6840,"children":6841},{},[6842,6847],{"type":29,"tag":45,"props":6843,"children":6844},{},[6845],{"type":34,"value":6846},"Soyez respectueux et constructif",{"type":34,"value":6848}," : Rappelez-vous que le but est d'améliorer le code, pas de critiquer la personne.",{"type":29,"tag":1589,"props":6850,"children":6851},{},[6852,6857],{"type":29,"tag":45,"props":6853,"children":6854},{},[6855],{"type":34,"value":6856},"Documentez les bonnes pratiques",{"type":34,"value":6858}," : Si un même type d'erreur revient souvent, envisagez de créer un guide de style pour votre équipe.",{"type":29,"tag":55,"props":6860,"children":6862},{"id":6861},"checklist-minimale-pour-une-revue-sérieuse",[6863],{"type":34,"value":6864},"Checklist minimale pour une revue sérieuse",{"type":29,"tag":30,"props":6866,"children":6867},{},[6868],{"type":34,"value":6869},"Les checklists à trente points ne sont jamais utilisées : trop longues à dérouler, trop génériques pour être actionnables. Voici les cinq blocs réellement à couvrir sur un changement Java, dans l'ordre de priorité.",{"type":29,"tag":30,"props":6871,"children":6872},{},[6873,6878,6880,6885],{"type":29,"tag":45,"props":6874,"children":6875},{},[6876],{"type":34,"value":6877},"1. Le code fait-il ce qui est attendu ?",{"type":34,"value":6879},"\nAvant tout le reste : la fonctionnalité couvre-t-elle les cas nominaux ",{"type":29,"tag":5410,"props":6881,"children":6882},{},[6883],{"type":34,"value":6884},"et",{"type":34,"value":6886}," les cas limites ? Les exceptions sont-elles gérées ? Le diff répond-il vraiment au besoin de la PR, ou couvre-t-il plus de scope que prévu ?",{"type":29,"tag":30,"props":6888,"children":6889},{},[6890,6895],{"type":29,"tag":45,"props":6891,"children":6892},{},[6893],{"type":34,"value":6894},"2. Tests : présents, ciblés, utiles ?",{"type":34,"value":6896},"\nPas de tests = pas de merge sur du code non trivial. Quand les tests existent, valent-ils mieux que des assertions tautologiques ? Couvrent-ils les cas qui cassent vraiment ?",{"type":29,"tag":30,"props":6898,"children":6899},{},[6900,6905],{"type":29,"tag":45,"props":6901,"children":6902},{},[6903],{"type":34,"value":6904},"3. Lisibilité et nommage",{"type":34,"value":6906},"\nUn autre développeur comprendra-t-il ce code dans six mois sans contexte ? Les noms expriment-ils l'intention ? Les méthodes longues sont-elles découpées ? Le code suit-il les conventions du projet ?",{"type":29,"tag":30,"props":6908,"children":6909},{},[6910,6915,6917,6923],{"type":29,"tag":45,"props":6911,"children":6912},{},[6913],{"type":34,"value":6914},"4. Conception et impact",{"type":34,"value":6916},"\nLe changement respecte-t-il les ",{"type":29,"tag":453,"props":6918,"children":6920},{"href":6919},"\u002Ffr\u002Farchitecture-craft\u002Fprincipes-solid-java-exemples",[6921],{"type":34,"value":6922},"principes SOLID",{"type":34,"value":6924}," et l'architecture du projet ? Introduit-il du couplage évitable ? A-t-il des effets de bord sur d'autres modules ?",{"type":29,"tag":30,"props":6926,"children":6927},{},[6928,6933],{"type":29,"tag":45,"props":6929,"children":6930},{},[6931],{"type":34,"value":6932},"5. Sécurité et performance, sur les zones sensibles",{"type":34,"value":6934},"\nValidation des entrées utilisateur, gestion des secrets, requêtes SQL paramétrées. Sur les chemins critiques : algorithmique raisonnable, pas de N+1 sur les requêtes BDD, pas d'opérations bloquantes dans des sections asynchrones.",{"type":29,"tag":5462,"props":6936,"children":6937},{"type":5464},[6938],{"type":29,"tag":30,"props":6939,"children":6940},{},[6941,6943,6949],{"type":34,"value":6942},"Téléchargez la version complète de cette checklist (PDF imprimable) en ",{"type":29,"tag":453,"props":6944,"children":6946},{"href":6945},"\u002Fressources\u002FChecklist-de-revue-de-code.pdf",[6947],{"type":34,"value":6948},"cliquant ici",{"type":34,"value":369},{"type":29,"tag":567,"props":6951,"children":6953},{"cta":805,"href":806,"title":6952,"type":808},"Une revue rigoureuse n'est qu'une pratique sur les 100 que j'applique",[6954],{"type":29,"tag":30,"props":6955,"children":6956},{},[6957],{"type":34,"value":6958},"La checklist de cet article décrit une seule discipline du craft : savoir relire du code et formuler un feedback qui fait progresser. Le Craft Bundle réunit les 100 pratiques que j'applique pour écrire et faire écrire du code propre, celles que l'IA ne vous apprendra jamais parce qu'elle ne les a jamais vues tenir en production sur la durée.",{"type":29,"tag":51,"props":6960,"children":6961},{},[],{"type":29,"tag":55,"props":6963,"children":6965},{"id":6964},"questions-fréquentes",[6966],{"type":34,"value":6967},"Questions fréquentes",{"type":29,"tag":825,"props":6969,"children":6970},{},[6971,6976],{"type":29,"tag":829,"props":6972,"children":6973},{},[6974],{"type":34,"value":6975},"Combien de temps consacrer à une revue ?",{"type":29,"tag":30,"props":6977,"children":6978},{},[6979],{"type":34,"value":6980},"Au-delà de 60 minutes en continu, l'attention chute et les remarques deviennent superficielles. Mieux vaut deux sessions de 30 minutes étalées qu'une marathon d'une heure et demie. Sur des PR trop grosses, demander un découpage est presque toujours la bonne réponse.",{"type":29,"tag":825,"props":6982,"children":6983},{},[6984,6989],{"type":29,"tag":829,"props":6985,"children":6986},{},[6987],{"type":34,"value":6988},"Que faire en cas de désaccord persistant avec un reviewer ?",{"type":29,"tag":30,"props":6990,"children":6991},{},[6992],{"type":34,"value":6993},"Sortir du commentaire écrit, passer à un échange de cinq minutes en visio ou en face à face. La plupart des désaccords viennent d'un contexte implicite que l'un des deux n'a pas. Si le désaccord persiste après échange, escalader à un troisième regard plutôt que d'enliser la PR.",{"type":29,"tag":825,"props":6995,"children":6996},{},[6997,7002],{"type":29,"tag":829,"props":6998,"children":6999},{},[7000],{"type":34,"value":7001},"Comment monter en compétences sur les revues ?",{"type":29,"tag":30,"props":7003,"children":7004},{},[7005],{"type":34,"value":7006},"Lire activement le code des autres, pas seulement le sien. Regarder les PR mergées sur des projets open source matures. En interne, demander à pair-reviewer avec un développeur plus senior pendant deux semaines : c'est l'accélérateur le plus efficace.",{"type":29,"tag":825,"props":7008,"children":7009},{},[7010,7015],{"type":29,"tag":829,"props":7011,"children":7012},{},[7013],{"type":34,"value":7014},"Quels outils pour structurer le processus ?",{"type":29,"tag":30,"props":7016,"children":7017},{},[7018,7020,7024],{"type":34,"value":7019},"GitHub ou GitLab pour la mécanique de PR. ",{"type":29,"tag":453,"props":7021,"children":7022},{"href":841},[7023],{"type":34,"value":4613},{"type":34,"value":7025}," en complément pour l'analyse statique, qui prend en charge les vérifications mécaniques (duplication, vulnérabilités CVE, complexité cyclomatique), ce qui libère le reviewer humain pour les questions de conception.",{"type":29,"tag":567,"props":7027,"children":7030},{"cta":7028,"href":918,"title":7029,"type":920},"Accéder au template gratuit →","Ressource gratuite : Faites votre propre audit engineering en 2 heures",[7031],{"type":29,"tag":30,"props":7032,"children":7033},{},[7034],{"type":34,"value":7035},"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":928,"props":7037,"children":7038},{},[7039],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":7041},[7042,7043,7048,7051,7056,7060,7061],{"id":5419,"depth":130,"text":5422},{"id":5473,"depth":130,"text":5476,"children":7044},[7045,7046,7047],{"id":5479,"depth":139,"text":5482},{"id":5508,"depth":139,"text":5511},{"id":5685,"depth":139,"text":5688},{"id":5705,"depth":130,"text":5708,"children":7049},[7050],{"id":5763,"depth":139,"text":5766},{"id":5774,"depth":130,"text":5777,"children":7052},[7053,7054,7055],{"id":5785,"depth":139,"text":5788},{"id":5949,"depth":139,"text":5952},{"id":6448,"depth":139,"text":6451},{"id":6775,"depth":130,"text":6778,"children":7057},[7058,7059],{"id":6781,"depth":139,"text":6784},{"id":6822,"depth":139,"text":6825},{"id":6861,"depth":130,"text":6864},{"id":6964,"depth":130,"text":6967},"content:fr:dette-technique:revue-de-code-java-guide-exemples.md","fr\u002Fdette-technique\u002Frevue-de-code-java-guide-exemples.md","fr\u002Fdette-technique\u002Frevue-de-code-java-guide-exemples",{"_path":7066,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":7067,"description":7068,"id":7069,"date":7070,"listed":13,"nocomments":7,"hidden":7,"categories":7071,"tags":7072,"cover":7073,"readingTime":7074,"body":7079,"_type":942,"_id":7473,"_source":944,"_file":7474,"_stem":7475,"_extension":947},"\u002Ffr\u002Fdette-technique\u002Floi-norvig-maitrise-theorie-pratique","Loi de Norvig, Maîtriser le Développement à travers la Pratique et la Théorie","Découvrez comment équilibrer théorie et pratique avec la Loi de Norvig, et améliorez vos compétences en tant que développeur. Comparez avec le software craftsmanship...",51,"2024-08-28",[1765],[5391,18],"covers\u002Farticles\u002Floi-de-norvig.jpg",{"text":7075,"minutes":7076,"time":7077,"words":7078},"6 min read",5.77,346200,1154,{"type":26,"children":7080,"toc":7452},[7081,7090,7095,7107,7110,7119,7140,7149,7154,7163,7177,7186,7209,7229,7232,7241,7250,7255,7266,7271,7282,7287,7297,7307,7312,7323,7344,7355,7360,7369,7378,7381,7390,7414,7427,7440,7443],{"type":29,"tag":55,"props":7082,"children":7084},{"id":7083},"loi-de-norvig-maîtriser-le-développement-à-travers-la-pratique-et-la-théorie",[7085],{"type":29,"tag":45,"props":7086,"children":7087},{},[7088],{"type":34,"value":7089},"Loi de Norvig : Maîtriser le Développement à travers la Pratique et la Théorie",{"type":29,"tag":30,"props":7091,"children":7092},{},[7093],{"type":34,"value":7094},"Sentiment partagé par beaucoup de développeurs après quelques années de métier : plusieurs langages maîtrisés, des bugs résolus efficacement, et pourtant l'impression de stagner. \"Est-ce que je progresse vraiment ?\". Dans les DSI que j'accompagne, j'ai vu ce déséquilibre freiner des équipes entières : des développeurs compétents bloqués à un même palier, faute d'apprentissage structuré. Conséquence opérationnelle : délais de livraison qui s'allongent, dette technique qui s'accumule.",{"type":29,"tag":30,"props":7096,"children":7097},{},[7098,7100,7105],{"type":34,"value":7099},"La ",{"type":29,"tag":45,"props":7101,"children":7102},{},[7103],{"type":34,"value":7104},"Loi de Norvig",{"type":34,"value":7106}," pointe la cause : pour maîtriser une compétence technique, la pratique doit s'appuyer sur une compréhension théorique solide. La répétition seule ne franchit pas les paliers. Anders Ericsson, dont les travaux sur la pratique délibérée ont inspiré Peter Norvig, montre que c'est la qualité de l'effort qui fait la différence, pas la quantité brute d'heures.",{"type":29,"tag":51,"props":7108,"children":7109},{},[],{"type":29,"tag":55,"props":7111,"children":7113},{"id":7112},"comparaison-entre-la-loi-de-norvig-et-le-software-craftsmanship",[7114],{"type":29,"tag":45,"props":7115,"children":7116},{},[7117],{"type":34,"value":7118},"Comparaison entre la Loi de Norvig et le Software Craftsmanship",{"type":29,"tag":30,"props":7120,"children":7121},{},[7122,7123,7127,7129,7138],{"type":34,"value":7099},{"type":29,"tag":45,"props":7124,"children":7125},{},[7126],{"type":34,"value":7104},{"type":34,"value":7128}," et le ",{"type":29,"tag":45,"props":7130,"children":7131},{},[7132],{"type":29,"tag":453,"props":7133,"children":7135},{"href":7134},"\u002Ffr\u002Fdette-technique\u002Fsoftware-craftsmanship-principes-exemples-java",[7136],{"type":34,"value":7137},"software craftsmanship",{"type":34,"value":7139}," partagent un objectif commun : atteindre l'excellence dans la création de logiciels. Pourtant, ces deux concepts abordent la question de manière différente.",{"type":29,"tag":4530,"props":7141,"children":7143},{"id":7142},"loi-de-norvig-équilibre-entre-théorie-et-pratique",[7144],{"type":29,"tag":45,"props":7145,"children":7146},{},[7147],{"type":34,"value":7148},"Loi de Norvig : Équilibre entre théorie et pratique",{"type":29,"tag":30,"props":7150,"children":7151},{},[7152],{"type":34,"value":7153},"Selon Peter Norvig, il faut environ dix ans pour maîtriser un domaine technique. Cette durée n'est pas seulement une question de pratique répétée. La Loi de Norvig stipule que pour progresser, il faut non seulement pratiquer régulièrement, mais aussi approfondir les concepts théoriques sous-jacents. La pratique seule, sans compréhension de la théorie, peut entraîner des habitudes inefficaces. À l’inverse, trop se concentrer sur la théorie, sans application concrète, peut limiter la capacité à résoudre des problèmes réels.",{"type":29,"tag":4530,"props":7155,"children":7157},{"id":7156},"software-craftsmanship-lart-du-développement-logiciel",[7158],{"type":29,"tag":45,"props":7159,"children":7160},{},[7161],{"type":34,"value":7162},"Software Craftsmanship : L’art du développement logiciel",{"type":29,"tag":30,"props":7164,"children":7165},{},[7166,7168,7175],{"type":34,"value":7167},"Le ",{"type":29,"tag":45,"props":7169,"children":7170},{},[7171],{"type":29,"tag":453,"props":7172,"children":7173},{"href":7134},[7174],{"type":34,"value":7137},{"type":34,"value":7176}," est une philosophie qui prône l'idée que le développement logiciel est un artisanat. Il met l'accent sur la qualité du code, la collaboration, et l’amélioration continue à travers la pratique. Les développeurs sont encouragés à considérer leur travail comme un art, en perfectionnant constamment leurs compétences par l'expérience, la révision de code, et le mentorat.",{"type":29,"tag":4530,"props":7178,"children":7180},{"id":7179},"comparaison-clé",[7181],{"type":29,"tag":45,"props":7182,"children":7183},{},[7184],{"type":34,"value":7185},"Comparaison clé",{"type":29,"tag":1585,"props":7187,"children":7188},{},[7189,7199],{"type":29,"tag":1589,"props":7190,"children":7191},{},[7192,7193,7197],{"type":34,"value":7099},{"type":29,"tag":45,"props":7194,"children":7195},{},[7196],{"type":34,"value":7104},{"type":34,"value":7198}," insiste sur l’importance d’un apprentissage équilibré : pratiquer, mais aussi comprendre pourquoi vous faites ce que vous faites.",{"type":29,"tag":1589,"props":7200,"children":7201},{},[7202,7203,7207],{"type":34,"value":7167},{"type":29,"tag":45,"props":7204,"children":7205},{},[7206],{"type":34,"value":7137},{"type":34,"value":7208}," se concentre plus sur l'amélioration continue à travers la pratique consciente et la qualité du travail. L'aspect théorique y est moins présent, bien qu'il soit implicite dans la quête de perfectionnement.",{"type":29,"tag":30,"props":7210,"children":7211},{},[7212,7214,7218,7220,7227],{"type":34,"value":7213},"Les deux approches reconnaissent la nécessité de persévérance et de discipline, mais là où la ",{"type":29,"tag":45,"props":7215,"children":7216},{},[7217],{"type":34,"value":7104},{"type":34,"value":7219}," vous pousse à constamment réfléchir aux principes théoriques, le ",{"type":29,"tag":45,"props":7221,"children":7222},{},[7223],{"type":29,"tag":453,"props":7224,"children":7225},{"href":7134},[7226],{"type":34,"value":7137},{"type":34,"value":7228}," vous invite à adopter une mentalité d'artisan, où la qualité du produit fini et la transmission des connaissances sont prioritaires.",{"type":29,"tag":51,"props":7230,"children":7231},{},[],{"type":29,"tag":567,"props":7233,"children":7235},{"cta":569,"href":570,"title":7234,"type":572},"Vous pratiquez beaucoup mais vous sentez que vous stagnez sur le même palier ?",[7236],{"type":29,"tag":30,"props":7237,"children":7238},{},[7239],{"type":34,"value":7240},"La pratique délibérée ne s'improvise pas seul : c'est exactement ce que je travaille avec vous en mentoring 1:1. On cible les concepts que vous répétez sans vraiment les comprendre, on relit votre code ensemble, et on transforme vos heures de code en vraie montée en niveau. Vous arrêtez de tourner en rond et vous voyez enfin pourquoi vos solutions tiennent (ou pas).",{"type":29,"tag":55,"props":7242,"children":7244},{"id":7243},"plan-daction-pour-équilibrer-théorie-et-pratique",[7245],{"type":29,"tag":45,"props":7246,"children":7247},{},[7248],{"type":34,"value":7249},"Plan d'action pour équilibrer théorie et pratique",{"type":29,"tag":30,"props":7251,"children":7252},{},[7253],{"type":34,"value":7254},"Pas d'accumulation aveugle d'heures de code. Pas non plus de bibliographie infinie sans application. Un équilibre travaillé entre les deux. Voici un plan concret en cinq axes.",{"type":29,"tag":4530,"props":7256,"children":7258},{"id":7257},"_1-pratique-délibérée-coder-avec-un-but-précis",[7259,7261],{"type":34,"value":7260},"1. ",{"type":29,"tag":45,"props":7262,"children":7263},{},[7264],{"type":34,"value":7265},"Pratique délibérée : coder avec un but précis",{"type":29,"tag":30,"props":7267,"children":7268},{},[7269],{"type":34,"value":7270},"La pratique n'est efficace que lorsqu'elle est intentionnelle. Ciblez des compétences spécifiques au lieu d'écrire du code sans réfléchir. Difficulté avec la gestion des exceptions ? Consacrez une session entière à des scénarios qui vous forcent à explorer plusieurs approches. Posez-vous les bonnes questions : \"Pourquoi cette solution marche-t-elle ici ?\", \"Quelles sont ses limites ?\". Prenez une tâche que vous faites souvent (intégration d'API, accès à une base) et explorez plusieurs implémentations en pesant les compromis de chacune.",{"type":29,"tag":4530,"props":7272,"children":7274},{"id":7273},"_2-étudier-la-théorie-comprendre-les-fondations",[7275,7277],{"type":34,"value":7276},"2. ",{"type":29,"tag":45,"props":7278,"children":7279},{},[7280],{"type":34,"value":7281},"Étudier la théorie : comprendre les fondations",{"type":29,"tag":30,"props":7283,"children":7284},{},[7285],{"type":34,"value":7286},"Pour chaque session de pratique, comprenez le concept sous-jacent. Si vous travaillez sur des algorithmes de tri, lisez ou relisez leurs principes. Pourquoi le tri rapide bat-il souvent le tri par insertion ? Comprendre les nuances théoriques vous donne le levier pour adapter les solutions à des contextes variés. Fixez-vous un objectif simple : approfondir au moins un concept théorique par semaine, via un livre, un papier ou une conférence sérieuse.",{"type":29,"tag":30,"props":7288,"children":7289},{},[7290,7295],{"type":29,"tag":45,"props":7291,"children":7292},{},[7293],{"type":34,"value":7294},"Conseil",{"type":34,"value":7296}," : un ratio de départ raisonnable est 70 % de pratique, 30 % de théorie. À ajuster selon vos besoins.",{"type":29,"tag":4530,"props":7298,"children":7300},{"id":7299},"_3-appliquer-immédiatement-la-théorie",[7301,7302],{"type":34,"value":1956},{"type":29,"tag":45,"props":7303,"children":7304},{},[7305],{"type":34,"value":7306},"Appliquer immédiatement la théorie",{"type":29,"tag":30,"props":7308,"children":7309},{},[7310],{"type":34,"value":7311},"Un concept appris non appliqué s'évapore en quelques jours. Dès que vous découvrez quelque chose, intégrez-le à un projet pratique. Étudié les structures de données ? Implémentez-les dans une petite app où chaque fonctionnalité incarne un concept que vous voulez ancrer. C'est la meilleure garantie que vous avez vraiment compris.",{"type":29,"tag":4530,"props":7313,"children":7315},{"id":7314},"_4-revoir-partager-demander-des-retours",[7316,7318],{"type":34,"value":7317},"4. ",{"type":29,"tag":45,"props":7319,"children":7320},{},[7321],{"type":34,"value":7322},"Revoir, partager, demander des retours",{"type":29,"tag":30,"props":7324,"children":7325},{},[7326,7328,7335,7337,7342],{"type":34,"value":7327},"Le perfectionnement passe par la révision. Relisez votre code, identifiez les inefficacités, corrigez-les. C'est aussi le moment de chercher du feedback : pair, mentor, communauté. C'est là que le ",{"type":29,"tag":45,"props":7329,"children":7330},{},[7331],{"type":29,"tag":453,"props":7332,"children":7333},{"href":7134},[7334],{"type":34,"value":7137},{"type":34,"value":7336}," rejoint Norvig : amélioration continue et transmission. Un mentor accélère la progression en pointant les angles morts. Un forum ou un meetup expose à des pratiques que vous n'auriez pas explorées seul. Pratiquez régulièrement la ",{"type":29,"tag":453,"props":7338,"children":7339},{"href":5},[7340],{"type":34,"value":7341},"revue de code",{"type":34,"value":7343}," avec vos pairs.",{"type":29,"tag":4530,"props":7345,"children":7347},{"id":7346},"_5-suivre-les-progrès-et-ajuster",[7348,7350],{"type":34,"value":7349},"5. ",{"type":29,"tag":45,"props":7351,"children":7352},{},[7353],{"type":34,"value":7354},"Suivre les progrès et ajuster",{"type":29,"tag":30,"props":7356,"children":7357},{},[7358],{"type":34,"value":7359},"Fixez-vous des objectifs courts et longs termes : méthode SMART si ça vous parle (\"Implémenter trois algos de tri dans deux semaines\" plutôt que \"progresser en algorithmique\"). Tenez un journal d'apprentissage : concepts étudiés, projets réalisés, ce qui a marché, ce qui a coincé. Bilan mensuel pour réorienter la méthode si nécessaire. Et célébrez les petites victoires, la stagnation est souvent un problème de perception, pas de progrès.",{"type":29,"tag":30,"props":7361,"children":7362},{},[7363,7367],{"type":29,"tag":45,"props":7364,"children":7365},{},[7366],{"type":34,"value":7294},{"type":34,"value":7368}," : adoptez une mentalité de croissance. Chaque erreur est de l'information, pas un échec. Prenez le temps de comprendre pourquoi une difficulté est apparue et comment l'éviter ensuite.",{"type":29,"tag":567,"props":7370,"children":7372},{"cta":805,"href":806,"title":7371,"type":808},"La pratique délibérée appliquée au code propre : voici les 100 pratiques que je vise",[7373],{"type":29,"tag":30,"props":7374,"children":7375},{},[7376],{"type":34,"value":7377},"Cet article montre comment équilibrer théorie et pratique pour franchir vos paliers. Le Craft Bundle va plus loin : il réunit les 100 pratiques craft que j'applique au quotidien pour coder propre, celles que la pratique délibérée vous ferait découvrir en dix ans. Ce sont précisément les pratiques que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues tenir en production.",{"type":29,"tag":51,"props":7379,"children":7380},{},[],{"type":29,"tag":55,"props":7382,"children":7384},{"id":7383},"faq-sur-la-loi-de-norvig-et-le-software-craftsmanship",[7385],{"type":29,"tag":45,"props":7386,"children":7387},{},[7388],{"type":34,"value":7389},"FAQ sur la Loi de Norvig et le Software Craftsmanship",{"type":29,"tag":825,"props":7391,"children":7392},{},[7393,7398],{"type":29,"tag":829,"props":7394,"children":7395},{},[7396],{"type":34,"value":7397},"1. En quoi la Loi de Norvig se distingue-t-elle du software craftsmanship ?",{"type":29,"tag":30,"props":7399,"children":7400},{},[7401,7402,7406,7408,7412],{"type":34,"value":7099},{"type":29,"tag":45,"props":7403,"children":7404},{},[7405],{"type":34,"value":7104},{"type":34,"value":7407}," insiste sur l'équilibre théorie\u002Fpratique comme moteur de la maîtrise. Le ",{"type":29,"tag":45,"props":7409,"children":7410},{},[7411],{"type":34,"value":7137},{"type":34,"value":7413}," se concentre sur l'amélioration continue du code et la qualité du travail via la pratique, la collaboration et le mentorat. Les deux sont complémentaires : Norvig structure l'apprentissage, le craftsmanship installe une mentalité d'artisan.",{"type":29,"tag":825,"props":7415,"children":7416},{},[7417,7422],{"type":29,"tag":829,"props":7418,"children":7419},{},[7420],{"type":34,"value":7421},"2. Comment éviter de me perdre dans la théorie sans fin ?",{"type":29,"tag":30,"props":7423,"children":7424},{},[7425],{"type":34,"value":7426},"En appliquant immédiatement chaque concept étudié à un projet pratique. C'est ce qui ancre la connaissance et coupe court à l'abstraction stérile. Norvig ne dit pas \"lisez plus\", il dit \"comprenez ce que vous pratiquez\".",{"type":29,"tag":825,"props":7428,"children":7429},{},[7430,7435],{"type":29,"tag":829,"props":7431,"children":7432},{},[7433],{"type":34,"value":7434},"3. Quels outils ou ressources pour ce plan d'action ?",{"type":29,"tag":30,"props":7436,"children":7437},{},[7438],{"type":34,"value":7439},"Côté théorie : livres techniques de référence, papiers académiques accessibles, conférences sérieuses (Coursera, Udemy, MIT OCW selon le domaine). Côté pratique : projets personnels, challenges de code (LeetCode, HackerRank), revues de code en communauté ou avec un mentor.",{"type":29,"tag":51,"props":7441,"children":7442},{},[],{"type":29,"tag":567,"props":7444,"children":7446},{"cta":3878,"href":918,"title":7445,"type":920},"Ressource gratuite : Votre équipe est-elle vraiment prête pour l'IA ?",[7447],{"type":29,"tag":30,"props":7448,"children":7449},{},[7450],{"type":34,"value":7451},"25 questions, 5 dimensions, score de maturité IA sur 25. La maîtrise technique est la fondation de l'adoption de l'IA : identifiez vos 3 gaps critiques avant de scaler vos outils.",{"title":8,"searchDepth":130,"depth":130,"links":7453},[7454,7455,7460,7472],{"id":7083,"depth":130,"text":7089},{"id":7112,"depth":130,"text":7118,"children":7456},[7457,7458,7459],{"id":7142,"depth":139,"text":7148},{"id":7156,"depth":139,"text":7162},{"id":7179,"depth":139,"text":7185},{"id":7243,"depth":130,"text":7249,"children":7461},[7462,7464,7466,7468,7470],{"id":7257,"depth":139,"text":7463},"1. Pratique délibérée : coder avec un but précis",{"id":7273,"depth":139,"text":7465},"2. Étudier la théorie : comprendre les fondations",{"id":7299,"depth":139,"text":7467},"3. Appliquer immédiatement la théorie",{"id":7314,"depth":139,"text":7469},"4. Revoir, partager, demander des retours",{"id":7346,"depth":139,"text":7471},"5. Suivre les progrès et ajuster",{"id":7383,"depth":130,"text":7389},"content:fr:dette-technique:loi-norvig-maitrise-theorie-pratique.md","fr\u002Fdette-technique\u002Floi-norvig-maitrise-theorie-pratique.md","fr\u002Fdette-technique\u002Floi-norvig-maitrise-theorie-pratique",{"_path":7477,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":7478,"description":7479,"id":7480,"date":7481,"listed":13,"nocomments":7,"hidden":7,"categories":7482,"tags":7483,"cover":7484,"readingTime":7485,"body":7490,"_type":942,"_id":12661,"_source":944,"_file":12662,"_stem":12663,"_extension":947},"\u002Ffr\u002Fdette-technique\u002Fcomment-ecrire-du-code-evolutif-en-developpement-logiciel","Comment écrire du code évolutif en développement logiciel - Bonnes pratiques et exemples Java","Découvrez comment écrire du code évolutif pour faciliter la maintenance et l'extension de vos projets. Apprenez les bonnes pratiques en développement...",50,"2024-07-01",[1765],[5391,18],"covers\u002Farticles\u002Fcode-evolutif.jpg",{"text":7486,"minutes":7487,"time":7488,"words":7489},"14 min read",13.325,799500,2665,{"type":26,"children":7491,"toc":12640},[7492,7498,7503,7508,7511,7517,7522,7527,7534,7539,7545,7557,7962,7974,7977,7986,7992,7997,8003,8008,8368,8373,8379,8390,8513,8519,8524,8543,8794,8807,8810,8816,8821,8827,8838,9117,9123,9134,9167,9412,9418,9429,9915,9921,9933,9957,10302,10305,10311,10316,10322,10342,10348,10732,10738,10743,11235,11255,11261,11273,11278,11423,11450,11455,11473,11673,11692,11934,11940,11952,11958,12098,12104,12123,12470,12482,12491,12494,12500,12556,12569,12610,12613,12619,12624,12627,12636],{"type":29,"tag":55,"props":7493,"children":7495},{"id":7494},"comment-écrire-du-code-évolutif-en-développement-logiciel-les-bonnes-pratiques-et-exemples-en-java",[7496],{"type":34,"value":7497},"Comment écrire du code évolutif en développement logiciel : Les bonnes pratiques et exemples en Java",{"type":29,"tag":30,"props":7499,"children":7500},{},[7501],{"type":34,"value":7502},"Sur les projets long terme (j'en ai vu des dizaines dans la banque et l'assurance) un symptôme revient. Une modif anodine, et trois écrans plus loin, une régression. Le code n'a pas été conçu pour bouger. Il fonctionne, mais il résiste au changement.",{"type":29,"tag":30,"props":7504,"children":7505},{},[7506],{"type":34,"value":7507},"C'est exactement ce qu'on appelle un code non évolutif. Et c'est rattrapable, à condition de se discipliner sur quelques principes. L'article qui suit montre les pratiques que j'applique en mission, avec des exemples Java concrets.",{"type":29,"tag":51,"props":7509,"children":7510},{},[],{"type":29,"tag":55,"props":7512,"children":7514},{"id":7513},"quest-ce-que-le-code-évolutif",[7515],{"type":34,"value":7516},"Qu'est-ce que le code évolutif ?",{"type":29,"tag":30,"props":7518,"children":7519},{},[7520],{"type":34,"value":7521},"Le code évolutif se modifie sans introduire de bugs et sans casser l'existant. Vous ajoutez une fonctionnalité, corrigez une erreur, vous adaptez à un changement d'exigence, sans tout réécrire.",{"type":29,"tag":30,"props":7523,"children":7524},{},[7525],{"type":34,"value":7526},"Imaginez que vous construisez une maison. Si elle est bien conçue, vous pourrez y ajouter des étages, changer la disposition des pièces ou installer de nouvelles fenêtres sans avoir à démolir toute la structure. C'est exactement ce que vous voulez avec votre code : une base solide et flexible, capable de s'adapter aux changements.",{"type":29,"tag":7528,"props":7529,"children":7531},"h4",{"id":7530},"pourquoi-est-ce-important",[7532],{"type":34,"value":7533},"Pourquoi est-ce important ?",{"type":29,"tag":30,"props":7535,"children":7536},{},[7537],{"type":34,"value":7538},"Un code non évolutif devient rapidement un cauchemar à maintenir. Chaque modification devient risquée, car elle peut affecter des parties du programme que vous n'aviez même pas prévues. Cela augmente le coût en temps et en efforts pour ajouter des fonctionnalités ou corriger des bugs. En revanche, avec un code évolutif, vous économisez du temps à long terme et vous réduisez les risques d'introduire de nouvelles erreurs.",{"type":29,"tag":7528,"props":7540,"children":7542},{"id":7541},"exemples-de-code-non-évolutif",[7543],{"type":34,"value":7544},"Exemples de code non évolutif",{"type":29,"tag":30,"props":7546,"children":7547},{},[7548,7550,7555],{"type":34,"value":7549},"Prenons un exemple concret en Java. Imaginez que vous ayez une classe ",{"type":29,"tag":113,"props":7551,"children":7553},{"className":7552},[],[7554],{"type":34,"value":6491},{"type":34,"value":7556}," qui gère non seulement les informations de l'employé, mais aussi la génération de rapports, la gestion des salaires, et d'autres fonctionnalités. Si vous devez modifier une seule de ces fonctionnalités, vous risquez d'affecter tout le reste de la classe.",{"type":29,"tag":106,"props":7558,"children":7560},{"className":5519,"code":7559,"language":5521,"meta":8,"style":8},"public class Employee {\n    private String name;\n    private double salary;\n\n    public Employee(String name, double salary) {\n        this.name = name;\n        this.salary = salary;\n    }\n\n    public void generateReport() {\n        \u002F\u002F Code pour générer un rapport\n    }\n\n    public void processSalary() {\n        \u002F\u002F Code pour calculer le salaire\n    }\n\n    public void updateDetails(String newName, double newSalary) {\n        this.name = newName;\n        this.salary = newSalary;\n    }\n}\n",[7561],{"type":29,"tag":113,"props":7562,"children":7563},{"__ignoreMap":8},[7564,7585,7606,7627,7634,7680,7709,7737,7744,7751,7776,7784,7791,7798,7822,7830,7837,7844,7894,7921,7948,7955],{"type":29,"tag":117,"props":7565,"children":7566},{"class":119,"line":120},[7567,7571,7576,7581],{"type":29,"tag":117,"props":7568,"children":7569},{"style":143},[7570],{"type":34,"value":5541},{"type":29,"tag":117,"props":7572,"children":7573},{"style":143},[7574],{"type":34,"value":7575}," class",{"type":29,"tag":117,"props":7577,"children":7578},{"style":2863},[7579],{"type":34,"value":7580}," Employee",{"type":29,"tag":117,"props":7582,"children":7583},{"style":384},[7584],{"type":34,"value":3461},{"type":29,"tag":117,"props":7586,"children":7587},{"class":119,"line":130},[7588,7593,7597,7602],{"type":29,"tag":117,"props":7589,"children":7590},{"style":143},[7591],{"type":34,"value":7592},"    private",{"type":29,"tag":117,"props":7594,"children":7595},{"style":5976},[7596],{"type":34,"value":6477},{"type":29,"tag":117,"props":7598,"children":7599},{"style":378},[7600],{"type":34,"value":7601}," name",{"type":29,"tag":117,"props":7603,"children":7604},{"style":384},[7605],{"type":34,"value":387},{"type":29,"tag":117,"props":7607,"children":7608},{"class":119,"line":139},[7609,7613,7618,7623],{"type":29,"tag":117,"props":7610,"children":7611},{"style":143},[7612],{"type":34,"value":7592},{"type":29,"tag":117,"props":7614,"children":7615},{"style":143},[7616],{"type":34,"value":7617}," double",{"type":29,"tag":117,"props":7619,"children":7620},{"style":378},[7621],{"type":34,"value":7622}," salary",{"type":29,"tag":117,"props":7624,"children":7625},{"style":384},[7626],{"type":34,"value":387},{"type":29,"tag":117,"props":7628,"children":7629},{"class":119,"line":172},[7630],{"type":29,"tag":117,"props":7631,"children":7632},{"emptyLinePlaceholder":13},[7633],{"type":34,"value":136},{"type":29,"tag":117,"props":7635,"children":7636},{"class":119,"line":181},[7637,7642,7646,7650,7655,7660,7664,7668,7672,7676],{"type":29,"tag":117,"props":7638,"children":7639},{"style":143},[7640],{"type":34,"value":7641},"    public",{"type":29,"tag":117,"props":7643,"children":7644},{"style":372},[7645],{"type":34,"value":7580},{"type":29,"tag":117,"props":7647,"children":7648},{"style":384},[7649],{"type":34,"value":1108},{"type":29,"tag":117,"props":7651,"children":7652},{"style":5976},[7653],{"type":34,"value":7654},"String",{"type":29,"tag":117,"props":7656,"children":7658},{"style":7657},"--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit",[7659],{"type":34,"value":7601},{"type":29,"tag":117,"props":7661,"children":7662},{"style":384},[7663],{"type":34,"value":1118},{"type":29,"tag":117,"props":7665,"children":7666},{"style":143},[7667],{"type":34,"value":7617},{"type":29,"tag":117,"props":7669,"children":7670},{"style":7657},[7671],{"type":34,"value":7622},{"type":29,"tag":117,"props":7673,"children":7674},{"style":384},[7675],{"type":34,"value":2803},{"type":29,"tag":117,"props":7677,"children":7678},{"style":384},[7679],{"type":34,"value":3461},{"type":29,"tag":117,"props":7681,"children":7682},{"class":119,"line":189},[7683,7688,7692,7697,7701,7705],{"type":29,"tag":117,"props":7684,"children":7685},{"style":6700},[7686],{"type":34,"value":7687},"        this",{"type":29,"tag":117,"props":7689,"children":7690},{"style":384},[7691],{"type":34,"value":369},{"type":29,"tag":117,"props":7693,"children":7694},{"style":378},[7695],{"type":34,"value":7696},"name ",{"type":29,"tag":117,"props":7698,"children":7699},{"style":160},[7700],{"type":34,"value":6061},{"type":29,"tag":117,"props":7702,"children":7703},{"style":378},[7704],{"type":34,"value":7601},{"type":29,"tag":117,"props":7706,"children":7707},{"style":384},[7708],{"type":34,"value":387},{"type":29,"tag":117,"props":7710,"children":7711},{"class":119,"line":198},[7712,7716,7720,7725,7729,7733],{"type":29,"tag":117,"props":7713,"children":7714},{"style":6700},[7715],{"type":34,"value":7687},{"type":29,"tag":117,"props":7717,"children":7718},{"style":384},[7719],{"type":34,"value":369},{"type":29,"tag":117,"props":7721,"children":7722},{"style":378},[7723],{"type":34,"value":7724},"salary ",{"type":29,"tag":117,"props":7726,"children":7727},{"style":160},[7728],{"type":34,"value":6061},{"type":29,"tag":117,"props":7730,"children":7731},{"style":378},[7732],{"type":34,"value":7622},{"type":29,"tag":117,"props":7734,"children":7735},{"style":384},[7736],{"type":34,"value":387},{"type":29,"tag":117,"props":7738,"children":7739},{"class":119,"line":207},[7740],{"type":29,"tag":117,"props":7741,"children":7742},{"style":384},[7743],{"type":34,"value":5632},{"type":29,"tag":117,"props":7745,"children":7746},{"class":119,"line":215},[7747],{"type":29,"tag":117,"props":7748,"children":7749},{"emptyLinePlaceholder":13},[7750],{"type":34,"value":136},{"type":29,"tag":117,"props":7752,"children":7753},{"class":119,"line":224},[7754,7758,7763,7768,7772],{"type":29,"tag":117,"props":7755,"children":7756},{"style":143},[7757],{"type":34,"value":7641},{"type":29,"tag":117,"props":7759,"children":7760},{"style":143},[7761],{"type":34,"value":7762}," void",{"type":29,"tag":117,"props":7764,"children":7765},{"style":372},[7766],{"type":34,"value":7767}," generateReport",{"type":29,"tag":117,"props":7769,"children":7770},{"style":384},[7771],{"type":34,"value":381},{"type":29,"tag":117,"props":7773,"children":7774},{"style":384},[7775],{"type":34,"value":3461},{"type":29,"tag":117,"props":7777,"children":7778},{"class":119,"line":233},[7779],{"type":29,"tag":117,"props":7780,"children":7781},{"style":124},[7782],{"type":34,"value":7783},"        \u002F\u002F Code pour générer un rapport\n",{"type":29,"tag":117,"props":7785,"children":7786},{"class":119,"line":242},[7787],{"type":29,"tag":117,"props":7788,"children":7789},{"style":384},[7790],{"type":34,"value":5632},{"type":29,"tag":117,"props":7792,"children":7793},{"class":119,"line":251},[7794],{"type":29,"tag":117,"props":7795,"children":7796},{"emptyLinePlaceholder":13},[7797],{"type":34,"value":136},{"type":29,"tag":117,"props":7799,"children":7800},{"class":119,"line":260},[7801,7805,7809,7814,7818],{"type":29,"tag":117,"props":7802,"children":7803},{"style":143},[7804],{"type":34,"value":7641},{"type":29,"tag":117,"props":7806,"children":7807},{"style":143},[7808],{"type":34,"value":7762},{"type":29,"tag":117,"props":7810,"children":7811},{"style":372},[7812],{"type":34,"value":7813}," processSalary",{"type":29,"tag":117,"props":7815,"children":7816},{"style":384},[7817],{"type":34,"value":381},{"type":29,"tag":117,"props":7819,"children":7820},{"style":384},[7821],{"type":34,"value":3461},{"type":29,"tag":117,"props":7823,"children":7824},{"class":119,"line":269},[7825],{"type":29,"tag":117,"props":7826,"children":7827},{"style":124},[7828],{"type":34,"value":7829},"        \u002F\u002F Code pour calculer le salaire\n",{"type":29,"tag":117,"props":7831,"children":7832},{"class":119,"line":278},[7833],{"type":29,"tag":117,"props":7834,"children":7835},{"style":384},[7836],{"type":34,"value":5632},{"type":29,"tag":117,"props":7838,"children":7839},{"class":119,"line":286},[7840],{"type":29,"tag":117,"props":7841,"children":7842},{"emptyLinePlaceholder":13},[7843],{"type":34,"value":136},{"type":29,"tag":117,"props":7845,"children":7846},{"class":119,"line":295},[7847,7851,7855,7860,7864,7868,7873,7877,7881,7886,7890],{"type":29,"tag":117,"props":7848,"children":7849},{"style":143},[7850],{"type":34,"value":7641},{"type":29,"tag":117,"props":7852,"children":7853},{"style":143},[7854],{"type":34,"value":7762},{"type":29,"tag":117,"props":7856,"children":7857},{"style":372},[7858],{"type":34,"value":7859}," updateDetails",{"type":29,"tag":117,"props":7861,"children":7862},{"style":384},[7863],{"type":34,"value":1108},{"type":29,"tag":117,"props":7865,"children":7866},{"style":5976},[7867],{"type":34,"value":7654},{"type":29,"tag":117,"props":7869,"children":7870},{"style":7657},[7871],{"type":34,"value":7872}," newName",{"type":29,"tag":117,"props":7874,"children":7875},{"style":384},[7876],{"type":34,"value":1118},{"type":29,"tag":117,"props":7878,"children":7879},{"style":143},[7880],{"type":34,"value":7617},{"type":29,"tag":117,"props":7882,"children":7883},{"style":7657},[7884],{"type":34,"value":7885}," newSalary",{"type":29,"tag":117,"props":7887,"children":7888},{"style":384},[7889],{"type":34,"value":2803},{"type":29,"tag":117,"props":7891,"children":7892},{"style":384},[7893],{"type":34,"value":3461},{"type":29,"tag":117,"props":7895,"children":7896},{"class":119,"line":304},[7897,7901,7905,7909,7913,7917],{"type":29,"tag":117,"props":7898,"children":7899},{"style":6700},[7900],{"type":34,"value":7687},{"type":29,"tag":117,"props":7902,"children":7903},{"style":384},[7904],{"type":34,"value":369},{"type":29,"tag":117,"props":7906,"children":7907},{"style":378},[7908],{"type":34,"value":7696},{"type":29,"tag":117,"props":7910,"children":7911},{"style":160},[7912],{"type":34,"value":6061},{"type":29,"tag":117,"props":7914,"children":7915},{"style":378},[7916],{"type":34,"value":7872},{"type":29,"tag":117,"props":7918,"children":7919},{"style":384},[7920],{"type":34,"value":387},{"type":29,"tag":117,"props":7922,"children":7923},{"class":119,"line":313},[7924,7928,7932,7936,7940,7944],{"type":29,"tag":117,"props":7925,"children":7926},{"style":6700},[7927],{"type":34,"value":7687},{"type":29,"tag":117,"props":7929,"children":7930},{"style":384},[7931],{"type":34,"value":369},{"type":29,"tag":117,"props":7933,"children":7934},{"style":378},[7935],{"type":34,"value":7724},{"type":29,"tag":117,"props":7937,"children":7938},{"style":160},[7939],{"type":34,"value":6061},{"type":29,"tag":117,"props":7941,"children":7942},{"style":378},[7943],{"type":34,"value":7885},{"type":29,"tag":117,"props":7945,"children":7946},{"style":384},[7947],{"type":34,"value":387},{"type":29,"tag":117,"props":7949,"children":7950},{"class":119,"line":322},[7951],{"type":29,"tag":117,"props":7952,"children":7953},{"style":384},[7954],{"type":34,"value":5632},{"type":29,"tag":117,"props":7956,"children":7957},{"class":119,"line":331},[7958],{"type":29,"tag":117,"props":7959,"children":7960},{"style":384},[7961],{"type":34,"value":2903},{"type":29,"tag":30,"props":7963,"children":7964},{},[7965,7967,7972],{"type":34,"value":7966},"Dans cet exemple, la classe ",{"type":29,"tag":113,"props":7968,"children":7970},{"className":7969},[],[7971],{"type":34,"value":6491},{"type":34,"value":7973}," fait trop de choses à la fois, ce qui la rend difficile à modifier sans risquer de casser quelque chose. Si vous devez ajuster la méthode de calcul du salaire, vous devez être très prudent pour ne pas impacter la génération de rapports ou la mise à jour des informations de l'employé. Ce type de conception est typique d'un code non évolutif.",{"type":29,"tag":51,"props":7975,"children":7976},{},[],{"type":29,"tag":567,"props":7978,"children":7980},{"cta":569,"href":570,"title":7979,"type":572},"Vous voulez écrire des classes qui se laissent modifier sans tout casser ?",[7981],{"type":29,"tag":30,"props":7982,"children":7983},{},[7984],{"type":34,"value":7985},"Découper les responsabilités au bon endroit, inverser une dépendance sans complexifier, sentir quand une classe en fait trop : ça ne se lit pas, ça se pratique. En mentoring 1:1, je relis votre code Java avec vous et on retravaille vos conceptions ensemble, jusqu'à ce que le réflexe du code évolutif devienne le vôtre.",{"type":29,"tag":55,"props":7987,"children":7989},{"id":7988},"principes-de-base-pour-écrire-du-code-évolutif",[7990],{"type":34,"value":7991},"Principes de base pour écrire du code évolutif",{"type":29,"tag":30,"props":7993,"children":7994},{},[7995],{"type":34,"value":7996},"Écrire du code évolutif repose sur quelques principes qui maintiennent une structure claire et flexible. Voici les concepts à garder en tête pour qu'un code reste facile à modifier et à étendre.",{"type":29,"tag":4530,"props":7998,"children":8000},{"id":7999},"_1-la-modularité",[8001],{"type":34,"value":8002},"1. La modularité",{"type":29,"tag":30,"props":8004,"children":8005},{},[8006],{"type":34,"value":8007},"La modularité consiste à diviser votre code en petits morceaux indépendants qui accomplissent chacun une tâche bien définie. En séparant vos fonctionnalités dans des modules distincts, vous pouvez travailler sur une partie du programme sans risquer de casser les autres. En Java, cela se traduit par la création de classes et de méthodes spécifiques qui remplissent des fonctions uniques.",{"type":29,"tag":106,"props":8009,"children":8011},{"className":5519,"code":8010,"language":5521,"meta":8,"style":8},"\u002F\u002F Classe pour gérer les informations de l'employé\npublic class Employee {\n    private String name;\n    private double salary;\n\n    public Employee(String name, double salary) {\n        this.name = name;\n        this.salary = salary;\n    }\n}\n\npublic class ReportGenerator {\n    public void generate(Employee employee) {\n        \u002F\u002F Code pour générer un rapport pour cet employé\n    }\n}\n\npublic class SalaryProcessor {\n    public void process(Employee employee) {\n        \u002F\u002F Code pour calculer le salaire\n    }\n}\n",[8012],{"type":29,"tag":113,"props":8013,"children":8014},{"__ignoreMap":8},[8015,8023,8042,8061,8080,8087,8130,8157,8184,8191,8198,8205,8225,8262,8270,8277,8284,8291,8311,8347,8354,8361],{"type":29,"tag":117,"props":8016,"children":8017},{"class":119,"line":120},[8018],{"type":29,"tag":117,"props":8019,"children":8020},{"style":124},[8021],{"type":34,"value":8022},"\u002F\u002F Classe pour gérer les informations de l'employé\n",{"type":29,"tag":117,"props":8024,"children":8025},{"class":119,"line":130},[8026,8030,8034,8038],{"type":29,"tag":117,"props":8027,"children":8028},{"style":143},[8029],{"type":34,"value":5541},{"type":29,"tag":117,"props":8031,"children":8032},{"style":143},[8033],{"type":34,"value":7575},{"type":29,"tag":117,"props":8035,"children":8036},{"style":2863},[8037],{"type":34,"value":7580},{"type":29,"tag":117,"props":8039,"children":8040},{"style":384},[8041],{"type":34,"value":3461},{"type":29,"tag":117,"props":8043,"children":8044},{"class":119,"line":139},[8045,8049,8053,8057],{"type":29,"tag":117,"props":8046,"children":8047},{"style":143},[8048],{"type":34,"value":7592},{"type":29,"tag":117,"props":8050,"children":8051},{"style":5976},[8052],{"type":34,"value":6477},{"type":29,"tag":117,"props":8054,"children":8055},{"style":378},[8056],{"type":34,"value":7601},{"type":29,"tag":117,"props":8058,"children":8059},{"style":384},[8060],{"type":34,"value":387},{"type":29,"tag":117,"props":8062,"children":8063},{"class":119,"line":172},[8064,8068,8072,8076],{"type":29,"tag":117,"props":8065,"children":8066},{"style":143},[8067],{"type":34,"value":7592},{"type":29,"tag":117,"props":8069,"children":8070},{"style":143},[8071],{"type":34,"value":7617},{"type":29,"tag":117,"props":8073,"children":8074},{"style":378},[8075],{"type":34,"value":7622},{"type":29,"tag":117,"props":8077,"children":8078},{"style":384},[8079],{"type":34,"value":387},{"type":29,"tag":117,"props":8081,"children":8082},{"class":119,"line":181},[8083],{"type":29,"tag":117,"props":8084,"children":8085},{"emptyLinePlaceholder":13},[8086],{"type":34,"value":136},{"type":29,"tag":117,"props":8088,"children":8089},{"class":119,"line":189},[8090,8094,8098,8102,8106,8110,8114,8118,8122,8126],{"type":29,"tag":117,"props":8091,"children":8092},{"style":143},[8093],{"type":34,"value":7641},{"type":29,"tag":117,"props":8095,"children":8096},{"style":372},[8097],{"type":34,"value":7580},{"type":29,"tag":117,"props":8099,"children":8100},{"style":384},[8101],{"type":34,"value":1108},{"type":29,"tag":117,"props":8103,"children":8104},{"style":5976},[8105],{"type":34,"value":7654},{"type":29,"tag":117,"props":8107,"children":8108},{"style":7657},[8109],{"type":34,"value":7601},{"type":29,"tag":117,"props":8111,"children":8112},{"style":384},[8113],{"type":34,"value":1118},{"type":29,"tag":117,"props":8115,"children":8116},{"style":143},[8117],{"type":34,"value":7617},{"type":29,"tag":117,"props":8119,"children":8120},{"style":7657},[8121],{"type":34,"value":7622},{"type":29,"tag":117,"props":8123,"children":8124},{"style":384},[8125],{"type":34,"value":2803},{"type":29,"tag":117,"props":8127,"children":8128},{"style":384},[8129],{"type":34,"value":3461},{"type":29,"tag":117,"props":8131,"children":8132},{"class":119,"line":198},[8133,8137,8141,8145,8149,8153],{"type":29,"tag":117,"props":8134,"children":8135},{"style":6700},[8136],{"type":34,"value":7687},{"type":29,"tag":117,"props":8138,"children":8139},{"style":384},[8140],{"type":34,"value":369},{"type":29,"tag":117,"props":8142,"children":8143},{"style":378},[8144],{"type":34,"value":7696},{"type":29,"tag":117,"props":8146,"children":8147},{"style":160},[8148],{"type":34,"value":6061},{"type":29,"tag":117,"props":8150,"children":8151},{"style":378},[8152],{"type":34,"value":7601},{"type":29,"tag":117,"props":8154,"children":8155},{"style":384},[8156],{"type":34,"value":387},{"type":29,"tag":117,"props":8158,"children":8159},{"class":119,"line":207},[8160,8164,8168,8172,8176,8180],{"type":29,"tag":117,"props":8161,"children":8162},{"style":6700},[8163],{"type":34,"value":7687},{"type":29,"tag":117,"props":8165,"children":8166},{"style":384},[8167],{"type":34,"value":369},{"type":29,"tag":117,"props":8169,"children":8170},{"style":378},[8171],{"type":34,"value":7724},{"type":29,"tag":117,"props":8173,"children":8174},{"style":160},[8175],{"type":34,"value":6061},{"type":29,"tag":117,"props":8177,"children":8178},{"style":378},[8179],{"type":34,"value":7622},{"type":29,"tag":117,"props":8181,"children":8182},{"style":384},[8183],{"type":34,"value":387},{"type":29,"tag":117,"props":8185,"children":8186},{"class":119,"line":215},[8187],{"type":29,"tag":117,"props":8188,"children":8189},{"style":384},[8190],{"type":34,"value":5632},{"type":29,"tag":117,"props":8192,"children":8193},{"class":119,"line":224},[8194],{"type":29,"tag":117,"props":8195,"children":8196},{"style":384},[8197],{"type":34,"value":2903},{"type":29,"tag":117,"props":8199,"children":8200},{"class":119,"line":233},[8201],{"type":29,"tag":117,"props":8202,"children":8203},{"emptyLinePlaceholder":13},[8204],{"type":34,"value":136},{"type":29,"tag":117,"props":8206,"children":8207},{"class":119,"line":242},[8208,8212,8216,8221],{"type":29,"tag":117,"props":8209,"children":8210},{"style":143},[8211],{"type":34,"value":5541},{"type":29,"tag":117,"props":8213,"children":8214},{"style":143},[8215],{"type":34,"value":7575},{"type":29,"tag":117,"props":8217,"children":8218},{"style":2863},[8219],{"type":34,"value":8220}," ReportGenerator",{"type":29,"tag":117,"props":8222,"children":8223},{"style":384},[8224],{"type":34,"value":3461},{"type":29,"tag":117,"props":8226,"children":8227},{"class":119,"line":251},[8228,8232,8236,8241,8245,8249,8254,8258],{"type":29,"tag":117,"props":8229,"children":8230},{"style":143},[8231],{"type":34,"value":7641},{"type":29,"tag":117,"props":8233,"children":8234},{"style":143},[8235],{"type":34,"value":7762},{"type":29,"tag":117,"props":8237,"children":8238},{"style":372},[8239],{"type":34,"value":8240}," generate",{"type":29,"tag":117,"props":8242,"children":8243},{"style":384},[8244],{"type":34,"value":1108},{"type":29,"tag":117,"props":8246,"children":8247},{"style":5976},[8248],{"type":34,"value":6491},{"type":29,"tag":117,"props":8250,"children":8251},{"style":7657},[8252],{"type":34,"value":8253}," employee",{"type":29,"tag":117,"props":8255,"children":8256},{"style":384},[8257],{"type":34,"value":2803},{"type":29,"tag":117,"props":8259,"children":8260},{"style":384},[8261],{"type":34,"value":3461},{"type":29,"tag":117,"props":8263,"children":8264},{"class":119,"line":260},[8265],{"type":29,"tag":117,"props":8266,"children":8267},{"style":124},[8268],{"type":34,"value":8269},"        \u002F\u002F Code pour générer un rapport pour cet employé\n",{"type":29,"tag":117,"props":8271,"children":8272},{"class":119,"line":269},[8273],{"type":29,"tag":117,"props":8274,"children":8275},{"style":384},[8276],{"type":34,"value":5632},{"type":29,"tag":117,"props":8278,"children":8279},{"class":119,"line":278},[8280],{"type":29,"tag":117,"props":8281,"children":8282},{"style":384},[8283],{"type":34,"value":2903},{"type":29,"tag":117,"props":8285,"children":8286},{"class":119,"line":286},[8287],{"type":29,"tag":117,"props":8288,"children":8289},{"emptyLinePlaceholder":13},[8290],{"type":34,"value":136},{"type":29,"tag":117,"props":8292,"children":8293},{"class":119,"line":295},[8294,8298,8302,8307],{"type":29,"tag":117,"props":8295,"children":8296},{"style":143},[8297],{"type":34,"value":5541},{"type":29,"tag":117,"props":8299,"children":8300},{"style":143},[8301],{"type":34,"value":7575},{"type":29,"tag":117,"props":8303,"children":8304},{"style":2863},[8305],{"type":34,"value":8306}," SalaryProcessor",{"type":29,"tag":117,"props":8308,"children":8309},{"style":384},[8310],{"type":34,"value":3461},{"type":29,"tag":117,"props":8312,"children":8313},{"class":119,"line":304},[8314,8318,8322,8327,8331,8335,8339,8343],{"type":29,"tag":117,"props":8315,"children":8316},{"style":143},[8317],{"type":34,"value":7641},{"type":29,"tag":117,"props":8319,"children":8320},{"style":143},[8321],{"type":34,"value":7762},{"type":29,"tag":117,"props":8323,"children":8324},{"style":372},[8325],{"type":34,"value":8326}," process",{"type":29,"tag":117,"props":8328,"children":8329},{"style":384},[8330],{"type":34,"value":1108},{"type":29,"tag":117,"props":8332,"children":8333},{"style":5976},[8334],{"type":34,"value":6491},{"type":29,"tag":117,"props":8336,"children":8337},{"style":7657},[8338],{"type":34,"value":8253},{"type":29,"tag":117,"props":8340,"children":8341},{"style":384},[8342],{"type":34,"value":2803},{"type":29,"tag":117,"props":8344,"children":8345},{"style":384},[8346],{"type":34,"value":3461},{"type":29,"tag":117,"props":8348,"children":8349},{"class":119,"line":313},[8350],{"type":29,"tag":117,"props":8351,"children":8352},{"style":124},[8353],{"type":34,"value":7829},{"type":29,"tag":117,"props":8355,"children":8356},{"class":119,"line":322},[8357],{"type":29,"tag":117,"props":8358,"children":8359},{"style":384},[8360],{"type":34,"value":5632},{"type":29,"tag":117,"props":8362,"children":8363},{"class":119,"line":331},[8364],{"type":29,"tag":117,"props":8365,"children":8366},{"style":384},[8367],{"type":34,"value":2903},{"type":29,"tag":30,"props":8369,"children":8370},{},[8371],{"type":34,"value":8372},"Dans cet exemple, chaque classe a une responsabilité claire et distincte, ce qui facilite les modifications et les extensions futures.",{"type":29,"tag":4530,"props":8374,"children":8376},{"id":8375},"_2-le-principe-solid",[8377],{"type":34,"value":8378},"2. Le principe SOLID",{"type":29,"tag":30,"props":8380,"children":8381},{},[8382,8384,8388],{"type":34,"value":8383},"Les ",{"type":29,"tag":453,"props":8385,"children":8386},{"href":6919},[8387],{"type":34,"value":6922},{"type":34,"value":8389}," sont cinq règles de base pour la conception de logiciels évolutifs et maintenables, formalisés notamment par Robert C. Martin dans \"Clean Code\" et approfondis par Martin Fowler dans \"Refactoring\". Voici une rapide explication de chacun de ces principes :",{"type":29,"tag":1585,"props":8391,"children":8392},{},[8393,8416,8451,8472,8493],{"type":29,"tag":1589,"props":8394,"children":8395},{},[8396,8401,8403,8408,8410,8414],{"type":29,"tag":45,"props":8397,"children":8398},{},[8399],{"type":34,"value":8400},"S",{"type":34,"value":8402}," : ",{"type":29,"tag":45,"props":8404,"children":8405},{},[8406],{"type":34,"value":8407},"Single Responsibility Principle",{"type":34,"value":8409}," (Principe de responsabilité unique)",{"type":29,"tag":8411,"props":8412,"children":8413},"br",{},[],{"type":34,"value":8415},"\nUne classe ne doit avoir qu'une seule raison de changer, c'est-à-dire qu'elle ne doit être responsable que d'une seule fonctionnalité ou tâche.",{"type":29,"tag":1589,"props":8417,"children":8418},{},[8419,8424,8425,8430,8432,8435,8437,8442,8444,8449],{"type":29,"tag":45,"props":8420,"children":8421},{},[8422],{"type":34,"value":8423},"O",{"type":34,"value":8402},{"type":29,"tag":45,"props":8426,"children":8427},{},[8428],{"type":34,"value":8429},"Open\u002FClosed Principle",{"type":34,"value":8431}," (Principe ouvert\u002Ffermé)",{"type":29,"tag":8411,"props":8433,"children":8434},{},[],{"type":34,"value":8436},"\nVotre code doit être ",{"type":29,"tag":45,"props":8438,"children":8439},{},[8440],{"type":34,"value":8441},"ouvert",{"type":34,"value":8443}," à l’extension mais ",{"type":29,"tag":45,"props":8445,"children":8446},{},[8447],{"type":34,"value":8448},"fermé",{"type":34,"value":8450}," à la modification. Cela signifie que vous devez pouvoir ajouter de nouvelles fonctionnalités sans modifier le code existant.",{"type":29,"tag":1589,"props":8452,"children":8453},{},[8454,8459,8460,8465,8467,8470],{"type":29,"tag":45,"props":8455,"children":8456},{},[8457],{"type":34,"value":8458},"L",{"type":34,"value":8402},{"type":29,"tag":45,"props":8461,"children":8462},{},[8463],{"type":34,"value":8464},"Liskov Substitution Principle",{"type":34,"value":8466}," (Principe de substitution de Liskov)",{"type":29,"tag":8411,"props":8468,"children":8469},{},[],{"type":34,"value":8471},"\nLes objets d'une sous-classe doivent pouvoir remplacer les objets de leur classe parente sans altérer le comportement du programme.",{"type":29,"tag":1589,"props":8473,"children":8474},{},[8475,8480,8481,8486,8488,8491],{"type":29,"tag":45,"props":8476,"children":8477},{},[8478],{"type":34,"value":8479},"I",{"type":34,"value":8402},{"type":29,"tag":45,"props":8482,"children":8483},{},[8484],{"type":34,"value":8485},"Interface Segregation Principle",{"type":34,"value":8487}," (Principe de ségrégation des interfaces)",{"type":29,"tag":8411,"props":8489,"children":8490},{},[],{"type":34,"value":8492},"\nIl est préférable de créer plusieurs interfaces spécifiques plutôt qu'une interface générale qui contient trop de méthodes inutiles pour certaines classes.",{"type":29,"tag":1589,"props":8494,"children":8495},{},[8496,8501,8502,8511],{"type":29,"tag":45,"props":8497,"children":8498},{},[8499],{"type":34,"value":8500},"D",{"type":34,"value":8402},{"type":29,"tag":45,"props":8503,"children":8504},{},[8505],{"type":29,"tag":453,"props":8506,"children":8508},{"href":8507},"\u002Ffr\u002Farchitecture-craft\u002Fdependency-inversion-pratique",[8509],{"type":34,"value":8510},"Dependency Inversion Principle",{"type":34,"value":8512}," (Principe d'inversion des dépendances)\nLes modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Les deux devraient dépendre d'abstractions. En d'autres termes, utilisez des interfaces pour réduire le couplage entre les classes.",{"type":29,"tag":7528,"props":8514,"children":8516},{"id":8515},"_3-lencapsulation-et-labstraction",[8517],{"type":34,"value":8518},"3. L'encapsulation et l'abstraction",{"type":29,"tag":30,"props":8520,"children":8521},{},[8522],{"type":34,"value":8523},"L'encapsulation protège les données en les rendant inaccessibles directement depuis l'extérieur d'une classe. Vous exposez uniquement ce qui est nécessaire via des méthodes publiques. Vous contrôlez ainsi comment les autres parties du programme interagissent avec la classe, et vous pouvez la modifier sans impacter le reste.",{"type":29,"tag":30,"props":8525,"children":8526},{},[8527,8529,8534,8536,8541],{"type":34,"value":8528},"L'abstraction, quant à elle, consiste à simplifier la complexité en cachant les détails d'implémentation. En utilisant des interfaces et des classes abstraites, vous pouvez vous concentrer sur ",{"type":29,"tag":45,"props":8530,"children":8531},{},[8532],{"type":34,"value":8533},"quoi",{"type":34,"value":8535}," une classe fait, sans vous soucier de ",{"type":29,"tag":45,"props":8537,"children":8538},{},[8539],{"type":34,"value":8540},"comment",{"type":34,"value":8542}," elle le fait.",{"type":29,"tag":106,"props":8544,"children":8546},{"className":5519,"code":8545,"language":5521,"meta":8,"style":8},"public interface PaymentMethod {\n    void pay(double amount);\n}\n\npublic class CreditCardPayment implements PaymentMethod {\n    public void pay(double amount) {\n        \u002F\u002F Implémentation du paiement par carte de crédit\n    }\n}\n\npublic class PayPalPayment implements PaymentMethod {\n    public void pay(double amount) {\n        \u002F\u002F Implémentation du paiement via PayPal\n    }\n}\n",[8547],{"type":29,"tag":113,"props":8548,"children":8549},{"__ignoreMap":8},[8550,8571,8602,8609,8616,8645,8680,8688,8695,8702,8709,8737,8772,8780,8787],{"type":29,"tag":117,"props":8551,"children":8552},{"class":119,"line":120},[8553,8557,8562,8567],{"type":29,"tag":117,"props":8554,"children":8555},{"style":143},[8556],{"type":34,"value":5541},{"type":29,"tag":117,"props":8558,"children":8559},{"style":143},[8560],{"type":34,"value":8561}," interface",{"type":29,"tag":117,"props":8563,"children":8564},{"style":2863},[8565],{"type":34,"value":8566}," PaymentMethod",{"type":29,"tag":117,"props":8568,"children":8569},{"style":384},[8570],{"type":34,"value":3461},{"type":29,"tag":117,"props":8572,"children":8573},{"class":119,"line":130},[8574,8579,8584,8588,8593,8598],{"type":29,"tag":117,"props":8575,"children":8576},{"style":143},[8577],{"type":34,"value":8578},"    void",{"type":29,"tag":117,"props":8580,"children":8581},{"style":372},[8582],{"type":34,"value":8583}," pay",{"type":29,"tag":117,"props":8585,"children":8586},{"style":384},[8587],{"type":34,"value":1108},{"type":29,"tag":117,"props":8589,"children":8590},{"style":143},[8591],{"type":34,"value":8592},"double",{"type":29,"tag":117,"props":8594,"children":8595},{"style":7657},[8596],{"type":34,"value":8597}," amount",{"type":29,"tag":117,"props":8599,"children":8600},{"style":384},[8601],{"type":34,"value":5675},{"type":29,"tag":117,"props":8603,"children":8604},{"class":119,"line":139},[8605],{"type":29,"tag":117,"props":8606,"children":8607},{"style":384},[8608],{"type":34,"value":2903},{"type":29,"tag":117,"props":8610,"children":8611},{"class":119,"line":172},[8612],{"type":29,"tag":117,"props":8613,"children":8614},{"emptyLinePlaceholder":13},[8615],{"type":34,"value":136},{"type":29,"tag":117,"props":8617,"children":8618},{"class":119,"line":181},[8619,8623,8627,8632,8637,8641],{"type":29,"tag":117,"props":8620,"children":8621},{"style":143},[8622],{"type":34,"value":5541},{"type":29,"tag":117,"props":8624,"children":8625},{"style":143},[8626],{"type":34,"value":7575},{"type":29,"tag":117,"props":8628,"children":8629},{"style":2863},[8630],{"type":34,"value":8631}," CreditCardPayment",{"type":29,"tag":117,"props":8633,"children":8634},{"style":143},[8635],{"type":34,"value":8636}," implements",{"type":29,"tag":117,"props":8638,"children":8639},{"style":2863},[8640],{"type":34,"value":8566},{"type":29,"tag":117,"props":8642,"children":8643},{"style":384},[8644],{"type":34,"value":3461},{"type":29,"tag":117,"props":8646,"children":8647},{"class":119,"line":189},[8648,8652,8656,8660,8664,8668,8672,8676],{"type":29,"tag":117,"props":8649,"children":8650},{"style":143},[8651],{"type":34,"value":7641},{"type":29,"tag":117,"props":8653,"children":8654},{"style":143},[8655],{"type":34,"value":7762},{"type":29,"tag":117,"props":8657,"children":8658},{"style":372},[8659],{"type":34,"value":8583},{"type":29,"tag":117,"props":8661,"children":8662},{"style":384},[8663],{"type":34,"value":1108},{"type":29,"tag":117,"props":8665,"children":8666},{"style":143},[8667],{"type":34,"value":8592},{"type":29,"tag":117,"props":8669,"children":8670},{"style":7657},[8671],{"type":34,"value":8597},{"type":29,"tag":117,"props":8673,"children":8674},{"style":384},[8675],{"type":34,"value":2803},{"type":29,"tag":117,"props":8677,"children":8678},{"style":384},[8679],{"type":34,"value":3461},{"type":29,"tag":117,"props":8681,"children":8682},{"class":119,"line":198},[8683],{"type":29,"tag":117,"props":8684,"children":8685},{"style":124},[8686],{"type":34,"value":8687},"        \u002F\u002F Implémentation du paiement par carte de crédit\n",{"type":29,"tag":117,"props":8689,"children":8690},{"class":119,"line":207},[8691],{"type":29,"tag":117,"props":8692,"children":8693},{"style":384},[8694],{"type":34,"value":5632},{"type":29,"tag":117,"props":8696,"children":8697},{"class":119,"line":215},[8698],{"type":29,"tag":117,"props":8699,"children":8700},{"style":384},[8701],{"type":34,"value":2903},{"type":29,"tag":117,"props":8703,"children":8704},{"class":119,"line":224},[8705],{"type":29,"tag":117,"props":8706,"children":8707},{"emptyLinePlaceholder":13},[8708],{"type":34,"value":136},{"type":29,"tag":117,"props":8710,"children":8711},{"class":119,"line":233},[8712,8716,8720,8725,8729,8733],{"type":29,"tag":117,"props":8713,"children":8714},{"style":143},[8715],{"type":34,"value":5541},{"type":29,"tag":117,"props":8717,"children":8718},{"style":143},[8719],{"type":34,"value":7575},{"type":29,"tag":117,"props":8721,"children":8722},{"style":2863},[8723],{"type":34,"value":8724}," PayPalPayment",{"type":29,"tag":117,"props":8726,"children":8727},{"style":143},[8728],{"type":34,"value":8636},{"type":29,"tag":117,"props":8730,"children":8731},{"style":2863},[8732],{"type":34,"value":8566},{"type":29,"tag":117,"props":8734,"children":8735},{"style":384},[8736],{"type":34,"value":3461},{"type":29,"tag":117,"props":8738,"children":8739},{"class":119,"line":242},[8740,8744,8748,8752,8756,8760,8764,8768],{"type":29,"tag":117,"props":8741,"children":8742},{"style":143},[8743],{"type":34,"value":7641},{"type":29,"tag":117,"props":8745,"children":8746},{"style":143},[8747],{"type":34,"value":7762},{"type":29,"tag":117,"props":8749,"children":8750},{"style":372},[8751],{"type":34,"value":8583},{"type":29,"tag":117,"props":8753,"children":8754},{"style":384},[8755],{"type":34,"value":1108},{"type":29,"tag":117,"props":8757,"children":8758},{"style":143},[8759],{"type":34,"value":8592},{"type":29,"tag":117,"props":8761,"children":8762},{"style":7657},[8763],{"type":34,"value":8597},{"type":29,"tag":117,"props":8765,"children":8766},{"style":384},[8767],{"type":34,"value":2803},{"type":29,"tag":117,"props":8769,"children":8770},{"style":384},[8771],{"type":34,"value":3461},{"type":29,"tag":117,"props":8773,"children":8774},{"class":119,"line":251},[8775],{"type":29,"tag":117,"props":8776,"children":8777},{"style":124},[8778],{"type":34,"value":8779},"        \u002F\u002F Implémentation du paiement via PayPal\n",{"type":29,"tag":117,"props":8781,"children":8782},{"class":119,"line":260},[8783],{"type":29,"tag":117,"props":8784,"children":8785},{"style":384},[8786],{"type":34,"value":5632},{"type":29,"tag":117,"props":8788,"children":8789},{"class":119,"line":269},[8790],{"type":29,"tag":117,"props":8791,"children":8792},{"style":384},[8793],{"type":34,"value":2903},{"type":29,"tag":30,"props":8795,"children":8796},{},[8797,8799,8805],{"type":34,"value":8798},"Dans cet exemple, l’interface ",{"type":29,"tag":113,"props":8800,"children":8802},{"className":8801},[],[8803],{"type":34,"value":8804},"PaymentMethod",{"type":34,"value":8806}," permet d’utiliser différentes méthodes de paiement sans changer le reste du code qui gère les paiements.",{"type":29,"tag":51,"props":8808,"children":8809},{},[],{"type":29,"tag":55,"props":8811,"children":8813},{"id":8812},"meilleures-pratiques-pour-un-code-évolutif-en-java",[8814],{"type":34,"value":8815},"Meilleures pratiques pour un code évolutif en Java",{"type":29,"tag":30,"props":8817,"children":8818},{},[8819],{"type":34,"value":8820},"Maintenant que vous avez une bonne compréhension des principes de base, voyons comment appliquer ces concepts dans un projet Java. Les bonnes pratiques suivantes vous aideront à écrire du code évolutif dans vos applications Java.",{"type":29,"tag":4530,"props":8822,"children":8824},{"id":8823},"_1-structurer-les-classes-de-manière-logique",[8825],{"type":34,"value":8826},"1. Structurer les classes de manière logique",{"type":29,"tag":30,"props":8828,"children":8829},{},[8830,8832,8837],{"type":34,"value":8831},"Une bonne organisation des classes est cruciale pour la lisibilité et l'évolutivité du code. Je vous recommande de garder vos classes focalisées sur des tâches spécifiques et d'éviter les classes dites \"god objects\" qui s'occupent de tout. Structurez vos classes de manière à ce qu'elles respectent le principe de ",{"type":29,"tag":45,"props":8833,"children":8834},{},[8835],{"type":34,"value":8836},"responsabilité unique",{"type":34,"value":369},{"type":29,"tag":106,"props":8839,"children":8841},{"className":5519,"code":8840,"language":5521,"meta":8,"style":8},"\u002F\u002F Classe pour gérer les informations de l'employé\npublic class Employee {\n    private String name;\n    private String department;\n\n    \u002F\u002F Getters et Setters\n}\n\n\u002F\u002F Classe pour calculer le salaire\npublic class SalaryService {\n    public double calculateSalary(Employee employee) {\n        \u002F\u002F Logique pour calculer le salaire\n    }\n}\n\n\u002F\u002F Classe pour générer un rapport\npublic class ReportService {\n    public String generateReport(Employee employee) {\n        \u002F\u002F Logique pour générer un rapport\n    }\n}\n",[8842],{"type":29,"tag":113,"props":8843,"children":8844},{"__ignoreMap":8},[8845,8852,8871,8890,8910,8917,8925,8932,8939,8947,8967,9003,9011,9018,9025,9032,9040,9060,9095,9103,9110],{"type":29,"tag":117,"props":8846,"children":8847},{"class":119,"line":120},[8848],{"type":29,"tag":117,"props":8849,"children":8850},{"style":124},[8851],{"type":34,"value":8022},{"type":29,"tag":117,"props":8853,"children":8854},{"class":119,"line":130},[8855,8859,8863,8867],{"type":29,"tag":117,"props":8856,"children":8857},{"style":143},[8858],{"type":34,"value":5541},{"type":29,"tag":117,"props":8860,"children":8861},{"style":143},[8862],{"type":34,"value":7575},{"type":29,"tag":117,"props":8864,"children":8865},{"style":2863},[8866],{"type":34,"value":7580},{"type":29,"tag":117,"props":8868,"children":8869},{"style":384},[8870],{"type":34,"value":3461},{"type":29,"tag":117,"props":8872,"children":8873},{"class":119,"line":139},[8874,8878,8882,8886],{"type":29,"tag":117,"props":8875,"children":8876},{"style":143},[8877],{"type":34,"value":7592},{"type":29,"tag":117,"props":8879,"children":8880},{"style":5976},[8881],{"type":34,"value":6477},{"type":29,"tag":117,"props":8883,"children":8884},{"style":378},[8885],{"type":34,"value":7601},{"type":29,"tag":117,"props":8887,"children":8888},{"style":384},[8889],{"type":34,"value":387},{"type":29,"tag":117,"props":8891,"children":8892},{"class":119,"line":172},[8893,8897,8901,8906],{"type":29,"tag":117,"props":8894,"children":8895},{"style":143},[8896],{"type":34,"value":7592},{"type":29,"tag":117,"props":8898,"children":8899},{"style":5976},[8900],{"type":34,"value":6477},{"type":29,"tag":117,"props":8902,"children":8903},{"style":378},[8904],{"type":34,"value":8905}," department",{"type":29,"tag":117,"props":8907,"children":8908},{"style":384},[8909],{"type":34,"value":387},{"type":29,"tag":117,"props":8911,"children":8912},{"class":119,"line":181},[8913],{"type":29,"tag":117,"props":8914,"children":8915},{"emptyLinePlaceholder":13},[8916],{"type":34,"value":136},{"type":29,"tag":117,"props":8918,"children":8919},{"class":119,"line":189},[8920],{"type":29,"tag":117,"props":8921,"children":8922},{"style":124},[8923],{"type":34,"value":8924},"    \u002F\u002F Getters et Setters\n",{"type":29,"tag":117,"props":8926,"children":8927},{"class":119,"line":198},[8928],{"type":29,"tag":117,"props":8929,"children":8930},{"style":384},[8931],{"type":34,"value":2903},{"type":29,"tag":117,"props":8933,"children":8934},{"class":119,"line":207},[8935],{"type":29,"tag":117,"props":8936,"children":8937},{"emptyLinePlaceholder":13},[8938],{"type":34,"value":136},{"type":29,"tag":117,"props":8940,"children":8941},{"class":119,"line":215},[8942],{"type":29,"tag":117,"props":8943,"children":8944},{"style":124},[8945],{"type":34,"value":8946},"\u002F\u002F Classe pour calculer le salaire\n",{"type":29,"tag":117,"props":8948,"children":8949},{"class":119,"line":224},[8950,8954,8958,8963],{"type":29,"tag":117,"props":8951,"children":8952},{"style":143},[8953],{"type":34,"value":5541},{"type":29,"tag":117,"props":8955,"children":8956},{"style":143},[8957],{"type":34,"value":7575},{"type":29,"tag":117,"props":8959,"children":8960},{"style":2863},[8961],{"type":34,"value":8962}," SalaryService",{"type":29,"tag":117,"props":8964,"children":8965},{"style":384},[8966],{"type":34,"value":3461},{"type":29,"tag":117,"props":8968,"children":8969},{"class":119,"line":233},[8970,8974,8978,8983,8987,8991,8995,8999],{"type":29,"tag":117,"props":8971,"children":8972},{"style":143},[8973],{"type":34,"value":7641},{"type":29,"tag":117,"props":8975,"children":8976},{"style":143},[8977],{"type":34,"value":7617},{"type":29,"tag":117,"props":8979,"children":8980},{"style":372},[8981],{"type":34,"value":8982}," calculateSalary",{"type":29,"tag":117,"props":8984,"children":8985},{"style":384},[8986],{"type":34,"value":1108},{"type":29,"tag":117,"props":8988,"children":8989},{"style":5976},[8990],{"type":34,"value":6491},{"type":29,"tag":117,"props":8992,"children":8993},{"style":7657},[8994],{"type":34,"value":8253},{"type":29,"tag":117,"props":8996,"children":8997},{"style":384},[8998],{"type":34,"value":2803},{"type":29,"tag":117,"props":9000,"children":9001},{"style":384},[9002],{"type":34,"value":3461},{"type":29,"tag":117,"props":9004,"children":9005},{"class":119,"line":242},[9006],{"type":29,"tag":117,"props":9007,"children":9008},{"style":124},[9009],{"type":34,"value":9010},"        \u002F\u002F Logique pour calculer le salaire\n",{"type":29,"tag":117,"props":9012,"children":9013},{"class":119,"line":251},[9014],{"type":29,"tag":117,"props":9015,"children":9016},{"style":384},[9017],{"type":34,"value":5632},{"type":29,"tag":117,"props":9019,"children":9020},{"class":119,"line":260},[9021],{"type":29,"tag":117,"props":9022,"children":9023},{"style":384},[9024],{"type":34,"value":2903},{"type":29,"tag":117,"props":9026,"children":9027},{"class":119,"line":269},[9028],{"type":29,"tag":117,"props":9029,"children":9030},{"emptyLinePlaceholder":13},[9031],{"type":34,"value":136},{"type":29,"tag":117,"props":9033,"children":9034},{"class":119,"line":278},[9035],{"type":29,"tag":117,"props":9036,"children":9037},{"style":124},[9038],{"type":34,"value":9039},"\u002F\u002F Classe pour générer un rapport\n",{"type":29,"tag":117,"props":9041,"children":9042},{"class":119,"line":286},[9043,9047,9051,9056],{"type":29,"tag":117,"props":9044,"children":9045},{"style":143},[9046],{"type":34,"value":5541},{"type":29,"tag":117,"props":9048,"children":9049},{"style":143},[9050],{"type":34,"value":7575},{"type":29,"tag":117,"props":9052,"children":9053},{"style":2863},[9054],{"type":34,"value":9055}," ReportService",{"type":29,"tag":117,"props":9057,"children":9058},{"style":384},[9059],{"type":34,"value":3461},{"type":29,"tag":117,"props":9061,"children":9062},{"class":119,"line":295},[9063,9067,9071,9075,9079,9083,9087,9091],{"type":29,"tag":117,"props":9064,"children":9065},{"style":143},[9066],{"type":34,"value":7641},{"type":29,"tag":117,"props":9068,"children":9069},{"style":5976},[9070],{"type":34,"value":6477},{"type":29,"tag":117,"props":9072,"children":9073},{"style":372},[9074],{"type":34,"value":7767},{"type":29,"tag":117,"props":9076,"children":9077},{"style":384},[9078],{"type":34,"value":1108},{"type":29,"tag":117,"props":9080,"children":9081},{"style":5976},[9082],{"type":34,"value":6491},{"type":29,"tag":117,"props":9084,"children":9085},{"style":7657},[9086],{"type":34,"value":8253},{"type":29,"tag":117,"props":9088,"children":9089},{"style":384},[9090],{"type":34,"value":2803},{"type":29,"tag":117,"props":9092,"children":9093},{"style":384},[9094],{"type":34,"value":3461},{"type":29,"tag":117,"props":9096,"children":9097},{"class":119,"line":304},[9098],{"type":29,"tag":117,"props":9099,"children":9100},{"style":124},[9101],{"type":34,"value":9102},"        \u002F\u002F Logique pour générer un rapport\n",{"type":29,"tag":117,"props":9104,"children":9105},{"class":119,"line":313},[9106],{"type":29,"tag":117,"props":9107,"children":9108},{"style":384},[9109],{"type":34,"value":5632},{"type":29,"tag":117,"props":9111,"children":9112},{"class":119,"line":322},[9113],{"type":29,"tag":117,"props":9114,"children":9115},{"style":384},[9116],{"type":34,"value":2903},{"type":29,"tag":4530,"props":9118,"children":9120},{"id":9119},"_2-utiliser-des-patrons-de-conception-design-patterns",[9121],{"type":34,"value":9122},"2. Utiliser des patrons de conception (design patterns)",{"type":29,"tag":30,"props":9124,"children":9125},{},[9126,9127,9132],{"type":34,"value":8383},{"type":29,"tag":45,"props":9128,"children":9129},{},[9130],{"type":34,"value":9131},"patrons de conception",{"type":34,"value":9133}," sont des solutions éprouvées pour résoudre des problèmes courants de conception dans le développement logiciel. Voici quelques-uns des patrons les plus utiles pour écrire du code évolutif en Java :",{"type":29,"tag":1585,"props":9135,"children":9136},{},[9137,9147,9157],{"type":29,"tag":1589,"props":9138,"children":9139},{},[9140,9145],{"type":29,"tag":45,"props":9141,"children":9142},{},[9143],{"type":34,"value":9144},"Patron Singleton",{"type":34,"value":9146}," : Garantit qu'une classe n'a qu'une seule instance, souvent utilisé pour des services globaux.",{"type":29,"tag":1589,"props":9148,"children":9149},{},[9150,9155],{"type":29,"tag":45,"props":9151,"children":9152},{},[9153],{"type":34,"value":9154},"Patron Factory",{"type":34,"value":9156}," : Encapsule la création d'objets dans une méthode ou classe dédiée. Vous changez la façon de créer les objets sans toucher à la logique métier.",{"type":29,"tag":1589,"props":9158,"children":9159},{},[9160,9165],{"type":29,"tag":45,"props":9161,"children":9162},{},[9163],{"type":34,"value":9164},"Patron Observer",{"type":34,"value":9166}," : Permet à une classe d'être avertie automatiquement lorsque certaines conditions changent dans une autre classe, utile pour les systèmes d'événements.",{"type":29,"tag":106,"props":9168,"children":9170},{"className":5519,"code":9169,"language":5521,"meta":8,"style":8},"\u002F\u002F Exemple simple d'un Singleton en Java\npublic class DatabaseConnection {\n    private static DatabaseConnection instance;\n\n    private DatabaseConnection() {\n        \u002F\u002F Constructeur privé pour éviter l'instanciation\n\n directe\n    }\n\n    public static DatabaseConnection getInstance() {\n        if (instance == null) {\n            instance = new DatabaseConnection();\n        }\n        return instance;\n    }\n}\n",[9171],{"type":29,"tag":113,"props":9172,"children":9173},{"__ignoreMap":8},[9174,9182,9202,9227,9234,9253,9261,9268,9276,9283,9290,9318,9351,9376,9383,9398,9405],{"type":29,"tag":117,"props":9175,"children":9176},{"class":119,"line":120},[9177],{"type":29,"tag":117,"props":9178,"children":9179},{"style":124},[9180],{"type":34,"value":9181},"\u002F\u002F Exemple simple d'un Singleton en Java\n",{"type":29,"tag":117,"props":9183,"children":9184},{"class":119,"line":130},[9185,9189,9193,9198],{"type":29,"tag":117,"props":9186,"children":9187},{"style":143},[9188],{"type":34,"value":5541},{"type":29,"tag":117,"props":9190,"children":9191},{"style":143},[9192],{"type":34,"value":7575},{"type":29,"tag":117,"props":9194,"children":9195},{"style":2863},[9196],{"type":34,"value":9197}," DatabaseConnection",{"type":29,"tag":117,"props":9199,"children":9200},{"style":384},[9201],{"type":34,"value":3461},{"type":29,"tag":117,"props":9203,"children":9204},{"class":119,"line":139},[9205,9209,9214,9218,9223],{"type":29,"tag":117,"props":9206,"children":9207},{"style":143},[9208],{"type":34,"value":7592},{"type":29,"tag":117,"props":9210,"children":9211},{"style":143},[9212],{"type":34,"value":9213}," static",{"type":29,"tag":117,"props":9215,"children":9216},{"style":5976},[9217],{"type":34,"value":9197},{"type":29,"tag":117,"props":9219,"children":9220},{"style":378},[9221],{"type":34,"value":9222}," instance",{"type":29,"tag":117,"props":9224,"children":9225},{"style":384},[9226],{"type":34,"value":387},{"type":29,"tag":117,"props":9228,"children":9229},{"class":119,"line":172},[9230],{"type":29,"tag":117,"props":9231,"children":9232},{"emptyLinePlaceholder":13},[9233],{"type":34,"value":136},{"type":29,"tag":117,"props":9235,"children":9236},{"class":119,"line":181},[9237,9241,9245,9249],{"type":29,"tag":117,"props":9238,"children":9239},{"style":143},[9240],{"type":34,"value":7592},{"type":29,"tag":117,"props":9242,"children":9243},{"style":372},[9244],{"type":34,"value":9197},{"type":29,"tag":117,"props":9246,"children":9247},{"style":384},[9248],{"type":34,"value":381},{"type":29,"tag":117,"props":9250,"children":9251},{"style":384},[9252],{"type":34,"value":3461},{"type":29,"tag":117,"props":9254,"children":9255},{"class":119,"line":189},[9256],{"type":29,"tag":117,"props":9257,"children":9258},{"style":124},[9259],{"type":34,"value":9260},"        \u002F\u002F Constructeur privé pour éviter l'instanciation\n",{"type":29,"tag":117,"props":9262,"children":9263},{"class":119,"line":198},[9264],{"type":29,"tag":117,"props":9265,"children":9266},{"emptyLinePlaceholder":13},[9267],{"type":34,"value":136},{"type":29,"tag":117,"props":9269,"children":9270},{"class":119,"line":207},[9271],{"type":29,"tag":117,"props":9272,"children":9273},{"style":378},[9274],{"type":34,"value":9275}," directe\n",{"type":29,"tag":117,"props":9277,"children":9278},{"class":119,"line":215},[9279],{"type":29,"tag":117,"props":9280,"children":9281},{"style":384},[9282],{"type":34,"value":5632},{"type":29,"tag":117,"props":9284,"children":9285},{"class":119,"line":224},[9286],{"type":29,"tag":117,"props":9287,"children":9288},{"emptyLinePlaceholder":13},[9289],{"type":34,"value":136},{"type":29,"tag":117,"props":9291,"children":9292},{"class":119,"line":233},[9293,9297,9301,9305,9310,9314],{"type":29,"tag":117,"props":9294,"children":9295},{"style":143},[9296],{"type":34,"value":7641},{"type":29,"tag":117,"props":9298,"children":9299},{"style":143},[9300],{"type":34,"value":9213},{"type":29,"tag":117,"props":9302,"children":9303},{"style":5976},[9304],{"type":34,"value":9197},{"type":29,"tag":117,"props":9306,"children":9307},{"style":372},[9308],{"type":34,"value":9309}," getInstance",{"type":29,"tag":117,"props":9311,"children":9312},{"style":384},[9313],{"type":34,"value":381},{"type":29,"tag":117,"props":9315,"children":9316},{"style":384},[9317],{"type":34,"value":3461},{"type":29,"tag":117,"props":9319,"children":9320},{"class":119,"line":242},[9321,9325,9329,9334,9339,9343,9347],{"type":29,"tag":117,"props":9322,"children":9323},{"style":143},[9324],{"type":34,"value":6121},{"type":29,"tag":117,"props":9326,"children":9327},{"style":384},[9328],{"type":34,"value":3181},{"type":29,"tag":117,"props":9330,"children":9331},{"style":378},[9332],{"type":34,"value":9333},"instance ",{"type":29,"tag":117,"props":9335,"children":9336},{"style":160},[9337],{"type":34,"value":9338},"==",{"type":29,"tag":117,"props":9340,"children":9341},{"style":6700},[9342],{"type":34,"value":6703},{"type":29,"tag":117,"props":9344,"children":9345},{"style":384},[9346],{"type":34,"value":2803},{"type":29,"tag":117,"props":9348,"children":9349},{"style":384},[9350],{"type":34,"value":3461},{"type":29,"tag":117,"props":9352,"children":9353},{"class":119,"line":251},[9354,9359,9363,9367,9371],{"type":29,"tag":117,"props":9355,"children":9356},{"style":378},[9357],{"type":34,"value":9358},"            instance ",{"type":29,"tag":117,"props":9360,"children":9361},{"style":160},[9362],{"type":34,"value":6061},{"type":29,"tag":117,"props":9364,"children":9365},{"style":143},[9366],{"type":34,"value":6066},{"type":29,"tag":117,"props":9368,"children":9369},{"style":372},[9370],{"type":34,"value":9197},{"type":29,"tag":117,"props":9372,"children":9373},{"style":384},[9374],{"type":34,"value":9375},"();\n",{"type":29,"tag":117,"props":9377,"children":9378},{"class":119,"line":260},[9379],{"type":29,"tag":117,"props":9380,"children":9381},{"style":384},[9382],{"type":34,"value":6196},{"type":29,"tag":117,"props":9384,"children":9385},{"class":119,"line":269},[9386,9390,9394],{"type":29,"tag":117,"props":9387,"children":9388},{"style":143},[9389],{"type":34,"value":5616},{"type":29,"tag":117,"props":9391,"children":9392},{"style":378},[9393],{"type":34,"value":9222},{"type":29,"tag":117,"props":9395,"children":9396},{"style":384},[9397],{"type":34,"value":387},{"type":29,"tag":117,"props":9399,"children":9400},{"class":119,"line":278},[9401],{"type":29,"tag":117,"props":9402,"children":9403},{"style":384},[9404],{"type":34,"value":5632},{"type":29,"tag":117,"props":9406,"children":9407},{"class":119,"line":286},[9408],{"type":29,"tag":117,"props":9409,"children":9410},{"style":384},[9411],{"type":34,"value":2903},{"type":29,"tag":4530,"props":9413,"children":9415},{"id":9414},"_3-favoriser-le-couplage-faible",[9416],{"type":34,"value":9417},"3. Favoriser le couplage faible",{"type":29,"tag":30,"props":9419,"children":9420},{},[9421,9422,9427],{"type":34,"value":7167},{"type":29,"tag":45,"props":9423,"children":9424},{},[9425],{"type":34,"value":9426},"couplage faible",{"type":34,"value":9428}," signifie que vos classes et modules doivent être aussi indépendants que possible. Vous pouvez alors les modifier ou les remplacer sans affecter le reste. En Java, les interfaces sont l'outil principal pour réduire le couplage entre classes.",{"type":29,"tag":106,"props":9430,"children":9432},{"className":5519,"code":9431,"language":5521,"meta":8,"style":8},"\u002F\u002F Interface pour la méthode de paiement\npublic interface PaymentMethod {\n    void processPayment(double amount);\n}\n\n\u002F\u002F Implémentation de la méthode de paiement par carte\npublic class CreditCardPayment implements PaymentMethod {\n    public void processPayment(double amount) {\n        \u002F\u002F Logique de paiement par carte\n    }\n}\n\n\u002F\u002F Implémentation de la méthode de paiement via PayPal\npublic class PayPalPayment implements PaymentMethod {\n    public void processPayment(double amount) {\n        \u002F\u002F Logique de paiement PayPal\n    }\n}\n\n\u002F\u002F Utilisation de la méthode de paiement sans se soucier de l'implémentation\npublic class PaymentService {\n    private PaymentMethod paymentMethod;\n\n    public PaymentService(PaymentMethod paymentMethod) {\n        this.paymentMethod = paymentMethod;\n    }\n\n    public void executePayment(double amount) {\n        paymentMethod.processPayment(amount);\n    }\n}\n",[9433],{"type":29,"tag":113,"props":9434,"children":9435},{"__ignoreMap":8},[9436,9444,9463,9491,9498,9505,9513,9540,9575,9583,9590,9597,9604,9612,9639,9674,9682,9689,9696,9703,9711,9731,9751,9758,9789,9817,9824,9831,9868,9899,9907],{"type":29,"tag":117,"props":9437,"children":9438},{"class":119,"line":120},[9439],{"type":29,"tag":117,"props":9440,"children":9441},{"style":124},[9442],{"type":34,"value":9443},"\u002F\u002F Interface pour la méthode de paiement\n",{"type":29,"tag":117,"props":9445,"children":9446},{"class":119,"line":130},[9447,9451,9455,9459],{"type":29,"tag":117,"props":9448,"children":9449},{"style":143},[9450],{"type":34,"value":5541},{"type":29,"tag":117,"props":9452,"children":9453},{"style":143},[9454],{"type":34,"value":8561},{"type":29,"tag":117,"props":9456,"children":9457},{"style":2863},[9458],{"type":34,"value":8566},{"type":29,"tag":117,"props":9460,"children":9461},{"style":384},[9462],{"type":34,"value":3461},{"type":29,"tag":117,"props":9464,"children":9465},{"class":119,"line":139},[9466,9470,9475,9479,9483,9487],{"type":29,"tag":117,"props":9467,"children":9468},{"style":143},[9469],{"type":34,"value":8578},{"type":29,"tag":117,"props":9471,"children":9472},{"style":372},[9473],{"type":34,"value":9474}," processPayment",{"type":29,"tag":117,"props":9476,"children":9477},{"style":384},[9478],{"type":34,"value":1108},{"type":29,"tag":117,"props":9480,"children":9481},{"style":143},[9482],{"type":34,"value":8592},{"type":29,"tag":117,"props":9484,"children":9485},{"style":7657},[9486],{"type":34,"value":8597},{"type":29,"tag":117,"props":9488,"children":9489},{"style":384},[9490],{"type":34,"value":5675},{"type":29,"tag":117,"props":9492,"children":9493},{"class":119,"line":172},[9494],{"type":29,"tag":117,"props":9495,"children":9496},{"style":384},[9497],{"type":34,"value":2903},{"type":29,"tag":117,"props":9499,"children":9500},{"class":119,"line":181},[9501],{"type":29,"tag":117,"props":9502,"children":9503},{"emptyLinePlaceholder":13},[9504],{"type":34,"value":136},{"type":29,"tag":117,"props":9506,"children":9507},{"class":119,"line":189},[9508],{"type":29,"tag":117,"props":9509,"children":9510},{"style":124},[9511],{"type":34,"value":9512},"\u002F\u002F Implémentation de la méthode de paiement par carte\n",{"type":29,"tag":117,"props":9514,"children":9515},{"class":119,"line":198},[9516,9520,9524,9528,9532,9536],{"type":29,"tag":117,"props":9517,"children":9518},{"style":143},[9519],{"type":34,"value":5541},{"type":29,"tag":117,"props":9521,"children":9522},{"style":143},[9523],{"type":34,"value":7575},{"type":29,"tag":117,"props":9525,"children":9526},{"style":2863},[9527],{"type":34,"value":8631},{"type":29,"tag":117,"props":9529,"children":9530},{"style":143},[9531],{"type":34,"value":8636},{"type":29,"tag":117,"props":9533,"children":9534},{"style":2863},[9535],{"type":34,"value":8566},{"type":29,"tag":117,"props":9537,"children":9538},{"style":384},[9539],{"type":34,"value":3461},{"type":29,"tag":117,"props":9541,"children":9542},{"class":119,"line":207},[9543,9547,9551,9555,9559,9563,9567,9571],{"type":29,"tag":117,"props":9544,"children":9545},{"style":143},[9546],{"type":34,"value":7641},{"type":29,"tag":117,"props":9548,"children":9549},{"style":143},[9550],{"type":34,"value":7762},{"type":29,"tag":117,"props":9552,"children":9553},{"style":372},[9554],{"type":34,"value":9474},{"type":29,"tag":117,"props":9556,"children":9557},{"style":384},[9558],{"type":34,"value":1108},{"type":29,"tag":117,"props":9560,"children":9561},{"style":143},[9562],{"type":34,"value":8592},{"type":29,"tag":117,"props":9564,"children":9565},{"style":7657},[9566],{"type":34,"value":8597},{"type":29,"tag":117,"props":9568,"children":9569},{"style":384},[9570],{"type":34,"value":2803},{"type":29,"tag":117,"props":9572,"children":9573},{"style":384},[9574],{"type":34,"value":3461},{"type":29,"tag":117,"props":9576,"children":9577},{"class":119,"line":215},[9578],{"type":29,"tag":117,"props":9579,"children":9580},{"style":124},[9581],{"type":34,"value":9582},"        \u002F\u002F Logique de paiement par carte\n",{"type":29,"tag":117,"props":9584,"children":9585},{"class":119,"line":224},[9586],{"type":29,"tag":117,"props":9587,"children":9588},{"style":384},[9589],{"type":34,"value":5632},{"type":29,"tag":117,"props":9591,"children":9592},{"class":119,"line":233},[9593],{"type":29,"tag":117,"props":9594,"children":9595},{"style":384},[9596],{"type":34,"value":2903},{"type":29,"tag":117,"props":9598,"children":9599},{"class":119,"line":242},[9600],{"type":29,"tag":117,"props":9601,"children":9602},{"emptyLinePlaceholder":13},[9603],{"type":34,"value":136},{"type":29,"tag":117,"props":9605,"children":9606},{"class":119,"line":251},[9607],{"type":29,"tag":117,"props":9608,"children":9609},{"style":124},[9610],{"type":34,"value":9611},"\u002F\u002F Implémentation de la méthode de paiement via PayPal\n",{"type":29,"tag":117,"props":9613,"children":9614},{"class":119,"line":260},[9615,9619,9623,9627,9631,9635],{"type":29,"tag":117,"props":9616,"children":9617},{"style":143},[9618],{"type":34,"value":5541},{"type":29,"tag":117,"props":9620,"children":9621},{"style":143},[9622],{"type":34,"value":7575},{"type":29,"tag":117,"props":9624,"children":9625},{"style":2863},[9626],{"type":34,"value":8724},{"type":29,"tag":117,"props":9628,"children":9629},{"style":143},[9630],{"type":34,"value":8636},{"type":29,"tag":117,"props":9632,"children":9633},{"style":2863},[9634],{"type":34,"value":8566},{"type":29,"tag":117,"props":9636,"children":9637},{"style":384},[9638],{"type":34,"value":3461},{"type":29,"tag":117,"props":9640,"children":9641},{"class":119,"line":269},[9642,9646,9650,9654,9658,9662,9666,9670],{"type":29,"tag":117,"props":9643,"children":9644},{"style":143},[9645],{"type":34,"value":7641},{"type":29,"tag":117,"props":9647,"children":9648},{"style":143},[9649],{"type":34,"value":7762},{"type":29,"tag":117,"props":9651,"children":9652},{"style":372},[9653],{"type":34,"value":9474},{"type":29,"tag":117,"props":9655,"children":9656},{"style":384},[9657],{"type":34,"value":1108},{"type":29,"tag":117,"props":9659,"children":9660},{"style":143},[9661],{"type":34,"value":8592},{"type":29,"tag":117,"props":9663,"children":9664},{"style":7657},[9665],{"type":34,"value":8597},{"type":29,"tag":117,"props":9667,"children":9668},{"style":384},[9669],{"type":34,"value":2803},{"type":29,"tag":117,"props":9671,"children":9672},{"style":384},[9673],{"type":34,"value":3461},{"type":29,"tag":117,"props":9675,"children":9676},{"class":119,"line":278},[9677],{"type":29,"tag":117,"props":9678,"children":9679},{"style":124},[9680],{"type":34,"value":9681},"        \u002F\u002F Logique de paiement PayPal\n",{"type":29,"tag":117,"props":9683,"children":9684},{"class":119,"line":286},[9685],{"type":29,"tag":117,"props":9686,"children":9687},{"style":384},[9688],{"type":34,"value":5632},{"type":29,"tag":117,"props":9690,"children":9691},{"class":119,"line":295},[9692],{"type":29,"tag":117,"props":9693,"children":9694},{"style":384},[9695],{"type":34,"value":2903},{"type":29,"tag":117,"props":9697,"children":9698},{"class":119,"line":304},[9699],{"type":29,"tag":117,"props":9700,"children":9701},{"emptyLinePlaceholder":13},[9702],{"type":34,"value":136},{"type":29,"tag":117,"props":9704,"children":9705},{"class":119,"line":313},[9706],{"type":29,"tag":117,"props":9707,"children":9708},{"style":124},[9709],{"type":34,"value":9710},"\u002F\u002F Utilisation de la méthode de paiement sans se soucier de l'implémentation\n",{"type":29,"tag":117,"props":9712,"children":9713},{"class":119,"line":322},[9714,9718,9722,9727],{"type":29,"tag":117,"props":9715,"children":9716},{"style":143},[9717],{"type":34,"value":5541},{"type":29,"tag":117,"props":9719,"children":9720},{"style":143},[9721],{"type":34,"value":7575},{"type":29,"tag":117,"props":9723,"children":9724},{"style":2863},[9725],{"type":34,"value":9726}," PaymentService",{"type":29,"tag":117,"props":9728,"children":9729},{"style":384},[9730],{"type":34,"value":3461},{"type":29,"tag":117,"props":9732,"children":9733},{"class":119,"line":331},[9734,9738,9742,9747],{"type":29,"tag":117,"props":9735,"children":9736},{"style":143},[9737],{"type":34,"value":7592},{"type":29,"tag":117,"props":9739,"children":9740},{"style":5976},[9741],{"type":34,"value":8566},{"type":29,"tag":117,"props":9743,"children":9744},{"style":378},[9745],{"type":34,"value":9746}," paymentMethod",{"type":29,"tag":117,"props":9748,"children":9749},{"style":384},[9750],{"type":34,"value":387},{"type":29,"tag":117,"props":9752,"children":9753},{"class":119,"line":340},[9754],{"type":29,"tag":117,"props":9755,"children":9756},{"emptyLinePlaceholder":13},[9757],{"type":34,"value":136},{"type":29,"tag":117,"props":9759,"children":9760},{"class":119,"line":348},[9761,9765,9769,9773,9777,9781,9785],{"type":29,"tag":117,"props":9762,"children":9763},{"style":143},[9764],{"type":34,"value":7641},{"type":29,"tag":117,"props":9766,"children":9767},{"style":372},[9768],{"type":34,"value":9726},{"type":29,"tag":117,"props":9770,"children":9771},{"style":384},[9772],{"type":34,"value":1108},{"type":29,"tag":117,"props":9774,"children":9775},{"style":5976},[9776],{"type":34,"value":8804},{"type":29,"tag":117,"props":9778,"children":9779},{"style":7657},[9780],{"type":34,"value":9746},{"type":29,"tag":117,"props":9782,"children":9783},{"style":384},[9784],{"type":34,"value":2803},{"type":29,"tag":117,"props":9786,"children":9787},{"style":384},[9788],{"type":34,"value":3461},{"type":29,"tag":117,"props":9790,"children":9791},{"class":119,"line":357},[9792,9796,9800,9805,9809,9813],{"type":29,"tag":117,"props":9793,"children":9794},{"style":6700},[9795],{"type":34,"value":7687},{"type":29,"tag":117,"props":9797,"children":9798},{"style":384},[9799],{"type":34,"value":369},{"type":29,"tag":117,"props":9801,"children":9802},{"style":378},[9803],{"type":34,"value":9804},"paymentMethod ",{"type":29,"tag":117,"props":9806,"children":9807},{"style":160},[9808],{"type":34,"value":6061},{"type":29,"tag":117,"props":9810,"children":9811},{"style":378},[9812],{"type":34,"value":9746},{"type":29,"tag":117,"props":9814,"children":9815},{"style":384},[9816],{"type":34,"value":387},{"type":29,"tag":117,"props":9818,"children":9819},{"class":119,"line":1768},[9820],{"type":29,"tag":117,"props":9821,"children":9822},{"style":384},[9823],{"type":34,"value":5632},{"type":29,"tag":117,"props":9825,"children":9826},{"class":119,"line":953},[9827],{"type":29,"tag":117,"props":9828,"children":9829},{"emptyLinePlaceholder":13},[9830],{"type":34,"value":136},{"type":29,"tag":117,"props":9832,"children":9834},{"class":119,"line":9833},28,[9835,9839,9843,9848,9852,9856,9860,9864],{"type":29,"tag":117,"props":9836,"children":9837},{"style":143},[9838],{"type":34,"value":7641},{"type":29,"tag":117,"props":9840,"children":9841},{"style":143},[9842],{"type":34,"value":7762},{"type":29,"tag":117,"props":9844,"children":9845},{"style":372},[9846],{"type":34,"value":9847}," executePayment",{"type":29,"tag":117,"props":9849,"children":9850},{"style":384},[9851],{"type":34,"value":1108},{"type":29,"tag":117,"props":9853,"children":9854},{"style":143},[9855],{"type":34,"value":8592},{"type":29,"tag":117,"props":9857,"children":9858},{"style":7657},[9859],{"type":34,"value":8597},{"type":29,"tag":117,"props":9861,"children":9862},{"style":384},[9863],{"type":34,"value":2803},{"type":29,"tag":117,"props":9865,"children":9866},{"style":384},[9867],{"type":34,"value":3461},{"type":29,"tag":117,"props":9869,"children":9871},{"class":119,"line":9870},29,[9872,9877,9881,9886,9890,9895],{"type":29,"tag":117,"props":9873,"children":9874},{"style":378},[9875],{"type":34,"value":9876},"        paymentMethod",{"type":29,"tag":117,"props":9878,"children":9879},{"style":384},[9880],{"type":34,"value":369},{"type":29,"tag":117,"props":9882,"children":9883},{"style":372},[9884],{"type":34,"value":9885},"processPayment",{"type":29,"tag":117,"props":9887,"children":9888},{"style":384},[9889],{"type":34,"value":1108},{"type":29,"tag":117,"props":9891,"children":9892},{"style":378},[9893],{"type":34,"value":9894},"amount",{"type":29,"tag":117,"props":9896,"children":9897},{"style":384},[9898],{"type":34,"value":5675},{"type":29,"tag":117,"props":9900,"children":9902},{"class":119,"line":9901},30,[9903],{"type":29,"tag":117,"props":9904,"children":9905},{"style":384},[9906],{"type":34,"value":5632},{"type":29,"tag":117,"props":9908,"children":9910},{"class":119,"line":9909},31,[9911],{"type":29,"tag":117,"props":9912,"children":9913},{"style":384},[9914],{"type":34,"value":2903},{"type":29,"tag":4530,"props":9916,"children":9918},{"id":9917},"_4-tests-automatisés-et-tdd",[9919],{"type":34,"value":9920},"4. Tests automatisés et TDD",{"type":29,"tag":30,"props":9922,"children":9923},{},[9924,9926,9931],{"type":34,"value":9925},"Les tests sont essentiels pour garantir que votre code fonctionne correctement après chaque modification. L'écriture de ",{"type":29,"tag":45,"props":9927,"children":9928},{},[9929],{"type":34,"value":9930},"tests unitaires",{"type":34,"value":9932}," aide à s'assurer que chaque module de votre code fonctionne comme prévu, tandis que les tests d'intégration garantissent que les modules fonctionnent bien ensemble.",{"type":29,"tag":30,"props":9934,"children":9935},{},[9936,9937,9942,9944,9949,9950,9955],{"type":34,"value":7099},{"type":29,"tag":45,"props":9938,"children":9939},{},[9940],{"type":34,"value":9941},"méthodologie TDD (Test-Driven Development)",{"type":34,"value":9943}," consiste à écrire d'abord les tests avant de coder. Cela garantit que le code que vous écrivez est toujours testable et évolutif. Avec Java, des frameworks comme ",{"type":29,"tag":45,"props":9945,"children":9946},{},[9947],{"type":34,"value":9948},"JUnit",{"type":34,"value":5923},{"type":29,"tag":45,"props":9951,"children":9952},{},[9953],{"type":34,"value":9954},"Mockito",{"type":34,"value":9956}," facilitent l'écriture de tests unitaires et de tests d'intégration.",{"type":29,"tag":106,"props":9958,"children":9960},{"className":5519,"code":9959,"language":5521,"meta":8,"style":8},"import static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\npublic class SalaryServiceTest {\n\n    @Test\n    public void testCalculateSalary() {\n        Employee employee = new Employee(\"John\", \"IT\");\n        SalaryService salaryService = new SalaryService();\n        double salary = salaryService.calculateSalary(employee);\n\n        assertEquals(3000, salary, 0.01); \u002F\u002F Vérifie si le salaire est bien calculé\n    }\n}\n",[9961],{"type":29,"tag":113,"props":9962,"children":9963},{"__ignoreMap":8},[9964,10012,10044,10051,10071,10078,10093,10117,10164,10193,10237,10244,10288,10295],{"type":29,"tag":117,"props":9965,"children":9966},{"class":119,"line":120},[9967,9972,9976,9981,9985,9990,9994,9999,10003,10008],{"type":29,"tag":117,"props":9968,"children":9969},{"style":143},[9970],{"type":34,"value":9971},"import",{"type":29,"tag":117,"props":9973,"children":9974},{"style":143},[9975],{"type":34,"value":9213},{"type":29,"tag":117,"props":9977,"children":9978},{"style":378},[9979],{"type":34,"value":9980}," org",{"type":29,"tag":117,"props":9982,"children":9983},{"style":384},[9984],{"type":34,"value":369},{"type":29,"tag":117,"props":9986,"children":9987},{"style":378},[9988],{"type":34,"value":9989},"junit",{"type":29,"tag":117,"props":9991,"children":9992},{"style":384},[9993],{"type":34,"value":369},{"type":29,"tag":117,"props":9995,"children":9996},{"style":378},[9997],{"type":34,"value":9998},"Assert",{"type":29,"tag":117,"props":10000,"children":10001},{"style":384},[10002],{"type":34,"value":369},{"type":29,"tag":117,"props":10004,"children":10005},{"style":378},[10006],{"type":34,"value":10007},"assertEquals",{"type":29,"tag":117,"props":10009,"children":10010},{"style":384},[10011],{"type":34,"value":387},{"type":29,"tag":117,"props":10013,"children":10014},{"class":119,"line":130},[10015,10019,10023,10027,10031,10035,10040],{"type":29,"tag":117,"props":10016,"children":10017},{"style":143},[10018],{"type":34,"value":9971},{"type":29,"tag":117,"props":10020,"children":10021},{"style":378},[10022],{"type":34,"value":9980},{"type":29,"tag":117,"props":10024,"children":10025},{"style":384},[10026],{"type":34,"value":369},{"type":29,"tag":117,"props":10028,"children":10029},{"style":378},[10030],{"type":34,"value":9989},{"type":29,"tag":117,"props":10032,"children":10033},{"style":384},[10034],{"type":34,"value":369},{"type":29,"tag":117,"props":10036,"children":10037},{"style":378},[10038],{"type":34,"value":10039},"Test",{"type":29,"tag":117,"props":10041,"children":10042},{"style":384},[10043],{"type":34,"value":387},{"type":29,"tag":117,"props":10045,"children":10046},{"class":119,"line":139},[10047],{"type":29,"tag":117,"props":10048,"children":10049},{"emptyLinePlaceholder":13},[10050],{"type":34,"value":136},{"type":29,"tag":117,"props":10052,"children":10053},{"class":119,"line":172},[10054,10058,10062,10067],{"type":29,"tag":117,"props":10055,"children":10056},{"style":143},[10057],{"type":34,"value":5541},{"type":29,"tag":117,"props":10059,"children":10060},{"style":143},[10061],{"type":34,"value":7575},{"type":29,"tag":117,"props":10063,"children":10064},{"style":2863},[10065],{"type":34,"value":10066}," SalaryServiceTest",{"type":29,"tag":117,"props":10068,"children":10069},{"style":384},[10070],{"type":34,"value":3461},{"type":29,"tag":117,"props":10072,"children":10073},{"class":119,"line":181},[10074],{"type":29,"tag":117,"props":10075,"children":10076},{"emptyLinePlaceholder":13},[10077],{"type":34,"value":136},{"type":29,"tag":117,"props":10079,"children":10080},{"class":119,"line":189},[10081,10087],{"type":29,"tag":117,"props":10082,"children":10084},{"style":10083},"--shiki-default:#EF9F76;--shiki-dark:#E1E4E8",[10085],{"type":34,"value":10086},"    @",{"type":29,"tag":117,"props":10088,"children":10090},{"style":10089},"--shiki-default:#EF9F76;--shiki-dark:#F97583",[10091],{"type":34,"value":10092},"Test\n",{"type":29,"tag":117,"props":10094,"children":10095},{"class":119,"line":198},[10096,10100,10104,10109,10113],{"type":29,"tag":117,"props":10097,"children":10098},{"style":143},[10099],{"type":34,"value":7641},{"type":29,"tag":117,"props":10101,"children":10102},{"style":143},[10103],{"type":34,"value":7762},{"type":29,"tag":117,"props":10105,"children":10106},{"style":372},[10107],{"type":34,"value":10108}," testCalculateSalary",{"type":29,"tag":117,"props":10110,"children":10111},{"style":384},[10112],{"type":34,"value":381},{"type":29,"tag":117,"props":10114,"children":10115},{"style":384},[10116],{"type":34,"value":3461},{"type":29,"tag":117,"props":10118,"children":10119},{"class":119,"line":207},[10120,10125,10130,10134,10138,10142,10146,10151,10155,10160],{"type":29,"tag":117,"props":10121,"children":10122},{"style":5976},[10123],{"type":34,"value":10124},"        Employee",{"type":29,"tag":117,"props":10126,"children":10127},{"style":378},[10128],{"type":34,"value":10129}," employee ",{"type":29,"tag":117,"props":10131,"children":10132},{"style":160},[10133],{"type":34,"value":6061},{"type":29,"tag":117,"props":10135,"children":10136},{"style":143},[10137],{"type":34,"value":6066},{"type":29,"tag":117,"props":10139,"children":10140},{"style":372},[10141],{"type":34,"value":7580},{"type":29,"tag":117,"props":10143,"children":10144},{"style":384},[10145],{"type":34,"value":1108},{"type":29,"tag":117,"props":10147,"children":10148},{"style":166},[10149],{"type":34,"value":10150},"\"John\"",{"type":29,"tag":117,"props":10152,"children":10153},{"style":384},[10154],{"type":34,"value":1118},{"type":29,"tag":117,"props":10156,"children":10157},{"style":166},[10158],{"type":34,"value":10159}," \"IT\"",{"type":29,"tag":117,"props":10161,"children":10162},{"style":384},[10163],{"type":34,"value":5675},{"type":29,"tag":117,"props":10165,"children":10166},{"class":119,"line":215},[10167,10172,10177,10181,10185,10189],{"type":29,"tag":117,"props":10168,"children":10169},{"style":5976},[10170],{"type":34,"value":10171},"        SalaryService",{"type":29,"tag":117,"props":10173,"children":10174},{"style":378},[10175],{"type":34,"value":10176}," salaryService ",{"type":29,"tag":117,"props":10178,"children":10179},{"style":160},[10180],{"type":34,"value":6061},{"type":29,"tag":117,"props":10182,"children":10183},{"style":143},[10184],{"type":34,"value":6066},{"type":29,"tag":117,"props":10186,"children":10187},{"style":372},[10188],{"type":34,"value":8962},{"type":29,"tag":117,"props":10190,"children":10191},{"style":384},[10192],{"type":34,"value":9375},{"type":29,"tag":117,"props":10194,"children":10195},{"class":119,"line":224},[10196,10201,10206,10210,10215,10219,10224,10228,10233],{"type":29,"tag":117,"props":10197,"children":10198},{"style":143},[10199],{"type":34,"value":10200},"        double",{"type":29,"tag":117,"props":10202,"children":10203},{"style":378},[10204],{"type":34,"value":10205}," salary ",{"type":29,"tag":117,"props":10207,"children":10208},{"style":160},[10209],{"type":34,"value":6061},{"type":29,"tag":117,"props":10211,"children":10212},{"style":378},[10213],{"type":34,"value":10214}," salaryService",{"type":29,"tag":117,"props":10216,"children":10217},{"style":384},[10218],{"type":34,"value":369},{"type":29,"tag":117,"props":10220,"children":10221},{"style":372},[10222],{"type":34,"value":10223},"calculateSalary",{"type":29,"tag":117,"props":10225,"children":10226},{"style":384},[10227],{"type":34,"value":1108},{"type":29,"tag":117,"props":10229,"children":10230},{"style":378},[10231],{"type":34,"value":10232},"employee",{"type":29,"tag":117,"props":10234,"children":10235},{"style":384},[10236],{"type":34,"value":5675},{"type":29,"tag":117,"props":10238,"children":10239},{"class":119,"line":233},[10240],{"type":29,"tag":117,"props":10241,"children":10242},{"emptyLinePlaceholder":13},[10243],{"type":34,"value":136},{"type":29,"tag":117,"props":10245,"children":10246},{"class":119,"line":242},[10247,10252,10256,10261,10265,10269,10273,10278,10283],{"type":29,"tag":117,"props":10248,"children":10249},{"style":372},[10250],{"type":34,"value":10251},"        assertEquals",{"type":29,"tag":117,"props":10253,"children":10254},{"style":384},[10255],{"type":34,"value":1108},{"type":29,"tag":117,"props":10257,"children":10258},{"style":3476},[10259],{"type":34,"value":10260},"3000",{"type":29,"tag":117,"props":10262,"children":10263},{"style":384},[10264],{"type":34,"value":1118},{"type":29,"tag":117,"props":10266,"children":10267},{"style":378},[10268],{"type":34,"value":7622},{"type":29,"tag":117,"props":10270,"children":10271},{"style":384},[10272],{"type":34,"value":1118},{"type":29,"tag":117,"props":10274,"children":10275},{"style":3476},[10276],{"type":34,"value":10277}," 0.01",{"type":29,"tag":117,"props":10279,"children":10280},{"style":384},[10281],{"type":34,"value":10282},");",{"type":29,"tag":117,"props":10284,"children":10285},{"style":124},[10286],{"type":34,"value":10287}," \u002F\u002F Vérifie si le salaire est bien calculé\n",{"type":29,"tag":117,"props":10289,"children":10290},{"class":119,"line":251},[10291],{"type":29,"tag":117,"props":10292,"children":10293},{"style":384},[10294],{"type":34,"value":5632},{"type":29,"tag":117,"props":10296,"children":10297},{"class":119,"line":260},[10298],{"type":29,"tag":117,"props":10299,"children":10300},{"style":384},[10301],{"type":34,"value":2903},{"type":29,"tag":51,"props":10303,"children":10304},{},[],{"type":29,"tag":55,"props":10306,"children":10308},{"id":10307},"exemples-pratiques-de-code-évolutif-en-java",[10309],{"type":34,"value":10310},"Exemples pratiques de code évolutif en Java",{"type":29,"tag":30,"props":10312,"children":10313},{},[10314],{"type":34,"value":10315},"Voici des exemples concrets qui montrent comment appliquer les principes d'écriture de code évolutif en Java. Vous verrez comment améliorer du code pour le rendre plus maintenable et évolutif. J'ai vu ces patterns se répéter dans des dizaines d'équipes que j'ai accompagnées, notamment dans des DSI bancaires où la dette structurelle s'accumule vite faute de séparation des responsabilités.",{"type":29,"tag":4530,"props":10317,"children":10319},{"id":10318},"exemple-1-application-du-principe-de-responsabilité-unique-srp",[10320],{"type":34,"value":10321},"Exemple 1 : Application du principe de Responsabilité unique (SRP)",{"type":29,"tag":30,"props":10323,"children":10324},{},[10325,10327,10332,10334,10340],{"type":34,"value":10326},"Prenons un exemple de code qui viole le ",{"type":29,"tag":45,"props":10328,"children":10329},{},[10330],{"type":34,"value":10331},"principe de responsabilité unique",{"type":34,"value":10333}," (SRP). Ici, une classe ",{"type":29,"tag":113,"props":10335,"children":10337},{"className":10336},[],[10338],{"type":34,"value":10339},"Order",{"type":34,"value":10341}," fait trop de choses à la fois, notamment gérer les détails de la commande, traiter le paiement et générer des factures.",{"type":29,"tag":7528,"props":10343,"children":10345},{"id":10344},"avant-code-non-évolutif",[10346],{"type":34,"value":10347},"Avant : Code non évolutif",{"type":29,"tag":106,"props":10349,"children":10351},{"className":5519,"code":10350,"language":5521,"meta":8,"style":8},"public class Order {\n    private String product;\n    private int quantity;\n    private double price;\n\n    public Order(String product, int quantity, double price) {\n        this.product = product;\n        this.quantity = quantity;\n        this.price = price;\n    }\n\n    public void processOrder() {\n        \u002F\u002F Logique pour traiter la commande\n    }\n\n    public void generateInvoice() {\n        \u002F\u002F Logique pour générer une facture\n    }\n\n    public void processPayment() {\n        \u002F\u002F Logique pour traiter le paiement\n    }\n}\n",[10352],{"type":29,"tag":113,"props":10353,"children":10354},{"__ignoreMap":8},[10355,10375,10395,10415,10435,10442,10497,10525,10553,10581,10588,10595,10619,10627,10634,10641,10665,10673,10680,10687,10710,10718,10725],{"type":29,"tag":117,"props":10356,"children":10357},{"class":119,"line":120},[10358,10362,10366,10371],{"type":29,"tag":117,"props":10359,"children":10360},{"style":143},[10361],{"type":34,"value":5541},{"type":29,"tag":117,"props":10363,"children":10364},{"style":143},[10365],{"type":34,"value":7575},{"type":29,"tag":117,"props":10367,"children":10368},{"style":2863},[10369],{"type":34,"value":10370}," Order",{"type":29,"tag":117,"props":10372,"children":10373},{"style":384},[10374],{"type":34,"value":3461},{"type":29,"tag":117,"props":10376,"children":10377},{"class":119,"line":130},[10378,10382,10386,10391],{"type":29,"tag":117,"props":10379,"children":10380},{"style":143},[10381],{"type":34,"value":7592},{"type":29,"tag":117,"props":10383,"children":10384},{"style":5976},[10385],{"type":34,"value":6477},{"type":29,"tag":117,"props":10387,"children":10388},{"style":378},[10389],{"type":34,"value":10390}," product",{"type":29,"tag":117,"props":10392,"children":10393},{"style":384},[10394],{"type":34,"value":387},{"type":29,"tag":117,"props":10396,"children":10397},{"class":119,"line":139},[10398,10402,10406,10411],{"type":29,"tag":117,"props":10399,"children":10400},{"style":143},[10401],{"type":34,"value":7592},{"type":29,"tag":117,"props":10403,"children":10404},{"style":143},[10405],{"type":34,"value":5546},{"type":29,"tag":117,"props":10407,"children":10408},{"style":378},[10409],{"type":34,"value":10410}," quantity",{"type":29,"tag":117,"props":10412,"children":10413},{"style":384},[10414],{"type":34,"value":387},{"type":29,"tag":117,"props":10416,"children":10417},{"class":119,"line":172},[10418,10422,10426,10431],{"type":29,"tag":117,"props":10419,"children":10420},{"style":143},[10421],{"type":34,"value":7592},{"type":29,"tag":117,"props":10423,"children":10424},{"style":143},[10425],{"type":34,"value":7617},{"type":29,"tag":117,"props":10427,"children":10428},{"style":378},[10429],{"type":34,"value":10430}," price",{"type":29,"tag":117,"props":10432,"children":10433},{"style":384},[10434],{"type":34,"value":387},{"type":29,"tag":117,"props":10436,"children":10437},{"class":119,"line":181},[10438],{"type":29,"tag":117,"props":10439,"children":10440},{"emptyLinePlaceholder":13},[10441],{"type":34,"value":136},{"type":29,"tag":117,"props":10443,"children":10444},{"class":119,"line":189},[10445,10449,10453,10457,10461,10465,10469,10473,10477,10481,10485,10489,10493],{"type":29,"tag":117,"props":10446,"children":10447},{"style":143},[10448],{"type":34,"value":7641},{"type":29,"tag":117,"props":10450,"children":10451},{"style":372},[10452],{"type":34,"value":10370},{"type":29,"tag":117,"props":10454,"children":10455},{"style":384},[10456],{"type":34,"value":1108},{"type":29,"tag":117,"props":10458,"children":10459},{"style":5976},[10460],{"type":34,"value":7654},{"type":29,"tag":117,"props":10462,"children":10463},{"style":7657},[10464],{"type":34,"value":10390},{"type":29,"tag":117,"props":10466,"children":10467},{"style":384},[10468],{"type":34,"value":1118},{"type":29,"tag":117,"props":10470,"children":10471},{"style":143},[10472],{"type":34,"value":5546},{"type":29,"tag":117,"props":10474,"children":10475},{"style":7657},[10476],{"type":34,"value":10410},{"type":29,"tag":117,"props":10478,"children":10479},{"style":384},[10480],{"type":34,"value":1118},{"type":29,"tag":117,"props":10482,"children":10483},{"style":143},[10484],{"type":34,"value":7617},{"type":29,"tag":117,"props":10486,"children":10487},{"style":7657},[10488],{"type":34,"value":10430},{"type":29,"tag":117,"props":10490,"children":10491},{"style":384},[10492],{"type":34,"value":2803},{"type":29,"tag":117,"props":10494,"children":10495},{"style":384},[10496],{"type":34,"value":3461},{"type":29,"tag":117,"props":10498,"children":10499},{"class":119,"line":198},[10500,10504,10508,10513,10517,10521],{"type":29,"tag":117,"props":10501,"children":10502},{"style":6700},[10503],{"type":34,"value":7687},{"type":29,"tag":117,"props":10505,"children":10506},{"style":384},[10507],{"type":34,"value":369},{"type":29,"tag":117,"props":10509,"children":10510},{"style":378},[10511],{"type":34,"value":10512},"product ",{"type":29,"tag":117,"props":10514,"children":10515},{"style":160},[10516],{"type":34,"value":6061},{"type":29,"tag":117,"props":10518,"children":10519},{"style":378},[10520],{"type":34,"value":10390},{"type":29,"tag":117,"props":10522,"children":10523},{"style":384},[10524],{"type":34,"value":387},{"type":29,"tag":117,"props":10526,"children":10527},{"class":119,"line":207},[10528,10532,10536,10541,10545,10549],{"type":29,"tag":117,"props":10529,"children":10530},{"style":6700},[10531],{"type":34,"value":7687},{"type":29,"tag":117,"props":10533,"children":10534},{"style":384},[10535],{"type":34,"value":369},{"type":29,"tag":117,"props":10537,"children":10538},{"style":378},[10539],{"type":34,"value":10540},"quantity ",{"type":29,"tag":117,"props":10542,"children":10543},{"style":160},[10544],{"type":34,"value":6061},{"type":29,"tag":117,"props":10546,"children":10547},{"style":378},[10548],{"type":34,"value":10410},{"type":29,"tag":117,"props":10550,"children":10551},{"style":384},[10552],{"type":34,"value":387},{"type":29,"tag":117,"props":10554,"children":10555},{"class":119,"line":215},[10556,10560,10564,10569,10573,10577],{"type":29,"tag":117,"props":10557,"children":10558},{"style":6700},[10559],{"type":34,"value":7687},{"type":29,"tag":117,"props":10561,"children":10562},{"style":384},[10563],{"type":34,"value":369},{"type":29,"tag":117,"props":10565,"children":10566},{"style":378},[10567],{"type":34,"value":10568},"price ",{"type":29,"tag":117,"props":10570,"children":10571},{"style":160},[10572],{"type":34,"value":6061},{"type":29,"tag":117,"props":10574,"children":10575},{"style":378},[10576],{"type":34,"value":10430},{"type":29,"tag":117,"props":10578,"children":10579},{"style":384},[10580],{"type":34,"value":387},{"type":29,"tag":117,"props":10582,"children":10583},{"class":119,"line":224},[10584],{"type":29,"tag":117,"props":10585,"children":10586},{"style":384},[10587],{"type":34,"value":5632},{"type":29,"tag":117,"props":10589,"children":10590},{"class":119,"line":233},[10591],{"type":29,"tag":117,"props":10592,"children":10593},{"emptyLinePlaceholder":13},[10594],{"type":34,"value":136},{"type":29,"tag":117,"props":10596,"children":10597},{"class":119,"line":242},[10598,10602,10606,10611,10615],{"type":29,"tag":117,"props":10599,"children":10600},{"style":143},[10601],{"type":34,"value":7641},{"type":29,"tag":117,"props":10603,"children":10604},{"style":143},[10605],{"type":34,"value":7762},{"type":29,"tag":117,"props":10607,"children":10608},{"style":372},[10609],{"type":34,"value":10610}," processOrder",{"type":29,"tag":117,"props":10612,"children":10613},{"style":384},[10614],{"type":34,"value":381},{"type":29,"tag":117,"props":10616,"children":10617},{"style":384},[10618],{"type":34,"value":3461},{"type":29,"tag":117,"props":10620,"children":10621},{"class":119,"line":251},[10622],{"type":29,"tag":117,"props":10623,"children":10624},{"style":124},[10625],{"type":34,"value":10626},"        \u002F\u002F Logique pour traiter la commande\n",{"type":29,"tag":117,"props":10628,"children":10629},{"class":119,"line":260},[10630],{"type":29,"tag":117,"props":10631,"children":10632},{"style":384},[10633],{"type":34,"value":5632},{"type":29,"tag":117,"props":10635,"children":10636},{"class":119,"line":269},[10637],{"type":29,"tag":117,"props":10638,"children":10639},{"emptyLinePlaceholder":13},[10640],{"type":34,"value":136},{"type":29,"tag":117,"props":10642,"children":10643},{"class":119,"line":278},[10644,10648,10652,10657,10661],{"type":29,"tag":117,"props":10645,"children":10646},{"style":143},[10647],{"type":34,"value":7641},{"type":29,"tag":117,"props":10649,"children":10650},{"style":143},[10651],{"type":34,"value":7762},{"type":29,"tag":117,"props":10653,"children":10654},{"style":372},[10655],{"type":34,"value":10656}," generateInvoice",{"type":29,"tag":117,"props":10658,"children":10659},{"style":384},[10660],{"type":34,"value":381},{"type":29,"tag":117,"props":10662,"children":10663},{"style":384},[10664],{"type":34,"value":3461},{"type":29,"tag":117,"props":10666,"children":10667},{"class":119,"line":286},[10668],{"type":29,"tag":117,"props":10669,"children":10670},{"style":124},[10671],{"type":34,"value":10672},"        \u002F\u002F Logique pour générer une facture\n",{"type":29,"tag":117,"props":10674,"children":10675},{"class":119,"line":295},[10676],{"type":29,"tag":117,"props":10677,"children":10678},{"style":384},[10679],{"type":34,"value":5632},{"type":29,"tag":117,"props":10681,"children":10682},{"class":119,"line":304},[10683],{"type":29,"tag":117,"props":10684,"children":10685},{"emptyLinePlaceholder":13},[10686],{"type":34,"value":136},{"type":29,"tag":117,"props":10688,"children":10689},{"class":119,"line":313},[10690,10694,10698,10702,10706],{"type":29,"tag":117,"props":10691,"children":10692},{"style":143},[10693],{"type":34,"value":7641},{"type":29,"tag":117,"props":10695,"children":10696},{"style":143},[10697],{"type":34,"value":7762},{"type":29,"tag":117,"props":10699,"children":10700},{"style":372},[10701],{"type":34,"value":9474},{"type":29,"tag":117,"props":10703,"children":10704},{"style":384},[10705],{"type":34,"value":381},{"type":29,"tag":117,"props":10707,"children":10708},{"style":384},[10709],{"type":34,"value":3461},{"type":29,"tag":117,"props":10711,"children":10712},{"class":119,"line":322},[10713],{"type":29,"tag":117,"props":10714,"children":10715},{"style":124},[10716],{"type":34,"value":10717},"        \u002F\u002F Logique pour traiter le paiement\n",{"type":29,"tag":117,"props":10719,"children":10720},{"class":119,"line":331},[10721],{"type":29,"tag":117,"props":10722,"children":10723},{"style":384},[10724],{"type":34,"value":5632},{"type":29,"tag":117,"props":10726,"children":10727},{"class":119,"line":340},[10728],{"type":29,"tag":117,"props":10729,"children":10730},{"style":384},[10731],{"type":34,"value":2903},{"type":29,"tag":7528,"props":10733,"children":10735},{"id":10734},"après-code-évolutif",[10736],{"type":34,"value":10737},"Après : Code évolutif",{"type":29,"tag":30,"props":10739,"children":10740},{},[10741],{"type":34,"value":10742},"Voici une version améliorée en appliquant le principe de responsabilité unique. Chaque classe a désormais un rôle distinct.",{"type":29,"tag":106,"props":10744,"children":10746},{"className":5519,"code":10745,"language":5521,"meta":8,"style":8},"public class Order {\n    private String product;\n    private int quantity;\n    private double price;\n\n    public Order(String product, int quantity, double price) {\n        this.product = product;\n        this.quantity = quantity;\n        this.price = price;\n    }\n\n    \u002F\u002F Méthode pour obtenir le prix total de la commande\n    public double getTotalPrice() {\n        return quantity * price;\n    }\n}\n\n\u002F\u002F Classe pour traiter le paiement\npublic class PaymentService {\n    public void processPayment(Order order) {\n        \u002F\u002F Logique pour traiter le paiement\n    }\n}\n\n\u002F\u002F Classe pour générer une facture\npublic class InvoiceService {\n    public void generateInvoice(Order order) {\n        \u002F\u002F Logique pour générer une facture\n    }\n}\n",[10747],{"type":29,"tag":113,"props":10748,"children":10749},{"__ignoreMap":8},[10750,10769,10788,10807,10826,10833,10888,10915,10942,10969,10976,10983,10991,11015,11039,11046,11053,11060,11068,11087,11123,11130,11137,11144,11151,11159,11179,11214,11221,11228],{"type":29,"tag":117,"props":10751,"children":10752},{"class":119,"line":120},[10753,10757,10761,10765],{"type":29,"tag":117,"props":10754,"children":10755},{"style":143},[10756],{"type":34,"value":5541},{"type":29,"tag":117,"props":10758,"children":10759},{"style":143},[10760],{"type":34,"value":7575},{"type":29,"tag":117,"props":10762,"children":10763},{"style":2863},[10764],{"type":34,"value":10370},{"type":29,"tag":117,"props":10766,"children":10767},{"style":384},[10768],{"type":34,"value":3461},{"type":29,"tag":117,"props":10770,"children":10771},{"class":119,"line":130},[10772,10776,10780,10784],{"type":29,"tag":117,"props":10773,"children":10774},{"style":143},[10775],{"type":34,"value":7592},{"type":29,"tag":117,"props":10777,"children":10778},{"style":5976},[10779],{"type":34,"value":6477},{"type":29,"tag":117,"props":10781,"children":10782},{"style":378},[10783],{"type":34,"value":10390},{"type":29,"tag":117,"props":10785,"children":10786},{"style":384},[10787],{"type":34,"value":387},{"type":29,"tag":117,"props":10789,"children":10790},{"class":119,"line":139},[10791,10795,10799,10803],{"type":29,"tag":117,"props":10792,"children":10793},{"style":143},[10794],{"type":34,"value":7592},{"type":29,"tag":117,"props":10796,"children":10797},{"style":143},[10798],{"type":34,"value":5546},{"type":29,"tag":117,"props":10800,"children":10801},{"style":378},[10802],{"type":34,"value":10410},{"type":29,"tag":117,"props":10804,"children":10805},{"style":384},[10806],{"type":34,"value":387},{"type":29,"tag":117,"props":10808,"children":10809},{"class":119,"line":172},[10810,10814,10818,10822],{"type":29,"tag":117,"props":10811,"children":10812},{"style":143},[10813],{"type":34,"value":7592},{"type":29,"tag":117,"props":10815,"children":10816},{"style":143},[10817],{"type":34,"value":7617},{"type":29,"tag":117,"props":10819,"children":10820},{"style":378},[10821],{"type":34,"value":10430},{"type":29,"tag":117,"props":10823,"children":10824},{"style":384},[10825],{"type":34,"value":387},{"type":29,"tag":117,"props":10827,"children":10828},{"class":119,"line":181},[10829],{"type":29,"tag":117,"props":10830,"children":10831},{"emptyLinePlaceholder":13},[10832],{"type":34,"value":136},{"type":29,"tag":117,"props":10834,"children":10835},{"class":119,"line":189},[10836,10840,10844,10848,10852,10856,10860,10864,10868,10872,10876,10880,10884],{"type":29,"tag":117,"props":10837,"children":10838},{"style":143},[10839],{"type":34,"value":7641},{"type":29,"tag":117,"props":10841,"children":10842},{"style":372},[10843],{"type":34,"value":10370},{"type":29,"tag":117,"props":10845,"children":10846},{"style":384},[10847],{"type":34,"value":1108},{"type":29,"tag":117,"props":10849,"children":10850},{"style":5976},[10851],{"type":34,"value":7654},{"type":29,"tag":117,"props":10853,"children":10854},{"style":7657},[10855],{"type":34,"value":10390},{"type":29,"tag":117,"props":10857,"children":10858},{"style":384},[10859],{"type":34,"value":1118},{"type":29,"tag":117,"props":10861,"children":10862},{"style":143},[10863],{"type":34,"value":5546},{"type":29,"tag":117,"props":10865,"children":10866},{"style":7657},[10867],{"type":34,"value":10410},{"type":29,"tag":117,"props":10869,"children":10870},{"style":384},[10871],{"type":34,"value":1118},{"type":29,"tag":117,"props":10873,"children":10874},{"style":143},[10875],{"type":34,"value":7617},{"type":29,"tag":117,"props":10877,"children":10878},{"style":7657},[10879],{"type":34,"value":10430},{"type":29,"tag":117,"props":10881,"children":10882},{"style":384},[10883],{"type":34,"value":2803},{"type":29,"tag":117,"props":10885,"children":10886},{"style":384},[10887],{"type":34,"value":3461},{"type":29,"tag":117,"props":10889,"children":10890},{"class":119,"line":198},[10891,10895,10899,10903,10907,10911],{"type":29,"tag":117,"props":10892,"children":10893},{"style":6700},[10894],{"type":34,"value":7687},{"type":29,"tag":117,"props":10896,"children":10897},{"style":384},[10898],{"type":34,"value":369},{"type":29,"tag":117,"props":10900,"children":10901},{"style":378},[10902],{"type":34,"value":10512},{"type":29,"tag":117,"props":10904,"children":10905},{"style":160},[10906],{"type":34,"value":6061},{"type":29,"tag":117,"props":10908,"children":10909},{"style":378},[10910],{"type":34,"value":10390},{"type":29,"tag":117,"props":10912,"children":10913},{"style":384},[10914],{"type":34,"value":387},{"type":29,"tag":117,"props":10916,"children":10917},{"class":119,"line":207},[10918,10922,10926,10930,10934,10938],{"type":29,"tag":117,"props":10919,"children":10920},{"style":6700},[10921],{"type":34,"value":7687},{"type":29,"tag":117,"props":10923,"children":10924},{"style":384},[10925],{"type":34,"value":369},{"type":29,"tag":117,"props":10927,"children":10928},{"style":378},[10929],{"type":34,"value":10540},{"type":29,"tag":117,"props":10931,"children":10932},{"style":160},[10933],{"type":34,"value":6061},{"type":29,"tag":117,"props":10935,"children":10936},{"style":378},[10937],{"type":34,"value":10410},{"type":29,"tag":117,"props":10939,"children":10940},{"style":384},[10941],{"type":34,"value":387},{"type":29,"tag":117,"props":10943,"children":10944},{"class":119,"line":215},[10945,10949,10953,10957,10961,10965],{"type":29,"tag":117,"props":10946,"children":10947},{"style":6700},[10948],{"type":34,"value":7687},{"type":29,"tag":117,"props":10950,"children":10951},{"style":384},[10952],{"type":34,"value":369},{"type":29,"tag":117,"props":10954,"children":10955},{"style":378},[10956],{"type":34,"value":10568},{"type":29,"tag":117,"props":10958,"children":10959},{"style":160},[10960],{"type":34,"value":6061},{"type":29,"tag":117,"props":10962,"children":10963},{"style":378},[10964],{"type":34,"value":10430},{"type":29,"tag":117,"props":10966,"children":10967},{"style":384},[10968],{"type":34,"value":387},{"type":29,"tag":117,"props":10970,"children":10971},{"class":119,"line":224},[10972],{"type":29,"tag":117,"props":10973,"children":10974},{"style":384},[10975],{"type":34,"value":5632},{"type":29,"tag":117,"props":10977,"children":10978},{"class":119,"line":233},[10979],{"type":29,"tag":117,"props":10980,"children":10981},{"emptyLinePlaceholder":13},[10982],{"type":34,"value":136},{"type":29,"tag":117,"props":10984,"children":10985},{"class":119,"line":242},[10986],{"type":29,"tag":117,"props":10987,"children":10988},{"style":124},[10989],{"type":34,"value":10990},"    \u002F\u002F Méthode pour obtenir le prix total de la commande\n",{"type":29,"tag":117,"props":10992,"children":10993},{"class":119,"line":251},[10994,10998,11002,11007,11011],{"type":29,"tag":117,"props":10995,"children":10996},{"style":143},[10997],{"type":34,"value":7641},{"type":29,"tag":117,"props":10999,"children":11000},{"style":143},[11001],{"type":34,"value":7617},{"type":29,"tag":117,"props":11003,"children":11004},{"style":372},[11005],{"type":34,"value":11006}," getTotalPrice",{"type":29,"tag":117,"props":11008,"children":11009},{"style":384},[11010],{"type":34,"value":381},{"type":29,"tag":117,"props":11012,"children":11013},{"style":384},[11014],{"type":34,"value":3461},{"type":29,"tag":117,"props":11016,"children":11017},{"class":119,"line":260},[11018,11022,11027,11031,11035],{"type":29,"tag":117,"props":11019,"children":11020},{"style":143},[11021],{"type":34,"value":5616},{"type":29,"tag":117,"props":11023,"children":11024},{"style":378},[11025],{"type":34,"value":11026}," quantity ",{"type":29,"tag":117,"props":11028,"children":11029},{"style":160},[11030],{"type":34,"value":5649},{"type":29,"tag":117,"props":11032,"children":11033},{"style":378},[11034],{"type":34,"value":10430},{"type":29,"tag":117,"props":11036,"children":11037},{"style":384},[11038],{"type":34,"value":387},{"type":29,"tag":117,"props":11040,"children":11041},{"class":119,"line":269},[11042],{"type":29,"tag":117,"props":11043,"children":11044},{"style":384},[11045],{"type":34,"value":5632},{"type":29,"tag":117,"props":11047,"children":11048},{"class":119,"line":278},[11049],{"type":29,"tag":117,"props":11050,"children":11051},{"style":384},[11052],{"type":34,"value":2903},{"type":29,"tag":117,"props":11054,"children":11055},{"class":119,"line":286},[11056],{"type":29,"tag":117,"props":11057,"children":11058},{"emptyLinePlaceholder":13},[11059],{"type":34,"value":136},{"type":29,"tag":117,"props":11061,"children":11062},{"class":119,"line":295},[11063],{"type":29,"tag":117,"props":11064,"children":11065},{"style":124},[11066],{"type":34,"value":11067},"\u002F\u002F Classe pour traiter le paiement\n",{"type":29,"tag":117,"props":11069,"children":11070},{"class":119,"line":304},[11071,11075,11079,11083],{"type":29,"tag":117,"props":11072,"children":11073},{"style":143},[11074],{"type":34,"value":5541},{"type":29,"tag":117,"props":11076,"children":11077},{"style":143},[11078],{"type":34,"value":7575},{"type":29,"tag":117,"props":11080,"children":11081},{"style":2863},[11082],{"type":34,"value":9726},{"type":29,"tag":117,"props":11084,"children":11085},{"style":384},[11086],{"type":34,"value":3461},{"type":29,"tag":117,"props":11088,"children":11089},{"class":119,"line":313},[11090,11094,11098,11102,11106,11110,11115,11119],{"type":29,"tag":117,"props":11091,"children":11092},{"style":143},[11093],{"type":34,"value":7641},{"type":29,"tag":117,"props":11095,"children":11096},{"style":143},[11097],{"type":34,"value":7762},{"type":29,"tag":117,"props":11099,"children":11100},{"style":372},[11101],{"type":34,"value":9474},{"type":29,"tag":117,"props":11103,"children":11104},{"style":384},[11105],{"type":34,"value":1108},{"type":29,"tag":117,"props":11107,"children":11108},{"style":5976},[11109],{"type":34,"value":10339},{"type":29,"tag":117,"props":11111,"children":11112},{"style":7657},[11113],{"type":34,"value":11114}," order",{"type":29,"tag":117,"props":11116,"children":11117},{"style":384},[11118],{"type":34,"value":2803},{"type":29,"tag":117,"props":11120,"children":11121},{"style":384},[11122],{"type":34,"value":3461},{"type":29,"tag":117,"props":11124,"children":11125},{"class":119,"line":322},[11126],{"type":29,"tag":117,"props":11127,"children":11128},{"style":124},[11129],{"type":34,"value":10717},{"type":29,"tag":117,"props":11131,"children":11132},{"class":119,"line":331},[11133],{"type":29,"tag":117,"props":11134,"children":11135},{"style":384},[11136],{"type":34,"value":5632},{"type":29,"tag":117,"props":11138,"children":11139},{"class":119,"line":340},[11140],{"type":29,"tag":117,"props":11141,"children":11142},{"style":384},[11143],{"type":34,"value":2903},{"type":29,"tag":117,"props":11145,"children":11146},{"class":119,"line":348},[11147],{"type":29,"tag":117,"props":11148,"children":11149},{"emptyLinePlaceholder":13},[11150],{"type":34,"value":136},{"type":29,"tag":117,"props":11152,"children":11153},{"class":119,"line":357},[11154],{"type":29,"tag":117,"props":11155,"children":11156},{"style":124},[11157],{"type":34,"value":11158},"\u002F\u002F Classe pour générer une facture\n",{"type":29,"tag":117,"props":11160,"children":11161},{"class":119,"line":1768},[11162,11166,11170,11175],{"type":29,"tag":117,"props":11163,"children":11164},{"style":143},[11165],{"type":34,"value":5541},{"type":29,"tag":117,"props":11167,"children":11168},{"style":143},[11169],{"type":34,"value":7575},{"type":29,"tag":117,"props":11171,"children":11172},{"style":2863},[11173],{"type":34,"value":11174}," InvoiceService",{"type":29,"tag":117,"props":11176,"children":11177},{"style":384},[11178],{"type":34,"value":3461},{"type":29,"tag":117,"props":11180,"children":11181},{"class":119,"line":953},[11182,11186,11190,11194,11198,11202,11206,11210],{"type":29,"tag":117,"props":11183,"children":11184},{"style":143},[11185],{"type":34,"value":7641},{"type":29,"tag":117,"props":11187,"children":11188},{"style":143},[11189],{"type":34,"value":7762},{"type":29,"tag":117,"props":11191,"children":11192},{"style":372},[11193],{"type":34,"value":10656},{"type":29,"tag":117,"props":11195,"children":11196},{"style":384},[11197],{"type":34,"value":1108},{"type":29,"tag":117,"props":11199,"children":11200},{"style":5976},[11201],{"type":34,"value":10339},{"type":29,"tag":117,"props":11203,"children":11204},{"style":7657},[11205],{"type":34,"value":11114},{"type":29,"tag":117,"props":11207,"children":11208},{"style":384},[11209],{"type":34,"value":2803},{"type":29,"tag":117,"props":11211,"children":11212},{"style":384},[11213],{"type":34,"value":3461},{"type":29,"tag":117,"props":11215,"children":11216},{"class":119,"line":9833},[11217],{"type":29,"tag":117,"props":11218,"children":11219},{"style":124},[11220],{"type":34,"value":10672},{"type":29,"tag":117,"props":11222,"children":11223},{"class":119,"line":9870},[11224],{"type":29,"tag":117,"props":11225,"children":11226},{"style":384},[11227],{"type":34,"value":5632},{"type":29,"tag":117,"props":11229,"children":11230},{"class":119,"line":9901},[11231],{"type":29,"tag":117,"props":11232,"children":11233},{"style":384},[11234],{"type":34,"value":2903},{"type":29,"tag":30,"props":11236,"children":11237},{},[11238,11240,11246,11248,11253],{"type":34,"value":11239},"Maintenant, si vous avez besoin de changer la façon dont les paiements sont gérés, vous pouvez le faire dans la classe ",{"type":29,"tag":113,"props":11241,"children":11243},{"className":11242},[],[11244],{"type":34,"value":11245},"PaymentService",{"type":34,"value":11247}," sans toucher à la classe ",{"type":29,"tag":113,"props":11249,"children":11251},{"className":11250},[],[11252],{"type":34,"value":10339},{"type":34,"value":11254},". Cela rend le code beaucoup plus évolutif.",{"type":29,"tag":4530,"props":11256,"children":11258},{"id":11257},"exemple-2-gestion-des-dépendances-avec-inversion-de-dépendances",[11259],{"type":34,"value":11260},"Exemple 2 : Gestion des dépendances avec inversion de dépendances",{"type":29,"tag":30,"props":11262,"children":11263},{},[11264,11266,11271],{"type":34,"value":11265},"Dans cet exemple, nous allons améliorer la gestion des dépendances en appliquant le ",{"type":29,"tag":45,"props":11267,"children":11268},{},[11269],{"type":34,"value":11270},"principe d'inversion des dépendances",{"type":34,"value":11272},". Nous allons partir d'une classe qui crée elle-même ses dépendances, ce qui la rend rigide et difficile à tester.",{"type":29,"tag":7528,"props":11274,"children":11276},{"id":11275},"avant-code-non-évolutif-1",[11277],{"type":34,"value":10347},{"type":29,"tag":106,"props":11279,"children":11281},{"className":5519,"code":11280,"language":5521,"meta":8,"style":8},"public class ShoppingCart {\n    private PaymentService paymentService = new PaymentService();\n\n    public void checkout(Order order) {\n        paymentService.processPayment(order);\n    }\n}\n",[11282],{"type":29,"tag":113,"props":11283,"children":11284},{"__ignoreMap":8},[11285,11305,11337,11344,11380,11409,11416],{"type":29,"tag":117,"props":11286,"children":11287},{"class":119,"line":120},[11288,11292,11296,11301],{"type":29,"tag":117,"props":11289,"children":11290},{"style":143},[11291],{"type":34,"value":5541},{"type":29,"tag":117,"props":11293,"children":11294},{"style":143},[11295],{"type":34,"value":7575},{"type":29,"tag":117,"props":11297,"children":11298},{"style":2863},[11299],{"type":34,"value":11300}," ShoppingCart",{"type":29,"tag":117,"props":11302,"children":11303},{"style":384},[11304],{"type":34,"value":3461},{"type":29,"tag":117,"props":11306,"children":11307},{"class":119,"line":130},[11308,11312,11316,11321,11325,11329,11333],{"type":29,"tag":117,"props":11309,"children":11310},{"style":143},[11311],{"type":34,"value":7592},{"type":29,"tag":117,"props":11313,"children":11314},{"style":5976},[11315],{"type":34,"value":9726},{"type":29,"tag":117,"props":11317,"children":11318},{"style":378},[11319],{"type":34,"value":11320}," paymentService ",{"type":29,"tag":117,"props":11322,"children":11323},{"style":160},[11324],{"type":34,"value":6061},{"type":29,"tag":117,"props":11326,"children":11327},{"style":143},[11328],{"type":34,"value":6066},{"type":29,"tag":117,"props":11330,"children":11331},{"style":372},[11332],{"type":34,"value":9726},{"type":29,"tag":117,"props":11334,"children":11335},{"style":384},[11336],{"type":34,"value":9375},{"type":29,"tag":117,"props":11338,"children":11339},{"class":119,"line":139},[11340],{"type":29,"tag":117,"props":11341,"children":11342},{"emptyLinePlaceholder":13},[11343],{"type":34,"value":136},{"type":29,"tag":117,"props":11345,"children":11346},{"class":119,"line":172},[11347,11351,11355,11360,11364,11368,11372,11376],{"type":29,"tag":117,"props":11348,"children":11349},{"style":143},[11350],{"type":34,"value":7641},{"type":29,"tag":117,"props":11352,"children":11353},{"style":143},[11354],{"type":34,"value":7762},{"type":29,"tag":117,"props":11356,"children":11357},{"style":372},[11358],{"type":34,"value":11359}," checkout",{"type":29,"tag":117,"props":11361,"children":11362},{"style":384},[11363],{"type":34,"value":1108},{"type":29,"tag":117,"props":11365,"children":11366},{"style":5976},[11367],{"type":34,"value":10339},{"type":29,"tag":117,"props":11369,"children":11370},{"style":7657},[11371],{"type":34,"value":11114},{"type":29,"tag":117,"props":11373,"children":11374},{"style":384},[11375],{"type":34,"value":2803},{"type":29,"tag":117,"props":11377,"children":11378},{"style":384},[11379],{"type":34,"value":3461},{"type":29,"tag":117,"props":11381,"children":11382},{"class":119,"line":181},[11383,11388,11392,11396,11400,11405],{"type":29,"tag":117,"props":11384,"children":11385},{"style":378},[11386],{"type":34,"value":11387},"        paymentService",{"type":29,"tag":117,"props":11389,"children":11390},{"style":384},[11391],{"type":34,"value":369},{"type":29,"tag":117,"props":11393,"children":11394},{"style":372},[11395],{"type":34,"value":9885},{"type":29,"tag":117,"props":11397,"children":11398},{"style":384},[11399],{"type":34,"value":1108},{"type":29,"tag":117,"props":11401,"children":11402},{"style":378},[11403],{"type":34,"value":11404},"order",{"type":29,"tag":117,"props":11406,"children":11407},{"style":384},[11408],{"type":34,"value":5675},{"type":29,"tag":117,"props":11410,"children":11411},{"class":119,"line":189},[11412],{"type":29,"tag":117,"props":11413,"children":11414},{"style":384},[11415],{"type":34,"value":5632},{"type":29,"tag":117,"props":11417,"children":11418},{"class":119,"line":198},[11419],{"type":29,"tag":117,"props":11420,"children":11421},{"style":384},[11422],{"type":34,"value":2903},{"type":29,"tag":30,"props":11424,"children":11425},{},[11426,11428,11434,11436,11441,11443,11448],{"type":34,"value":11427},"Dans ce cas, la classe ",{"type":29,"tag":113,"props":11429,"children":11431},{"className":11430},[],[11432],{"type":34,"value":11433},"ShoppingCart",{"type":34,"value":11435}," est fortement couplée à ",{"type":29,"tag":113,"props":11437,"children":11439},{"className":11438},[],[11440],{"type":34,"value":11245},{"type":34,"value":11442},", ce qui rend difficile l'ajout d'une nouvelle méthode de paiement, ou le test de ",{"type":29,"tag":113,"props":11444,"children":11446},{"className":11445},[],[11447],{"type":34,"value":11433},{"type":34,"value":11449}," en isolation.",{"type":29,"tag":7528,"props":11451,"children":11453},{"id":11452},"après-code-évolutif-1",[11454],{"type":34,"value":10737},{"type":29,"tag":30,"props":11456,"children":11457},{},[11458,11460,11465,11467,11472],{"type":34,"value":11459},"Nous allons inverser la dépendance en passant la méthode de paiement comme paramètre dans le constructeur de ",{"type":29,"tag":113,"props":11461,"children":11463},{"className":11462},[],[11464],{"type":34,"value":11433},{"type":34,"value":11466},". Cela permet de changer facilement l'implémentation du paiement sans modifier ",{"type":29,"tag":113,"props":11468,"children":11470},{"className":11469},[],[11471],{"type":34,"value":11433},{"type":34,"value":369},{"type":29,"tag":106,"props":11474,"children":11476},{"className":5519,"code":11475,"language":5521,"meta":8,"style":8},"public class ShoppingCart {\n    private PaymentMethod paymentMethod;\n\n    public ShoppingCart(PaymentMethod paymentMethod) {\n        this.paymentMethod = paymentMethod;\n    }\n\n    public void checkout(Order order) {\n        paymentMethod.processPayment(order);\n    }\n}\n",[11477],{"type":29,"tag":113,"props":11478,"children":11479},{"__ignoreMap":8},[11480,11499,11518,11525,11556,11583,11590,11597,11632,11659,11666],{"type":29,"tag":117,"props":11481,"children":11482},{"class":119,"line":120},[11483,11487,11491,11495],{"type":29,"tag":117,"props":11484,"children":11485},{"style":143},[11486],{"type":34,"value":5541},{"type":29,"tag":117,"props":11488,"children":11489},{"style":143},[11490],{"type":34,"value":7575},{"type":29,"tag":117,"props":11492,"children":11493},{"style":2863},[11494],{"type":34,"value":11300},{"type":29,"tag":117,"props":11496,"children":11497},{"style":384},[11498],{"type":34,"value":3461},{"type":29,"tag":117,"props":11500,"children":11501},{"class":119,"line":130},[11502,11506,11510,11514],{"type":29,"tag":117,"props":11503,"children":11504},{"style":143},[11505],{"type":34,"value":7592},{"type":29,"tag":117,"props":11507,"children":11508},{"style":5976},[11509],{"type":34,"value":8566},{"type":29,"tag":117,"props":11511,"children":11512},{"style":378},[11513],{"type":34,"value":9746},{"type":29,"tag":117,"props":11515,"children":11516},{"style":384},[11517],{"type":34,"value":387},{"type":29,"tag":117,"props":11519,"children":11520},{"class":119,"line":139},[11521],{"type":29,"tag":117,"props":11522,"children":11523},{"emptyLinePlaceholder":13},[11524],{"type":34,"value":136},{"type":29,"tag":117,"props":11526,"children":11527},{"class":119,"line":172},[11528,11532,11536,11540,11544,11548,11552],{"type":29,"tag":117,"props":11529,"children":11530},{"style":143},[11531],{"type":34,"value":7641},{"type":29,"tag":117,"props":11533,"children":11534},{"style":372},[11535],{"type":34,"value":11300},{"type":29,"tag":117,"props":11537,"children":11538},{"style":384},[11539],{"type":34,"value":1108},{"type":29,"tag":117,"props":11541,"children":11542},{"style":5976},[11543],{"type":34,"value":8804},{"type":29,"tag":117,"props":11545,"children":11546},{"style":7657},[11547],{"type":34,"value":9746},{"type":29,"tag":117,"props":11549,"children":11550},{"style":384},[11551],{"type":34,"value":2803},{"type":29,"tag":117,"props":11553,"children":11554},{"style":384},[11555],{"type":34,"value":3461},{"type":29,"tag":117,"props":11557,"children":11558},{"class":119,"line":181},[11559,11563,11567,11571,11575,11579],{"type":29,"tag":117,"props":11560,"children":11561},{"style":6700},[11562],{"type":34,"value":7687},{"type":29,"tag":117,"props":11564,"children":11565},{"style":384},[11566],{"type":34,"value":369},{"type":29,"tag":117,"props":11568,"children":11569},{"style":378},[11570],{"type":34,"value":9804},{"type":29,"tag":117,"props":11572,"children":11573},{"style":160},[11574],{"type":34,"value":6061},{"type":29,"tag":117,"props":11576,"children":11577},{"style":378},[11578],{"type":34,"value":9746},{"type":29,"tag":117,"props":11580,"children":11581},{"style":384},[11582],{"type":34,"value":387},{"type":29,"tag":117,"props":11584,"children":11585},{"class":119,"line":189},[11586],{"type":29,"tag":117,"props":11587,"children":11588},{"style":384},[11589],{"type":34,"value":5632},{"type":29,"tag":117,"props":11591,"children":11592},{"class":119,"line":198},[11593],{"type":29,"tag":117,"props":11594,"children":11595},{"emptyLinePlaceholder":13},[11596],{"type":34,"value":136},{"type":29,"tag":117,"props":11598,"children":11599},{"class":119,"line":207},[11600,11604,11608,11612,11616,11620,11624,11628],{"type":29,"tag":117,"props":11601,"children":11602},{"style":143},[11603],{"type":34,"value":7641},{"type":29,"tag":117,"props":11605,"children":11606},{"style":143},[11607],{"type":34,"value":7762},{"type":29,"tag":117,"props":11609,"children":11610},{"style":372},[11611],{"type":34,"value":11359},{"type":29,"tag":117,"props":11613,"children":11614},{"style":384},[11615],{"type":34,"value":1108},{"type":29,"tag":117,"props":11617,"children":11618},{"style":5976},[11619],{"type":34,"value":10339},{"type":29,"tag":117,"props":11621,"children":11622},{"style":7657},[11623],{"type":34,"value":11114},{"type":29,"tag":117,"props":11625,"children":11626},{"style":384},[11627],{"type":34,"value":2803},{"type":29,"tag":117,"props":11629,"children":11630},{"style":384},[11631],{"type":34,"value":3461},{"type":29,"tag":117,"props":11633,"children":11634},{"class":119,"line":215},[11635,11639,11643,11647,11651,11655],{"type":29,"tag":117,"props":11636,"children":11637},{"style":378},[11638],{"type":34,"value":9876},{"type":29,"tag":117,"props":11640,"children":11641},{"style":384},[11642],{"type":34,"value":369},{"type":29,"tag":117,"props":11644,"children":11645},{"style":372},[11646],{"type":34,"value":9885},{"type":29,"tag":117,"props":11648,"children":11649},{"style":384},[11650],{"type":34,"value":1108},{"type":29,"tag":117,"props":11652,"children":11653},{"style":378},[11654],{"type":34,"value":11404},{"type":29,"tag":117,"props":11656,"children":11657},{"style":384},[11658],{"type":34,"value":5675},{"type":29,"tag":117,"props":11660,"children":11661},{"class":119,"line":224},[11662],{"type":29,"tag":117,"props":11663,"children":11664},{"style":384},[11665],{"type":34,"value":5632},{"type":29,"tag":117,"props":11667,"children":11668},{"class":119,"line":233},[11669],{"type":29,"tag":117,"props":11670,"children":11671},{"style":384},[11672],{"type":34,"value":2903},{"type":29,"tag":30,"props":11674,"children":11675},{},[11676,11678,11683,11685,11690],{"type":34,"value":11677},"Maintenant, ",{"type":29,"tag":113,"props":11679,"children":11681},{"className":11680},[],[11682],{"type":34,"value":11433},{"type":34,"value":11684}," peut accepter n'importe quelle implémentation de ",{"type":29,"tag":113,"props":11686,"children":11688},{"className":11687},[],[11689],{"type":34,"value":8804},{"type":34,"value":11691}," (carte de crédit, PayPal, etc.), ce qui rend le code beaucoup plus flexible et facile à maintenir.",{"type":29,"tag":106,"props":11693,"children":11695},{"className":5519,"code":11694,"language":5521,"meta":8,"style":8},"public interface PaymentMethod {\n    void processPayment(Order order);\n}\n\npublic class CreditCardPayment implements PaymentMethod {\n    public void processPayment(Order order) {\n        \u002F\u002F Logique pour traiter le paiement par carte\n    }\n}\n\npublic class PayPalPayment implements PaymentMethod {\n    public void processPayment(Order order) {\n        \u002F\u002F Logique pour traiter le paiement via PayPal\n    }\n}\n",[11696],{"type":29,"tag":113,"props":11697,"children":11698},{"__ignoreMap":8},[11699,11718,11745,11752,11759,11786,11821,11829,11836,11843,11850,11877,11912,11920,11927],{"type":29,"tag":117,"props":11700,"children":11701},{"class":119,"line":120},[11702,11706,11710,11714],{"type":29,"tag":117,"props":11703,"children":11704},{"style":143},[11705],{"type":34,"value":5541},{"type":29,"tag":117,"props":11707,"children":11708},{"style":143},[11709],{"type":34,"value":8561},{"type":29,"tag":117,"props":11711,"children":11712},{"style":2863},[11713],{"type":34,"value":8566},{"type":29,"tag":117,"props":11715,"children":11716},{"style":384},[11717],{"type":34,"value":3461},{"type":29,"tag":117,"props":11719,"children":11720},{"class":119,"line":130},[11721,11725,11729,11733,11737,11741],{"type":29,"tag":117,"props":11722,"children":11723},{"style":143},[11724],{"type":34,"value":8578},{"type":29,"tag":117,"props":11726,"children":11727},{"style":372},[11728],{"type":34,"value":9474},{"type":29,"tag":117,"props":11730,"children":11731},{"style":384},[11732],{"type":34,"value":1108},{"type":29,"tag":117,"props":11734,"children":11735},{"style":5976},[11736],{"type":34,"value":10339},{"type":29,"tag":117,"props":11738,"children":11739},{"style":7657},[11740],{"type":34,"value":11114},{"type":29,"tag":117,"props":11742,"children":11743},{"style":384},[11744],{"type":34,"value":5675},{"type":29,"tag":117,"props":11746,"children":11747},{"class":119,"line":139},[11748],{"type":29,"tag":117,"props":11749,"children":11750},{"style":384},[11751],{"type":34,"value":2903},{"type":29,"tag":117,"props":11753,"children":11754},{"class":119,"line":172},[11755],{"type":29,"tag":117,"props":11756,"children":11757},{"emptyLinePlaceholder":13},[11758],{"type":34,"value":136},{"type":29,"tag":117,"props":11760,"children":11761},{"class":119,"line":181},[11762,11766,11770,11774,11778,11782],{"type":29,"tag":117,"props":11763,"children":11764},{"style":143},[11765],{"type":34,"value":5541},{"type":29,"tag":117,"props":11767,"children":11768},{"style":143},[11769],{"type":34,"value":7575},{"type":29,"tag":117,"props":11771,"children":11772},{"style":2863},[11773],{"type":34,"value":8631},{"type":29,"tag":117,"props":11775,"children":11776},{"style":143},[11777],{"type":34,"value":8636},{"type":29,"tag":117,"props":11779,"children":11780},{"style":2863},[11781],{"type":34,"value":8566},{"type":29,"tag":117,"props":11783,"children":11784},{"style":384},[11785],{"type":34,"value":3461},{"type":29,"tag":117,"props":11787,"children":11788},{"class":119,"line":189},[11789,11793,11797,11801,11805,11809,11813,11817],{"type":29,"tag":117,"props":11790,"children":11791},{"style":143},[11792],{"type":34,"value":7641},{"type":29,"tag":117,"props":11794,"children":11795},{"style":143},[11796],{"type":34,"value":7762},{"type":29,"tag":117,"props":11798,"children":11799},{"style":372},[11800],{"type":34,"value":9474},{"type":29,"tag":117,"props":11802,"children":11803},{"style":384},[11804],{"type":34,"value":1108},{"type":29,"tag":117,"props":11806,"children":11807},{"style":5976},[11808],{"type":34,"value":10339},{"type":29,"tag":117,"props":11810,"children":11811},{"style":7657},[11812],{"type":34,"value":11114},{"type":29,"tag":117,"props":11814,"children":11815},{"style":384},[11816],{"type":34,"value":2803},{"type":29,"tag":117,"props":11818,"children":11819},{"style":384},[11820],{"type":34,"value":3461},{"type":29,"tag":117,"props":11822,"children":11823},{"class":119,"line":198},[11824],{"type":29,"tag":117,"props":11825,"children":11826},{"style":124},[11827],{"type":34,"value":11828},"        \u002F\u002F Logique pour traiter le paiement par carte\n",{"type":29,"tag":117,"props":11830,"children":11831},{"class":119,"line":207},[11832],{"type":29,"tag":117,"props":11833,"children":11834},{"style":384},[11835],{"type":34,"value":5632},{"type":29,"tag":117,"props":11837,"children":11838},{"class":119,"line":215},[11839],{"type":29,"tag":117,"props":11840,"children":11841},{"style":384},[11842],{"type":34,"value":2903},{"type":29,"tag":117,"props":11844,"children":11845},{"class":119,"line":224},[11846],{"type":29,"tag":117,"props":11847,"children":11848},{"emptyLinePlaceholder":13},[11849],{"type":34,"value":136},{"type":29,"tag":117,"props":11851,"children":11852},{"class":119,"line":233},[11853,11857,11861,11865,11869,11873],{"type":29,"tag":117,"props":11854,"children":11855},{"style":143},[11856],{"type":34,"value":5541},{"type":29,"tag":117,"props":11858,"children":11859},{"style":143},[11860],{"type":34,"value":7575},{"type":29,"tag":117,"props":11862,"children":11863},{"style":2863},[11864],{"type":34,"value":8724},{"type":29,"tag":117,"props":11866,"children":11867},{"style":143},[11868],{"type":34,"value":8636},{"type":29,"tag":117,"props":11870,"children":11871},{"style":2863},[11872],{"type":34,"value":8566},{"type":29,"tag":117,"props":11874,"children":11875},{"style":384},[11876],{"type":34,"value":3461},{"type":29,"tag":117,"props":11878,"children":11879},{"class":119,"line":242},[11880,11884,11888,11892,11896,11900,11904,11908],{"type":29,"tag":117,"props":11881,"children":11882},{"style":143},[11883],{"type":34,"value":7641},{"type":29,"tag":117,"props":11885,"children":11886},{"style":143},[11887],{"type":34,"value":7762},{"type":29,"tag":117,"props":11889,"children":11890},{"style":372},[11891],{"type":34,"value":9474},{"type":29,"tag":117,"props":11893,"children":11894},{"style":384},[11895],{"type":34,"value":1108},{"type":29,"tag":117,"props":11897,"children":11898},{"style":5976},[11899],{"type":34,"value":10339},{"type":29,"tag":117,"props":11901,"children":11902},{"style":7657},[11903],{"type":34,"value":11114},{"type":29,"tag":117,"props":11905,"children":11906},{"style":384},[11907],{"type":34,"value":2803},{"type":29,"tag":117,"props":11909,"children":11910},{"style":384},[11911],{"type":34,"value":3461},{"type":29,"tag":117,"props":11913,"children":11914},{"class":119,"line":251},[11915],{"type":29,"tag":117,"props":11916,"children":11917},{"style":124},[11918],{"type":34,"value":11919},"        \u002F\u002F Logique pour traiter le paiement via PayPal\n",{"type":29,"tag":117,"props":11921,"children":11922},{"class":119,"line":260},[11923],{"type":29,"tag":117,"props":11924,"children":11925},{"style":384},[11926],{"type":34,"value":5632},{"type":29,"tag":117,"props":11928,"children":11929},{"class":119,"line":269},[11930],{"type":29,"tag":117,"props":11931,"children":11932},{"style":384},[11933],{"type":34,"value":2903},{"type":29,"tag":4530,"props":11935,"children":11937},{"id":11936},"exemple-3-testabilité-et-utilisation-de-tdd",[11938],{"type":34,"value":11939},"Exemple 3 : Testabilité et utilisation de TDD",{"type":29,"tag":30,"props":11941,"children":11942},{},[11943,11945,11950],{"type":34,"value":11944},"L'évolutivité ne concerne pas seulement le code de production, mais aussi les tests. Un code bien conçu doit être facilement testable. L'approche ",{"type":29,"tag":45,"props":11946,"children":11947},{},[11948],{"type":34,"value":11949},"Test-Driven Development (TDD)",{"type":34,"value":11951}," aide à garantir que chaque modification du code est couverte par des tests unitaires, réduisant ainsi le risque d'introduire des bugs.",{"type":29,"tag":7528,"props":11953,"children":11955},{"id":11954},"avant-code-non-testé",[11956],{"type":34,"value":11957},"Avant : Code non testé",{"type":29,"tag":106,"props":11959,"children":11961},{"className":5519,"code":11960,"language":5521,"meta":8,"style":8},"public class DiscountService {\n    public double applyDiscount(Order order, double discountRate) {\n        return order.getTotalPrice() * (1 - discountRate);\n    }\n}\n",[11962],{"type":29,"tag":113,"props":11963,"children":11964},{"__ignoreMap":8},[11965,11985,12034,12084,12091],{"type":29,"tag":117,"props":11966,"children":11967},{"class":119,"line":120},[11968,11972,11976,11981],{"type":29,"tag":117,"props":11969,"children":11970},{"style":143},[11971],{"type":34,"value":5541},{"type":29,"tag":117,"props":11973,"children":11974},{"style":143},[11975],{"type":34,"value":7575},{"type":29,"tag":117,"props":11977,"children":11978},{"style":2863},[11979],{"type":34,"value":11980}," DiscountService",{"type":29,"tag":117,"props":11982,"children":11983},{"style":384},[11984],{"type":34,"value":3461},{"type":29,"tag":117,"props":11986,"children":11987},{"class":119,"line":130},[11988,11992,11996,12001,12005,12009,12013,12017,12021,12026,12030],{"type":29,"tag":117,"props":11989,"children":11990},{"style":143},[11991],{"type":34,"value":7641},{"type":29,"tag":117,"props":11993,"children":11994},{"style":143},[11995],{"type":34,"value":7617},{"type":29,"tag":117,"props":11997,"children":11998},{"style":372},[11999],{"type":34,"value":12000}," applyDiscount",{"type":29,"tag":117,"props":12002,"children":12003},{"style":384},[12004],{"type":34,"value":1108},{"type":29,"tag":117,"props":12006,"children":12007},{"style":5976},[12008],{"type":34,"value":10339},{"type":29,"tag":117,"props":12010,"children":12011},{"style":7657},[12012],{"type":34,"value":11114},{"type":29,"tag":117,"props":12014,"children":12015},{"style":384},[12016],{"type":34,"value":1118},{"type":29,"tag":117,"props":12018,"children":12019},{"style":143},[12020],{"type":34,"value":7617},{"type":29,"tag":117,"props":12022,"children":12023},{"style":7657},[12024],{"type":34,"value":12025}," discountRate",{"type":29,"tag":117,"props":12027,"children":12028},{"style":384},[12029],{"type":34,"value":2803},{"type":29,"tag":117,"props":12031,"children":12032},{"style":384},[12033],{"type":34,"value":3461},{"type":29,"tag":117,"props":12035,"children":12036},{"class":119,"line":139},[12037,12041,12045,12049,12054,12058,12063,12067,12071,12076,12080],{"type":29,"tag":117,"props":12038,"children":12039},{"style":143},[12040],{"type":34,"value":5616},{"type":29,"tag":117,"props":12042,"children":12043},{"style":378},[12044],{"type":34,"value":11114},{"type":29,"tag":117,"props":12046,"children":12047},{"style":384},[12048],{"type":34,"value":369},{"type":29,"tag":117,"props":12050,"children":12051},{"style":372},[12052],{"type":34,"value":12053},"getTotalPrice",{"type":29,"tag":117,"props":12055,"children":12056},{"style":384},[12057],{"type":34,"value":381},{"type":29,"tag":117,"props":12059,"children":12060},{"style":160},[12061],{"type":34,"value":12062}," *",{"type":29,"tag":117,"props":12064,"children":12065},{"style":384},[12066],{"type":34,"value":3181},{"type":29,"tag":117,"props":12068,"children":12069},{"style":3476},[12070],{"type":34,"value":2215},{"type":29,"tag":117,"props":12072,"children":12073},{"style":160},[12074],{"type":34,"value":12075}," -",{"type":29,"tag":117,"props":12077,"children":12078},{"style":378},[12079],{"type":34,"value":12025},{"type":29,"tag":117,"props":12081,"children":12082},{"style":384},[12083],{"type":34,"value":5675},{"type":29,"tag":117,"props":12085,"children":12086},{"class":119,"line":172},[12087],{"type":29,"tag":117,"props":12088,"children":12089},{"style":384},[12090],{"type":34,"value":5632},{"type":29,"tag":117,"props":12092,"children":12093},{"class":119,"line":181},[12094],{"type":29,"tag":117,"props":12095,"children":12096},{"style":384},[12097],{"type":34,"value":2903},{"type":29,"tag":7528,"props":12099,"children":12101},{"id":12100},"après-ajout-de-tests-unitaires",[12102],{"type":34,"value":12103},"Après : Ajout de tests unitaires",{"type":29,"tag":30,"props":12105,"children":12106},{},[12107,12109,12113,12115,12121],{"type":34,"value":12108},"En utilisant ",{"type":29,"tag":45,"props":12110,"children":12111},{},[12112],{"type":34,"value":9948},{"type":34,"value":12114},", nous pouvons écrire un test unitaire pour garantir que la méthode ",{"type":29,"tag":113,"props":12116,"children":12118},{"className":12117},[],[12119],{"type":34,"value":12120},"applyDiscount",{"type":34,"value":12122}," fonctionne correctement, même après des modifications.",{"type":29,"tag":106,"props":12124,"children":12126},{"className":5519,"code":12125,"language":5521,"meta":8,"style":8},"import static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\npublic class DiscountServiceTest {\n\n    @Test\n    public void testApplyDiscount() {\n        Order order = new Order(\"Laptop\", 2, 1000);\n        DiscountService discountService = new DiscountService();\n        double discountedPrice = discountService.applyDiscount(order, 0.1); \u002F\u002F 10% de réduction\n\n        assertEquals(1800, discountedPrice, 0.01);\n    }\n}\n",[12127],{"type":29,"tag":113,"props":12128,"children":12129},{"__ignoreMap":8},[12130,12173,12204,12211,12231,12238,12249,12273,12328,12357,12412,12419,12456,12463],{"type":29,"tag":117,"props":12131,"children":12132},{"class":119,"line":120},[12133,12137,12141,12145,12149,12153,12157,12161,12165,12169],{"type":29,"tag":117,"props":12134,"children":12135},{"style":143},[12136],{"type":34,"value":9971},{"type":29,"tag":117,"props":12138,"children":12139},{"style":143},[12140],{"type":34,"value":9213},{"type":29,"tag":117,"props":12142,"children":12143},{"style":378},[12144],{"type":34,"value":9980},{"type":29,"tag":117,"props":12146,"children":12147},{"style":384},[12148],{"type":34,"value":369},{"type":29,"tag":117,"props":12150,"children":12151},{"style":378},[12152],{"type":34,"value":9989},{"type":29,"tag":117,"props":12154,"children":12155},{"style":384},[12156],{"type":34,"value":369},{"type":29,"tag":117,"props":12158,"children":12159},{"style":378},[12160],{"type":34,"value":9998},{"type":29,"tag":117,"props":12162,"children":12163},{"style":384},[12164],{"type":34,"value":369},{"type":29,"tag":117,"props":12166,"children":12167},{"style":378},[12168],{"type":34,"value":10007},{"type":29,"tag":117,"props":12170,"children":12171},{"style":384},[12172],{"type":34,"value":387},{"type":29,"tag":117,"props":12174,"children":12175},{"class":119,"line":130},[12176,12180,12184,12188,12192,12196,12200],{"type":29,"tag":117,"props":12177,"children":12178},{"style":143},[12179],{"type":34,"value":9971},{"type":29,"tag":117,"props":12181,"children":12182},{"style":378},[12183],{"type":34,"value":9980},{"type":29,"tag":117,"props":12185,"children":12186},{"style":384},[12187],{"type":34,"value":369},{"type":29,"tag":117,"props":12189,"children":12190},{"style":378},[12191],{"type":34,"value":9989},{"type":29,"tag":117,"props":12193,"children":12194},{"style":384},[12195],{"type":34,"value":369},{"type":29,"tag":117,"props":12197,"children":12198},{"style":378},[12199],{"type":34,"value":10039},{"type":29,"tag":117,"props":12201,"children":12202},{"style":384},[12203],{"type":34,"value":387},{"type":29,"tag":117,"props":12205,"children":12206},{"class":119,"line":139},[12207],{"type":29,"tag":117,"props":12208,"children":12209},{"emptyLinePlaceholder":13},[12210],{"type":34,"value":136},{"type":29,"tag":117,"props":12212,"children":12213},{"class":119,"line":172},[12214,12218,12222,12227],{"type":29,"tag":117,"props":12215,"children":12216},{"style":143},[12217],{"type":34,"value":5541},{"type":29,"tag":117,"props":12219,"children":12220},{"style":143},[12221],{"type":34,"value":7575},{"type":29,"tag":117,"props":12223,"children":12224},{"style":2863},[12225],{"type":34,"value":12226}," DiscountServiceTest",{"type":29,"tag":117,"props":12228,"children":12229},{"style":384},[12230],{"type":34,"value":3461},{"type":29,"tag":117,"props":12232,"children":12233},{"class":119,"line":181},[12234],{"type":29,"tag":117,"props":12235,"children":12236},{"emptyLinePlaceholder":13},[12237],{"type":34,"value":136},{"type":29,"tag":117,"props":12239,"children":12240},{"class":119,"line":189},[12241,12245],{"type":29,"tag":117,"props":12242,"children":12243},{"style":10083},[12244],{"type":34,"value":10086},{"type":29,"tag":117,"props":12246,"children":12247},{"style":10089},[12248],{"type":34,"value":10092},{"type":29,"tag":117,"props":12250,"children":12251},{"class":119,"line":198},[12252,12256,12260,12265,12269],{"type":29,"tag":117,"props":12253,"children":12254},{"style":143},[12255],{"type":34,"value":7641},{"type":29,"tag":117,"props":12257,"children":12258},{"style":143},[12259],{"type":34,"value":7762},{"type":29,"tag":117,"props":12261,"children":12262},{"style":372},[12263],{"type":34,"value":12264}," testApplyDiscount",{"type":29,"tag":117,"props":12266,"children":12267},{"style":384},[12268],{"type":34,"value":381},{"type":29,"tag":117,"props":12270,"children":12271},{"style":384},[12272],{"type":34,"value":3461},{"type":29,"tag":117,"props":12274,"children":12275},{"class":119,"line":207},[12276,12281,12286,12290,12294,12298,12302,12307,12311,12315,12319,12324],{"type":29,"tag":117,"props":12277,"children":12278},{"style":5976},[12279],{"type":34,"value":12280},"        Order",{"type":29,"tag":117,"props":12282,"children":12283},{"style":378},[12284],{"type":34,"value":12285}," order ",{"type":29,"tag":117,"props":12287,"children":12288},{"style":160},[12289],{"type":34,"value":6061},{"type":29,"tag":117,"props":12291,"children":12292},{"style":143},[12293],{"type":34,"value":6066},{"type":29,"tag":117,"props":12295,"children":12296},{"style":372},[12297],{"type":34,"value":10370},{"type":29,"tag":117,"props":12299,"children":12300},{"style":384},[12301],{"type":34,"value":1108},{"type":29,"tag":117,"props":12303,"children":12304},{"style":166},[12305],{"type":34,"value":12306},"\"Laptop\"",{"type":29,"tag":117,"props":12308,"children":12309},{"style":384},[12310],{"type":34,"value":1118},{"type":29,"tag":117,"props":12312,"children":12313},{"style":3476},[12314],{"type":34,"value":6140},{"type":29,"tag":117,"props":12316,"children":12317},{"style":384},[12318],{"type":34,"value":1118},{"type":29,"tag":117,"props":12320,"children":12321},{"style":3476},[12322],{"type":34,"value":12323}," 1000",{"type":29,"tag":117,"props":12325,"children":12326},{"style":384},[12327],{"type":34,"value":5675},{"type":29,"tag":117,"props":12329,"children":12330},{"class":119,"line":215},[12331,12336,12341,12345,12349,12353],{"type":29,"tag":117,"props":12332,"children":12333},{"style":5976},[12334],{"type":34,"value":12335},"        DiscountService",{"type":29,"tag":117,"props":12337,"children":12338},{"style":378},[12339],{"type":34,"value":12340}," discountService ",{"type":29,"tag":117,"props":12342,"children":12343},{"style":160},[12344],{"type":34,"value":6061},{"type":29,"tag":117,"props":12346,"children":12347},{"style":143},[12348],{"type":34,"value":6066},{"type":29,"tag":117,"props":12350,"children":12351},{"style":372},[12352],{"type":34,"value":11980},{"type":29,"tag":117,"props":12354,"children":12355},{"style":384},[12356],{"type":34,"value":9375},{"type":29,"tag":117,"props":12358,"children":12359},{"class":119,"line":224},[12360,12364,12369,12373,12378,12382,12386,12390,12394,12398,12403,12407],{"type":29,"tag":117,"props":12361,"children":12362},{"style":143},[12363],{"type":34,"value":10200},{"type":29,"tag":117,"props":12365,"children":12366},{"style":378},[12367],{"type":34,"value":12368}," discountedPrice ",{"type":29,"tag":117,"props":12370,"children":12371},{"style":160},[12372],{"type":34,"value":6061},{"type":29,"tag":117,"props":12374,"children":12375},{"style":378},[12376],{"type":34,"value":12377}," discountService",{"type":29,"tag":117,"props":12379,"children":12380},{"style":384},[12381],{"type":34,"value":369},{"type":29,"tag":117,"props":12383,"children":12384},{"style":372},[12385],{"type":34,"value":12120},{"type":29,"tag":117,"props":12387,"children":12388},{"style":384},[12389],{"type":34,"value":1108},{"type":29,"tag":117,"props":12391,"children":12392},{"style":378},[12393],{"type":34,"value":11404},{"type":29,"tag":117,"props":12395,"children":12396},{"style":384},[12397],{"type":34,"value":1118},{"type":29,"tag":117,"props":12399,"children":12400},{"style":3476},[12401],{"type":34,"value":12402}," 0.1",{"type":29,"tag":117,"props":12404,"children":12405},{"style":384},[12406],{"type":34,"value":10282},{"type":29,"tag":117,"props":12408,"children":12409},{"style":124},[12410],{"type":34,"value":12411}," \u002F\u002F 10% de réduction\n",{"type":29,"tag":117,"props":12413,"children":12414},{"class":119,"line":233},[12415],{"type":29,"tag":117,"props":12416,"children":12417},{"emptyLinePlaceholder":13},[12418],{"type":34,"value":136},{"type":29,"tag":117,"props":12420,"children":12421},{"class":119,"line":242},[12422,12426,12430,12435,12439,12444,12448,12452],{"type":29,"tag":117,"props":12423,"children":12424},{"style":372},[12425],{"type":34,"value":10251},{"type":29,"tag":117,"props":12427,"children":12428},{"style":384},[12429],{"type":34,"value":1108},{"type":29,"tag":117,"props":12431,"children":12432},{"style":3476},[12433],{"type":34,"value":12434},"1800",{"type":29,"tag":117,"props":12436,"children":12437},{"style":384},[12438],{"type":34,"value":1118},{"type":29,"tag":117,"props":12440,"children":12441},{"style":378},[12442],{"type":34,"value":12443}," discountedPrice",{"type":29,"tag":117,"props":12445,"children":12446},{"style":384},[12447],{"type":34,"value":1118},{"type":29,"tag":117,"props":12449,"children":12450},{"style":3476},[12451],{"type":34,"value":10277},{"type":29,"tag":117,"props":12453,"children":12454},{"style":384},[12455],{"type":34,"value":5675},{"type":29,"tag":117,"props":12457,"children":12458},{"class":119,"line":251},[12459],{"type":29,"tag":117,"props":12460,"children":12461},{"style":384},[12462],{"type":34,"value":5632},{"type":29,"tag":117,"props":12464,"children":12465},{"class":119,"line":260},[12466],{"type":29,"tag":117,"props":12467,"children":12468},{"style":384},[12469],{"type":34,"value":2903},{"type":29,"tag":30,"props":12471,"children":12472},{},[12473,12475,12480],{"type":34,"value":12474},"Grâce à ce test, nous pouvons modifier la méthode ",{"type":29,"tag":113,"props":12476,"children":12478},{"className":12477},[],[12479],{"type":34,"value":12120},{"type":34,"value":12481}," sans crainte, car les tests nous avertiront immédiatement si quelque chose casse.",{"type":29,"tag":567,"props":12483,"children":12485},{"cta":805,"href":806,"title":12484,"type":808},"Le code évolutif n'est qu'une pratique parmi 100",[12486],{"type":29,"tag":30,"props":12487,"children":12488},{},[12489],{"type":34,"value":12490},"Cet article détaille une pratique : concevoir des classes qui acceptent le changement. Le Craft Bundle réunit les 100 pratiques que j'applique pour coder propre, du découpage des responsabilités au refactoring sûr en passant par les tests qui sécurisent vos évolutions. Ce sont les réflexes que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vus tenir dans la durée sur un vrai projet.",{"type":29,"tag":51,"props":12492,"children":12493},{},[],{"type":29,"tag":55,"props":12495,"children":12497},{"id":12496},"faq-réponses-aux-questions-fréquentes",[12498],{"type":34,"value":12499},"FAQ : Réponses aux questions fréquentes",{"type":29,"tag":825,"props":12501,"children":12502},{},[12503,12508,12513],{"type":29,"tag":829,"props":12504,"children":12505},{},[12506],{"type":34,"value":12507},"1. Quels sont les signes d’un code non évolutif ?",{"type":29,"tag":30,"props":12509,"children":12510},{},[12511],{"type":34,"value":12512},"Un code non évolutif se reconnaît par plusieurs symptômes :",{"type":29,"tag":1585,"props":12514,"children":12515},{},[12516,12526,12536,12546],{"type":29,"tag":1589,"props":12517,"children":12518},{},[12519,12524],{"type":29,"tag":45,"props":12520,"children":12521},{},[12522],{"type":34,"value":12523},"Dépendances rigides",{"type":34,"value":12525}," : Vous devez souvent modifier plusieurs fichiers ou classes pour introduire un simple changement.",{"type":29,"tag":1589,"props":12527,"children":12528},{},[12529,12534],{"type":29,"tag":45,"props":12530,"children":12531},{},[12532],{"type":34,"value":12533},"Classes surchargées",{"type":34,"value":12535}," : Certaines classes ou méthodes semblent faire trop de choses à la fois, ce qui les rend difficiles à maintenir et à comprendre.",{"type":29,"tag":1589,"props":12537,"children":12538},{},[12539,12544],{"type":29,"tag":45,"props":12540,"children":12541},{},[12542],{"type":34,"value":12543},"Régression fréquente",{"type":34,"value":12545}," : À chaque fois que vous modifiez le code, vous cassez des fonctionnalités existantes.",{"type":29,"tag":1589,"props":12547,"children":12548},{},[12549,12554],{"type":29,"tag":45,"props":12550,"children":12551},{},[12552],{"type":34,"value":12553},"Manque de tests",{"type":34,"value":12555}," : Vous ne pouvez pas facilement tester certaines parties de votre code, ou les tests ne couvrent pas assez de cas, rendant le refactoring risqué.",{"type":29,"tag":825,"props":12557,"children":12558},{},[12559,12564],{"type":29,"tag":829,"props":12560,"children":12561},{},[12562],{"type":34,"value":12563},"2. Est-ce que toutes les parties d'un projet doivent être évolutives dès le début ?",{"type":29,"tag":30,"props":12565,"children":12566},{},[12567],{"type":34,"value":12568},"Pas nécessairement. Priorisez les parties qui vont évoluer : code critique, modules avec beaucoup d'interactions, zones soumises à des modifications fréquentes. Le code très spécifique ou temporaire peut rester plus simple : ne payez pas le coût d'abstraction pour du jetable.",{"type":29,"tag":825,"props":12570,"children":12571},{},[12572,12577],{"type":29,"tag":829,"props":12573,"children":12574},{},[12575],{"type":34,"value":12576},"3. Quelles erreurs courantes éviter ?",{"type":29,"tag":1585,"props":12578,"children":12579},{},[12580,12590,12600],{"type":29,"tag":1589,"props":12581,"children":12582},{},[12583,12588],{"type":29,"tag":45,"props":12584,"children":12585},{},[12586],{"type":34,"value":12587},"Sur-conception",{"type":34,"value":12589}," : anticiper chaque changement possible mène à un code trop abstrait. Restez pragmatique, faites évoluer au fur et à mesure des besoins réels.",{"type":29,"tag":1589,"props":12591,"children":12592},{},[12593,12598],{"type":29,"tag":45,"props":12594,"children":12595},{},[12596],{"type":34,"value":12597},"Ignorer les tests",{"type":34,"value":12599}," : écrire du code évolutif sans tests solides est contradictoire. Les tests sont le filet qui rend le refactoring possible.",{"type":29,"tag":1589,"props":12601,"children":12602},{},[12603,12608],{"type":29,"tag":45,"props":12604,"children":12605},{},[12606],{"type":34,"value":12607},"Manque de documentation",{"type":34,"value":12609}," : un code évolutif que personne ne sait étendre devient contre-productif. Documentez ce qui est non trivial.",{"type":29,"tag":51,"props":12611,"children":12612},{},[],{"type":29,"tag":55,"props":12614,"children":12616},{"id":12615},"conclusion",[12617],{"type":34,"value":12618},"Conclusion",{"type":29,"tag":30,"props":12620,"children":12621},{},[12622],{"type":34,"value":12623},"En appliquant les bonnes pratiques et les principes présentés ici, vous pouvez rendre votre code beaucoup plus évolutif. Cela vous permettra d'ajouter de nouvelles fonctionnalités, de corriger des erreurs et de maintenir votre logiciel plus facilement, sans avoir à craindre de tout casser. Avec des exemples concrets en Java, vous avez maintenant les outils nécessaires pour appliquer ces concepts à vos propres projets et améliorer la qualité et la longévité de votre code.",{"type":29,"tag":51,"props":12625,"children":12626},{},[],{"type":29,"tag":567,"props":12628,"children":12630},{"cta":1739,"href":918,"title":12629,"type":920},"Ressource gratuite : De 6 semaines à 8 jours de lead time en 90 jours",[12631],{"type":29,"tag":30,"props":12632,"children":12633},{},[12634],{"type":34,"value":12635},"Le framework 4 phases appliqué dans 12 équipes engineering, avec des exemples before\u002Fafter chiffrés. Un code évolutif est la clé d'un lead time court : découvrez comment y parvenir.",{"type":29,"tag":928,"props":12637,"children":12638},{},[12639],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":12641},[12642,12643,12644,12648,12654,12659,12660],{"id":7494,"depth":130,"text":7497},{"id":7513,"depth":130,"text":7516},{"id":7988,"depth":130,"text":7991,"children":12645},[12646,12647],{"id":7999,"depth":139,"text":8002},{"id":8375,"depth":139,"text":8378},{"id":8812,"depth":130,"text":8815,"children":12649},[12650,12651,12652,12653],{"id":8823,"depth":139,"text":8826},{"id":9119,"depth":139,"text":9122},{"id":9414,"depth":139,"text":9417},{"id":9917,"depth":139,"text":9920},{"id":10307,"depth":130,"text":10310,"children":12655},[12656,12657,12658],{"id":10318,"depth":139,"text":10321},{"id":11257,"depth":139,"text":11260},{"id":11936,"depth":139,"text":11939},{"id":12496,"depth":130,"text":12499},{"id":12615,"depth":130,"text":12618},"content:fr:dette-technique:comment-ecrire-du-code-evolutif-en-developpement-logiciel.md","fr\u002Fdette-technique\u002Fcomment-ecrire-du-code-evolutif-en-developpement-logiciel.md","fr\u002Fdette-technique\u002Fcomment-ecrire-du-code-evolutif-en-developpement-logiciel",{"_path":12665,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":12666,"description":12667,"id":12668,"date":12669,"listed":13,"nocomments":7,"hidden":7,"categories":12670,"tags":12671,"cover":12672,"readingTime":12673,"body":12677,"_type":942,"_id":13913,"_source":944,"_file":13914,"_stem":13915,"_extension":947},"\u002Ffr\u002Fdette-technique\u002Fguide-code-lisible-software-craftsmanship","Le Guide du Code Lisible, Améliorer la Qualité Logicielle en Software Craftsmanship","Découvrez comment la lisibilité du code est essentielle en software craftsmanship. Apprenez des techniques pratiques pour écrire un code lisible, clair...",39,"2024-06-27",[1765],[5391,18],"covers\u002Farticles\u002Fqualite-de-code.jpg",{"text":21,"minutes":12674,"time":12675,"words":12676},10.28,616800,2056,{"type":26,"children":12678,"toc":13904},[12679,12685,12712,12723,12728,12734,12739,12744,12841,12846,12942,12947,12978,12983,12992,12998,13009,13015,13051,13056,13062,13067,13072,13078,13083,13088,13196,13201,13364,13369,13374,13380,13385,13391,13410,13415,13567,13572,13603,13608,13613,13619,13624,13629,13647,13653,13658,13663,13668,13673,13679,13684,13689,13694,13700,13705,13711,13716,13726,13739,13745,13750,13759,13765,13770,13779,13785,13790,13799,13802,13806,13819,13846,13859,13872,13875,13892,13900],{"type":29,"tag":55,"props":12680,"children":12682},{"id":12681},"pourquoi-la-lisibilité-nest-jamais-facultative",[12683],{"type":34,"value":12684},"Pourquoi la lisibilité n'est jamais facultative",{"type":29,"tag":30,"props":12686,"children":12687},{},[12688,12690,12696,12697,12703,12704,12710],{"type":34,"value":12689},"Mission chez Canal+, équipe d'une vingtaine de développeurs sur une plateforme de diffusion. Premier code parcouru le matin de l'arrivée : trois mille lignes, des variables ",{"type":29,"tag":113,"props":12691,"children":12693},{"className":12692},[],[12694],{"type":34,"value":12695},"var1",{"type":34,"value":2468},{"type":29,"tag":113,"props":12698,"children":12700},{"className":12699},[],[12701],{"type":34,"value":12702},"tmp2",{"type":34,"value":2468},{"type":29,"tag":113,"props":12705,"children":12707},{"className":12706},[],[12708],{"type":34,"value":12709},"data",{"type":34,"value":12711},", des méthodes de quatre-vingts lignes sans nom évocateur, zéro commentaire utile. Pour comprendre ce que faisait une simple fonction de validation d'abonnement, il fallait remonter à travers quatre fichiers et déchiffrer un état partagé entre objets non typés. Même histoire chez Crédit Agricole Assurances quelques mois plus tard sur un module de tarification.",{"type":29,"tag":30,"props":12713,"children":12714},{},[12715,12717,12721],{"type":34,"value":12716},"Dans les deux cas, l'équipe livrait du code qui fonctionnait, et perdait collectivement plusieurs heures par jour à le déchiffrer pour pouvoir le modifier. La lisibilité n'est pas une question de goût esthétique : c'est ce qui détermine la vitesse à laquelle votre équipe peut évoluer le code sans casser autre chose. C'est aussi ce qui sépare le ",{"type":29,"tag":45,"props":12718,"children":12719},{},[12720],{"type":34,"value":7137},{"type":34,"value":12722}," d'une production logicielle à courte vue.",{"type":29,"tag":30,"props":12724,"children":12725},{},[12726],{"type":34,"value":12727},"Cet article rassemble ce qui fait la différence entre un code qu'on relit avec aisance six mois plus tard et un code qu'on n'ose plus toucher : les principes, les pratiques, les objections que vous entendrez en équipe et la manière d'y répondre.",{"type":29,"tag":55,"props":12729,"children":12731},{"id":12730},"reconnaître-un-code-lisible",[12732],{"type":34,"value":12733},"Reconnaître un code lisible",{"type":29,"tag":30,"props":12735,"children":12736},{},[12737],{"type":34,"value":12738},"Un code lisible se laisse comprendre rapidement, sans archéologie ni devinette sur les intentions de l'auteur. Chaque élément (nom de variable, signature de méthode, structure de bloc) porte sa charge d'information.",{"type":29,"tag":30,"props":12740,"children":12741},{},[12742],{"type":34,"value":12743},"L'exemple canonique :",{"type":29,"tag":106,"props":12745,"children":12747},{"className":5519,"code":12746,"language":5521,"meta":8,"style":8},"int a = 3;  \nint b = 5;  \nint c = a * b;\n",[12748],{"type":29,"tag":113,"props":12749,"children":12750},{"__ignoreMap":8},[12751,12780,12809],{"type":29,"tag":117,"props":12752,"children":12753},{"class":119,"line":120},[12754,12758,12762,12766,12771,12775],{"type":29,"tag":117,"props":12755,"children":12756},{"style":143},[12757],{"type":34,"value":5560},{"type":29,"tag":117,"props":12759,"children":12760},{"style":378},[12761],{"type":34,"value":5865},{"type":29,"tag":117,"props":12763,"children":12764},{"style":160},[12765],{"type":34,"value":6061},{"type":29,"tag":117,"props":12767,"children":12768},{"style":3476},[12769],{"type":34,"value":12770}," 3",{"type":29,"tag":117,"props":12772,"children":12773},{"style":384},[12774],{"type":34,"value":2722},{"type":29,"tag":117,"props":12776,"children":12777},{"style":378},[12778],{"type":34,"value":12779},"  \n",{"type":29,"tag":117,"props":12781,"children":12782},{"class":119,"line":130},[12783,12787,12792,12796,12801,12805],{"type":29,"tag":117,"props":12784,"children":12785},{"style":143},[12786],{"type":34,"value":5560},{"type":29,"tag":117,"props":12788,"children":12789},{"style":378},[12790],{"type":34,"value":12791}," b ",{"type":29,"tag":117,"props":12793,"children":12794},{"style":160},[12795],{"type":34,"value":6061},{"type":29,"tag":117,"props":12797,"children":12798},{"style":3476},[12799],{"type":34,"value":12800}," 5",{"type":29,"tag":117,"props":12802,"children":12803},{"style":384},[12804],{"type":34,"value":2722},{"type":29,"tag":117,"props":12806,"children":12807},{"style":378},[12808],{"type":34,"value":12779},{"type":29,"tag":117,"props":12810,"children":12811},{"class":119,"line":139},[12812,12816,12821,12825,12829,12833,12837],{"type":29,"tag":117,"props":12813,"children":12814},{"style":143},[12815],{"type":34,"value":5560},{"type":29,"tag":117,"props":12817,"children":12818},{"style":378},[12819],{"type":34,"value":12820}," c ",{"type":29,"tag":117,"props":12822,"children":12823},{"style":160},[12824],{"type":34,"value":6061},{"type":29,"tag":117,"props":12826,"children":12827},{"style":378},[12828],{"type":34,"value":5865},{"type":29,"tag":117,"props":12830,"children":12831},{"style":160},[12832],{"type":34,"value":5649},{"type":29,"tag":117,"props":12834,"children":12835},{"style":378},[12836],{"type":34,"value":5845},{"type":29,"tag":117,"props":12838,"children":12839},{"style":384},[12840],{"type":34,"value":387},{"type":29,"tag":30,"props":12842,"children":12843},{},[12844],{"type":34,"value":12845},"vs.",{"type":29,"tag":106,"props":12847,"children":12849},{"className":5519,"code":12848,"language":5521,"meta":8,"style":8},"int largeur = 3;  \nint hauteur = 5;  \nint surface = largeur * hauteur;\n",[12850],{"type":29,"tag":113,"props":12851,"children":12852},{"__ignoreMap":8},[12853,12881,12909],{"type":29,"tag":117,"props":12854,"children":12855},{"class":119,"line":120},[12856,12860,12865,12869,12873,12877],{"type":29,"tag":117,"props":12857,"children":12858},{"style":143},[12859],{"type":34,"value":5560},{"type":29,"tag":117,"props":12861,"children":12862},{"style":378},[12863],{"type":34,"value":12864}," largeur ",{"type":29,"tag":117,"props":12866,"children":12867},{"style":160},[12868],{"type":34,"value":6061},{"type":29,"tag":117,"props":12870,"children":12871},{"style":3476},[12872],{"type":34,"value":12770},{"type":29,"tag":117,"props":12874,"children":12875},{"style":384},[12876],{"type":34,"value":2722},{"type":29,"tag":117,"props":12878,"children":12879},{"style":378},[12880],{"type":34,"value":12779},{"type":29,"tag":117,"props":12882,"children":12883},{"class":119,"line":130},[12884,12888,12893,12897,12901,12905],{"type":29,"tag":117,"props":12885,"children":12886},{"style":143},[12887],{"type":34,"value":5560},{"type":29,"tag":117,"props":12889,"children":12890},{"style":378},[12891],{"type":34,"value":12892}," hauteur ",{"type":29,"tag":117,"props":12894,"children":12895},{"style":160},[12896],{"type":34,"value":6061},{"type":29,"tag":117,"props":12898,"children":12899},{"style":3476},[12900],{"type":34,"value":12800},{"type":29,"tag":117,"props":12902,"children":12903},{"style":384},[12904],{"type":34,"value":2722},{"type":29,"tag":117,"props":12906,"children":12907},{"style":378},[12908],{"type":34,"value":12779},{"type":29,"tag":117,"props":12910,"children":12911},{"class":119,"line":139},[12912,12916,12921,12925,12929,12933,12938],{"type":29,"tag":117,"props":12913,"children":12914},{"style":143},[12915],{"type":34,"value":5560},{"type":29,"tag":117,"props":12917,"children":12918},{"style":378},[12919],{"type":34,"value":12920}," surface ",{"type":29,"tag":117,"props":12922,"children":12923},{"style":160},[12924],{"type":34,"value":6061},{"type":29,"tag":117,"props":12926,"children":12927},{"style":378},[12928],{"type":34,"value":12864},{"type":29,"tag":117,"props":12930,"children":12931},{"style":160},[12932],{"type":34,"value":5649},{"type":29,"tag":117,"props":12934,"children":12935},{"style":378},[12936],{"type":34,"value":12937}," hauteur",{"type":29,"tag":117,"props":12939,"children":12940},{"style":384},[12941],{"type":34,"value":387},{"type":29,"tag":30,"props":12943,"children":12944},{},[12945],{"type":34,"value":12946},"Aucun commentaire ne devient nécessaire dans la seconde version : le code raconte lui-même ce qu'il calcule. La lisibilité commence là, dans le choix précis du nom de chaque variable.",{"type":29,"tag":5462,"props":12948,"children":12949},{"type":5464},[12950],{"type":29,"tag":30,"props":12951,"children":12952},{},[12953,12955,12961,12963,12969,12971,12977],{"type":34,"value":12954},"Règle pratique : un nom de variable doit décrire son rôle, pas son type. ",{"type":29,"tag":113,"props":12956,"children":12958},{"className":12957},[],[12959],{"type":34,"value":12960},"nombreDeLignes",{"type":34,"value":12962}," vaut mieux que ",{"type":29,"tag":113,"props":12964,"children":12966},{"className":12965},[],[12967],{"type":34,"value":12968},"n",{"type":34,"value":12970}," ou que ",{"type":29,"tag":113,"props":12972,"children":12974},{"className":12973},[],[12975],{"type":34,"value":12976},"intLignes",{"type":34,"value":369},{"type":29,"tag":30,"props":12979,"children":12980},{},[12981],{"type":34,"value":12982},"Les bénéfices se mesurent à la durée de vie du projet : maintenance plus rapide, onboarding raccourci, moins de bugs introduits par incompréhension. À l'inverse, un code illisible alimente directement la dette technique : chaque modification devient un pari, chaque arrivée d'un nouveau développeur coûte deux semaines de plus que prévu.",{"type":29,"tag":567,"props":12984,"children":12986},{"cta":569,"href":570,"title":12985,"type":572},"Vous voulez écrire un code que vos collègues comprennent en trois secondes ?",[12987],{"type":29,"tag":30,"props":12988,"children":12989},{},[12990],{"type":34,"value":12991},"Choisir le bon nom, découper une fonction, isoler une condition : ces réflexes ne s'acquièrent pas en lisant un article, ils se travaillent sur votre propre code. En mentoring 1:1, je relis vos PR avec vous et on retravaille ensemble les passages où la lisibilité décroche, jusqu'à ce que ces choix deviennent un automatisme.",{"type":29,"tag":55,"props":12993,"children":12995},{"id":12994},"trois-piliers-concrets",[12996],{"type":34,"value":12997},"Trois piliers concrets",{"type":29,"tag":30,"props":12999,"children":13000},{},[13001,13003,13007],{"type":34,"value":13002},"Le nommage ne suffit pas. Trois principes structurent la lisibilité, appliqués ensemble, ils transforment durablement la qualité du code. Robert C. Martin le formule dans ",{"type":29,"tag":5410,"props":13004,"children":13005},{},[13006],{"type":34,"value":5414},{"type":34,"value":13008}," : un bon code se lit comme de la prose.",{"type":29,"tag":7528,"props":13010,"children":13012},{"id":13011},"_1-nommer-pour-révéler-lintention",[13013],{"type":34,"value":13014},"1. Nommer pour révéler l'intention",{"type":29,"tag":30,"props":13016,"children":13017},{},[13018,13020,13026,13028,13034,13036,13042,13043,13049],{"type":34,"value":13019},"Variables, fonctions, classes : chaque nom doit décrire ce que représente la chose, pas comment elle est implémentée. ",{"type":29,"tag":113,"props":13021,"children":13023},{"className":13022},[],[13024],{"type":34,"value":13025},"additionnerNombres",{"type":34,"value":13027}," parle, ",{"type":29,"tag":113,"props":13029,"children":13031},{"className":13030},[],[13032],{"type":34,"value":13033},"calculer",{"type":34,"value":13035}," reste mystérieux. ",{"type":29,"tag":113,"props":13037,"children":13039},{"className":13038},[],[13040],{"type":34,"value":13041},"compteurDeLignes",{"type":34,"value":13027},{"type":29,"tag":113,"props":13044,"children":13046},{"className":13045},[],[13047],{"type":34,"value":13048},"i",{"type":34,"value":13050}," oblige à remonter trois lignes plus haut pour savoir.",{"type":29,"tag":30,"props":13052,"children":13053},{},[13054],{"type":34,"value":13055},"Règle des trois secondes : si la fonction ou la variable n'est pas comprise en trois secondes par un développeur de l'équipe, le nom est à reprendre.",{"type":29,"tag":7528,"props":13057,"children":13059},{"id":13058},"_2-structure-et-organisation-du-code",[13060],{"type":34,"value":13061},"2. Structure et organisation du code",{"type":29,"tag":30,"props":13063,"children":13064},{},[13065],{"type":34,"value":13066},"La manière dont votre code est structuré a un impact direct sur sa lisibilité. Il est essentiel de séparer les préoccupations et de diviser le code en petites fonctions ou méthodes qui réalisent chacune une tâche bien précise. Une règle simple : chaque fonction ne devrait faire qu'une seule chose. Si vous constatez que votre fonction fait plusieurs actions, il est probablement temps de la diviser en plusieurs fonctions plus petites.",{"type":29,"tag":30,"props":13068,"children":13069},{},[13070],{"type":34,"value":13071},"De plus, un bon formatage (indentation, espaces, sauts de ligne) améliore la lisibilité. Un code compact et mal organisé, sans espaces entre les blocs logiques, devient rapidement difficile à suivre.",{"type":29,"tag":7528,"props":13073,"children":13075},{"id":13074},"_3-limiter-la-complexité-cognitive",[13076],{"type":34,"value":13077},"3. Limiter la complexité cognitive",{"type":29,"tag":30,"props":13079,"children":13080},{},[13081],{"type":34,"value":13082},"La complexité cognitive correspond à la charge mentale nécessaire pour comprendre un morceau de code. Plus un code est complexe, plus il est difficile à lire et à maintenir. Pour réduire cette complexité, je vous recommande d'éviter les longues chaînes de conditions, les boucles imbriquées et les instructions trop denses.",{"type":29,"tag":30,"props":13084,"children":13085},{},[13086],{"type":34,"value":13087},"Par exemple, au lieu de ceci :",{"type":29,"tag":106,"props":13089,"children":13091},{"className":5519,"code":13090,"language":5521,"meta":8,"style":8},"if (x > 10 && y \u003C 5 || (z == 3 && !a)) {\n    \u002F\u002F code\n}\n",[13092],{"type":29,"tag":113,"props":13093,"children":13094},{"__ignoreMap":8},[13095,13181,13189],{"type":29,"tag":117,"props":13096,"children":13097},{"class":119,"line":120},[13098,13102,13106,13111,13115,13120,13124,13129,13133,13137,13142,13146,13151,13155,13159,13163,13168,13172,13177],{"type":29,"tag":117,"props":13099,"children":13100},{"style":143},[13101],{"type":34,"value":1088},{"type":29,"tag":117,"props":13103,"children":13104},{"style":384},[13105],{"type":34,"value":3181},{"type":29,"tag":117,"props":13107,"children":13108},{"style":378},[13109],{"type":34,"value":13110},"x ",{"type":29,"tag":117,"props":13112,"children":13113},{"style":160},[13114],{"type":34,"value":2877},{"type":29,"tag":117,"props":13116,"children":13117},{"style":3476},[13118],{"type":34,"value":13119}," 10",{"type":29,"tag":117,"props":13121,"children":13122},{"style":160},[13123],{"type":34,"value":6708},{"type":29,"tag":117,"props":13125,"children":13126},{"style":378},[13127],{"type":34,"value":13128}," y ",{"type":29,"tag":117,"props":13130,"children":13131},{"style":160},[13132],{"type":34,"value":2860},{"type":29,"tag":117,"props":13134,"children":13135},{"style":3476},[13136],{"type":34,"value":12800},{"type":29,"tag":117,"props":13138,"children":13139},{"style":160},[13140],{"type":34,"value":13141}," ||",{"type":29,"tag":117,"props":13143,"children":13144},{"style":384},[13145],{"type":34,"value":3181},{"type":29,"tag":117,"props":13147,"children":13148},{"style":378},[13149],{"type":34,"value":13150},"z ",{"type":29,"tag":117,"props":13152,"children":13153},{"style":160},[13154],{"type":34,"value":9338},{"type":29,"tag":117,"props":13156,"children":13157},{"style":3476},[13158],{"type":34,"value":12770},{"type":29,"tag":117,"props":13160,"children":13161},{"style":160},[13162],{"type":34,"value":6708},{"type":29,"tag":117,"props":13164,"children":13165},{"style":160},[13166],{"type":34,"value":13167}," !",{"type":29,"tag":117,"props":13169,"children":13170},{"style":378},[13171],{"type":34,"value":453},{"type":29,"tag":117,"props":13173,"children":13174},{"style":384},[13175],{"type":34,"value":13176},"))",{"type":29,"tag":117,"props":13178,"children":13179},{"style":384},[13180],{"type":34,"value":3461},{"type":29,"tag":117,"props":13182,"children":13183},{"class":119,"line":130},[13184],{"type":29,"tag":117,"props":13185,"children":13186},{"style":124},[13187],{"type":34,"value":13188},"    \u002F\u002F code\n",{"type":29,"tag":117,"props":13190,"children":13191},{"class":119,"line":139},[13192],{"type":29,"tag":117,"props":13193,"children":13194},{"style":384},[13195],{"type":34,"value":2903},{"type":29,"tag":30,"props":13197,"children":13198},{},[13199],{"type":34,"value":13200},"Vous pouvez simplifier la logique en extrayant des morceaux de code dans des fonctions ou en les assignant à des variables explicites :",{"type":29,"tag":106,"props":13202,"children":13204},{"className":5519,"code":13203,"language":5521,"meta":8,"style":8},"boolean condition1 = (x > 10 && y \u003C 5);\nboolean condition2 = (z == 3 && !a);\n\nif (condition1 || condition2) {\n    \u002F\u002F code\n}\n",[13205],{"type":29,"tag":113,"props":13206,"children":13207},{"__ignoreMap":8},[13208,13261,13309,13316,13350,13357],{"type":29,"tag":117,"props":13209,"children":13210},{"class":119,"line":120},[13211,13216,13221,13225,13229,13233,13237,13241,13245,13249,13253,13257],{"type":29,"tag":117,"props":13212,"children":13213},{"style":143},[13214],{"type":34,"value":13215},"boolean",{"type":29,"tag":117,"props":13217,"children":13218},{"style":378},[13219],{"type":34,"value":13220}," condition1 ",{"type":29,"tag":117,"props":13222,"children":13223},{"style":160},[13224],{"type":34,"value":6061},{"type":29,"tag":117,"props":13226,"children":13227},{"style":384},[13228],{"type":34,"value":3181},{"type":29,"tag":117,"props":13230,"children":13231},{"style":378},[13232],{"type":34,"value":13110},{"type":29,"tag":117,"props":13234,"children":13235},{"style":160},[13236],{"type":34,"value":2877},{"type":29,"tag":117,"props":13238,"children":13239},{"style":3476},[13240],{"type":34,"value":13119},{"type":29,"tag":117,"props":13242,"children":13243},{"style":160},[13244],{"type":34,"value":6708},{"type":29,"tag":117,"props":13246,"children":13247},{"style":378},[13248],{"type":34,"value":13128},{"type":29,"tag":117,"props":13250,"children":13251},{"style":160},[13252],{"type":34,"value":2860},{"type":29,"tag":117,"props":13254,"children":13255},{"style":3476},[13256],{"type":34,"value":12800},{"type":29,"tag":117,"props":13258,"children":13259},{"style":384},[13260],{"type":34,"value":5675},{"type":29,"tag":117,"props":13262,"children":13263},{"class":119,"line":130},[13264,13268,13273,13277,13281,13285,13289,13293,13297,13301,13305],{"type":29,"tag":117,"props":13265,"children":13266},{"style":143},[13267],{"type":34,"value":13215},{"type":29,"tag":117,"props":13269,"children":13270},{"style":378},[13271],{"type":34,"value":13272}," condition2 ",{"type":29,"tag":117,"props":13274,"children":13275},{"style":160},[13276],{"type":34,"value":6061},{"type":29,"tag":117,"props":13278,"children":13279},{"style":384},[13280],{"type":34,"value":3181},{"type":29,"tag":117,"props":13282,"children":13283},{"style":378},[13284],{"type":34,"value":13150},{"type":29,"tag":117,"props":13286,"children":13287},{"style":160},[13288],{"type":34,"value":9338},{"type":29,"tag":117,"props":13290,"children":13291},{"style":3476},[13292],{"type":34,"value":12770},{"type":29,"tag":117,"props":13294,"children":13295},{"style":160},[13296],{"type":34,"value":6708},{"type":29,"tag":117,"props":13298,"children":13299},{"style":160},[13300],{"type":34,"value":13167},{"type":29,"tag":117,"props":13302,"children":13303},{"style":378},[13304],{"type":34,"value":453},{"type":29,"tag":117,"props":13306,"children":13307},{"style":384},[13308],{"type":34,"value":5675},{"type":29,"tag":117,"props":13310,"children":13311},{"class":119,"line":139},[13312],{"type":29,"tag":117,"props":13313,"children":13314},{"emptyLinePlaceholder":13},[13315],{"type":34,"value":136},{"type":29,"tag":117,"props":13317,"children":13318},{"class":119,"line":172},[13319,13323,13327,13332,13337,13342,13346],{"type":29,"tag":117,"props":13320,"children":13321},{"style":143},[13322],{"type":34,"value":1088},{"type":29,"tag":117,"props":13324,"children":13325},{"style":384},[13326],{"type":34,"value":3181},{"type":29,"tag":117,"props":13328,"children":13329},{"style":378},[13330],{"type":34,"value":13331},"condition1 ",{"type":29,"tag":117,"props":13333,"children":13334},{"style":160},[13335],{"type":34,"value":13336},"||",{"type":29,"tag":117,"props":13338,"children":13339},{"style":378},[13340],{"type":34,"value":13341}," condition2",{"type":29,"tag":117,"props":13343,"children":13344},{"style":384},[13345],{"type":34,"value":2803},{"type":29,"tag":117,"props":13347,"children":13348},{"style":384},[13349],{"type":34,"value":3461},{"type":29,"tag":117,"props":13351,"children":13352},{"class":119,"line":181},[13353],{"type":29,"tag":117,"props":13354,"children":13355},{"style":124},[13356],{"type":34,"value":13188},{"type":29,"tag":117,"props":13358,"children":13359},{"class":119,"line":189},[13360],{"type":29,"tag":117,"props":13361,"children":13362},{"style":384},[13363],{"type":34,"value":2903},{"type":29,"tag":30,"props":13365,"children":13366},{},[13367],{"type":34,"value":13368},"Ce code est plus facile à lire et à comprendre car chaque condition a été isolée dans une variable qui a un nom clair.",{"type":29,"tag":30,"props":13370,"children":13371},{},[13372],{"type":34,"value":13373},"Découper les conditions complexes en variables nommées reste l'une des transformations les plus rentables : zéro impact sur la perf, gain massif sur la lisibilité.",{"type":29,"tag":55,"props":13375,"children":13377},{"id":13376},"outils-et-pratiques-pour-améliorer-la-lisibilité-du-code",[13378],{"type":34,"value":13379},"Outils et pratiques pour améliorer la lisibilité du code",{"type":29,"tag":30,"props":13381,"children":13382},{},[13383],{"type":34,"value":13384},"Même avec de bonnes intentions, il peut parfois être difficile de maintenir un haut niveau de lisibilité dans le code. Heureusement, il existe des outils et des pratiques éprouvées qui peuvent vous aider à écrire du code plus lisible au quotidien.",{"type":29,"tag":7528,"props":13386,"children":13388},{"id":13387},"_1-commentaires-pertinents-et-documentation",[13389],{"type":34,"value":13390},"1. Commentaires pertinents et documentation",{"type":29,"tag":30,"props":13392,"children":13393},{},[13394,13396,13401,13403,13408],{"type":34,"value":13395},"Bien que le code doit idéalement s’expliquer par lui-même, les commentaires restent un outil précieux lorsqu'ils sont utilisés de manière judicieuse. Un bon commentaire doit expliquer ",{"type":29,"tag":5410,"props":13397,"children":13398},{},[13399],{"type":34,"value":13400},"pourquoi",{"type":34,"value":13402}," une certaine approche a été choisie, et non ",{"type":29,"tag":5410,"props":13404,"children":13405},{},[13406],{"type":34,"value":13407},"ce que",{"type":34,"value":13409}," fait le code. Un commentaire qui se contente de paraphraser le code n’ajoute aucune valeur.",{"type":29,"tag":30,"props":13411,"children":13412},{},[13413],{"type":34,"value":13414},"Exemple de commentaire utile :",{"type":29,"tag":106,"props":13416,"children":13418},{"className":5519,"code":13417,"language":5521,"meta":8,"style":8},"\u002F\u002F Vérifie si le montant de la commande dépasse le seuil pour la livraison gratuite.\n\u002F\u002F Ce seuil est défini en fonction d'une promotion actuelle (20% de réduction) pour encourager les commandes de plus de 50€.\nif (commande.getMontantTotal() > 50) {\n    commande.setLivraisonGratuite(true);\n} else {\n    commande.setFraisLivraison(7.99);\n}\n\n",[13419],{"type":29,"tag":113,"props":13420,"children":13421},{"__ignoreMap":8},[13422,13430,13438,13485,13515,13531,13560],{"type":29,"tag":117,"props":13423,"children":13424},{"class":119,"line":120},[13425],{"type":29,"tag":117,"props":13426,"children":13427},{"style":124},[13428],{"type":34,"value":13429},"\u002F\u002F Vérifie si le montant de la commande dépasse le seuil pour la livraison gratuite.\n",{"type":29,"tag":117,"props":13431,"children":13432},{"class":119,"line":130},[13433],{"type":29,"tag":117,"props":13434,"children":13435},{"style":124},[13436],{"type":34,"value":13437},"\u002F\u002F Ce seuil est défini en fonction d'une promotion actuelle (20% de réduction) pour encourager les commandes de plus de 50€.\n",{"type":29,"tag":117,"props":13439,"children":13440},{"class":119,"line":139},[13441,13445,13449,13454,13458,13463,13467,13472,13477,13481],{"type":29,"tag":117,"props":13442,"children":13443},{"style":143},[13444],{"type":34,"value":1088},{"type":29,"tag":117,"props":13446,"children":13447},{"style":384},[13448],{"type":34,"value":3181},{"type":29,"tag":117,"props":13450,"children":13451},{"style":378},[13452],{"type":34,"value":13453},"commande",{"type":29,"tag":117,"props":13455,"children":13456},{"style":384},[13457],{"type":34,"value":369},{"type":29,"tag":117,"props":13459,"children":13460},{"style":372},[13461],{"type":34,"value":13462},"getMontantTotal",{"type":29,"tag":117,"props":13464,"children":13465},{"style":384},[13466],{"type":34,"value":381},{"type":29,"tag":117,"props":13468,"children":13469},{"style":160},[13470],{"type":34,"value":13471}," >",{"type":29,"tag":117,"props":13473,"children":13474},{"style":3476},[13475],{"type":34,"value":13476}," 50",{"type":29,"tag":117,"props":13478,"children":13479},{"style":384},[13480],{"type":34,"value":2803},{"type":29,"tag":117,"props":13482,"children":13483},{"style":384},[13484],{"type":34,"value":3461},{"type":29,"tag":117,"props":13486,"children":13487},{"class":119,"line":172},[13488,13493,13497,13502,13506,13511],{"type":29,"tag":117,"props":13489,"children":13490},{"style":378},[13491],{"type":34,"value":13492},"    commande",{"type":29,"tag":117,"props":13494,"children":13495},{"style":384},[13496],{"type":34,"value":369},{"type":29,"tag":117,"props":13498,"children":13499},{"style":372},[13500],{"type":34,"value":13501},"setLivraisonGratuite",{"type":29,"tag":117,"props":13503,"children":13504},{"style":384},[13505],{"type":34,"value":1108},{"type":29,"tag":117,"props":13507,"children":13508},{"style":6700},[13509],{"type":34,"value":13510},"true",{"type":29,"tag":117,"props":13512,"children":13513},{"style":384},[13514],{"type":34,"value":5675},{"type":29,"tag":117,"props":13516,"children":13517},{"class":119,"line":181},[13518,13522,13527],{"type":29,"tag":117,"props":13519,"children":13520},{"style":384},[13521],{"type":34,"value":2790},{"type":29,"tag":117,"props":13523,"children":13524},{"style":143},[13525],{"type":34,"value":13526}," else",{"type":29,"tag":117,"props":13528,"children":13529},{"style":384},[13530],{"type":34,"value":3461},{"type":29,"tag":117,"props":13532,"children":13533},{"class":119,"line":189},[13534,13538,13542,13547,13551,13556],{"type":29,"tag":117,"props":13535,"children":13536},{"style":378},[13537],{"type":34,"value":13492},{"type":29,"tag":117,"props":13539,"children":13540},{"style":384},[13541],{"type":34,"value":369},{"type":29,"tag":117,"props":13543,"children":13544},{"style":372},[13545],{"type":34,"value":13546},"setFraisLivraison",{"type":29,"tag":117,"props":13548,"children":13549},{"style":384},[13550],{"type":34,"value":1108},{"type":29,"tag":117,"props":13552,"children":13553},{"style":3476},[13554],{"type":34,"value":13555},"7.99",{"type":29,"tag":117,"props":13557,"children":13558},{"style":384},[13559],{"type":34,"value":5675},{"type":29,"tag":117,"props":13561,"children":13562},{"class":119,"line":198},[13563],{"type":29,"tag":117,"props":13564,"children":13565},{"style":384},[13566],{"type":34,"value":2903},{"type":29,"tag":30,"props":13568,"children":13569},{},[13570],{"type":34,"value":13571},"Exemple de commentaire inutile :",{"type":29,"tag":106,"props":13573,"children":13575},{"className":5519,"code":13574,"language":5521,"meta":8,"style":8},"\u002F\u002F Incrémente la variable i\ni++;\n",[13576],{"type":29,"tag":113,"props":13577,"children":13578},{"__ignoreMap":8},[13579,13587],{"type":29,"tag":117,"props":13580,"children":13581},{"class":119,"line":120},[13582],{"type":29,"tag":117,"props":13583,"children":13584},{"style":124},[13585],{"type":34,"value":13586},"\u002F\u002F Incrémente la variable i\n",{"type":29,"tag":117,"props":13588,"children":13589},{"class":119,"line":130},[13590,13594,13599],{"type":29,"tag":117,"props":13591,"children":13592},{"style":378},[13593],{"type":34,"value":13048},{"type":29,"tag":117,"props":13595,"children":13596},{"style":160},[13597],{"type":34,"value":13598},"++",{"type":29,"tag":117,"props":13600,"children":13601},{"style":384},[13602],{"type":34,"value":387},{"type":29,"tag":30,"props":13604,"children":13605},{},[13606],{"type":34,"value":13607},"En plus des commentaires, une documentation claire et concise est essentielle, surtout pour les projets de grande envergure. Les outils comme Javadoc, Doxygen ou encore Sphinx (pour Python) peuvent vous aider à générer une documentation directement à partir de votre code.",{"type":29,"tag":30,"props":13609,"children":13610},{},[13611],{"type":34,"value":13612},"La règle inverse vaut aussi : un commentaire qui paraphrase le code n'ajoute rien et fait du bruit. Mieux vaut un code explicite que dix commentaires redondants.",{"type":29,"tag":7528,"props":13614,"children":13616},{"id":13615},"_2-revue-de-code-entre-pairs",[13617],{"type":34,"value":13618},"2. Revue de code entre pairs",{"type":29,"tag":30,"props":13620,"children":13621},{},[13622],{"type":34,"value":13623},"La revue de code est l’une des pratiques les plus efficaces pour garantir la lisibilité du code. Lorsqu’un autre développeur examine votre travail, il peut repérer des parties de code qui vous paraissent évidentes mais qui ne le sont pas pour quelqu’un d’autre. Les critiques constructives permettent d’améliorer non seulement le code, mais aussi les compétences de chacun dans l’équipe.",{"type":29,"tag":30,"props":13625,"children":13626},{},[13627],{"type":34,"value":13628},"Quelques points à aborder lors d’une revue de code :",{"type":29,"tag":1585,"props":13630,"children":13631},{},[13632,13637,13642],{"type":29,"tag":1589,"props":13633,"children":13634},{},[13635],{"type":34,"value":13636},"Est-ce que les noms des variables et des fonctions sont explicites ?",{"type":29,"tag":1589,"props":13638,"children":13639},{},[13640],{"type":34,"value":13641},"Est-ce que la logique est claire et facile à suivre ?",{"type":29,"tag":1589,"props":13643,"children":13644},{},[13645],{"type":34,"value":13646},"Y a-t-il des parties du code qui pourraient être simplifiées ou réorganisées ?",{"type":29,"tag":7528,"props":13648,"children":13650},{"id":13649},"_3-tests-automatisés-pour-renforcer-la-clarté",[13651],{"type":34,"value":13652},"3. Tests automatisés pour renforcer la clarté",{"type":29,"tag":30,"props":13654,"children":13655},{},[13656],{"type":34,"value":13657},"Les tests automatisés, en particulier les tests unitaires, contribuent également à rendre le code plus lisible. En rédigeant des tests, vous êtes amené à réfléchir à la manière dont chaque partie de votre code doit se comporter. Un test bien écrit fonctionne comme une",{"type":29,"tag":30,"props":13659,"children":13660},{},[13661],{"type":34,"value":13662},"forme de documentation vivante : il montre comment les différentes fonctions interagissent et ce qu’on attend d’elles.",{"type":29,"tag":30,"props":13664,"children":13665},{},[13666],{"type":34,"value":13667},"Les tests servent aussi de filet contre les régressions : une suite complète garantit qu'un code remanié continue de se comporter comme attendu.",{"type":29,"tag":30,"props":13669,"children":13670},{},[13671],{"type":34,"value":13672},"Un test difficile à écrire est presque toujours le signe d'un code trop couplé ou trop dense. Cette difficulté est un signal, pas un obstacle à contourner.",{"type":29,"tag":7528,"props":13674,"children":13676},{"id":13675},"_4-linters-et-formatteurs-automatiques",[13677],{"type":34,"value":13678},"4. Linters et formatteurs automatiques",{"type":29,"tag":30,"props":13680,"children":13681},{},[13682],{"type":34,"value":13683},"Des outils comme les linters (par exemple, ESLint pour JavaScript, Pylint pour Python) et les formatteurs de code (comme Prettier ou Black) sont très utiles pour imposer des standards de qualité dans le code. Ces outils vérifient automatiquement la cohérence du style et peuvent même corriger certaines erreurs de formatage, rendant le code plus propre et lisible sans effort manuel.",{"type":29,"tag":30,"props":13685,"children":13686},{},[13687],{"type":34,"value":13688},"Ils assurent aussi que tous les membres d'une équipe respectent les mêmes conventions, ce qui améliore encore la lisibilité générale du projet.",{"type":29,"tag":30,"props":13690,"children":13691},{},[13692],{"type":34,"value":13693},"Les règles par défaut des linters sont rarement adaptées : prendre une demi-journée pour configurer un set cohérent avec les conventions de l'équipe évite ensuite des semaines de débats stériles en revue.",{"type":29,"tag":55,"props":13695,"children":13697},{"id":13696},"objections-courantes-et-comment-les-surmonter",[13698],{"type":34,"value":13699},"Objections courantes et comment les surmonter",{"type":29,"tag":30,"props":13701,"children":13702},{},[13703],{"type":34,"value":13704},"Malgré l’importance de la lisibilité du code, de nombreux développeurs hésitent à y consacrer du temps, principalement en raison de contraintes de temps ou de priorités mal définies. Voici quelques-unes des objections les plus courantes et des réponses pour les surmonter.",{"type":29,"tag":7528,"props":13706,"children":13708},{"id":13707},"objection-1-je-nai-pas-le-temps-de-rendre-mon-code-lisible",[13709],{"type":34,"value":13710},"Objection 1 : \"Je n’ai pas le temps de rendre mon code lisible.\"",{"type":29,"tag":30,"props":13712,"children":13713},{},[13714],{"type":34,"value":13715},"C’est probablement l’objection la plus fréquente. Lorsque vous travaillez sous pression pour respecter des délais, il peut sembler plus rapide de sacrifier la lisibilité au profit de l’efficacité immédiate. Cependant, c’est un piège à long terme.",{"type":29,"tag":30,"props":13717,"children":13718},{},[13719,13724],{"type":29,"tag":45,"props":13720,"children":13721},{},[13722],{"type":34,"value":13723},"Réponse",{"type":34,"value":13725}," : Écrire du code lisible fait gagner du temps à long terme. Un code clair nécessite moins de corrections et est plus facile à maintenir, surtout dans des projets de longue durée où vous devez souvent revenir sur du code ancien. Les quelques minutes que vous passez à choisir de bons noms de variables ou à bien structurer votre code peuvent vous épargner des heures de débogage plus tard.",{"type":29,"tag":2164,"props":13727,"children":13728},{},[13729],{"type":29,"tag":30,"props":13730,"children":13731},{},[13732,13737],{"type":29,"tag":45,"props":13733,"children":13734},{},[13735],{"type":34,"value":13736},"💡 Astuce",{"type":34,"value":13738}," : Considérez la lisibilité comme un investissement. Un code mal structuré aujourd’hui coûtera beaucoup plus cher en maintenance demain.",{"type":29,"tag":7528,"props":13740,"children":13742},{"id":13741},"objection-2-tant-que-ça-fonctionne-peu-importe-si-le-code-est-un-peu-désordonné",[13743],{"type":34,"value":13744},"Objection 2 : \"Tant que ça fonctionne, peu importe si le code est un peu désordonné.\"",{"type":29,"tag":30,"props":13746,"children":13747},{},[13748],{"type":34,"value":13749},"Certains développeurs pensent que la lisibilité est un détail secondaire tant que le code \"fait le job\". Après tout, si le logiciel fonctionne correctement, pourquoi se soucier de l’apparence du code ?",{"type":29,"tag":30,"props":13751,"children":13752},{},[13753,13757],{"type":29,"tag":45,"props":13754,"children":13755},{},[13756],{"type":34,"value":13723},{"type":34,"value":13758}," : Un code qui fonctionne aujourd'hui, mais qui est difficile à lire, est une bombe à retardement. La plupart des bugs apparaissent lors de la maintenance ou des modifications du code. Si le code est difficile à comprendre, chaque modification devient risquée, augmentant les chances d’introduire de nouvelles erreurs.",{"type":29,"tag":7528,"props":13760,"children":13762},{"id":13761},"objection-3-ce-nest-pas-mon-problème-si-les-autres-ne-comprennent-pas-mon-code",[13763],{"type":34,"value":13764},"Objection 3 : \"Ce n’est pas mon problème si les autres ne comprennent pas mon code.\"",{"type":29,"tag":30,"props":13766,"children":13767},{},[13768],{"type":34,"value":13769},"Certains développeurs pensent que chaque personne devrait être responsable de comprendre le code, quelle que soit sa lisibilité. Ils estiment que tant qu'ils comprennent ce qu’ils ont écrit, c’est suffisant.",{"type":29,"tag":30,"props":13771,"children":13772},{},[13773,13777],{"type":29,"tag":45,"props":13774,"children":13775},{},[13776],{"type":34,"value":13723},{"type":34,"value":13778}," : Travailler en équipe repose sur la collaboration, et un code illisible devient un obstacle à la productivité collective. Lorsque d'autres membres de l'équipe doivent passer du temps à déchiffrer votre code, cela réduit leur efficacité et génère de la frustration.",{"type":29,"tag":55,"props":13780,"children":13782},{"id":13781},"investissement-pas-dépense",[13783],{"type":34,"value":13784},"Investissement, pas dépense",{"type":29,"tag":30,"props":13786,"children":13787},{},[13788],{"type":34,"value":13789},"La lisibilité paraît coûteuse sur le moment : quelques minutes pour trouver le bon nom, dix minutes pour découper une fonction, une demi-heure pour clarifier une condition. Sur la durée d'un projet, ce sont les heures les mieux investies. Chaque ligne lisible évite cinq lectures laborieuses futures et trois bugs introduits par incompréhension. C'est ce calcul, fait mille fois sur un sprint, qui distingue une équipe qui accélère d'une équipe qui s'enlise.",{"type":29,"tag":567,"props":13791,"children":13793},{"cta":805,"href":806,"title":13792,"type":808},"La lisibilité n'est qu'une pratique parmi les 100 qui font un code propre",[13794],{"type":29,"tag":30,"props":13795,"children":13796},{},[13797],{"type":34,"value":13798},"Nommer pour révéler l'intention, c'est une seule des pratiques décrites ici. Le Craft Bundle réunit les 100 pratiques craft que j'applique au quotidien pour écrire un code propre et durable, celles que l'IA ne vous apprendra jamais parce qu'elle ne les a jamais vues tenir en production sur le long terme.",{"type":29,"tag":51,"props":13800,"children":13801},{},[],{"type":29,"tag":55,"props":13803,"children":13804},{"id":6964},[13805],{"type":34,"value":6967},{"type":29,"tag":825,"props":13807,"children":13808},{},[13809,13814],{"type":29,"tag":829,"props":13810,"children":13811},{},[13812],{"type":34,"value":13813},"Code fonctionnel et code lisible : où est la différence ?",{"type":29,"tag":30,"props":13815,"children":13816},{},[13817],{"type":34,"value":13818},"Un code fonctionnel fait ce qu'on attend de lui mais peut rester opaque. Un code lisible s'ajoute à ça : il se laisse comprendre rapidement par un autre développeur, sans explication orale supplémentaire. La distinction n'est pas cosmétique : c'est elle qui détermine la vitesse d'évolution du projet sur la durée.",{"type":29,"tag":825,"props":13820,"children":13821},{},[13822,13827],{"type":29,"tag":829,"props":13823,"children":13824},{},[13825],{"type":34,"value":13826},"Faut-il commenter chaque ligne ?",{"type":29,"tag":30,"props":13828,"children":13829},{},[13830,13832,13836,13838,13844],{"type":34,"value":13831},"Non. Les commentaires utiles expliquent ",{"type":29,"tag":5410,"props":13833,"children":13834},{},[13835],{"type":34,"value":13400},{"type":34,"value":13837}," : la raison d'une décision technique, le contexte d'une contrainte métier, la subtilité d'une convention. Les commentaires qui paraphrasent le code (",{"type":29,"tag":113,"props":13839,"children":13841},{"className":13840},[],[13842],{"type":34,"value":13843},"\u002F\u002F incrémente i",{"type":34,"value":13845},") sont du bruit. Un bon code se passe d'eux dans 90 % des cas.",{"type":29,"tag":825,"props":13847,"children":13848},{},[13849,13854],{"type":29,"tag":829,"props":13850,"children":13851},{},[13852],{"type":34,"value":13853},"Si je suis seul sur un projet, est-ce vraiment nécessaire ?",{"type":29,"tag":30,"props":13855,"children":13856},{},[13857],{"type":34,"value":13858},"Oui. Le \"vous dans six mois\" est un autre développeur, qui n'a plus accès au contexte mental que vous aviez à l'écriture. Tous les développeurs solo expérimentés finissent par confirmer cette règle après avoir relu leur propre code un an plus tard.",{"type":29,"tag":825,"props":13860,"children":13861},{},[13862,13867],{"type":29,"tag":829,"props":13863,"children":13864},{},[13865],{"type":34,"value":13866},"Quels outils pour faciliter ?",{"type":29,"tag":30,"props":13868,"children":13869},{},[13870],{"type":34,"value":13871},"Linters et formatteurs adaptés au langage (Checkstyle, ESLint, Prettier) pour la cohérence mécanique. Tests unitaires comme documentation vivante. Revues de code régulières pour le reste : c'est l'outil le plus puissant, parce qu'il révèle ce que l'auteur ne peut pas voir par lui-même.",{"type":29,"tag":51,"props":13873,"children":13874},{},[],{"type":29,"tag":30,"props":13876,"children":13877},{},[13878,13880,13884,13886,13890],{"type":34,"value":13879},"Un code lisible est aussi un code qui passe la ",{"type":29,"tag":453,"props":13881,"children":13882},{"href":5},[13883],{"type":34,"value":7341},{"type":34,"value":13885}," sans friction et qui s'inscrit dans les pratiques d'une ",{"type":29,"tag":453,"props":13887,"children":13888},{"href":1573},[13889],{"type":34,"value":1576},{"type":34,"value":13891}," exigeante : ces deux pratiques se renforcent mutuellement.",{"type":29,"tag":567,"props":13893,"children":13894},{"cta":7028,"href":918,"title":7029,"type":920},[13895],{"type":29,"tag":30,"props":13896,"children":13897},{},[13898],{"type":34,"value":13899},"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":928,"props":13901,"children":13902},{},[13903],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":13905},[13906,13907,13908,13909,13910,13911,13912],{"id":12681,"depth":130,"text":12684},{"id":12730,"depth":130,"text":12733},{"id":12994,"depth":130,"text":12997},{"id":13376,"depth":130,"text":13379},{"id":13696,"depth":130,"text":13699},{"id":13781,"depth":130,"text":13784},{"id":6964,"depth":130,"text":6967},"content:fr:dette-technique:guide-code-lisible-software-craftsmanship.md","fr\u002Fdette-technique\u002Fguide-code-lisible-software-craftsmanship.md","fr\u002Fdette-technique\u002Fguide-code-lisible-software-craftsmanship",{"_path":7134,"_dir":1765,"_draft":7,"_partial":7,"_locale":8,"title":13917,"description":13918,"id":13919,"date":13920,"listed":13,"nocomments":7,"hidden":7,"categories":13921,"tags":13922,"cover":13923,"readingTime":13924,"body":13928,"_type":942,"_id":16368,"_source":944,"_file":16369,"_stem":16370,"_extension":947},"Software Craftsmanship, Principes, Exemples Java et Astuces pour un Code Propre","Découvrez le Software Craftsmanship et comment appliquer ses principes à travers des exemples concrets en Java, des outils recommandés et des astuces pour améliorer votre code.",46,"2024-05-25",[1765],[5391,18],"covers\u002Farticles\u002Fsoftware-craftsmanship.jpg",{"text":960,"minutes":13925,"time":13926,"words":13927},8.885,533100,1777,{"type":26,"children":13929,"toc":16357},[13930,13936,13942,13947,13959,13962,13968,13986,13992,14004,14010,14029,14047,14050,14059,14065,14075,14851,14854,14860,14871,14877,14882,14905,14913,15129,15137,15478,15483,15486,15492,15497,15505,15641,15646,15649,15655,15668,15673,15680,15786,15793,15903,15908,15911,15917,15941,15944,15950,15955,15961,15984,15989,16194,16199,16222,16225,16231,16241,16251,16254,16260,16265,16274,16277,16281,16306,16319,16332,16335,16339,16344,16353],{"type":29,"tag":4530,"props":13931,"children":13933},{"id":13932},"software-craftsmanship-guide-complet-pour-un-code-propre-et-maintenable",[13934],{"type":34,"value":13935},"Software Craftsmanship : Guide Complet pour un Code Propre et Maintenable",{"type":29,"tag":7528,"props":13937,"children":13939},{"id":13938},"introduction-quest-ce-que-le-software-craftsmanship",[13940],{"type":34,"value":13941},"Introduction : Qu'est-ce que le Software Craftsmanship ?",{"type":29,"tag":30,"props":13943,"children":13944},{},[13945],{"type":34,"value":13946},"Mission chez Agirc-Arrco, équipe d’une douzaine de développeurs sur une plateforme métier critique. Le code tournait, les sprints se bouclaient, et pourtant chaque modification prenait deux fois plus de temps que prévu. Diagnostic : pas de tests sur les modules anciens, des classes de mille lignes héritées sans documentation, un refactoring que personne n’osait engager. Même topo chez ING Bank quelques mois plus tard sur un projet de paiements : la livraison fonctionnait, mais la dette technique mangeait 40 % de la capacité de l’équipe.",{"type":29,"tag":30,"props":13948,"children":13949},{},[13950,13952,13957],{"type":34,"value":13951},"Dans les deux cas, le redressement est passé par la même chose : adopter une posture d’artisan logiciel. Pas un label marketing, mais un ensemble de pratiques exigeantes : tests d’abord, refactoring continu, revues sérieuses, code que ses auteurs n’ont pas honte de montrer. Le ",{"type":29,"tag":45,"props":13953,"children":13954},{},[13955],{"type":34,"value":13956},"Software Craftsmanship",{"type":34,"value":13958}," porte un nom à cette discipline et la formalise depuis 2009. Cet article en pose les principes et montre, exemples Java à l’appui, comment les appliquer sans transformer chaque sprint en débat philosophique.",{"type":29,"tag":51,"props":13960,"children":13961},{},[],{"type":29,"tag":4530,"props":13963,"children":13965},{"id":13964},"les-origines-du-software-craftsmanship",[13966],{"type":34,"value":13967},"Les origines du Software Craftsmanship",{"type":29,"tag":30,"props":13969,"children":13970},{},[13971,13973,13977,13979,13984],{"type":34,"value":13972},"Le mouvement ",{"type":29,"tag":45,"props":13974,"children":13975},{},[13976],{"type":34,"value":13956},{"type":34,"value":13978}," trouve ses racines dans la volonté d’améliorer la qualité du code produit dans l'industrie du logiciel. Il s'agit d'une réponse directe aux pratiques de développement qui privilégient la vitesse au détriment de la qualité, souvent encouragées par des approches ",{"type":29,"tag":45,"props":13980,"children":13981},{},[13982],{"type":34,"value":13983},"agiles",{"type":34,"value":13985}," mal interprétées.",{"type":29,"tag":7528,"props":13987,"children":13989},{"id":13988},"_1-le-manifeste-agile-2001",[13990],{"type":34,"value":13991},"1. Le Manifeste Agile (2001)",{"type":29,"tag":30,"props":13993,"children":13994},{},[13995,13997,14002],{"type":34,"value":13996},"Tout commence en 2001 avec le ",{"type":29,"tag":45,"props":13998,"children":13999},{},[14000],{"type":34,"value":14001},"Manifeste Agile",{"type":34,"value":14003}," qui prône l'adaptation et la flexibilité dans le développement logiciel. Cependant, au fil des années, certains développeurs ont constaté que la méthodologie agile était parfois utilisée pour justifier un travail rapide et bâclé.",{"type":29,"tag":7528,"props":14005,"children":14007},{"id":14006},"_2-le-manifeste-du-software-craftsmanship-2009",[14008],{"type":34,"value":14009},"2. Le Manifeste du Software Craftsmanship (2009)",{"type":29,"tag":30,"props":14011,"children":14012},{},[14013,14015,14020,14022,14027],{"type":34,"value":14014},"En 2009, un groupe de développeurs autour de ",{"type":29,"tag":45,"props":14016,"children":14017},{},[14018],{"type":34,"value":14019},"Robert C. Martin",{"type":34,"value":14021}," (Uncle Bob) publie le ",{"type":29,"tag":45,"props":14023,"children":14024},{},[14025],{"type":34,"value":14026},"Manifeste du Software Craftsmanship",{"type":34,"value":14028},". Le texte ajoute quatre engagements à ceux du Manifeste Agile : du logiciel bien conçu, pas seulement fonctionnel ; de la valeur ajoutée en continu, pas seulement de la réactivité ; une communauté de professionnels qui partagent leurs pratiques ; une collaboration productive avec le client, pas seulement de la collaboration.",{"type":29,"tag":30,"props":14030,"children":14031},{},[14032,14034,14038,14040,14045],{"type":34,"value":14033},"L’extension est naturelle : l’agilité dit ",{"type":29,"tag":5410,"props":14035,"children":14036},{},[14037],{"type":34,"value":8540},{"type":34,"value":14039}," livrer, le craftsmanship dit ",{"type":29,"tag":5410,"props":14041,"children":14042},{},[14043],{"type":34,"value":14044},"à quelle qualité",{"type":34,"value":14046},". Sans cette deuxième conversation, les sprints rapides finissent en sprints rapides vers le mur.",{"type":29,"tag":51,"props":14048,"children":14049},{},[],{"type":29,"tag":567,"props":14051,"children":14053},{"cta":569,"href":570,"title":14052,"type":572},"Vous voulez écrire un code dont vous n'avez plus honte en revue ?",[14054],{"type":29,"tag":30,"props":14055,"children":14056},{},[14057],{"type":34,"value":14058},"Le clean code, le TDD et le refactoring sans casse ne s'attrapent pas en lisant un article : ça se travaille sur votre propre code. En mentoring 1:1, je relis vos classes avec vous, je vous montre où extraire, où tester d'abord, où simplifier. Vous prenez le réflexe de l'artisan au lieu de juste connaître les principes.",{"type":29,"tag":4530,"props":14060,"children":14062},{"id":14061},"les-principes-fondamentaux-du-software-craftsmanship",[14063],{"type":34,"value":14064},"Les principes fondamentaux du Software Craftsmanship",{"type":29,"tag":30,"props":14066,"children":14067},{},[14068,14069,14073],{"type":34,"value":7167},{"type":29,"tag":45,"props":14070,"children":14071},{},[14072],{"type":34,"value":13956},{"type":34,"value":14074}," repose sur plusieurs principes clés qui vont bien au-delà du simple fait d'écrire du code qui fonctionne. C'est une approche qui valorise la qualité du code et la collaboration au sein de la communauté des développeurs. Voici les principes fondamentaux :",{"type":29,"tag":4212,"props":14076,"children":14077},{},[14078,14296,14528,14841],{"type":29,"tag":1589,"props":14079,"children":14080},{},[14081,14086,14088,14091,14096,14265],{"type":29,"tag":45,"props":14082,"children":14083},{},[14084],{"type":34,"value":14085},"Code propre (Clean Code)",{"type":34,"value":14087},"\nLisible, maintenable, testé. Un autre développeur (ou vous dans six mois) doit comprendre le code sans archéologie. Cela passe par des noms explicites, des fonctions courtes, une responsabilité claire par classe.",{"type":29,"tag":8411,"props":14089,"children":14090},{},[],{"type":29,"tag":5410,"props":14092,"children":14093},{},[14094],{"type":34,"value":14095},"Exemple Java :",{"type":29,"tag":106,"props":14097,"children":14099},{"className":5519,"code":14098,"language":5521,"meta":8,"style":8},"public class Calculateur {\n    public double calculerMoyenne(List\u003CInteger> nombres) {\n        return nombres.stream().mapToInt(Integer::intValue).average().orElse(0);\n    }\n}\n",[14100],{"type":29,"tag":113,"props":14101,"children":14102},{"__ignoreMap":8},[14103,14123,14172,14251,14258],{"type":29,"tag":117,"props":14104,"children":14105},{"class":119,"line":120},[14106,14110,14114,14119],{"type":29,"tag":117,"props":14107,"children":14108},{"style":143},[14109],{"type":34,"value":5541},{"type":29,"tag":117,"props":14111,"children":14112},{"style":143},[14113],{"type":34,"value":7575},{"type":29,"tag":117,"props":14115,"children":14116},{"style":2863},[14117],{"type":34,"value":14118}," Calculateur",{"type":29,"tag":117,"props":14120,"children":14121},{"style":384},[14122],{"type":34,"value":3461},{"type":29,"tag":117,"props":14124,"children":14125},{"class":119,"line":130},[14126,14130,14134,14139,14143,14147,14151,14155,14159,14164,14168],{"type":29,"tag":117,"props":14127,"children":14128},{"style":143},[14129],{"type":34,"value":7641},{"type":29,"tag":117,"props":14131,"children":14132},{"style":143},[14133],{"type":34,"value":7617},{"type":29,"tag":117,"props":14135,"children":14136},{"style":372},[14137],{"type":34,"value":14138}," calculerMoyenne",{"type":29,"tag":117,"props":14140,"children":14141},{"style":384},[14142],{"type":34,"value":1108},{"type":29,"tag":117,"props":14144,"children":14145},{"style":5976},[14146],{"type":34,"value":6006},{"type":29,"tag":117,"props":14148,"children":14149},{"style":384},[14150],{"type":34,"value":2860},{"type":29,"tag":117,"props":14152,"children":14153},{"style":143},[14154],{"type":34,"value":5988},{"type":29,"tag":117,"props":14156,"children":14157},{"style":384},[14158],{"type":34,"value":2877},{"type":29,"tag":117,"props":14160,"children":14161},{"style":7657},[14162],{"type":34,"value":14163}," nombres",{"type":29,"tag":117,"props":14165,"children":14166},{"style":384},[14167],{"type":34,"value":2803},{"type":29,"tag":117,"props":14169,"children":14170},{"style":384},[14171],{"type":34,"value":3461},{"type":29,"tag":117,"props":14173,"children":14174},{"class":119,"line":139},[14175,14179,14183,14187,14191,14196,14201,14205,14209,14214,14219,14224,14229,14233,14238,14242,14247],{"type":29,"tag":117,"props":14176,"children":14177},{"style":143},[14178],{"type":34,"value":5616},{"type":29,"tag":117,"props":14180,"children":14181},{"style":378},[14182],{"type":34,"value":14163},{"type":29,"tag":117,"props":14184,"children":14185},{"style":384},[14186],{"type":34,"value":369},{"type":29,"tag":117,"props":14188,"children":14189},{"style":372},[14190],{"type":34,"value":6340},{"type":29,"tag":117,"props":14192,"children":14193},{"style":384},[14194],{"type":34,"value":14195},"().",{"type":29,"tag":117,"props":14197,"children":14198},{"style":372},[14199],{"type":34,"value":14200},"mapToInt",{"type":29,"tag":117,"props":14202,"children":14203},{"style":384},[14204],{"type":34,"value":1108},{"type":29,"tag":117,"props":14206,"children":14207},{"style":378},[14208],{"type":34,"value":5988},{"type":29,"tag":117,"props":14210,"children":14211},{"style":143},[14212],{"type":34,"value":14213},"::",{"type":29,"tag":117,"props":14215,"children":14216},{"style":378},[14217],{"type":34,"value":14218},"intValue",{"type":29,"tag":117,"props":14220,"children":14221},{"style":384},[14222],{"type":34,"value":14223},").",{"type":29,"tag":117,"props":14225,"children":14226},{"style":372},[14227],{"type":34,"value":14228},"average",{"type":29,"tag":117,"props":14230,"children":14231},{"style":384},[14232],{"type":34,"value":14195},{"type":29,"tag":117,"props":14234,"children":14235},{"style":372},[14236],{"type":34,"value":14237},"orElse",{"type":29,"tag":117,"props":14239,"children":14240},{"style":384},[14241],{"type":34,"value":1108},{"type":29,"tag":117,"props":14243,"children":14244},{"style":3476},[14245],{"type":34,"value":14246},"0",{"type":29,"tag":117,"props":14248,"children":14249},{"style":384},[14250],{"type":34,"value":5675},{"type":29,"tag":117,"props":14252,"children":14253},{"class":119,"line":172},[14254],{"type":29,"tag":117,"props":14255,"children":14256},{"style":384},[14257],{"type":34,"value":5632},{"type":29,"tag":117,"props":14259,"children":14260},{"class":119,"line":181},[14261],{"type":29,"tag":117,"props":14262,"children":14263},{"style":384},[14264],{"type":34,"value":2903},{"type":29,"tag":5462,"props":14266,"children":14267},{"type":5464},[14268],{"type":29,"tag":30,"props":14269,"children":14270},{},[14271,14273,14279,14280,14286,14288,14294],{"type":34,"value":14272},"Le nom d’une méthode doit décrire son intention sans ambiguïté. ",{"type":29,"tag":113,"props":14274,"children":14276},{"className":14275},[],[14277],{"type":34,"value":14278},"calculerMoyenne",{"type":34,"value":13027},{"type":29,"tag":113,"props":14281,"children":14283},{"className":14282},[],[14284],{"type":34,"value":14285},"calc",{"type":34,"value":14287}," ou ",{"type":29,"tag":113,"props":14289,"children":14291},{"className":14290},[],[14292],{"type":34,"value":14293},"moy",{"type":34,"value":14295}," obligent à ouvrir l’implémentation pour deviner.",{"type":29,"tag":1589,"props":14297,"children":14298},{},[14299,14304,14306,14311,14313,14316,14321],{"type":29,"tag":45,"props":14300,"children":14301},{},[14302],{"type":34,"value":14303},"Tests automatisés",{"type":34,"value":14305},"\nLe développement piloté par les tests (",{"type":29,"tag":45,"props":14307,"children":14308},{},[14309],{"type":34,"value":14310},"TDD",{"type":34,"value":14312},") reste l’ossature du craftsmanship. Test d’abord, code ensuite, juste assez pour passer au vert. Le bénéfice n’est pas qu’une question de bugs évités : c’est aussi le filet qui rend le refactoring possible.",{"type":29,"tag":8411,"props":14314,"children":14315},{},[],{"type":29,"tag":5410,"props":14317,"children":14318},{},[14319],{"type":34,"value":14320},"Exemple Java avec JUnit :",{"type":29,"tag":106,"props":14322,"children":14324},{"className":5519,"code":14323,"language":5521,"meta":8,"style":8},"@Test\npublic void testCalculerMoyenne() {\n    Calculateur calc = new Calculateur();\n    List\u003CInteger> nombres = Arrays.asList(2, 4, 6);\n    assertEquals(4.0, calc.calculerMoyenne(nombres), 0.01);\n}\n",[14325],{"type":29,"tag":113,"props":14326,"children":14327},{"__ignoreMap":8},[14328,14340,14364,14393,14465,14521],{"type":29,"tag":117,"props":14329,"children":14330},{"class":119,"line":120},[14331,14336],{"type":29,"tag":117,"props":14332,"children":14333},{"style":10083},[14334],{"type":34,"value":14335},"@",{"type":29,"tag":117,"props":14337,"children":14338},{"style":10089},[14339],{"type":34,"value":10092},{"type":29,"tag":117,"props":14341,"children":14342},{"class":119,"line":130},[14343,14347,14351,14356,14360],{"type":29,"tag":117,"props":14344,"children":14345},{"style":143},[14346],{"type":34,"value":5541},{"type":29,"tag":117,"props":14348,"children":14349},{"style":143},[14350],{"type":34,"value":7762},{"type":29,"tag":117,"props":14352,"children":14353},{"style":372},[14354],{"type":34,"value":14355}," testCalculerMoyenne",{"type":29,"tag":117,"props":14357,"children":14358},{"style":384},[14359],{"type":34,"value":381},{"type":29,"tag":117,"props":14361,"children":14362},{"style":384},[14363],{"type":34,"value":3461},{"type":29,"tag":117,"props":14365,"children":14366},{"class":119,"line":139},[14367,14372,14377,14381,14385,14389],{"type":29,"tag":117,"props":14368,"children":14369},{"style":5976},[14370],{"type":34,"value":14371},"    Calculateur",{"type":29,"tag":117,"props":14373,"children":14374},{"style":378},[14375],{"type":34,"value":14376}," calc ",{"type":29,"tag":117,"props":14378,"children":14379},{"style":160},[14380],{"type":34,"value":6061},{"type":29,"tag":117,"props":14382,"children":14383},{"style":143},[14384],{"type":34,"value":6066},{"type":29,"tag":117,"props":14386,"children":14387},{"style":372},[14388],{"type":34,"value":14118},{"type":29,"tag":117,"props":14390,"children":14391},{"style":384},[14392],{"type":34,"value":9375},{"type":29,"tag":117,"props":14394,"children":14395},{"class":119,"line":172},[14396,14400,14404,14408,14412,14417,14421,14426,14430,14435,14439,14443,14447,14452,14456,14461],{"type":29,"tag":117,"props":14397,"children":14398},{"style":5976},[14399],{"type":34,"value":6039},{"type":29,"tag":117,"props":14401,"children":14402},{"style":384},[14403],{"type":34,"value":2860},{"type":29,"tag":117,"props":14405,"children":14406},{"style":143},[14407],{"type":34,"value":5988},{"type":29,"tag":117,"props":14409,"children":14410},{"style":384},[14411],{"type":34,"value":2877},{"type":29,"tag":117,"props":14413,"children":14414},{"style":378},[14415],{"type":34,"value":14416}," nombres ",{"type":29,"tag":117,"props":14418,"children":14419},{"style":160},[14420],{"type":34,"value":6061},{"type":29,"tag":117,"props":14422,"children":14423},{"style":378},[14424],{"type":34,"value":14425}," Arrays",{"type":29,"tag":117,"props":14427,"children":14428},{"style":384},[14429],{"type":34,"value":369},{"type":29,"tag":117,"props":14431,"children":14432},{"style":372},[14433],{"type":34,"value":14434},"asList",{"type":29,"tag":117,"props":14436,"children":14437},{"style":384},[14438],{"type":34,"value":1108},{"type":29,"tag":117,"props":14440,"children":14441},{"style":3476},[14442],{"type":34,"value":2233},{"type":29,"tag":117,"props":14444,"children":14445},{"style":384},[14446],{"type":34,"value":1118},{"type":29,"tag":117,"props":14448,"children":14449},{"style":3476},[14450],{"type":34,"value":14451}," 4",{"type":29,"tag":117,"props":14453,"children":14454},{"style":384},[14455],{"type":34,"value":1118},{"type":29,"tag":117,"props":14457,"children":14458},{"style":3476},[14459],{"type":34,"value":14460}," 6",{"type":29,"tag":117,"props":14462,"children":14463},{"style":384},[14464],{"type":34,"value":5675},{"type":29,"tag":117,"props":14466,"children":14467},{"class":119,"line":181},[14468,14473,14477,14482,14486,14491,14495,14499,14503,14508,14513,14517],{"type":29,"tag":117,"props":14469,"children":14470},{"style":372},[14471],{"type":34,"value":14472},"    assertEquals",{"type":29,"tag":117,"props":14474,"children":14475},{"style":384},[14476],{"type":34,"value":1108},{"type":29,"tag":117,"props":14478,"children":14479},{"style":3476},[14480],{"type":34,"value":14481},"4.0",{"type":29,"tag":117,"props":14483,"children":14484},{"style":384},[14485],{"type":34,"value":1118},{"type":29,"tag":117,"props":14487,"children":14488},{"style":378},[14489],{"type":34,"value":14490}," calc",{"type":29,"tag":117,"props":14492,"children":14493},{"style":384},[14494],{"type":34,"value":369},{"type":29,"tag":117,"props":14496,"children":14497},{"style":372},[14498],{"type":34,"value":14278},{"type":29,"tag":117,"props":14500,"children":14501},{"style":384},[14502],{"type":34,"value":1108},{"type":29,"tag":117,"props":14504,"children":14505},{"style":378},[14506],{"type":34,"value":14507},"nombres",{"type":29,"tag":117,"props":14509,"children":14510},{"style":384},[14511],{"type":34,"value":14512},"),",{"type":29,"tag":117,"props":14514,"children":14515},{"style":3476},[14516],{"type":34,"value":10277},{"type":29,"tag":117,"props":14518,"children":14519},{"style":384},[14520],{"type":34,"value":5675},{"type":29,"tag":117,"props":14522,"children":14523},{"class":119,"line":189},[14524],{"type":29,"tag":117,"props":14525,"children":14526},{"style":384},[14527],{"type":34,"value":2903},{"type":29,"tag":1589,"props":14529,"children":14530},{},[14531,14536,14538,14541,14546,14715,14718,14723],{"type":29,"tag":45,"props":14532,"children":14533},{},[14534],{"type":34,"value":14535},"Refactoring constant",{"type":34,"value":14537},"\nAméliorer la structure du code sans changer son comportement. Cette pratique garde la base saine à mesure que le projet grossit, et n’a de sens qu’adossée à une couverture de tests sérieuse.",{"type":29,"tag":8411,"props":14539,"children":14540},{},[],{"type":29,"tag":5410,"props":14542,"children":14543},{},[14544],{"type":34,"value":14545},"Avant :",{"type":29,"tag":106,"props":14547,"children":14549},{"className":5519,"code":14548,"language":5521,"meta":8,"style":8},"public double calculerTotal(List\u003CInteger> prix) {\n    double total = 0;\n    for (int prixUnitaire : prix) {\n        total += prixUnitaire;\n    }\n    return total;\n}\n",[14550],{"type":29,"tag":113,"props":14551,"children":14552},{"__ignoreMap":8},[14553,14602,14627,14663,14685,14692,14708],{"type":29,"tag":117,"props":14554,"children":14555},{"class":119,"line":120},[14556,14560,14564,14569,14573,14577,14581,14585,14589,14594,14598],{"type":29,"tag":117,"props":14557,"children":14558},{"style":143},[14559],{"type":34,"value":5541},{"type":29,"tag":117,"props":14561,"children":14562},{"style":143},[14563],{"type":34,"value":7617},{"type":29,"tag":117,"props":14565,"children":14566},{"style":372},[14567],{"type":34,"value":14568}," calculerTotal",{"type":29,"tag":117,"props":14570,"children":14571},{"style":384},[14572],{"type":34,"value":1108},{"type":29,"tag":117,"props":14574,"children":14575},{"style":5976},[14576],{"type":34,"value":6006},{"type":29,"tag":117,"props":14578,"children":14579},{"style":160},[14580],{"type":34,"value":2860},{"type":29,"tag":117,"props":14582,"children":14583},{"style":378},[14584],{"type":34,"value":5988},{"type":29,"tag":117,"props":14586,"children":14587},{"style":160},[14588],{"type":34,"value":2877},{"type":29,"tag":117,"props":14590,"children":14591},{"style":378},[14592],{"type":34,"value":14593}," prix",{"type":29,"tag":117,"props":14595,"children":14596},{"style":384},[14597],{"type":34,"value":2803},{"type":29,"tag":117,"props":14599,"children":14600},{"style":384},[14601],{"type":34,"value":3461},{"type":29,"tag":117,"props":14603,"children":14604},{"class":119,"line":130},[14605,14610,14615,14619,14623],{"type":29,"tag":117,"props":14606,"children":14607},{"style":143},[14608],{"type":34,"value":14609},"    double",{"type":29,"tag":117,"props":14611,"children":14612},{"style":378},[14613],{"type":34,"value":14614}," total ",{"type":29,"tag":117,"props":14616,"children":14617},{"style":160},[14618],{"type":34,"value":6061},{"type":29,"tag":117,"props":14620,"children":14621},{"style":3476},[14622],{"type":34,"value":6150},{"type":29,"tag":117,"props":14624,"children":14625},{"style":384},[14626],{"type":34,"value":387},{"type":29,"tag":117,"props":14628,"children":14629},{"class":119,"line":139},[14630,14634,14638,14642,14647,14651,14655,14659],{"type":29,"tag":117,"props":14631,"children":14632},{"style":143},[14633],{"type":34,"value":6084},{"type":29,"tag":117,"props":14635,"children":14636},{"style":384},[14637],{"type":34,"value":3181},{"type":29,"tag":117,"props":14639,"children":14640},{"style":143},[14641],{"type":34,"value":5560},{"type":29,"tag":117,"props":14643,"children":14644},{"style":378},[14645],{"type":34,"value":14646}," prixUnitaire ",{"type":29,"tag":117,"props":14648,"children":14649},{"style":143},[14650],{"type":34,"value":1276},{"type":29,"tag":117,"props":14652,"children":14653},{"style":378},[14654],{"type":34,"value":14593},{"type":29,"tag":117,"props":14656,"children":14657},{"style":384},[14658],{"type":34,"value":2803},{"type":29,"tag":117,"props":14660,"children":14661},{"style":384},[14662],{"type":34,"value":3461},{"type":29,"tag":117,"props":14664,"children":14665},{"class":119,"line":172},[14666,14671,14676,14681],{"type":29,"tag":117,"props":14667,"children":14668},{"style":378},[14669],{"type":34,"value":14670},"        total ",{"type":29,"tag":117,"props":14672,"children":14673},{"style":160},[14674],{"type":34,"value":14675},"+=",{"type":29,"tag":117,"props":14677,"children":14678},{"style":378},[14679],{"type":34,"value":14680}," prixUnitaire",{"type":29,"tag":117,"props":14682,"children":14683},{"style":384},[14684],{"type":34,"value":387},{"type":29,"tag":117,"props":14686,"children":14687},{"class":119,"line":181},[14688],{"type":29,"tag":117,"props":14689,"children":14690},{"style":384},[14691],{"type":34,"value":5632},{"type":29,"tag":117,"props":14693,"children":14694},{"class":119,"line":189},[14695,14699,14704],{"type":29,"tag":117,"props":14696,"children":14697},{"style":143},[14698],{"type":34,"value":1136},{"type":29,"tag":117,"props":14700,"children":14701},{"style":378},[14702],{"type":34,"value":14703}," total",{"type":29,"tag":117,"props":14705,"children":14706},{"style":384},[14707],{"type":34,"value":387},{"type":29,"tag":117,"props":14709,"children":14710},{"class":119,"line":198},[14711],{"type":29,"tag":117,"props":14712,"children":14713},{"style":384},[14714],{"type":34,"value":2903},{"type":29,"tag":8411,"props":14716,"children":14717},{},[],{"type":29,"tag":5410,"props":14719,"children":14720},{},[14721],{"type":34,"value":14722},"Après :",{"type":29,"tag":106,"props":14724,"children":14726},{"className":5519,"code":14725,"language":5521,"meta":8,"style":8},"public double calculerTotal(List\u003CInteger> prix) {\n    return prix.stream().mapToDouble(Integer::intValue).sum();\n}\n",[14727],{"type":29,"tag":113,"props":14728,"children":14729},{"__ignoreMap":8},[14730,14777,14834],{"type":29,"tag":117,"props":14731,"children":14732},{"class":119,"line":120},[14733,14737,14741,14745,14749,14753,14757,14761,14765,14769,14773],{"type":29,"tag":117,"props":14734,"children":14735},{"style":143},[14736],{"type":34,"value":5541},{"type":29,"tag":117,"props":14738,"children":14739},{"style":143},[14740],{"type":34,"value":7617},{"type":29,"tag":117,"props":14742,"children":14743},{"style":372},[14744],{"type":34,"value":14568},{"type":29,"tag":117,"props":14746,"children":14747},{"style":384},[14748],{"type":34,"value":1108},{"type":29,"tag":117,"props":14750,"children":14751},{"style":5976},[14752],{"type":34,"value":6006},{"type":29,"tag":117,"props":14754,"children":14755},{"style":160},[14756],{"type":34,"value":2860},{"type":29,"tag":117,"props":14758,"children":14759},{"style":378},[14760],{"type":34,"value":5988},{"type":29,"tag":117,"props":14762,"children":14763},{"style":160},[14764],{"type":34,"value":2877},{"type":29,"tag":117,"props":14766,"children":14767},{"style":378},[14768],{"type":34,"value":14593},{"type":29,"tag":117,"props":14770,"children":14771},{"style":384},[14772],{"type":34,"value":2803},{"type":29,"tag":117,"props":14774,"children":14775},{"style":384},[14776],{"type":34,"value":3461},{"type":29,"tag":117,"props":14778,"children":14779},{"class":119,"line":130},[14780,14784,14788,14792,14796,14800,14805,14809,14813,14817,14821,14825,14830],{"type":29,"tag":117,"props":14781,"children":14782},{"style":143},[14783],{"type":34,"value":1136},{"type":29,"tag":117,"props":14785,"children":14786},{"style":378},[14787],{"type":34,"value":14593},{"type":29,"tag":117,"props":14789,"children":14790},{"style":384},[14791],{"type":34,"value":369},{"type":29,"tag":117,"props":14793,"children":14794},{"style":372},[14795],{"type":34,"value":6340},{"type":29,"tag":117,"props":14797,"children":14798},{"style":384},[14799],{"type":34,"value":14195},{"type":29,"tag":117,"props":14801,"children":14802},{"style":372},[14803],{"type":34,"value":14804},"mapToDouble",{"type":29,"tag":117,"props":14806,"children":14807},{"style":384},[14808],{"type":34,"value":1108},{"type":29,"tag":117,"props":14810,"children":14811},{"style":378},[14812],{"type":34,"value":5988},{"type":29,"tag":117,"props":14814,"children":14815},{"style":143},[14816],{"type":34,"value":14213},{"type":29,"tag":117,"props":14818,"children":14819},{"style":378},[14820],{"type":34,"value":14218},{"type":29,"tag":117,"props":14822,"children":14823},{"style":384},[14824],{"type":34,"value":14223},{"type":29,"tag":117,"props":14826,"children":14827},{"style":372},[14828],{"type":34,"value":14829},"sum",{"type":29,"tag":117,"props":14831,"children":14832},{"style":384},[14833],{"type":34,"value":9375},{"type":29,"tag":117,"props":14835,"children":14836},{"class":119,"line":139},[14837],{"type":29,"tag":117,"props":14838,"children":14839},{"style":384},[14840],{"type":34,"value":2903},{"type":29,"tag":1589,"props":14842,"children":14843},{},[14844,14849],{"type":29,"tag":45,"props":14845,"children":14846},{},[14847],{"type":34,"value":14848},"Apprendre et transmettre",{"type":34,"value":14850},"\nLe métier évolue vite. Lectures régulières, participation aux revues, mentorat ascendant ou descendant : un artisan logiciel investit dans sa pratique et celle des autres. Une équipe qui ne partage pas ses pratiques régresse, même si chaque individu progresse.",{"type":29,"tag":51,"props":14852,"children":14853},{},[],{"type":29,"tag":4530,"props":14855,"children":14857},{"id":14856},"comment-appliquer-ces-principes-dans-votre-code-au-quotidien-avec-exemples-java",[14858],{"type":34,"value":14859},"Comment appliquer ces principes dans votre code au quotidien (avec exemples Java)",{"type":29,"tag":30,"props":14861,"children":14862},{},[14863,14865,14869],{"type":34,"value":14864},"Voyons ",{"type":29,"tag":45,"props":14866,"children":14867},{},[14868],{"type":34,"value":8540},{"type":34,"value":14870}," appliquer de manière concrète ces principes dans votre développement quotidien.",{"type":29,"tag":7528,"props":14872,"children":14874},{"id":14873},"_1-code-propre-structure-et-lisibilité",[14875],{"type":34,"value":14876},"1. Code propre : Structure et lisibilité",{"type":29,"tag":30,"props":14878,"children":14879},{},[14880],{"type":34,"value":14881},"Quand je parle de code propre, cela signifie que chaque partie de votre code doit être facilement compréhensible et maintenable. Voici quelques règles simples pour y parvenir :",{"type":29,"tag":1585,"props":14883,"children":14884},{},[14885,14895],{"type":29,"tag":1589,"props":14886,"children":14887},{},[14888,14893],{"type":29,"tag":45,"props":14889,"children":14890},{},[14891],{"type":34,"value":14892},"Utilisez des noms de variables explicites.",{"type":34,"value":14894}," Les noms doivent décrire clairement leur rôle.",{"type":29,"tag":1589,"props":14896,"children":14897},{},[14898,14903],{"type":29,"tag":45,"props":14899,"children":14900},{},[14901],{"type":34,"value":14902},"Découpez votre code en petites fonctions",{"type":34,"value":14904},". Chacune doit accomplir une seule tâche.",{"type":29,"tag":30,"props":14906,"children":14907},{},[14908],{"type":29,"tag":45,"props":14909,"children":14910},{},[14911],{"type":34,"value":14912},"Exemple de mauvaise pratique :",{"type":29,"tag":106,"props":14914,"children":14916},{"className":5519,"code":14915,"language":5521,"meta":8,"style":8},"public void traiterDonnées(List\u003CString> données) {\n    for (String d : données) {\n        if (d != null && !d.isEmpty()) {\n            System.out.println(\"Donnée : \" + d);\n        }\n    }\n}\n",[14917],{"type":29,"tag":113,"props":14918,"children":14919},{"__ignoreMap":8},[14920,14969,15005,15059,15108,15115,15122],{"type":29,"tag":117,"props":14921,"children":14922},{"class":119,"line":120},[14923,14927,14931,14936,14940,14944,14948,14952,14956,14961,14965],{"type":29,"tag":117,"props":14924,"children":14925},{"style":143},[14926],{"type":34,"value":5541},{"type":29,"tag":117,"props":14928,"children":14929},{"style":143},[14930],{"type":34,"value":7762},{"type":29,"tag":117,"props":14932,"children":14933},{"style":372},[14934],{"type":34,"value":14935}," traiterDonnées",{"type":29,"tag":117,"props":14937,"children":14938},{"style":384},[14939],{"type":34,"value":1108},{"type":29,"tag":117,"props":14941,"children":14942},{"style":5976},[14943],{"type":34,"value":6006},{"type":29,"tag":117,"props":14945,"children":14946},{"style":160},[14947],{"type":34,"value":2860},{"type":29,"tag":117,"props":14949,"children":14950},{"style":378},[14951],{"type":34,"value":7654},{"type":29,"tag":117,"props":14953,"children":14954},{"style":160},[14955],{"type":34,"value":2877},{"type":29,"tag":117,"props":14957,"children":14958},{"style":378},[14959],{"type":34,"value":14960}," données",{"type":29,"tag":117,"props":14962,"children":14963},{"style":384},[14964],{"type":34,"value":2803},{"type":29,"tag":117,"props":14966,"children":14967},{"style":384},[14968],{"type":34,"value":3461},{"type":29,"tag":117,"props":14970,"children":14971},{"class":119,"line":130},[14972,14976,14980,14984,14989,14993,14997,15001],{"type":29,"tag":117,"props":14973,"children":14974},{"style":143},[14975],{"type":34,"value":6084},{"type":29,"tag":117,"props":14977,"children":14978},{"style":384},[14979],{"type":34,"value":3181},{"type":29,"tag":117,"props":14981,"children":14982},{"style":5976},[14983],{"type":34,"value":7654},{"type":29,"tag":117,"props":14985,"children":14986},{"style":378},[14987],{"type":34,"value":14988}," d ",{"type":29,"tag":117,"props":14990,"children":14991},{"style":143},[14992],{"type":34,"value":1276},{"type":29,"tag":117,"props":14994,"children":14995},{"style":378},[14996],{"type":34,"value":14960},{"type":29,"tag":117,"props":14998,"children":14999},{"style":384},[15000],{"type":34,"value":2803},{"type":29,"tag":117,"props":15002,"children":15003},{"style":384},[15004],{"type":34,"value":3461},{"type":29,"tag":117,"props":15006,"children":15007},{"class":119,"line":139},[15008,15012,15016,15021,15025,15029,15033,15037,15042,15046,15051,15055],{"type":29,"tag":117,"props":15009,"children":15010},{"style":143},[15011],{"type":34,"value":6121},{"type":29,"tag":117,"props":15013,"children":15014},{"style":384},[15015],{"type":34,"value":3181},{"type":29,"tag":117,"props":15017,"children":15018},{"style":378},[15019],{"type":34,"value":15020},"d ",{"type":29,"tag":117,"props":15022,"children":15023},{"style":160},[15024],{"type":34,"value":6697},{"type":29,"tag":117,"props":15026,"children":15027},{"style":6700},[15028],{"type":34,"value":6703},{"type":29,"tag":117,"props":15030,"children":15031},{"style":160},[15032],{"type":34,"value":6708},{"type":29,"tag":117,"props":15034,"children":15035},{"style":160},[15036],{"type":34,"value":13167},{"type":29,"tag":117,"props":15038,"children":15039},{"style":378},[15040],{"type":34,"value":15041},"d",{"type":29,"tag":117,"props":15043,"children":15044},{"style":384},[15045],{"type":34,"value":369},{"type":29,"tag":117,"props":15047,"children":15048},{"style":372},[15049],{"type":34,"value":15050},"isEmpty",{"type":29,"tag":117,"props":15052,"children":15053},{"style":384},[15054],{"type":34,"value":6534},{"type":29,"tag":117,"props":15056,"children":15057},{"style":384},[15058],{"type":34,"value":3461},{"type":29,"tag":117,"props":15060,"children":15061},{"class":119,"line":172},[15062,15067,15071,15076,15080,15085,15089,15094,15099,15104],{"type":29,"tag":117,"props":15063,"children":15064},{"style":378},[15065],{"type":34,"value":15066},"            System",{"type":29,"tag":117,"props":15068,"children":15069},{"style":384},[15070],{"type":34,"value":369},{"type":29,"tag":117,"props":15072,"children":15073},{"style":378},[15074],{"type":34,"value":15075},"out",{"type":29,"tag":117,"props":15077,"children":15078},{"style":384},[15079],{"type":34,"value":369},{"type":29,"tag":117,"props":15081,"children":15082},{"style":372},[15083],{"type":34,"value":15084},"println",{"type":29,"tag":117,"props":15086,"children":15087},{"style":384},[15088],{"type":34,"value":1108},{"type":29,"tag":117,"props":15090,"children":15091},{"style":166},[15092],{"type":34,"value":15093},"\"Donnée : \"",{"type":29,"tag":117,"props":15095,"children":15096},{"style":160},[15097],{"type":34,"value":15098}," +",{"type":29,"tag":117,"props":15100,"children":15101},{"style":378},[15102],{"type":34,"value":15103}," d",{"type":29,"tag":117,"props":15105,"children":15106},{"style":384},[15107],{"type":34,"value":5675},{"type":29,"tag":117,"props":15109,"children":15110},{"class":119,"line":181},[15111],{"type":29,"tag":117,"props":15112,"children":15113},{"style":384},[15114],{"type":34,"value":6196},{"type":29,"tag":117,"props":15116,"children":15117},{"class":119,"line":189},[15118],{"type":29,"tag":117,"props":15119,"children":15120},{"style":384},[15121],{"type":34,"value":5632},{"type":29,"tag":117,"props":15123,"children":15124},{"class":119,"line":198},[15125],{"type":29,"tag":117,"props":15126,"children":15127},{"style":384},[15128],{"type":34,"value":2903},{"type":29,"tag":30,"props":15130,"children":15131},{},[15132],{"type":29,"tag":45,"props":15133,"children":15134},{},[15135],{"type":34,"value":15136},"Exemple amélioré :",{"type":29,"tag":106,"props":15138,"children":15140},{"className":5519,"code":15139,"language":5521,"meta":8,"style":8},"public void afficherDonnéesNonNulles(List\u003CString> données) {\n    données.stream()\n           .filter(this::estValide)\n           .forEach(this::afficherDonnée);\n}\n\nprivate boolean estValide(String donnée) {\n    return donnée != null && !donnée.isEmpty();\n}\n\nprivate void afficherDonnée(String donnée) {\n    System.out.println(\"Donnée : \" + donnée);\n}\n",[15141],{"type":29,"tag":113,"props":15142,"children":15143},{"__ignoreMap":8},[15144,15192,15212,15246,15279,15286,15293,15332,15377,15384,15391,15427,15471],{"type":29,"tag":117,"props":15145,"children":15146},{"class":119,"line":120},[15147,15151,15155,15160,15164,15168,15172,15176,15180,15184,15188],{"type":29,"tag":117,"props":15148,"children":15149},{"style":143},[15150],{"type":34,"value":5541},{"type":29,"tag":117,"props":15152,"children":15153},{"style":143},[15154],{"type":34,"value":7762},{"type":29,"tag":117,"props":15156,"children":15157},{"style":372},[15158],{"type":34,"value":15159}," afficherDonnéesNonNulles",{"type":29,"tag":117,"props":15161,"children":15162},{"style":384},[15163],{"type":34,"value":1108},{"type":29,"tag":117,"props":15165,"children":15166},{"style":5976},[15167],{"type":34,"value":6006},{"type":29,"tag":117,"props":15169,"children":15170},{"style":160},[15171],{"type":34,"value":2860},{"type":29,"tag":117,"props":15173,"children":15174},{"style":378},[15175],{"type":34,"value":7654},{"type":29,"tag":117,"props":15177,"children":15178},{"style":160},[15179],{"type":34,"value":2877},{"type":29,"tag":117,"props":15181,"children":15182},{"style":378},[15183],{"type":34,"value":14960},{"type":29,"tag":117,"props":15185,"children":15186},{"style":384},[15187],{"type":34,"value":2803},{"type":29,"tag":117,"props":15189,"children":15190},{"style":384},[15191],{"type":34,"value":3461},{"type":29,"tag":117,"props":15193,"children":15194},{"class":119,"line":130},[15195,15200,15204,15208],{"type":29,"tag":117,"props":15196,"children":15197},{"style":378},[15198],{"type":34,"value":15199},"    données",{"type":29,"tag":117,"props":15201,"children":15202},{"style":384},[15203],{"type":34,"value":369},{"type":29,"tag":117,"props":15205,"children":15206},{"style":372},[15207],{"type":34,"value":6340},{"type":29,"tag":117,"props":15209,"children":15210},{"style":384},[15211],{"type":34,"value":6345},{"type":29,"tag":117,"props":15213,"children":15214},{"class":119,"line":139},[15215,15220,15224,15228,15233,15237,15242],{"type":29,"tag":117,"props":15216,"children":15217},{"style":384},[15218],{"type":34,"value":15219},"           .",{"type":29,"tag":117,"props":15221,"children":15222},{"style":372},[15223],{"type":34,"value":6358},{"type":29,"tag":117,"props":15225,"children":15226},{"style":384},[15227],{"type":34,"value":1108},{"type":29,"tag":117,"props":15229,"children":15230},{"style":6700},[15231],{"type":34,"value":15232},"this",{"type":29,"tag":117,"props":15234,"children":15235},{"style":143},[15236],{"type":34,"value":14213},{"type":29,"tag":117,"props":15238,"children":15239},{"style":378},[15240],{"type":34,"value":15241},"estValide",{"type":29,"tag":117,"props":15243,"children":15244},{"style":384},[15245],{"type":34,"value":1155},{"type":29,"tag":117,"props":15247,"children":15248},{"class":119,"line":172},[15249,15253,15258,15262,15266,15270,15275],{"type":29,"tag":117,"props":15250,"children":15251},{"style":384},[15252],{"type":34,"value":15219},{"type":29,"tag":117,"props":15254,"children":15255},{"style":372},[15256],{"type":34,"value":15257},"forEach",{"type":29,"tag":117,"props":15259,"children":15260},{"style":384},[15261],{"type":34,"value":1108},{"type":29,"tag":117,"props":15263,"children":15264},{"style":6700},[15265],{"type":34,"value":15232},{"type":29,"tag":117,"props":15267,"children":15268},{"style":143},[15269],{"type":34,"value":14213},{"type":29,"tag":117,"props":15271,"children":15272},{"style":378},[15273],{"type":34,"value":15274},"afficherDonnée",{"type":29,"tag":117,"props":15276,"children":15277},{"style":384},[15278],{"type":34,"value":5675},{"type":29,"tag":117,"props":15280,"children":15281},{"class":119,"line":181},[15282],{"type":29,"tag":117,"props":15283,"children":15284},{"style":384},[15285],{"type":34,"value":2903},{"type":29,"tag":117,"props":15287,"children":15288},{"class":119,"line":189},[15289],{"type":29,"tag":117,"props":15290,"children":15291},{"emptyLinePlaceholder":13},[15292],{"type":34,"value":136},{"type":29,"tag":117,"props":15294,"children":15295},{"class":119,"line":198},[15296,15301,15306,15311,15315,15319,15324,15328],{"type":29,"tag":117,"props":15297,"children":15298},{"style":143},[15299],{"type":34,"value":15300},"private",{"type":29,"tag":117,"props":15302,"children":15303},{"style":143},[15304],{"type":34,"value":15305}," boolean",{"type":29,"tag":117,"props":15307,"children":15308},{"style":372},[15309],{"type":34,"value":15310}," estValide",{"type":29,"tag":117,"props":15312,"children":15313},{"style":384},[15314],{"type":34,"value":1108},{"type":29,"tag":117,"props":15316,"children":15317},{"style":5976},[15318],{"type":34,"value":7654},{"type":29,"tag":117,"props":15320,"children":15321},{"style":378},[15322],{"type":34,"value":15323}," donnée",{"type":29,"tag":117,"props":15325,"children":15326},{"style":384},[15327],{"type":34,"value":2803},{"type":29,"tag":117,"props":15329,"children":15330},{"style":384},[15331],{"type":34,"value":3461},{"type":29,"tag":117,"props":15333,"children":15334},{"class":119,"line":207},[15335,15339,15344,15348,15352,15356,15360,15365,15369,15373],{"type":29,"tag":117,"props":15336,"children":15337},{"style":143},[15338],{"type":34,"value":1136},{"type":29,"tag":117,"props":15340,"children":15341},{"style":378},[15342],{"type":34,"value":15343}," donnée ",{"type":29,"tag":117,"props":15345,"children":15346},{"style":160},[15347],{"type":34,"value":6697},{"type":29,"tag":117,"props":15349,"children":15350},{"style":6700},[15351],{"type":34,"value":6703},{"type":29,"tag":117,"props":15353,"children":15354},{"style":160},[15355],{"type":34,"value":6708},{"type":29,"tag":117,"props":15357,"children":15358},{"style":160},[15359],{"type":34,"value":13167},{"type":29,"tag":117,"props":15361,"children":15362},{"style":378},[15363],{"type":34,"value":15364},"donnée",{"type":29,"tag":117,"props":15366,"children":15367},{"style":384},[15368],{"type":34,"value":369},{"type":29,"tag":117,"props":15370,"children":15371},{"style":372},[15372],{"type":34,"value":15050},{"type":29,"tag":117,"props":15374,"children":15375},{"style":384},[15376],{"type":34,"value":9375},{"type":29,"tag":117,"props":15378,"children":15379},{"class":119,"line":215},[15380],{"type":29,"tag":117,"props":15381,"children":15382},{"style":384},[15383],{"type":34,"value":2903},{"type":29,"tag":117,"props":15385,"children":15386},{"class":119,"line":224},[15387],{"type":29,"tag":117,"props":15388,"children":15389},{"emptyLinePlaceholder":13},[15390],{"type":34,"value":136},{"type":29,"tag":117,"props":15392,"children":15393},{"class":119,"line":233},[15394,15398,15402,15407,15411,15415,15419,15423],{"type":29,"tag":117,"props":15395,"children":15396},{"style":143},[15397],{"type":34,"value":15300},{"type":29,"tag":117,"props":15399,"children":15400},{"style":143},[15401],{"type":34,"value":7762},{"type":29,"tag":117,"props":15403,"children":15404},{"style":372},[15405],{"type":34,"value":15406}," afficherDonnée",{"type":29,"tag":117,"props":15408,"children":15409},{"style":384},[15410],{"type":34,"value":1108},{"type":29,"tag":117,"props":15412,"children":15413},{"style":5976},[15414],{"type":34,"value":7654},{"type":29,"tag":117,"props":15416,"children":15417},{"style":378},[15418],{"type":34,"value":15323},{"type":29,"tag":117,"props":15420,"children":15421},{"style":384},[15422],{"type":34,"value":2803},{"type":29,"tag":117,"props":15424,"children":15425},{"style":384},[15426],{"type":34,"value":3461},{"type":29,"tag":117,"props":15428,"children":15429},{"class":119,"line":242},[15430,15435,15439,15443,15447,15451,15455,15459,15463,15467],{"type":29,"tag":117,"props":15431,"children":15432},{"style":378},[15433],{"type":34,"value":15434},"    System",{"type":29,"tag":117,"props":15436,"children":15437},{"style":384},[15438],{"type":34,"value":369},{"type":29,"tag":117,"props":15440,"children":15441},{"style":378},[15442],{"type":34,"value":15075},{"type":29,"tag":117,"props":15444,"children":15445},{"style":384},[15446],{"type":34,"value":369},{"type":29,"tag":117,"props":15448,"children":15449},{"style":372},[15450],{"type":34,"value":15084},{"type":29,"tag":117,"props":15452,"children":15453},{"style":384},[15454],{"type":34,"value":1108},{"type":29,"tag":117,"props":15456,"children":15457},{"style":166},[15458],{"type":34,"value":15093},{"type":29,"tag":117,"props":15460,"children":15461},{"style":160},[15462],{"type":34,"value":15098},{"type":29,"tag":117,"props":15464,"children":15465},{"style":378},[15466],{"type":34,"value":15323},{"type":29,"tag":117,"props":15468,"children":15469},{"style":384},[15470],{"type":34,"value":5675},{"type":29,"tag":117,"props":15472,"children":15473},{"class":119,"line":251},[15474],{"type":29,"tag":117,"props":15475,"children":15476},{"style":384},[15477],{"type":34,"value":2903},{"type":29,"tag":30,"props":15479,"children":15480},{},[15481],{"type":34,"value":15482},"Les méthodes privées extraites portent la complexité par petits morceaux nommés, là où une boucle imbriquée la cachait.",{"type":29,"tag":51,"props":15484,"children":15485},{},[],{"type":29,"tag":7528,"props":15487,"children":15489},{"id":15488},"_2-tests-automatisés-assurer-la-qualité-de-votre-code-dès-le-départ",[15490],{"type":34,"value":15491},"2. Tests automatisés : Assurer la qualité de votre code dès le départ",{"type":29,"tag":30,"props":15493,"children":15494},{},[15495],{"type":34,"value":15496},"Les tests garantissent que votre code fonctionne comme prévu à chaque étape, et surtout, ils rendent le refactoring possible sans crainte.",{"type":29,"tag":30,"props":15498,"children":15499},{},[15500],{"type":29,"tag":45,"props":15501,"children":15502},{},[15503],{"type":34,"value":15504},"Exemple avec JUnit :",{"type":29,"tag":106,"props":15506,"children":15508},{"className":5519,"code":15507,"language":5521,"meta":8,"style":8},"@Test\npublic void testEstValide() {\n    assertTrue(estValide(\"ValidData\"));\n    assertFalse(estValide(\"\"));\n    assertFalse(estValide(null));\n}\n",[15509],{"type":29,"tag":113,"props":15510,"children":15511},{"__ignoreMap":8},[15512,15523,15547,15577,15606,15634],{"type":29,"tag":117,"props":15513,"children":15514},{"class":119,"line":120},[15515,15519],{"type":29,"tag":117,"props":15516,"children":15517},{"style":10083},[15518],{"type":34,"value":14335},{"type":29,"tag":117,"props":15520,"children":15521},{"style":10089},[15522],{"type":34,"value":10092},{"type":29,"tag":117,"props":15524,"children":15525},{"class":119,"line":130},[15526,15530,15534,15539,15543],{"type":29,"tag":117,"props":15527,"children":15528},{"style":143},[15529],{"type":34,"value":5541},{"type":29,"tag":117,"props":15531,"children":15532},{"style":143},[15533],{"type":34,"value":7762},{"type":29,"tag":117,"props":15535,"children":15536},{"style":372},[15537],{"type":34,"value":15538}," testEstValide",{"type":29,"tag":117,"props":15540,"children":15541},{"style":384},[15542],{"type":34,"value":381},{"type":29,"tag":117,"props":15544,"children":15545},{"style":384},[15546],{"type":34,"value":3461},{"type":29,"tag":117,"props":15548,"children":15549},{"class":119,"line":139},[15550,15555,15559,15563,15567,15572],{"type":29,"tag":117,"props":15551,"children":15552},{"style":372},[15553],{"type":34,"value":15554},"    assertTrue",{"type":29,"tag":117,"props":15556,"children":15557},{"style":384},[15558],{"type":34,"value":1108},{"type":29,"tag":117,"props":15560,"children":15561},{"style":372},[15562],{"type":34,"value":15241},{"type":29,"tag":117,"props":15564,"children":15565},{"style":384},[15566],{"type":34,"value":1108},{"type":29,"tag":117,"props":15568,"children":15569},{"style":166},[15570],{"type":34,"value":15571},"\"ValidData\"",{"type":29,"tag":117,"props":15573,"children":15574},{"style":384},[15575],{"type":34,"value":15576},"));\n",{"type":29,"tag":117,"props":15578,"children":15579},{"class":119,"line":172},[15580,15585,15589,15593,15597,15602],{"type":29,"tag":117,"props":15581,"children":15582},{"style":372},[15583],{"type":34,"value":15584},"    assertFalse",{"type":29,"tag":117,"props":15586,"children":15587},{"style":384},[15588],{"type":34,"value":1108},{"type":29,"tag":117,"props":15590,"children":15591},{"style":372},[15592],{"type":34,"value":15241},{"type":29,"tag":117,"props":15594,"children":15595},{"style":384},[15596],{"type":34,"value":1108},{"type":29,"tag":117,"props":15598,"children":15599},{"style":166},[15600],{"type":34,"value":15601},"\"\"",{"type":29,"tag":117,"props":15603,"children":15604},{"style":384},[15605],{"type":34,"value":15576},{"type":29,"tag":117,"props":15607,"children":15608},{"class":119,"line":181},[15609,15613,15617,15621,15625,15630],{"type":29,"tag":117,"props":15610,"children":15611},{"style":372},[15612],{"type":34,"value":15584},{"type":29,"tag":117,"props":15614,"children":15615},{"style":384},[15616],{"type":34,"value":1108},{"type":29,"tag":117,"props":15618,"children":15619},{"style":372},[15620],{"type":34,"value":15241},{"type":29,"tag":117,"props":15622,"children":15623},{"style":384},[15624],{"type":34,"value":1108},{"type":29,"tag":117,"props":15626,"children":15627},{"style":6700},[15628],{"type":34,"value":15629},"null",{"type":29,"tag":117,"props":15631,"children":15632},{"style":384},[15633],{"type":34,"value":15576},{"type":29,"tag":117,"props":15635,"children":15636},{"class":119,"line":189},[15637],{"type":29,"tag":117,"props":15638,"children":15639},{"style":384},[15640],{"type":34,"value":2903},{"type":29,"tag":30,"props":15642,"children":15643},{},[15644],{"type":34,"value":15645},"Cette approche valide la logique à chaque modification, sans dépendre d’un test manuel oublié. À coupler systématiquement avec un pipeline CI\u002FCD qui rejoue la suite à chaque commit. Sinon les tests existent sans vraiment exister.",{"type":29,"tag":51,"props":15647,"children":15648},{},[],{"type":29,"tag":7528,"props":15650,"children":15652},{"id":15651},"_3-refactoring-améliorer-sans-casser",[15653],{"type":34,"value":15654},"3. Refactoring : Améliorer sans casser",{"type":29,"tag":30,"props":15656,"children":15657},{},[15658,15660,15666],{"type":34,"value":15659},"Refactorer, c’est nettoyer sans modifier le comportement observable. Une boucle remplacée par un stream, une concaténation transformée en ",{"type":29,"tag":113,"props":15661,"children":15663},{"className":15662},[],[15664],{"type":34,"value":15665},"String.format",{"type":34,"value":15667},", une méthode extraite pour clarifier une intention. Petits gestes, effet cumulé considérable sur la durée de vie de la base.",{"type":29,"tag":30,"props":15669,"children":15670},{},[15671],{"type":34,"value":15672},"Exemple typique :",{"type":29,"tag":30,"props":15674,"children":15675},{},[15676],{"type":29,"tag":45,"props":15677,"children":15678},{},[15679],{"type":34,"value":14545},{"type":29,"tag":106,"props":15681,"children":15683},{"className":5519,"code":15682,"language":5521,"meta":8,"style":8},"public String construireMessage(String nom, int age) {\n    return \"Nom: \" + nom + \", Age: \" + age;\n}\n",[15684],{"type":29,"tag":113,"props":15685,"children":15686},{"__ignoreMap":8},[15687,15737,15779],{"type":29,"tag":117,"props":15688,"children":15689},{"class":119,"line":120},[15690,15694,15698,15703,15707,15711,15716,15720,15724,15729,15733],{"type":29,"tag":117,"props":15691,"children":15692},{"style":143},[15693],{"type":34,"value":5541},{"type":29,"tag":117,"props":15695,"children":15696},{"style":5976},[15697],{"type":34,"value":6477},{"type":29,"tag":117,"props":15699,"children":15700},{"style":372},[15701],{"type":34,"value":15702}," construireMessage",{"type":29,"tag":117,"props":15704,"children":15705},{"style":384},[15706],{"type":34,"value":1108},{"type":29,"tag":117,"props":15708,"children":15709},{"style":5976},[15710],{"type":34,"value":7654},{"type":29,"tag":117,"props":15712,"children":15713},{"style":378},[15714],{"type":34,"value":15715}," nom",{"type":29,"tag":117,"props":15717,"children":15718},{"style":384},[15719],{"type":34,"value":1118},{"type":29,"tag":117,"props":15721,"children":15722},{"style":143},[15723],{"type":34,"value":5546},{"type":29,"tag":117,"props":15725,"children":15726},{"style":378},[15727],{"type":34,"value":15728}," age",{"type":29,"tag":117,"props":15730,"children":15731},{"style":384},[15732],{"type":34,"value":2803},{"type":29,"tag":117,"props":15734,"children":15735},{"style":384},[15736],{"type":34,"value":3461},{"type":29,"tag":117,"props":15738,"children":15739},{"class":119,"line":130},[15740,15744,15749,15753,15758,15762,15767,15771,15775],{"type":29,"tag":117,"props":15741,"children":15742},{"style":143},[15743],{"type":34,"value":1136},{"type":29,"tag":117,"props":15745,"children":15746},{"style":166},[15747],{"type":34,"value":15748}," \"Nom: \"",{"type":29,"tag":117,"props":15750,"children":15751},{"style":160},[15752],{"type":34,"value":15098},{"type":29,"tag":117,"props":15754,"children":15755},{"style":378},[15756],{"type":34,"value":15757}," nom ",{"type":29,"tag":117,"props":15759,"children":15760},{"style":160},[15761],{"type":34,"value":5870},{"type":29,"tag":117,"props":15763,"children":15764},{"style":166},[15765],{"type":34,"value":15766}," \", Age: \"",{"type":29,"tag":117,"props":15768,"children":15769},{"style":160},[15770],{"type":34,"value":15098},{"type":29,"tag":117,"props":15772,"children":15773},{"style":378},[15774],{"type":34,"value":15728},{"type":29,"tag":117,"props":15776,"children":15777},{"style":384},[15778],{"type":34,"value":387},{"type":29,"tag":117,"props":15780,"children":15781},{"class":119,"line":139},[15782],{"type":29,"tag":117,"props":15783,"children":15784},{"style":384},[15785],{"type":34,"value":2903},{"type":29,"tag":30,"props":15787,"children":15788},{},[15789],{"type":29,"tag":45,"props":15790,"children":15791},{},[15792],{"type":34,"value":14722},{"type":29,"tag":106,"props":15794,"children":15796},{"className":5519,"code":15795,"language":5521,"meta":8,"style":8},"public String construireMessage(String nom, int age) {\n    return String.format(\"Nom: %s, Age: %d\", nom, age);\n}\n",[15797],{"type":29,"tag":113,"props":15798,"children":15799},{"__ignoreMap":8},[15800,15847,15896],{"type":29,"tag":117,"props":15801,"children":15802},{"class":119,"line":120},[15803,15807,15811,15815,15819,15823,15827,15831,15835,15839,15843],{"type":29,"tag":117,"props":15804,"children":15805},{"style":143},[15806],{"type":34,"value":5541},{"type":29,"tag":117,"props":15808,"children":15809},{"style":5976},[15810],{"type":34,"value":6477},{"type":29,"tag":117,"props":15812,"children":15813},{"style":372},[15814],{"type":34,"value":15702},{"type":29,"tag":117,"props":15816,"children":15817},{"style":384},[15818],{"type":34,"value":1108},{"type":29,"tag":117,"props":15820,"children":15821},{"style":5976},[15822],{"type":34,"value":7654},{"type":29,"tag":117,"props":15824,"children":15825},{"style":378},[15826],{"type":34,"value":15715},{"type":29,"tag":117,"props":15828,"children":15829},{"style":384},[15830],{"type":34,"value":1118},{"type":29,"tag":117,"props":15832,"children":15833},{"style":143},[15834],{"type":34,"value":5546},{"type":29,"tag":117,"props":15836,"children":15837},{"style":378},[15838],{"type":34,"value":15728},{"type":29,"tag":117,"props":15840,"children":15841},{"style":384},[15842],{"type":34,"value":2803},{"type":29,"tag":117,"props":15844,"children":15845},{"style":384},[15846],{"type":34,"value":3461},{"type":29,"tag":117,"props":15848,"children":15849},{"class":119,"line":130},[15850,15854,15858,15862,15867,15871,15876,15880,15884,15888,15892],{"type":29,"tag":117,"props":15851,"children":15852},{"style":143},[15853],{"type":34,"value":1136},{"type":29,"tag":117,"props":15855,"children":15856},{"style":378},[15857],{"type":34,"value":6477},{"type":29,"tag":117,"props":15859,"children":15860},{"style":384},[15861],{"type":34,"value":369},{"type":29,"tag":117,"props":15863,"children":15864},{"style":372},[15865],{"type":34,"value":15866},"format",{"type":29,"tag":117,"props":15868,"children":15869},{"style":384},[15870],{"type":34,"value":1108},{"type":29,"tag":117,"props":15872,"children":15873},{"style":166},[15874],{"type":34,"value":15875},"\"Nom: %s, Age: %d\"",{"type":29,"tag":117,"props":15877,"children":15878},{"style":384},[15879],{"type":34,"value":1118},{"type":29,"tag":117,"props":15881,"children":15882},{"style":378},[15883],{"type":34,"value":15715},{"type":29,"tag":117,"props":15885,"children":15886},{"style":384},[15887],{"type":34,"value":1118},{"type":29,"tag":117,"props":15889,"children":15890},{"style":378},[15891],{"type":34,"value":15728},{"type":29,"tag":117,"props":15893,"children":15894},{"style":384},[15895],{"type":34,"value":5675},{"type":29,"tag":117,"props":15897,"children":15898},{"class":119,"line":139},[15899],{"type":29,"tag":117,"props":15900,"children":15901},{"style":384},[15902],{"type":34,"value":2903},{"type":29,"tag":30,"props":15904,"children":15905},{},[15906],{"type":34,"value":15907},"Plus concis, plus robuste face aux cas limites de formatage. Règle non négociable : pas de refactoring sans filet de tests. Modifier du code sans garantie de comportement, c’est introduire des bugs sous couvert d’améliorer la qualité.",{"type":29,"tag":51,"props":15909,"children":15910},{},[],{"type":29,"tag":7528,"props":15912,"children":15914},{"id":15913},"_4-apprentissage-continu-et-pair-programming",[15915],{"type":34,"value":15916},"4. Apprentissage continu et Pair Programming",{"type":29,"tag":30,"props":15918,"children":15919},{},[15920,15921,15930,15932,15939],{"type":34,"value":7167},{"type":29,"tag":45,"props":15922,"children":15923},{},[15924],{"type":29,"tag":453,"props":15925,"children":15927},{"href":15926},"\u002Ffr\u002Fdette-technique\u002Fpair-programming-roi-conditions",[15928],{"type":34,"value":15929},"pair programming",{"type":34,"value":15931}," et la ",{"type":29,"tag":45,"props":15933,"children":15934},{},[15935],{"type":29,"tag":453,"props":15936,"children":15937},{"href":5},[15938],{"type":34,"value":7341},{"type":34,"value":15940}," restent les deux accélérateurs d'apprentissage les plus efficaces : on y découvre des patterns, on y débat des choix de design, on y prend l'habitude de justifier ses décisions.",{"type":29,"tag":51,"props":15942,"children":15943},{},[],{"type":29,"tag":4530,"props":15945,"children":15947},{"id":15946},"outils-et-pratiques-recommandés",[15948],{"type":34,"value":15949},"Outils et pratiques recommandés",{"type":29,"tag":30,"props":15951,"children":15952},{},[15953],{"type":34,"value":15954},"L’outillage ne fait pas l’artisan, mais sans outillage l’artisan perd un temps précieux. Voici l’équipement de base à mettre en place sur un projet Java sérieux.",{"type":29,"tag":7528,"props":15956,"children":15958},{"id":15957},"code-propre",[15959],{"type":34,"value":15960},"Code propre",{"type":29,"tag":1585,"props":15962,"children":15963},{},[15964,15974],{"type":29,"tag":1589,"props":15965,"children":15966},{},[15967,15972],{"type":29,"tag":45,"props":15968,"children":15969},{},[15970],{"type":34,"value":15971},"SonarLint",{"type":34,"value":15973}," : analyse statique en temps réel dans l’IDE. Détecte duplications, code mort, bugs probables. Indispensable.",{"type":29,"tag":1589,"props":15975,"children":15976},{},[15977,15982],{"type":29,"tag":45,"props":15978,"children":15979},{},[15980],{"type":34,"value":15981},"Checkstyle",{"type":34,"value":15983}," : vérification des conventions de style. À configurer selon les standards de l’équipe, pas selon les règles par défaut, qui sont rarement adaptées.",{"type":29,"tag":7528,"props":15985,"children":15986},{"id":2406},[15987],{"type":34,"value":15988},"Tests",{"type":29,"tag":1585,"props":15990,"children":15991},{},[15992,16001],{"type":29,"tag":1589,"props":15993,"children":15994},{},[15995,15999],{"type":29,"tag":45,"props":15996,"children":15997},{},[15998],{"type":34,"value":9948},{"type":34,"value":16000}," : bibliothèque de tests unitaires standard de l’écosystème Java.",{"type":29,"tag":1589,"props":16002,"children":16003},{},[16004,16008,16010],{"type":29,"tag":45,"props":16005,"children":16006},{},[16007],{"type":34,"value":9954},{"type":34,"value":16009}," : simulation de dépendances externes (bases, services web) pour isoler le composant testé.",{"type":29,"tag":106,"props":16011,"children":16013},{"className":5519,"code":16012,"language":5521,"meta":8,"style":8},"@Test\npublic void testAvecMock() {\n    MyService service = mock(MyService.class);\n    when(service.calculer()).thenReturn(42);\n\n    assertEquals(42, service.calculer());\n}\n",[16014],{"type":29,"tag":113,"props":16015,"children":16016},{"__ignoreMap":8},[16017,16028,16052,16096,16144,16151,16187],{"type":29,"tag":117,"props":16018,"children":16019},{"class":119,"line":120},[16020,16024],{"type":29,"tag":117,"props":16021,"children":16022},{"style":10083},[16023],{"type":34,"value":14335},{"type":29,"tag":117,"props":16025,"children":16026},{"style":10089},[16027],{"type":34,"value":10092},{"type":29,"tag":117,"props":16029,"children":16030},{"class":119,"line":130},[16031,16035,16039,16044,16048],{"type":29,"tag":117,"props":16032,"children":16033},{"style":143},[16034],{"type":34,"value":5541},{"type":29,"tag":117,"props":16036,"children":16037},{"style":143},[16038],{"type":34,"value":7762},{"type":29,"tag":117,"props":16040,"children":16041},{"style":372},[16042],{"type":34,"value":16043}," testAvecMock",{"type":29,"tag":117,"props":16045,"children":16046},{"style":384},[16047],{"type":34,"value":381},{"type":29,"tag":117,"props":16049,"children":16050},{"style":384},[16051],{"type":34,"value":3461},{"type":29,"tag":117,"props":16053,"children":16054},{"class":119,"line":139},[16055,16060,16065,16069,16074,16078,16083,16087,16092],{"type":29,"tag":117,"props":16056,"children":16057},{"style":5976},[16058],{"type":34,"value":16059},"    MyService",{"type":29,"tag":117,"props":16061,"children":16062},{"style":378},[16063],{"type":34,"value":16064}," service ",{"type":29,"tag":117,"props":16066,"children":16067},{"style":160},[16068],{"type":34,"value":6061},{"type":29,"tag":117,"props":16070,"children":16071},{"style":372},[16072],{"type":34,"value":16073}," mock",{"type":29,"tag":117,"props":16075,"children":16076},{"style":384},[16077],{"type":34,"value":1108},{"type":29,"tag":117,"props":16079,"children":16080},{"style":378},[16081],{"type":34,"value":16082},"MyService",{"type":29,"tag":117,"props":16084,"children":16085},{"style":384},[16086],{"type":34,"value":369},{"type":29,"tag":117,"props":16088,"children":16089},{"style":378},[16090],{"type":34,"value":16091},"class",{"type":29,"tag":117,"props":16093,"children":16094},{"style":384},[16095],{"type":34,"value":5675},{"type":29,"tag":117,"props":16097,"children":16098},{"class":119,"line":172},[16099,16104,16108,16113,16117,16121,16126,16131,16135,16140],{"type":29,"tag":117,"props":16100,"children":16101},{"style":372},[16102],{"type":34,"value":16103},"    when",{"type":29,"tag":117,"props":16105,"children":16106},{"style":384},[16107],{"type":34,"value":1108},{"type":29,"tag":117,"props":16109,"children":16110},{"style":378},[16111],{"type":34,"value":16112},"service",{"type":29,"tag":117,"props":16114,"children":16115},{"style":384},[16116],{"type":34,"value":369},{"type":29,"tag":117,"props":16118,"children":16119},{"style":372},[16120],{"type":34,"value":13033},{"type":29,"tag":117,"props":16122,"children":16123},{"style":384},[16124],{"type":34,"value":16125},"()).",{"type":29,"tag":117,"props":16127,"children":16128},{"style":372},[16129],{"type":34,"value":16130},"thenReturn",{"type":29,"tag":117,"props":16132,"children":16133},{"style":384},[16134],{"type":34,"value":1108},{"type":29,"tag":117,"props":16136,"children":16137},{"style":3476},[16138],{"type":34,"value":16139},"42",{"type":29,"tag":117,"props":16141,"children":16142},{"style":384},[16143],{"type":34,"value":5675},{"type":29,"tag":117,"props":16145,"children":16146},{"class":119,"line":181},[16147],{"type":29,"tag":117,"props":16148,"children":16149},{"emptyLinePlaceholder":13},[16150],{"type":34,"value":136},{"type":29,"tag":117,"props":16152,"children":16153},{"class":119,"line":189},[16154,16158,16162,16166,16170,16175,16179,16183],{"type":29,"tag":117,"props":16155,"children":16156},{"style":372},[16157],{"type":34,"value":14472},{"type":29,"tag":117,"props":16159,"children":16160},{"style":384},[16161],{"type":34,"value":1108},{"type":29,"tag":117,"props":16163,"children":16164},{"style":3476},[16165],{"type":34,"value":16139},{"type":29,"tag":117,"props":16167,"children":16168},{"style":384},[16169],{"type":34,"value":1118},{"type":29,"tag":117,"props":16171,"children":16172},{"style":378},[16173],{"type":34,"value":16174}," service",{"type":29,"tag":117,"props":16176,"children":16177},{"style":384},[16178],{"type":34,"value":369},{"type":29,"tag":117,"props":16180,"children":16181},{"style":372},[16182],{"type":34,"value":13033},{"type":29,"tag":117,"props":16184,"children":16185},{"style":384},[16186],{"type":34,"value":6430},{"type":29,"tag":117,"props":16188,"children":16189},{"class":119,"line":198},[16190],{"type":29,"tag":117,"props":16191,"children":16192},{"style":384},[16193],{"type":34,"value":2903},{"type":29,"tag":7528,"props":16195,"children":16196},{"id":3906},[16197],{"type":34,"value":16198},"Refactoring",{"type":29,"tag":1585,"props":16200,"children":16201},{},[16202,16212],{"type":29,"tag":1589,"props":16203,"children":16204},{},[16205,16210],{"type":29,"tag":45,"props":16206,"children":16207},{},[16208],{"type":34,"value":16209},"IntelliJ IDEA",{"type":34,"value":16211}," : refactorings intégrés (rename, extract method, inline, move). Apprendre les raccourcis change le quotidien.",{"type":29,"tag":1589,"props":16213,"children":16214},{},[16215,16220],{"type":29,"tag":45,"props":16216,"children":16217},{},[16218],{"type":34,"value":16219},"PMD",{"type":34,"value":16221}," : analyse statique complémentaire à SonarLint, particulièrement utile pour repérer les zones candidates au refactoring.",{"type":29,"tag":51,"props":16223,"children":16224},{},[],{"type":29,"tag":4530,"props":16226,"children":16228},{"id":16227},"deux-histoires-qui-finissent-mal",[16229],{"type":34,"value":16230},"Deux histoires qui finissent mal",{"type":29,"tag":30,"props":16232,"children":16233},{},[16234,16239],{"type":29,"tag":45,"props":16235,"children":16236},{},[16237],{"type":34,"value":16238},"Refactoring sans tests, équipe assurance, 2019.",{"type":34,"value":16240}," Un développeur senior décide de \"nettoyer\" un module de calcul de cotisations vieillissant. Pas de tests dessus, mais il connaît le code. Trois semaines plus tard, un client signale des écarts de quelques centimes sur des milliers de contrats. Coût total du correctif et des régularisations : un mois-homme et beaucoup de mails désagréables. Le refactoring sans filet n’est pas un raccourci, c’est une dette à crédit.",{"type":29,"tag":30,"props":16242,"children":16243},{},[16244,16249],{"type":29,"tag":45,"props":16245,"children":16246},{},[16247],{"type":34,"value":16248},"Tests \"à faire plus tard\", scale-up média, 2021.",{"type":34,"value":16250}," Sprint après sprint, les tests sont repoussés au refactoring suivant. Au bout d’un an, la base atteint 80 000 lignes avec 12 % de couverture. La moindre évolution déclenche des régressions imprévisibles, les développeurs ralentissent par peur. Il aura fallu six mois de remontée patient pour atteindre une couverture viable : six mois pendant lesquels presque aucune fonctionnalité n’a pu être livrée. Le \"test d’abord\" n’est pas un slogan, c’est une assurance qui se paie en temps réel.",{"type":29,"tag":51,"props":16252,"children":16253},{},[],{"type":29,"tag":4530,"props":16255,"children":16257},{"id":16256},"quelques-repères-pour-progresser",[16258],{"type":34,"value":16259},"Quelques repères pour progresser",{"type":29,"tag":30,"props":16261,"children":16262},{},[16263],{"type":34,"value":16264},"Un test simple pour évaluer votre code : seriez-vous à l’aise de l’expliquer ligne par ligne en revue ? Si la réponse est non, c’est que la simplification est encore possible. Le refactoring n’est pas une étape ponctuelle déclenchée par une crise : c’est un geste continu, intégré au cycle normal de développement. Et le meilleur accélérateur d’apprentissage reste la revue de code par des pairs exigeants : aucun blog, aucune conférence ne remplace le regard d’un collègue qui pointe une faiblesse dans votre design.",{"type":29,"tag":567,"props":16266,"children":16268},{"cta":805,"href":806,"title":16267,"type":808},"Le clean code n'est qu'une pratique parmi 100",[16269],{"type":29,"tag":30,"props":16270,"children":16271},{},[16272],{"type":34,"value":16273},"Cet article détaille une poignée de gestes : noms explicites, fonctions courtes, test d'abord, refactoring sous filet. Le Craft Bundle réunit les 100 pratiques que j'applique au quotidien pour coder propre, celles que j'ai vues tenir en production sur des projets critiques. Ce sont exactement celles que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues tourner.",{"type":29,"tag":51,"props":16275,"children":16276},{},[],{"type":29,"tag":4530,"props":16278,"children":16279},{"id":6964},[16280],{"type":34,"value":6967},{"type":29,"tag":825,"props":16282,"children":16283},{},[16284,16289],{"type":29,"tag":829,"props":16285,"children":16286},{},[16287],{"type":34,"value":16288},"Craftsmanship et agilité : opposition ou complémentarité ?",{"type":29,"tag":30,"props":16290,"children":16291},{},[16292,16294,16298,16300,16304],{"type":34,"value":16293},"Complémentarité. L’agilité organise ",{"type":29,"tag":5410,"props":16295,"children":16296},{},[16297],{"type":34,"value":8540},{"type":34,"value":16299}," on livre, le craftsmanship définit ",{"type":29,"tag":5410,"props":16301,"children":16302},{},[16303],{"type":34,"value":14044},{"type":34,"value":16305},". Une équipe agile sans craftsmanship livre vite et accumule de la dette ; une équipe craftsmanship sans agilité produit du beau code mais loupe la livraison. Les deux ensemble forment un cycle viable.",{"type":29,"tag":825,"props":16307,"children":16308},{},[16309,16314],{"type":29,"tag":829,"props":16310,"children":16311},{},[16312],{"type":34,"value":16313},"TDD ralentit-il vraiment le développement ?",{"type":29,"tag":30,"props":16315,"children":16316},{},[16317],{"type":34,"value":16318},"Sur les deux premières semaines, oui, le temps d’installer le réflexe. Au-delà, le bilan s’inverse : moins de régressions, refactoring serein, intégration continue qui fonctionne. Les équipes que j’ai accompagnées atteignent le seuil de rentabilité entre la troisième et la sixième semaine.",{"type":29,"tag":825,"props":16320,"children":16321},{},[16322,16327],{"type":29,"tag":829,"props":16323,"children":16324},{},[16325],{"type":34,"value":16326},"Faut-il tout tester ?",{"type":29,"tag":30,"props":16328,"children":16329},{},[16330],{"type":34,"value":16331},"Non. Cibler les composants critiques, la logique métier, les zones à fort taux de modification. Les getters\u002Fsetters triviaux et le code de glue ne méritent pas une suite dédiée. Une couverture de 70-80 % sur les bons modules vaut mieux que 95 % réparti partout.",{"type":29,"tag":51,"props":16333,"children":16334},{},[],{"type":29,"tag":4530,"props":16336,"children":16337},{"id":12615},[16338],{"type":34,"value":12618},{"type":29,"tag":30,"props":16340,"children":16341},{},[16342],{"type":34,"value":16343},"Le craftsmanship ne se décrète pas le matin et ne s’installe pas par un changement de process. C’est une discipline qui se construit au fil des sprints : un test écrit avant le code, un refactoring engagé plutôt que reporté, une revue qui pose les vraies questions plutôt que les questions polies. Ces petits gestes répétés font la différence entre une base qui vieillit bien et une base qui devient ingérable au bout de trois ans.",{"type":29,"tag":567,"props":16345,"children":16347},{"cta":2379,"href":918,"title":16346,"type":920},"Ressource gratuite : Votre équipe livre-t-elle aussi vite qu'elle le pourrait ?",[16348],{"type":29,"tag":30,"props":16349,"children":16350},{},[16351],{"type":34,"value":16352},"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":928,"props":16354,"children":16355},{},[16356],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":16358},[16359,16360,16361,16362,16363,16364,16365,16366,16367],{"id":13932,"depth":139,"text":13935},{"id":13964,"depth":139,"text":13967},{"id":14061,"depth":139,"text":14064},{"id":14856,"depth":139,"text":14859},{"id":15946,"depth":139,"text":15949},{"id":16227,"depth":139,"text":16230},{"id":16256,"depth":139,"text":16259},{"id":6964,"depth":139,"text":6967},{"id":12615,"depth":139,"text":12618},"content:fr:dette-technique:software-craftsmanship-principes-exemples-java.md","fr\u002Fdette-technique\u002Fsoftware-craftsmanship-principes-exemples-java.md","fr\u002Fdette-technique\u002Fsoftware-craftsmanship-principes-exemples-java",{"_path":6919,"_dir":16372,"_draft":7,"_partial":7,"_locale":8,"title":16373,"description":16374,"id":16375,"date":16376,"listed":13,"nocomments":7,"hidden":7,"categories":16377,"tags":16378,"cover":16379,"readingTime":16380,"body":16385,"_type":942,"_id":22464,"_source":944,"_file":22465,"_stem":22466,"_extension":947},"architecture-craft","Principes SOLID en Java, Comprendre et Appliquer pour un Code plus Propre","Découvrez comment appliquer les principes SOLID en Java pour améliorer la structure, la maintenabilité et la modularité de votre code. Avec des exemples...",48,"2024-05-22",[16372],[5391,18],"covers\u002Farticles\u002Fsolid-principles.jpg",{"text":16381,"minutes":16382,"time":16383,"words":16384},"16 min read",15.03,901800,3006,{"type":26,"children":16386,"toc":22438},[16387,16393,16398,16410,16415,16420,16478,16484,16489,16492,16498,16510,16516,16521,16527,16546,16552,16872,16883,16889,16894,17246,17249,17262,17271,17277,17296,17301,17306,17311,17316,17322,17335,17599,17626,17632,17637,18046,18057,18184,18195,18525,18528,18541,18547,18552,18557,18562,18567,18588,18594,18612,19193,19227,19233,19238,19729,19732,19745,19751,19756,19761,19766,19771,19784,19790,19795,19877,19904,19909,20168,20187,20193,20205,20376,20381,20816,20819,20832,20838,20843,20848,20853,20858,20870,20876,20888,21209,21235,21241,21254,21839,21879,22186,22189,22202,22208,22353,22362,22365,22371,22384,22397,22410,22423,22426,22434],{"type":29,"tag":55,"props":16388,"children":16390},{"id":16389},"principes-solid-les-fondements-de-la-programmation-orientée-objet",[16391],{"type":34,"value":16392},"Principes SOLID : Les fondements de la programmation orientée objet",{"type":29,"tag":30,"props":16394,"children":16395},{},[16396],{"type":34,"value":16397},"La plupart des bases de code que j'ai auditées en 25 ans ne souffrent pas d'un manque de tests ou d'un mauvais framework. Elles souffrent d'un couplage que personne n'ose plus toucher. Chaque nouvelle fonctionnalité casse une fonctionnalité voisine, chaque refactoring devient un projet de trois mois.",{"type":29,"tag":30,"props":16399,"children":16400},{},[16401,16403,16408],{"type":34,"value":16402},"Les cinq principes SOLID, formalisés par Robert C. Martin dans ",{"type":29,"tag":5410,"props":16404,"children":16405},{},[16406],{"type":34,"value":16407},"Agile Software Development: Principles, Patterns, and Practices",{"type":34,"value":16409},", ciblent exactement ce problème. Ils ne sont pas une théorie scolaire. Ce sont des leviers concrets pour décider où couper, où abstraire, et où s'arrêter. Quand j'ai commencé à les appliquer systématiquement, mon code est devenu plus propre et j'ai pu livrer plus vite sans craindre de casser l'existant.",{"type":29,"tag":30,"props":16411,"children":16412},{},[16413],{"type":34,"value":16414},"Cet article couvre ce que sont ces principes, pourquoi ils structurent une architecture saine, et comment les appliquer concrètement en Java.",{"type":29,"tag":30,"props":16416,"children":16417},{},[16418],{"type":34,"value":16419},"Les principes SOLID sont les suivants :",{"type":29,"tag":4212,"props":16421,"children":16422},{},[16423,16434,16445,16456,16467],{"type":29,"tag":1589,"props":16424,"children":16425},{},[16426,16432],{"type":29,"tag":453,"props":16427,"children":16429},{"href":16428},"\u002Ffr\u002Farchitecture-craft\u002Fprincipe-srp-software-craftsmanship-exemples-java",[16430],{"type":34,"value":16431},"Le principe de responsabilité unique (SRP)",{"type":34,"value":16433}," : une classe ne doit avoir qu'une seule raison de changer. Une classe, une responsabilité : pas un fourre-tout fonctionnel.",{"type":29,"tag":1589,"props":16435,"children":16436},{},[16437,16443],{"type":29,"tag":453,"props":16438,"children":16440},{"href":16439},"\u002Ffr\u002Farchitecture-craft\u002Fprincipe-ocp-software-craftsmanship-exemples-java",[16441],{"type":34,"value":16442},"Le principe d'ouverture\u002Ffermeture (OCP)",{"type":34,"value":16444}," : les entités logicielles (classes, modules, fonctions, etc.) doivent être ouvertes à l'extension mais fermées à la modification. On ajoute du comportement sans toucher au code existant.",{"type":29,"tag":1589,"props":16446,"children":16447},{},[16448,16454],{"type":29,"tag":453,"props":16449,"children":16451},{"href":16450},"\u002Ffr\u002Farchitecture-craft\u002Fprincipe-substitution-liskov-lsp-java",[16452],{"type":34,"value":16453},"Le principe de substitution de Liskov (LSP)",{"type":34,"value":16455}," : les objets d'une classe dérivée doivent pouvoir être utilisés en remplacement des objets de la classe de base sans altérer la cohérence du programme.",{"type":29,"tag":1589,"props":16457,"children":16458},{},[16459,16465],{"type":29,"tag":453,"props":16460,"children":16462},{"href":16461},"\u002Ffr\u002Farchitecture-craft\u002Fprincipe-isp-software-craftsmanship-exemples-java",[16463],{"type":34,"value":16464},"Le principe de ségrégation des interfaces (ISP)",{"type":34,"value":16466}," : les interfaces doivent être spécifiques aux besoins des clients. Plusieurs interfaces ciblées valent mieux qu'une interface fourre-tout.",{"type":29,"tag":1589,"props":16468,"children":16469},{},[16470,16476],{"type":29,"tag":453,"props":16471,"children":16473},{"href":16472},"\u002Ffr\u002Farchitecture-craft\u002Fprincipe-inversion-dependances-dip-java-guide-complet",[16474],{"type":34,"value":16475},"Le principe d'inversion de dépendance (DIP)",{"type":34,"value":16477}," : les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Les deux doivent dépendre d'abstractions, ce qui ouvre la voie à la modularité et à des tests réellement faisables.",{"type":29,"tag":55,"props":16479,"children":16481},{"id":16480},"comprendre-et-appliquer-les-principes-solid-en-java",[16482],{"type":34,"value":16483},"Comprendre et appliquer les principes SOLID en Java",{"type":29,"tag":30,"props":16485,"children":16486},{},[16487],{"type":34,"value":16488},"Les cinq principes qui suivent répondent à un seul problème : un code qui devient impossible à modifier sans tout casser. Chaque section illustre un principe avec un cas Java concret : d'abord le code qui pose problème, ensuite la version refactorisée.",{"type":29,"tag":51,"props":16490,"children":16491},{},[],{"type":29,"tag":55,"props":16493,"children":16495},{"id":16494},"_1-principe-de-responsabilité-unique-single-responsibility-principle-srp",[16496],{"type":34,"value":16497},"1. Principe de Responsabilité Unique (Single Responsibility Principle - SRP)",{"type":29,"tag":30,"props":16499,"children":16500},{},[16501,16503,16508],{"type":34,"value":16502},"Le principe de responsabilité unique, ou SRP, est probablement l’un des plus simples à comprendre, mais aussi l’un des plus importants. L'idée est qu'une classe ne devrait avoir ",{"type":29,"tag":45,"props":16504,"children":16505},{},[16506],{"type":34,"value":16507},"qu'une seule raison de changer",{"type":34,"value":16509},". En d'autres termes, chaque classe doit se concentrer sur une seule tâche ou responsabilité.",{"type":29,"tag":4530,"props":16511,"children":16513},{"id":16512},"pourquoi-cest-important",[16514],{"type":34,"value":16515},"Pourquoi c'est important ?",{"type":29,"tag":30,"props":16517,"children":16518},{},[16519],{"type":34,"value":16520},"Quand une classe porte plusieurs responsabilités, modifier une partie casse souvent les autres, qui n'ont pourtant rien à voir avec le changement. Le code devient difficile à maintenir et les bugs s'accumulent. Respecter le SRP réduit le couplage et clarifie où intervenir.",{"type":29,"tag":4530,"props":16522,"children":16524},{"id":16523},"exemple-concret-en-java",[16525],{"type":34,"value":16526},"Exemple concret en Java",{"type":29,"tag":30,"props":16528,"children":16529},{},[16530,16532,16538,16540,16544],{"type":34,"value":16531},"Imaginons un système qui gère des rapports. Nous avons une classe ",{"type":29,"tag":113,"props":16533,"children":16535},{"className":16534},[],[16536],{"type":34,"value":16537},"Report",{"type":34,"value":16539}," qui s'occupe à la fois de la génération du rapport et de son enregistrement au format PDF. À première vue, cela peut sembler correct. Cependant, cette classe enfreint le principe de responsabilité unique, car elle fait deux choses différentes : générer un rapport ",{"type":29,"tag":45,"props":16541,"children":16542},{},[16543],{"type":34,"value":6884},{"type":34,"value":16545}," le sauvegarder en PDF.",{"type":29,"tag":7528,"props":16547,"children":16549},{"id":16548},"exemple-sans-srp",[16550],{"type":34,"value":16551},"Exemple sans SRP :",{"type":29,"tag":106,"props":16553,"children":16555},{"className":5519,"code":16554,"language":5521,"meta":8,"style":8},"public class Report {\n    private String content;\n\n    public Report(String content) {\n        this.content = content;\n    }\n\n    public void generateReport() {\n        \u002F\u002F Logique de génération de rapport\n        System.out.println(\"Génération du rapport : \" + content);\n    }\n\n    public void saveToPDF(String filename) {\n        \u002F\u002F Logique d'enregistrement en PDF\n        System.out.println(\"Enregistrement du rapport en PDF sous : \" + filename);\n    }\n}\n",[16556],{"type":29,"tag":113,"props":16557,"children":16558},{"__ignoreMap":8},[16559,16579,16599,16606,16637,16665,16672,16679,16702,16710,16755,16762,16769,16806,16814,16858,16865],{"type":29,"tag":117,"props":16560,"children":16561},{"class":119,"line":120},[16562,16566,16570,16575],{"type":29,"tag":117,"props":16563,"children":16564},{"style":143},[16565],{"type":34,"value":5541},{"type":29,"tag":117,"props":16567,"children":16568},{"style":143},[16569],{"type":34,"value":7575},{"type":29,"tag":117,"props":16571,"children":16572},{"style":2863},[16573],{"type":34,"value":16574}," Report",{"type":29,"tag":117,"props":16576,"children":16577},{"style":384},[16578],{"type":34,"value":3461},{"type":29,"tag":117,"props":16580,"children":16581},{"class":119,"line":130},[16582,16586,16590,16595],{"type":29,"tag":117,"props":16583,"children":16584},{"style":143},[16585],{"type":34,"value":7592},{"type":29,"tag":117,"props":16587,"children":16588},{"style":5976},[16589],{"type":34,"value":6477},{"type":29,"tag":117,"props":16591,"children":16592},{"style":378},[16593],{"type":34,"value":16594}," content",{"type":29,"tag":117,"props":16596,"children":16597},{"style":384},[16598],{"type":34,"value":387},{"type":29,"tag":117,"props":16600,"children":16601},{"class":119,"line":139},[16602],{"type":29,"tag":117,"props":16603,"children":16604},{"emptyLinePlaceholder":13},[16605],{"type":34,"value":136},{"type":29,"tag":117,"props":16607,"children":16608},{"class":119,"line":172},[16609,16613,16617,16621,16625,16629,16633],{"type":29,"tag":117,"props":16610,"children":16611},{"style":143},[16612],{"type":34,"value":7641},{"type":29,"tag":117,"props":16614,"children":16615},{"style":372},[16616],{"type":34,"value":16574},{"type":29,"tag":117,"props":16618,"children":16619},{"style":384},[16620],{"type":34,"value":1108},{"type":29,"tag":117,"props":16622,"children":16623},{"style":5976},[16624],{"type":34,"value":7654},{"type":29,"tag":117,"props":16626,"children":16627},{"style":7657},[16628],{"type":34,"value":16594},{"type":29,"tag":117,"props":16630,"children":16631},{"style":384},[16632],{"type":34,"value":2803},{"type":29,"tag":117,"props":16634,"children":16635},{"style":384},[16636],{"type":34,"value":3461},{"type":29,"tag":117,"props":16638,"children":16639},{"class":119,"line":181},[16640,16644,16648,16653,16657,16661],{"type":29,"tag":117,"props":16641,"children":16642},{"style":6700},[16643],{"type":34,"value":7687},{"type":29,"tag":117,"props":16645,"children":16646},{"style":384},[16647],{"type":34,"value":369},{"type":29,"tag":117,"props":16649,"children":16650},{"style":378},[16651],{"type":34,"value":16652},"content ",{"type":29,"tag":117,"props":16654,"children":16655},{"style":160},[16656],{"type":34,"value":6061},{"type":29,"tag":117,"props":16658,"children":16659},{"style":378},[16660],{"type":34,"value":16594},{"type":29,"tag":117,"props":16662,"children":16663},{"style":384},[16664],{"type":34,"value":387},{"type":29,"tag":117,"props":16666,"children":16667},{"class":119,"line":189},[16668],{"type":29,"tag":117,"props":16669,"children":16670},{"style":384},[16671],{"type":34,"value":5632},{"type":29,"tag":117,"props":16673,"children":16674},{"class":119,"line":198},[16675],{"type":29,"tag":117,"props":16676,"children":16677},{"emptyLinePlaceholder":13},[16678],{"type":34,"value":136},{"type":29,"tag":117,"props":16680,"children":16681},{"class":119,"line":207},[16682,16686,16690,16694,16698],{"type":29,"tag":117,"props":16683,"children":16684},{"style":143},[16685],{"type":34,"value":7641},{"type":29,"tag":117,"props":16687,"children":16688},{"style":143},[16689],{"type":34,"value":7762},{"type":29,"tag":117,"props":16691,"children":16692},{"style":372},[16693],{"type":34,"value":7767},{"type":29,"tag":117,"props":16695,"children":16696},{"style":384},[16697],{"type":34,"value":381},{"type":29,"tag":117,"props":16699,"children":16700},{"style":384},[16701],{"type":34,"value":3461},{"type":29,"tag":117,"props":16703,"children":16704},{"class":119,"line":215},[16705],{"type":29,"tag":117,"props":16706,"children":16707},{"style":124},[16708],{"type":34,"value":16709},"        \u002F\u002F Logique de génération de rapport\n",{"type":29,"tag":117,"props":16711,"children":16712},{"class":119,"line":224},[16713,16718,16722,16726,16730,16734,16738,16743,16747,16751],{"type":29,"tag":117,"props":16714,"children":16715},{"style":378},[16716],{"type":34,"value":16717},"        System",{"type":29,"tag":117,"props":16719,"children":16720},{"style":384},[16721],{"type":34,"value":369},{"type":29,"tag":117,"props":16723,"children":16724},{"style":378},[16725],{"type":34,"value":15075},{"type":29,"tag":117,"props":16727,"children":16728},{"style":384},[16729],{"type":34,"value":369},{"type":29,"tag":117,"props":16731,"children":16732},{"style":372},[16733],{"type":34,"value":15084},{"type":29,"tag":117,"props":16735,"children":16736},{"style":384},[16737],{"type":34,"value":1108},{"type":29,"tag":117,"props":16739,"children":16740},{"style":166},[16741],{"type":34,"value":16742},"\"Génération du rapport : \"",{"type":29,"tag":117,"props":16744,"children":16745},{"style":160},[16746],{"type":34,"value":15098},{"type":29,"tag":117,"props":16748,"children":16749},{"style":378},[16750],{"type":34,"value":16594},{"type":29,"tag":117,"props":16752,"children":16753},{"style":384},[16754],{"type":34,"value":5675},{"type":29,"tag":117,"props":16756,"children":16757},{"class":119,"line":233},[16758],{"type":29,"tag":117,"props":16759,"children":16760},{"style":384},[16761],{"type":34,"value":5632},{"type":29,"tag":117,"props":16763,"children":16764},{"class":119,"line":242},[16765],{"type":29,"tag":117,"props":16766,"children":16767},{"emptyLinePlaceholder":13},[16768],{"type":34,"value":136},{"type":29,"tag":117,"props":16770,"children":16771},{"class":119,"line":251},[16772,16776,16780,16785,16789,16793,16798,16802],{"type":29,"tag":117,"props":16773,"children":16774},{"style":143},[16775],{"type":34,"value":7641},{"type":29,"tag":117,"props":16777,"children":16778},{"style":143},[16779],{"type":34,"value":7762},{"type":29,"tag":117,"props":16781,"children":16782},{"style":372},[16783],{"type":34,"value":16784}," saveToPDF",{"type":29,"tag":117,"props":16786,"children":16787},{"style":384},[16788],{"type":34,"value":1108},{"type":29,"tag":117,"props":16790,"children":16791},{"style":5976},[16792],{"type":34,"value":7654},{"type":29,"tag":117,"props":16794,"children":16795},{"style":7657},[16796],{"type":34,"value":16797}," filename",{"type":29,"tag":117,"props":16799,"children":16800},{"style":384},[16801],{"type":34,"value":2803},{"type":29,"tag":117,"props":16803,"children":16804},{"style":384},[16805],{"type":34,"value":3461},{"type":29,"tag":117,"props":16807,"children":16808},{"class":119,"line":260},[16809],{"type":29,"tag":117,"props":16810,"children":16811},{"style":124},[16812],{"type":34,"value":16813},"        \u002F\u002F Logique d'enregistrement en PDF\n",{"type":29,"tag":117,"props":16815,"children":16816},{"class":119,"line":269},[16817,16821,16825,16829,16833,16837,16841,16846,16850,16854],{"type":29,"tag":117,"props":16818,"children":16819},{"style":378},[16820],{"type":34,"value":16717},{"type":29,"tag":117,"props":16822,"children":16823},{"style":384},[16824],{"type":34,"value":369},{"type":29,"tag":117,"props":16826,"children":16827},{"style":378},[16828],{"type":34,"value":15075},{"type":29,"tag":117,"props":16830,"children":16831},{"style":384},[16832],{"type":34,"value":369},{"type":29,"tag":117,"props":16834,"children":16835},{"style":372},[16836],{"type":34,"value":15084},{"type":29,"tag":117,"props":16838,"children":16839},{"style":384},[16840],{"type":34,"value":1108},{"type":29,"tag":117,"props":16842,"children":16843},{"style":166},[16844],{"type":34,"value":16845},"\"Enregistrement du rapport en PDF sous : \"",{"type":29,"tag":117,"props":16847,"children":16848},{"style":160},[16849],{"type":34,"value":15098},{"type":29,"tag":117,"props":16851,"children":16852},{"style":378},[16853],{"type":34,"value":16797},{"type":29,"tag":117,"props":16855,"children":16856},{"style":384},[16857],{"type":34,"value":5675},{"type":29,"tag":117,"props":16859,"children":16860},{"class":119,"line":278},[16861],{"type":29,"tag":117,"props":16862,"children":16863},{"style":384},[16864],{"type":34,"value":5632},{"type":29,"tag":117,"props":16866,"children":16867},{"class":119,"line":286},[16868],{"type":29,"tag":117,"props":16869,"children":16870},{"style":384},[16871],{"type":34,"value":2903},{"type":29,"tag":30,"props":16873,"children":16874},{},[16875,16876,16881],{"type":34,"value":7966},{"type":29,"tag":113,"props":16877,"children":16879},{"className":16878},[],[16880],{"type":34,"value":16537},{"type":34,"value":16882}," enfreint le SRP. Elle est responsable de deux tâches distinctes : générer un rapport et l'enregistrer sous forme de fichier PDF. Si un jour on décide de changer la méthode de génération des rapports ou d'enregistrer le fichier dans un autre format (par exemple, JSON), il faudra modifier cette classe, ce qui peut introduire des bugs ou rendre les modifications plus difficiles.",{"type":29,"tag":7528,"props":16884,"children":16886},{"id":16885},"exemple-avec-srp-appliqué",[16887],{"type":34,"value":16888},"Exemple avec SRP appliqué :",{"type":29,"tag":30,"props":16890,"children":16891},{},[16892],{"type":34,"value":16893},"Pour corriger cela, on peut diviser les responsabilités en deux classes distinctes.",{"type":29,"tag":106,"props":16895,"children":16897},{"className":5519,"code":16896,"language":5521,"meta":8,"style":8},"\u002F\u002F Classe qui se charge uniquement de la génération du rapport\npublic class Report {\n    private String content;\n\n    public Report(String content) {\n        this.content = content;\n    }\n\n    public void generateReport() {\n        System.out.println(\"Génération du rapport : \" + content);\n    }\n}\n\n\u002F\u002F Classe qui se charge uniquement de l'enregistrement du rapport\npublic class ReportSaver {\n    public void saveToPDF(Report report, String filename) {\n        System.out.println(\"Enregistrement du rapport en PDF sous : \" + filename);\n    }\n}\n",[16898],{"type":29,"tag":113,"props":16899,"children":16900},{"__ignoreMap":8},[16901,16909,16928,16947,16954,16985,17012,17019,17026,17049,17092,17099,17106,17113,17121,17141,17189,17232,17239],{"type":29,"tag":117,"props":16902,"children":16903},{"class":119,"line":120},[16904],{"type":29,"tag":117,"props":16905,"children":16906},{"style":124},[16907],{"type":34,"value":16908},"\u002F\u002F Classe qui se charge uniquement de la génération du rapport\n",{"type":29,"tag":117,"props":16910,"children":16911},{"class":119,"line":130},[16912,16916,16920,16924],{"type":29,"tag":117,"props":16913,"children":16914},{"style":143},[16915],{"type":34,"value":5541},{"type":29,"tag":117,"props":16917,"children":16918},{"style":143},[16919],{"type":34,"value":7575},{"type":29,"tag":117,"props":16921,"children":16922},{"style":2863},[16923],{"type":34,"value":16574},{"type":29,"tag":117,"props":16925,"children":16926},{"style":384},[16927],{"type":34,"value":3461},{"type":29,"tag":117,"props":16929,"children":16930},{"class":119,"line":139},[16931,16935,16939,16943],{"type":29,"tag":117,"props":16932,"children":16933},{"style":143},[16934],{"type":34,"value":7592},{"type":29,"tag":117,"props":16936,"children":16937},{"style":5976},[16938],{"type":34,"value":6477},{"type":29,"tag":117,"props":16940,"children":16941},{"style":378},[16942],{"type":34,"value":16594},{"type":29,"tag":117,"props":16944,"children":16945},{"style":384},[16946],{"type":34,"value":387},{"type":29,"tag":117,"props":16948,"children":16949},{"class":119,"line":172},[16950],{"type":29,"tag":117,"props":16951,"children":16952},{"emptyLinePlaceholder":13},[16953],{"type":34,"value":136},{"type":29,"tag":117,"props":16955,"children":16956},{"class":119,"line":181},[16957,16961,16965,16969,16973,16977,16981],{"type":29,"tag":117,"props":16958,"children":16959},{"style":143},[16960],{"type":34,"value":7641},{"type":29,"tag":117,"props":16962,"children":16963},{"style":372},[16964],{"type":34,"value":16574},{"type":29,"tag":117,"props":16966,"children":16967},{"style":384},[16968],{"type":34,"value":1108},{"type":29,"tag":117,"props":16970,"children":16971},{"style":5976},[16972],{"type":34,"value":7654},{"type":29,"tag":117,"props":16974,"children":16975},{"style":7657},[16976],{"type":34,"value":16594},{"type":29,"tag":117,"props":16978,"children":16979},{"style":384},[16980],{"type":34,"value":2803},{"type":29,"tag":117,"props":16982,"children":16983},{"style":384},[16984],{"type":34,"value":3461},{"type":29,"tag":117,"props":16986,"children":16987},{"class":119,"line":189},[16988,16992,16996,17000,17004,17008],{"type":29,"tag":117,"props":16989,"children":16990},{"style":6700},[16991],{"type":34,"value":7687},{"type":29,"tag":117,"props":16993,"children":16994},{"style":384},[16995],{"type":34,"value":369},{"type":29,"tag":117,"props":16997,"children":16998},{"style":378},[16999],{"type":34,"value":16652},{"type":29,"tag":117,"props":17001,"children":17002},{"style":160},[17003],{"type":34,"value":6061},{"type":29,"tag":117,"props":17005,"children":17006},{"style":378},[17007],{"type":34,"value":16594},{"type":29,"tag":117,"props":17009,"children":17010},{"style":384},[17011],{"type":34,"value":387},{"type":29,"tag":117,"props":17013,"children":17014},{"class":119,"line":198},[17015],{"type":29,"tag":117,"props":17016,"children":17017},{"style":384},[17018],{"type":34,"value":5632},{"type":29,"tag":117,"props":17020,"children":17021},{"class":119,"line":207},[17022],{"type":29,"tag":117,"props":17023,"children":17024},{"emptyLinePlaceholder":13},[17025],{"type":34,"value":136},{"type":29,"tag":117,"props":17027,"children":17028},{"class":119,"line":215},[17029,17033,17037,17041,17045],{"type":29,"tag":117,"props":17030,"children":17031},{"style":143},[17032],{"type":34,"value":7641},{"type":29,"tag":117,"props":17034,"children":17035},{"style":143},[17036],{"type":34,"value":7762},{"type":29,"tag":117,"props":17038,"children":17039},{"style":372},[17040],{"type":34,"value":7767},{"type":29,"tag":117,"props":17042,"children":17043},{"style":384},[17044],{"type":34,"value":381},{"type":29,"tag":117,"props":17046,"children":17047},{"style":384},[17048],{"type":34,"value":3461},{"type":29,"tag":117,"props":17050,"children":17051},{"class":119,"line":224},[17052,17056,17060,17064,17068,17072,17076,17080,17084,17088],{"type":29,"tag":117,"props":17053,"children":17054},{"style":378},[17055],{"type":34,"value":16717},{"type":29,"tag":117,"props":17057,"children":17058},{"style":384},[17059],{"type":34,"value":369},{"type":29,"tag":117,"props":17061,"children":17062},{"style":378},[17063],{"type":34,"value":15075},{"type":29,"tag":117,"props":17065,"children":17066},{"style":384},[17067],{"type":34,"value":369},{"type":29,"tag":117,"props":17069,"children":17070},{"style":372},[17071],{"type":34,"value":15084},{"type":29,"tag":117,"props":17073,"children":17074},{"style":384},[17075],{"type":34,"value":1108},{"type":29,"tag":117,"props":17077,"children":17078},{"style":166},[17079],{"type":34,"value":16742},{"type":29,"tag":117,"props":17081,"children":17082},{"style":160},[17083],{"type":34,"value":15098},{"type":29,"tag":117,"props":17085,"children":17086},{"style":378},[17087],{"type":34,"value":16594},{"type":29,"tag":117,"props":17089,"children":17090},{"style":384},[17091],{"type":34,"value":5675},{"type":29,"tag":117,"props":17093,"children":17094},{"class":119,"line":233},[17095],{"type":29,"tag":117,"props":17096,"children":17097},{"style":384},[17098],{"type":34,"value":5632},{"type":29,"tag":117,"props":17100,"children":17101},{"class":119,"line":242},[17102],{"type":29,"tag":117,"props":17103,"children":17104},{"style":384},[17105],{"type":34,"value":2903},{"type":29,"tag":117,"props":17107,"children":17108},{"class":119,"line":251},[17109],{"type":29,"tag":117,"props":17110,"children":17111},{"emptyLinePlaceholder":13},[17112],{"type":34,"value":136},{"type":29,"tag":117,"props":17114,"children":17115},{"class":119,"line":260},[17116],{"type":29,"tag":117,"props":17117,"children":17118},{"style":124},[17119],{"type":34,"value":17120},"\u002F\u002F Classe qui se charge uniquement de l'enregistrement du rapport\n",{"type":29,"tag":117,"props":17122,"children":17123},{"class":119,"line":269},[17124,17128,17132,17137],{"type":29,"tag":117,"props":17125,"children":17126},{"style":143},[17127],{"type":34,"value":5541},{"type":29,"tag":117,"props":17129,"children":17130},{"style":143},[17131],{"type":34,"value":7575},{"type":29,"tag":117,"props":17133,"children":17134},{"style":2863},[17135],{"type":34,"value":17136}," ReportSaver",{"type":29,"tag":117,"props":17138,"children":17139},{"style":384},[17140],{"type":34,"value":3461},{"type":29,"tag":117,"props":17142,"children":17143},{"class":119,"line":278},[17144,17148,17152,17156,17160,17164,17169,17173,17177,17181,17185],{"type":29,"tag":117,"props":17145,"children":17146},{"style":143},[17147],{"type":34,"value":7641},{"type":29,"tag":117,"props":17149,"children":17150},{"style":143},[17151],{"type":34,"value":7762},{"type":29,"tag":117,"props":17153,"children":17154},{"style":372},[17155],{"type":34,"value":16784},{"type":29,"tag":117,"props":17157,"children":17158},{"style":384},[17159],{"type":34,"value":1108},{"type":29,"tag":117,"props":17161,"children":17162},{"style":5976},[17163],{"type":34,"value":16537},{"type":29,"tag":117,"props":17165,"children":17166},{"style":7657},[17167],{"type":34,"value":17168}," report",{"type":29,"tag":117,"props":17170,"children":17171},{"style":384},[17172],{"type":34,"value":1118},{"type":29,"tag":117,"props":17174,"children":17175},{"style":5976},[17176],{"type":34,"value":6477},{"type":29,"tag":117,"props":17178,"children":17179},{"style":7657},[17180],{"type":34,"value":16797},{"type":29,"tag":117,"props":17182,"children":17183},{"style":384},[17184],{"type":34,"value":2803},{"type":29,"tag":117,"props":17186,"children":17187},{"style":384},[17188],{"type":34,"value":3461},{"type":29,"tag":117,"props":17190,"children":17191},{"class":119,"line":286},[17192,17196,17200,17204,17208,17212,17216,17220,17224,17228],{"type":29,"tag":117,"props":17193,"children":17194},{"style":378},[17195],{"type":34,"value":16717},{"type":29,"tag":117,"props":17197,"children":17198},{"style":384},[17199],{"type":34,"value":369},{"type":29,"tag":117,"props":17201,"children":17202},{"style":378},[17203],{"type":34,"value":15075},{"type":29,"tag":117,"props":17205,"children":17206},{"style":384},[17207],{"type":34,"value":369},{"type":29,"tag":117,"props":17209,"children":17210},{"style":372},[17211],{"type":34,"value":15084},{"type":29,"tag":117,"props":17213,"children":17214},{"style":384},[17215],{"type":34,"value":1108},{"type":29,"tag":117,"props":17217,"children":17218},{"style":166},[17219],{"type":34,"value":16845},{"type":29,"tag":117,"props":17221,"children":17222},{"style":160},[17223],{"type":34,"value":15098},{"type":29,"tag":117,"props":17225,"children":17226},{"style":378},[17227],{"type":34,"value":16797},{"type":29,"tag":117,"props":17229,"children":17230},{"style":384},[17231],{"type":34,"value":5675},{"type":29,"tag":117,"props":17233,"children":17234},{"class":119,"line":295},[17235],{"type":29,"tag":117,"props":17236,"children":17237},{"style":384},[17238],{"type":34,"value":5632},{"type":29,"tag":117,"props":17240,"children":17241},{"class":119,"line":304},[17242],{"type":29,"tag":117,"props":17243,"children":17244},{"style":384},[17245],{"type":34,"value":2903},{"type":29,"tag":51,"props":17247,"children":17248},{},[],{"type":29,"tag":5462,"props":17250,"children":17251},{"type":5464},[17252],{"type":29,"tag":30,"props":17253,"children":17254},{},[17255,17260],{"type":29,"tag":45,"props":17256,"children":17257},{},[17258],{"type":34,"value":17259},"Gardez vos classes petites",{"type":34,"value":17261},". Si vous trouvez qu'une classe fait plusieurs choses non liées, envisagez de la diviser en plusieurs classes plus petites. Cela rendra le code plus lisible et plus facile à maintenir.",{"type":29,"tag":567,"props":17263,"children":17265},{"cta":569,"href":570,"title":17264,"type":572},"Vous voulez savoir, en regardant une classe, où SOLID doit s'appliquer et où il ne sert à rien ?",[17266],{"type":29,"tag":30,"props":17267,"children":17268},{},[17269],{"type":34,"value":17270},"Reconnaître une violation du SRP ou un héritage qui casse Liskov dans votre propre code, ça ne s'apprend pas en lisant un article : ça se travaille. En mentoring 1:1, je relis votre code Java avec vous, on refactorise ensemble les zones les plus couplées, et vous développez le réflexe de couper au bon endroit sans sur-abstraire.",{"type":29,"tag":55,"props":17272,"children":17274},{"id":17273},"_2-principe-ouvertfermé-openclosed-principle-ocp",[17275],{"type":34,"value":17276},"2. Principe Ouvert\u002FFermé (Open\u002FClosed Principle - OCP)",{"type":29,"tag":30,"props":17278,"children":17279},{},[17280,17282,17287,17289,17294],{"type":34,"value":17281},"Le principe Ouvert\u002FFermé stipule qu’une entité (classe, module, fonction, etc.) doit être ",{"type":29,"tag":45,"props":17283,"children":17284},{},[17285],{"type":34,"value":17286},"ouverte à l’extension",{"type":34,"value":17288}," mais ",{"type":29,"tag":45,"props":17290,"children":17291},{},[17292],{"type":34,"value":17293},"fermée à la modification",{"type":34,"value":17295},". Cela signifie qu’il devrait être possible d’ajouter de nouvelles fonctionnalités sans avoir à modifier le code existant. En d’autres termes, je vous recommande de concevoir le code de manière à ce qu’il puisse évoluer par des extensions plutôt que par des modifications internes.",{"type":29,"tag":4530,"props":17297,"children":17299},{"id":17298},"pourquoi-cest-important-1",[17300],{"type":34,"value":16515},{"type":29,"tag":30,"props":17302,"children":17303},{},[17304],{"type":34,"value":17305},"Respecter l'OCP évite de toucher au code stable et déjà testé, ce qui réduit le risque d'introduire des bugs. C'est aussi ce qui rend l'ajout de nouvelles fonctionnalités fluide sur le long terme : vous étendez plutôt que de patcher.",{"type":29,"tag":4530,"props":17307,"children":17309},{"id":17308},"exemple-concret-en-java-1",[17310],{"type":34,"value":16526},{"type":29,"tag":30,"props":17312,"children":17313},{},[17314],{"type":34,"value":17315},"Imaginons que nous travaillions sur un système de paiement qui supporte plusieurs méthodes de paiement comme la carte bancaire et PayPal. Si l’on veut ajouter une nouvelle méthode de paiement, par exemple via un portefeuille électronique (e-wallet), on ne veut pas devoir modifier chaque partie du code. Cela enfreindrait le principe OCP.",{"type":29,"tag":7528,"props":17317,"children":17319},{"id":17318},"exemple-sans-ocp",[17320],{"type":34,"value":17321},"Exemple sans OCP :",{"type":29,"tag":30,"props":17323,"children":17324},{},[17325,17327,17333],{"type":34,"value":17326},"Voici une implémentation où la classe ",{"type":29,"tag":113,"props":17328,"children":17330},{"className":17329},[],[17331],{"type":34,"value":17332},"PaymentProcessor",{"type":34,"value":17334}," gère directement les différentes méthodes de paiement :",{"type":29,"tag":106,"props":17336,"children":17338},{"className":5519,"code":17337,"language":5521,"meta":8,"style":8},"public class PaymentProcessor {\n    public void processPayment(String type) {\n        if (type.equals(\"creditCard\")) {\n            \u002F\u002F Traitement paiement par carte bancaire\n            System.out.println(\"Paiement par carte bancaire\");\n        } else if (type.equals(\"paypal\")) {\n            \u002F\u002F Traitement paiement PayPal\n            System.out.println(\"Paiement via PayPal\");\n        }\n    }\n}\n",[17339],{"type":29,"tag":113,"props":17340,"children":17341},{"__ignoreMap":8},[17342,17362,17398,17440,17448,17484,17534,17542,17578,17585,17592],{"type":29,"tag":117,"props":17343,"children":17344},{"class":119,"line":120},[17345,17349,17353,17358],{"type":29,"tag":117,"props":17346,"children":17347},{"style":143},[17348],{"type":34,"value":5541},{"type":29,"tag":117,"props":17350,"children":17351},{"style":143},[17352],{"type":34,"value":7575},{"type":29,"tag":117,"props":17354,"children":17355},{"style":2863},[17356],{"type":34,"value":17357}," PaymentProcessor",{"type":29,"tag":117,"props":17359,"children":17360},{"style":384},[17361],{"type":34,"value":3461},{"type":29,"tag":117,"props":17363,"children":17364},{"class":119,"line":130},[17365,17369,17373,17377,17381,17385,17390,17394],{"type":29,"tag":117,"props":17366,"children":17367},{"style":143},[17368],{"type":34,"value":7641},{"type":29,"tag":117,"props":17370,"children":17371},{"style":143},[17372],{"type":34,"value":7762},{"type":29,"tag":117,"props":17374,"children":17375},{"style":372},[17376],{"type":34,"value":9474},{"type":29,"tag":117,"props":17378,"children":17379},{"style":384},[17380],{"type":34,"value":1108},{"type":29,"tag":117,"props":17382,"children":17383},{"style":5976},[17384],{"type":34,"value":7654},{"type":29,"tag":117,"props":17386,"children":17387},{"style":7657},[17388],{"type":34,"value":17389}," type",{"type":29,"tag":117,"props":17391,"children":17392},{"style":384},[17393],{"type":34,"value":2803},{"type":29,"tag":117,"props":17395,"children":17396},{"style":384},[17397],{"type":34,"value":3461},{"type":29,"tag":117,"props":17399,"children":17400},{"class":119,"line":139},[17401,17405,17409,17414,17418,17423,17427,17432,17436],{"type":29,"tag":117,"props":17402,"children":17403},{"style":143},[17404],{"type":34,"value":6121},{"type":29,"tag":117,"props":17406,"children":17407},{"style":384},[17408],{"type":34,"value":3181},{"type":29,"tag":117,"props":17410,"children":17411},{"style":378},[17412],{"type":34,"value":17413},"type",{"type":29,"tag":117,"props":17415,"children":17416},{"style":384},[17417],{"type":34,"value":369},{"type":29,"tag":117,"props":17419,"children":17420},{"style":372},[17421],{"type":34,"value":17422},"equals",{"type":29,"tag":117,"props":17424,"children":17425},{"style":384},[17426],{"type":34,"value":1108},{"type":29,"tag":117,"props":17428,"children":17429},{"style":166},[17430],{"type":34,"value":17431},"\"creditCard\"",{"type":29,"tag":117,"props":17433,"children":17434},{"style":384},[17435],{"type":34,"value":13176},{"type":29,"tag":117,"props":17437,"children":17438},{"style":384},[17439],{"type":34,"value":3461},{"type":29,"tag":117,"props":17441,"children":17442},{"class":119,"line":172},[17443],{"type":29,"tag":117,"props":17444,"children":17445},{"style":124},[17446],{"type":34,"value":17447},"            \u002F\u002F Traitement paiement par carte bancaire\n",{"type":29,"tag":117,"props":17449,"children":17450},{"class":119,"line":181},[17451,17455,17459,17463,17467,17471,17475,17480],{"type":29,"tag":117,"props":17452,"children":17453},{"style":378},[17454],{"type":34,"value":15066},{"type":29,"tag":117,"props":17456,"children":17457},{"style":384},[17458],{"type":34,"value":369},{"type":29,"tag":117,"props":17460,"children":17461},{"style":378},[17462],{"type":34,"value":15075},{"type":29,"tag":117,"props":17464,"children":17465},{"style":384},[17466],{"type":34,"value":369},{"type":29,"tag":117,"props":17468,"children":17469},{"style":372},[17470],{"type":34,"value":15084},{"type":29,"tag":117,"props":17472,"children":17473},{"style":384},[17474],{"type":34,"value":1108},{"type":29,"tag":117,"props":17476,"children":17477},{"style":166},[17478],{"type":34,"value":17479},"\"Paiement par carte bancaire\"",{"type":29,"tag":117,"props":17481,"children":17482},{"style":384},[17483],{"type":34,"value":5675},{"type":29,"tag":117,"props":17485,"children":17486},{"class":119,"line":189},[17487,17492,17496,17501,17505,17509,17513,17517,17521,17526,17530],{"type":29,"tag":117,"props":17488,"children":17489},{"style":384},[17490],{"type":34,"value":17491},"        }",{"type":29,"tag":117,"props":17493,"children":17494},{"style":143},[17495],{"type":34,"value":13526},{"type":29,"tag":117,"props":17497,"children":17498},{"style":143},[17499],{"type":34,"value":17500}," if",{"type":29,"tag":117,"props":17502,"children":17503},{"style":384},[17504],{"type":34,"value":3181},{"type":29,"tag":117,"props":17506,"children":17507},{"style":378},[17508],{"type":34,"value":17413},{"type":29,"tag":117,"props":17510,"children":17511},{"style":384},[17512],{"type":34,"value":369},{"type":29,"tag":117,"props":17514,"children":17515},{"style":372},[17516],{"type":34,"value":17422},{"type":29,"tag":117,"props":17518,"children":17519},{"style":384},[17520],{"type":34,"value":1108},{"type":29,"tag":117,"props":17522,"children":17523},{"style":166},[17524],{"type":34,"value":17525},"\"paypal\"",{"type":29,"tag":117,"props":17527,"children":17528},{"style":384},[17529],{"type":34,"value":13176},{"type":29,"tag":117,"props":17531,"children":17532},{"style":384},[17533],{"type":34,"value":3461},{"type":29,"tag":117,"props":17535,"children":17536},{"class":119,"line":198},[17537],{"type":29,"tag":117,"props":17538,"children":17539},{"style":124},[17540],{"type":34,"value":17541},"            \u002F\u002F Traitement paiement PayPal\n",{"type":29,"tag":117,"props":17543,"children":17544},{"class":119,"line":207},[17545,17549,17553,17557,17561,17565,17569,17574],{"type":29,"tag":117,"props":17546,"children":17547},{"style":378},[17548],{"type":34,"value":15066},{"type":29,"tag":117,"props":17550,"children":17551},{"style":384},[17552],{"type":34,"value":369},{"type":29,"tag":117,"props":17554,"children":17555},{"style":378},[17556],{"type":34,"value":15075},{"type":29,"tag":117,"props":17558,"children":17559},{"style":384},[17560],{"type":34,"value":369},{"type":29,"tag":117,"props":17562,"children":17563},{"style":372},[17564],{"type":34,"value":15084},{"type":29,"tag":117,"props":17566,"children":17567},{"style":384},[17568],{"type":34,"value":1108},{"type":29,"tag":117,"props":17570,"children":17571},{"style":166},[17572],{"type":34,"value":17573},"\"Paiement via PayPal\"",{"type":29,"tag":117,"props":17575,"children":17576},{"style":384},[17577],{"type":34,"value":5675},{"type":29,"tag":117,"props":17579,"children":17580},{"class":119,"line":215},[17581],{"type":29,"tag":117,"props":17582,"children":17583},{"style":384},[17584],{"type":34,"value":6196},{"type":29,"tag":117,"props":17586,"children":17587},{"class":119,"line":224},[17588],{"type":29,"tag":117,"props":17589,"children":17590},{"style":384},[17591],{"type":34,"value":5632},{"type":29,"tag":117,"props":17593,"children":17594},{"class":119,"line":233},[17595],{"type":29,"tag":117,"props":17596,"children":17597},{"style":384},[17598],{"type":34,"value":2903},{"type":29,"tag":30,"props":17600,"children":17601},{},[17602,17604,17609,17611,17616,17618,17624],{"type":34,"value":17603},"Dans ce cas, si l'on veut ajouter un nouveau moyen de paiement, comme un portefeuille électronique, il faudrait ",{"type":29,"tag":45,"props":17605,"children":17606},{},[17607],{"type":34,"value":17608},"modifier la classe",{"type":34,"value":17610}," ",{"type":29,"tag":113,"props":17612,"children":17614},{"className":17613},[],[17615],{"type":34,"value":17332},{"type":34,"value":17617}," en ajoutant une nouvelle condition ",{"type":29,"tag":113,"props":17619,"children":17621},{"className":17620},[],[17622],{"type":34,"value":17623},"else if",{"type":34,"value":17625},". Cela enfreint le principe OCP, car on doit toucher au code existant pour ajouter une nouvelle fonctionnalité.",{"type":29,"tag":7528,"props":17627,"children":17629},{"id":17628},"exemple-avec-ocp-appliqué",[17630],{"type":34,"value":17631},"Exemple avec OCP appliqué :",{"type":29,"tag":30,"props":17633,"children":17634},{},[17635],{"type":34,"value":17636},"Voyons maintenant une solution où la classe est ouverte à l'extension mais fermée à la modification en utilisant l’héritage et le polymorphisme.",{"type":29,"tag":106,"props":17638,"children":17640},{"className":5519,"code":17639,"language":5521,"meta":8,"style":8},"\u002F\u002F Interface de stratégie de paiement\npublic interface PaymentMethod {\n    void processPayment();\n}\n\n\u002F\u002F Implémentation pour la carte bancaire\npublic class CreditCardPayment implements PaymentMethod {\n    @Override\n    public void processPayment() {\n        System.out.println(\"Paiement par carte bancaire\");\n    }\n}\n\n\u002F\u002F Implémentation pour PayPal\npublic class PayPalPayment implements PaymentMethod {\n    @Override\n    public void processPayment() {\n        System.out.println(\"Paiement via PayPal\");\n    }\n}\n\n\u002F\u002F Classe de traitement des paiements qui respecte OCP\npublic class PaymentProcessor {\n    public void processPayment(PaymentMethod paymentMethod) {\n        paymentMethod.processPayment();\n    }\n}\n",[17641],{"type":29,"tag":113,"props":17642,"children":17643},{"__ignoreMap":8},[17644,17652,17671,17686,17693,17700,17708,17735,17747,17770,17805,17812,17819,17826,17834,17861,17872,17895,17930,17937,17944,17951,17959,17978,18013,18032,18039],{"type":29,"tag":117,"props":17645,"children":17646},{"class":119,"line":120},[17647],{"type":29,"tag":117,"props":17648,"children":17649},{"style":124},[17650],{"type":34,"value":17651},"\u002F\u002F Interface de stratégie de paiement\n",{"type":29,"tag":117,"props":17653,"children":17654},{"class":119,"line":130},[17655,17659,17663,17667],{"type":29,"tag":117,"props":17656,"children":17657},{"style":143},[17658],{"type":34,"value":5541},{"type":29,"tag":117,"props":17660,"children":17661},{"style":143},[17662],{"type":34,"value":8561},{"type":29,"tag":117,"props":17664,"children":17665},{"style":2863},[17666],{"type":34,"value":8566},{"type":29,"tag":117,"props":17668,"children":17669},{"style":384},[17670],{"type":34,"value":3461},{"type":29,"tag":117,"props":17672,"children":17673},{"class":119,"line":139},[17674,17678,17682],{"type":29,"tag":117,"props":17675,"children":17676},{"style":143},[17677],{"type":34,"value":8578},{"type":29,"tag":117,"props":17679,"children":17680},{"style":372},[17681],{"type":34,"value":9474},{"type":29,"tag":117,"props":17683,"children":17684},{"style":384},[17685],{"type":34,"value":9375},{"type":29,"tag":117,"props":17687,"children":17688},{"class":119,"line":172},[17689],{"type":29,"tag":117,"props":17690,"children":17691},{"style":384},[17692],{"type":34,"value":2903},{"type":29,"tag":117,"props":17694,"children":17695},{"class":119,"line":181},[17696],{"type":29,"tag":117,"props":17697,"children":17698},{"emptyLinePlaceholder":13},[17699],{"type":34,"value":136},{"type":29,"tag":117,"props":17701,"children":17702},{"class":119,"line":189},[17703],{"type":29,"tag":117,"props":17704,"children":17705},{"style":124},[17706],{"type":34,"value":17707},"\u002F\u002F Implémentation pour la carte bancaire\n",{"type":29,"tag":117,"props":17709,"children":17710},{"class":119,"line":198},[17711,17715,17719,17723,17727,17731],{"type":29,"tag":117,"props":17712,"children":17713},{"style":143},[17714],{"type":34,"value":5541},{"type":29,"tag":117,"props":17716,"children":17717},{"style":143},[17718],{"type":34,"value":7575},{"type":29,"tag":117,"props":17720,"children":17721},{"style":2863},[17722],{"type":34,"value":8631},{"type":29,"tag":117,"props":17724,"children":17725},{"style":143},[17726],{"type":34,"value":8636},{"type":29,"tag":117,"props":17728,"children":17729},{"style":2863},[17730],{"type":34,"value":8566},{"type":29,"tag":117,"props":17732,"children":17733},{"style":384},[17734],{"type":34,"value":3461},{"type":29,"tag":117,"props":17736,"children":17737},{"class":119,"line":207},[17738,17742],{"type":29,"tag":117,"props":17739,"children":17740},{"style":10083},[17741],{"type":34,"value":10086},{"type":29,"tag":117,"props":17743,"children":17744},{"style":10089},[17745],{"type":34,"value":17746},"Override\n",{"type":29,"tag":117,"props":17748,"children":17749},{"class":119,"line":215},[17750,17754,17758,17762,17766],{"type":29,"tag":117,"props":17751,"children":17752},{"style":143},[17753],{"type":34,"value":7641},{"type":29,"tag":117,"props":17755,"children":17756},{"style":143},[17757],{"type":34,"value":7762},{"type":29,"tag":117,"props":17759,"children":17760},{"style":372},[17761],{"type":34,"value":9474},{"type":29,"tag":117,"props":17763,"children":17764},{"style":384},[17765],{"type":34,"value":381},{"type":29,"tag":117,"props":17767,"children":17768},{"style":384},[17769],{"type":34,"value":3461},{"type":29,"tag":117,"props":17771,"children":17772},{"class":119,"line":224},[17773,17777,17781,17785,17789,17793,17797,17801],{"type":29,"tag":117,"props":17774,"children":17775},{"style":378},[17776],{"type":34,"value":16717},{"type":29,"tag":117,"props":17778,"children":17779},{"style":384},[17780],{"type":34,"value":369},{"type":29,"tag":117,"props":17782,"children":17783},{"style":378},[17784],{"type":34,"value":15075},{"type":29,"tag":117,"props":17786,"children":17787},{"style":384},[17788],{"type":34,"value":369},{"type":29,"tag":117,"props":17790,"children":17791},{"style":372},[17792],{"type":34,"value":15084},{"type":29,"tag":117,"props":17794,"children":17795},{"style":384},[17796],{"type":34,"value":1108},{"type":29,"tag":117,"props":17798,"children":17799},{"style":166},[17800],{"type":34,"value":17479},{"type":29,"tag":117,"props":17802,"children":17803},{"style":384},[17804],{"type":34,"value":5675},{"type":29,"tag":117,"props":17806,"children":17807},{"class":119,"line":233},[17808],{"type":29,"tag":117,"props":17809,"children":17810},{"style":384},[17811],{"type":34,"value":5632},{"type":29,"tag":117,"props":17813,"children":17814},{"class":119,"line":242},[17815],{"type":29,"tag":117,"props":17816,"children":17817},{"style":384},[17818],{"type":34,"value":2903},{"type":29,"tag":117,"props":17820,"children":17821},{"class":119,"line":251},[17822],{"type":29,"tag":117,"props":17823,"children":17824},{"emptyLinePlaceholder":13},[17825],{"type":34,"value":136},{"type":29,"tag":117,"props":17827,"children":17828},{"class":119,"line":260},[17829],{"type":29,"tag":117,"props":17830,"children":17831},{"style":124},[17832],{"type":34,"value":17833},"\u002F\u002F Implémentation pour PayPal\n",{"type":29,"tag":117,"props":17835,"children":17836},{"class":119,"line":269},[17837,17841,17845,17849,17853,17857],{"type":29,"tag":117,"props":17838,"children":17839},{"style":143},[17840],{"type":34,"value":5541},{"type":29,"tag":117,"props":17842,"children":17843},{"style":143},[17844],{"type":34,"value":7575},{"type":29,"tag":117,"props":17846,"children":17847},{"style":2863},[17848],{"type":34,"value":8724},{"type":29,"tag":117,"props":17850,"children":17851},{"style":143},[17852],{"type":34,"value":8636},{"type":29,"tag":117,"props":17854,"children":17855},{"style":2863},[17856],{"type":34,"value":8566},{"type":29,"tag":117,"props":17858,"children":17859},{"style":384},[17860],{"type":34,"value":3461},{"type":29,"tag":117,"props":17862,"children":17863},{"class":119,"line":278},[17864,17868],{"type":29,"tag":117,"props":17865,"children":17866},{"style":10083},[17867],{"type":34,"value":10086},{"type":29,"tag":117,"props":17869,"children":17870},{"style":10089},[17871],{"type":34,"value":17746},{"type":29,"tag":117,"props":17873,"children":17874},{"class":119,"line":286},[17875,17879,17883,17887,17891],{"type":29,"tag":117,"props":17876,"children":17877},{"style":143},[17878],{"type":34,"value":7641},{"type":29,"tag":117,"props":17880,"children":17881},{"style":143},[17882],{"type":34,"value":7762},{"type":29,"tag":117,"props":17884,"children":17885},{"style":372},[17886],{"type":34,"value":9474},{"type":29,"tag":117,"props":17888,"children":17889},{"style":384},[17890],{"type":34,"value":381},{"type":29,"tag":117,"props":17892,"children":17893},{"style":384},[17894],{"type":34,"value":3461},{"type":29,"tag":117,"props":17896,"children":17897},{"class":119,"line":295},[17898,17902,17906,17910,17914,17918,17922,17926],{"type":29,"tag":117,"props":17899,"children":17900},{"style":378},[17901],{"type":34,"value":16717},{"type":29,"tag":117,"props":17903,"children":17904},{"style":384},[17905],{"type":34,"value":369},{"type":29,"tag":117,"props":17907,"children":17908},{"style":378},[17909],{"type":34,"value":15075},{"type":29,"tag":117,"props":17911,"children":17912},{"style":384},[17913],{"type":34,"value":369},{"type":29,"tag":117,"props":17915,"children":17916},{"style":372},[17917],{"type":34,"value":15084},{"type":29,"tag":117,"props":17919,"children":17920},{"style":384},[17921],{"type":34,"value":1108},{"type":29,"tag":117,"props":17923,"children":17924},{"style":166},[17925],{"type":34,"value":17573},{"type":29,"tag":117,"props":17927,"children":17928},{"style":384},[17929],{"type":34,"value":5675},{"type":29,"tag":117,"props":17931,"children":17932},{"class":119,"line":304},[17933],{"type":29,"tag":117,"props":17934,"children":17935},{"style":384},[17936],{"type":34,"value":5632},{"type":29,"tag":117,"props":17938,"children":17939},{"class":119,"line":313},[17940],{"type":29,"tag":117,"props":17941,"children":17942},{"style":384},[17943],{"type":34,"value":2903},{"type":29,"tag":117,"props":17945,"children":17946},{"class":119,"line":322},[17947],{"type":29,"tag":117,"props":17948,"children":17949},{"emptyLinePlaceholder":13},[17950],{"type":34,"value":136},{"type":29,"tag":117,"props":17952,"children":17953},{"class":119,"line":331},[17954],{"type":29,"tag":117,"props":17955,"children":17956},{"style":124},[17957],{"type":34,"value":17958},"\u002F\u002F Classe de traitement des paiements qui respecte OCP\n",{"type":29,"tag":117,"props":17960,"children":17961},{"class":119,"line":340},[17962,17966,17970,17974],{"type":29,"tag":117,"props":17963,"children":17964},{"style":143},[17965],{"type":34,"value":5541},{"type":29,"tag":117,"props":17967,"children":17968},{"style":143},[17969],{"type":34,"value":7575},{"type":29,"tag":117,"props":17971,"children":17972},{"style":2863},[17973],{"type":34,"value":17357},{"type":29,"tag":117,"props":17975,"children":17976},{"style":384},[17977],{"type":34,"value":3461},{"type":29,"tag":117,"props":17979,"children":17980},{"class":119,"line":348},[17981,17985,17989,17993,17997,18001,18005,18009],{"type":29,"tag":117,"props":17982,"children":17983},{"style":143},[17984],{"type":34,"value":7641},{"type":29,"tag":117,"props":17986,"children":17987},{"style":143},[17988],{"type":34,"value":7762},{"type":29,"tag":117,"props":17990,"children":17991},{"style":372},[17992],{"type":34,"value":9474},{"type":29,"tag":117,"props":17994,"children":17995},{"style":384},[17996],{"type":34,"value":1108},{"type":29,"tag":117,"props":17998,"children":17999},{"style":5976},[18000],{"type":34,"value":8804},{"type":29,"tag":117,"props":18002,"children":18003},{"style":7657},[18004],{"type":34,"value":9746},{"type":29,"tag":117,"props":18006,"children":18007},{"style":384},[18008],{"type":34,"value":2803},{"type":29,"tag":117,"props":18010,"children":18011},{"style":384},[18012],{"type":34,"value":3461},{"type":29,"tag":117,"props":18014,"children":18015},{"class":119,"line":357},[18016,18020,18024,18028],{"type":29,"tag":117,"props":18017,"children":18018},{"style":378},[18019],{"type":34,"value":9876},{"type":29,"tag":117,"props":18021,"children":18022},{"style":384},[18023],{"type":34,"value":369},{"type":29,"tag":117,"props":18025,"children":18026},{"style":372},[18027],{"type":34,"value":9885},{"type":29,"tag":117,"props":18029,"children":18030},{"style":384},[18031],{"type":34,"value":9375},{"type":29,"tag":117,"props":18033,"children":18034},{"class":119,"line":1768},[18035],{"type":29,"tag":117,"props":18036,"children":18037},{"style":384},[18038],{"type":34,"value":5632},{"type":29,"tag":117,"props":18040,"children":18041},{"class":119,"line":953},[18042],{"type":29,"tag":117,"props":18043,"children":18044},{"style":384},[18045],{"type":34,"value":2903},{"type":29,"tag":30,"props":18047,"children":18048},{},[18049,18051,18056],{"type":34,"value":18050},"Pour ajouter une nouvelle méthode de paiement, il suffit simplement de créer une nouvelle classe qui implémente l'interface ",{"type":29,"tag":113,"props":18052,"children":18054},{"className":18053},[],[18055],{"type":34,"value":8804},{"type":34,"value":1866},{"type":29,"tag":106,"props":18058,"children":18060},{"className":5519,"code":18059,"language":5521,"meta":8,"style":8},"\u002F\u002F Nouvelle implémentation pour portefeuille électronique (e-wallet)\npublic class EWalletPayment implements PaymentMethod {\n    @Override\n    public void processPayment() {\n        System.out.println(\"Paiement via portefeuille électronique\");\n    }\n}\n",[18061],{"type":29,"tag":113,"props":18062,"children":18063},{"__ignoreMap":8},[18064,18072,18100,18111,18134,18170,18177],{"type":29,"tag":117,"props":18065,"children":18066},{"class":119,"line":120},[18067],{"type":29,"tag":117,"props":18068,"children":18069},{"style":124},[18070],{"type":34,"value":18071},"\u002F\u002F Nouvelle implémentation pour portefeuille électronique (e-wallet)\n",{"type":29,"tag":117,"props":18073,"children":18074},{"class":119,"line":130},[18075,18079,18083,18088,18092,18096],{"type":29,"tag":117,"props":18076,"children":18077},{"style":143},[18078],{"type":34,"value":5541},{"type":29,"tag":117,"props":18080,"children":18081},{"style":143},[18082],{"type":34,"value":7575},{"type":29,"tag":117,"props":18084,"children":18085},{"style":2863},[18086],{"type":34,"value":18087}," EWalletPayment",{"type":29,"tag":117,"props":18089,"children":18090},{"style":143},[18091],{"type":34,"value":8636},{"type":29,"tag":117,"props":18093,"children":18094},{"style":2863},[18095],{"type":34,"value":8566},{"type":29,"tag":117,"props":18097,"children":18098},{"style":384},[18099],{"type":34,"value":3461},{"type":29,"tag":117,"props":18101,"children":18102},{"class":119,"line":139},[18103,18107],{"type":29,"tag":117,"props":18104,"children":18105},{"style":10083},[18106],{"type":34,"value":10086},{"type":29,"tag":117,"props":18108,"children":18109},{"style":10089},[18110],{"type":34,"value":17746},{"type":29,"tag":117,"props":18112,"children":18113},{"class":119,"line":172},[18114,18118,18122,18126,18130],{"type":29,"tag":117,"props":18115,"children":18116},{"style":143},[18117],{"type":34,"value":7641},{"type":29,"tag":117,"props":18119,"children":18120},{"style":143},[18121],{"type":34,"value":7762},{"type":29,"tag":117,"props":18123,"children":18124},{"style":372},[18125],{"type":34,"value":9474},{"type":29,"tag":117,"props":18127,"children":18128},{"style":384},[18129],{"type":34,"value":381},{"type":29,"tag":117,"props":18131,"children":18132},{"style":384},[18133],{"type":34,"value":3461},{"type":29,"tag":117,"props":18135,"children":18136},{"class":119,"line":181},[18137,18141,18145,18149,18153,18157,18161,18166],{"type":29,"tag":117,"props":18138,"children":18139},{"style":378},[18140],{"type":34,"value":16717},{"type":29,"tag":117,"props":18142,"children":18143},{"style":384},[18144],{"type":34,"value":369},{"type":29,"tag":117,"props":18146,"children":18147},{"style":378},[18148],{"type":34,"value":15075},{"type":29,"tag":117,"props":18150,"children":18151},{"style":384},[18152],{"type":34,"value":369},{"type":29,"tag":117,"props":18154,"children":18155},{"style":372},[18156],{"type":34,"value":15084},{"type":29,"tag":117,"props":18158,"children":18159},{"style":384},[18160],{"type":34,"value":1108},{"type":29,"tag":117,"props":18162,"children":18163},{"style":166},[18164],{"type":34,"value":18165},"\"Paiement via portefeuille électronique\"",{"type":29,"tag":117,"props":18167,"children":18168},{"style":384},[18169],{"type":34,"value":5675},{"type":29,"tag":117,"props":18171,"children":18172},{"class":119,"line":189},[18173],{"type":29,"tag":117,"props":18174,"children":18175},{"style":384},[18176],{"type":34,"value":5632},{"type":29,"tag":117,"props":18178,"children":18179},{"class":119,"line":198},[18180],{"type":29,"tag":117,"props":18181,"children":18182},{"style":384},[18183],{"type":34,"value":2903},{"type":29,"tag":30,"props":18185,"children":18186},{},[18187,18189,18194],{"type":34,"value":18188},"On peut maintenant utiliser cette nouvelle méthode de paiement sans toucher à la classe ",{"type":29,"tag":113,"props":18190,"children":18192},{"className":18191},[],[18193],{"type":34,"value":17332},{"type":34,"value":1866},{"type":29,"tag":106,"props":18196,"children":18198},{"className":5519,"code":18197,"language":5521,"meta":8,"style":8},"public class Main {\n    public static void main(String[] args) {\n        PaymentProcessor processor = new PaymentProcessor();\n\n        \u002F\u002F Utilisation de la carte bancaire\n        PaymentMethod creditCard = new CreditCardPayment();\n        processor.processPayment(creditCard);\n\n        \u002F\u002F Utilisation de PayPal\n        PaymentMethod paypal = new PayPalPayment();\n        processor.processPayment(paypal);\n\n        \u002F\u002F Utilisation d'un portefeuille électronique\n        PaymentMethod ewallet = new EWalletPayment();\n        processor.processPayment(ewallet);\n    }\n}\n",[18199],{"type":29,"tag":113,"props":18200,"children":18201},{"__ignoreMap":8},[18202,18222,18267,18296,18303,18311,18340,18369,18376,18384,18412,18440,18447,18455,18483,18511,18518],{"type":29,"tag":117,"props":18203,"children":18204},{"class":119,"line":120},[18205,18209,18213,18218],{"type":29,"tag":117,"props":18206,"children":18207},{"style":143},[18208],{"type":34,"value":5541},{"type":29,"tag":117,"props":18210,"children":18211},{"style":143},[18212],{"type":34,"value":7575},{"type":29,"tag":117,"props":18214,"children":18215},{"style":2863},[18216],{"type":34,"value":18217}," Main",{"type":29,"tag":117,"props":18219,"children":18220},{"style":384},[18221],{"type":34,"value":3461},{"type":29,"tag":117,"props":18223,"children":18224},{"class":119,"line":130},[18225,18229,18233,18237,18242,18246,18250,18254,18259,18263],{"type":29,"tag":117,"props":18226,"children":18227},{"style":143},[18228],{"type":34,"value":7641},{"type":29,"tag":117,"props":18230,"children":18231},{"style":143},[18232],{"type":34,"value":9213},{"type":29,"tag":117,"props":18234,"children":18235},{"style":143},[18236],{"type":34,"value":7762},{"type":29,"tag":117,"props":18238,"children":18239},{"style":372},[18240],{"type":34,"value":18241}," main",{"type":29,"tag":117,"props":18243,"children":18244},{"style":384},[18245],{"type":34,"value":1108},{"type":29,"tag":117,"props":18247,"children":18248},{"style":143},[18249],{"type":34,"value":7654},{"type":29,"tag":117,"props":18251,"children":18252},{"style":384},[18253],{"type":34,"value":2872},{"type":29,"tag":117,"props":18255,"children":18256},{"style":7657},[18257],{"type":34,"value":18258}," args",{"type":29,"tag":117,"props":18260,"children":18261},{"style":384},[18262],{"type":34,"value":2803},{"type":29,"tag":117,"props":18264,"children":18265},{"style":384},[18266],{"type":34,"value":3461},{"type":29,"tag":117,"props":18268,"children":18269},{"class":119,"line":139},[18270,18275,18280,18284,18288,18292],{"type":29,"tag":117,"props":18271,"children":18272},{"style":5976},[18273],{"type":34,"value":18274},"        PaymentProcessor",{"type":29,"tag":117,"props":18276,"children":18277},{"style":378},[18278],{"type":34,"value":18279}," processor ",{"type":29,"tag":117,"props":18281,"children":18282},{"style":160},[18283],{"type":34,"value":6061},{"type":29,"tag":117,"props":18285,"children":18286},{"style":143},[18287],{"type":34,"value":6066},{"type":29,"tag":117,"props":18289,"children":18290},{"style":372},[18291],{"type":34,"value":17357},{"type":29,"tag":117,"props":18293,"children":18294},{"style":384},[18295],{"type":34,"value":9375},{"type":29,"tag":117,"props":18297,"children":18298},{"class":119,"line":172},[18299],{"type":29,"tag":117,"props":18300,"children":18301},{"emptyLinePlaceholder":13},[18302],{"type":34,"value":136},{"type":29,"tag":117,"props":18304,"children":18305},{"class":119,"line":181},[18306],{"type":29,"tag":117,"props":18307,"children":18308},{"style":124},[18309],{"type":34,"value":18310},"        \u002F\u002F Utilisation de la carte bancaire\n",{"type":29,"tag":117,"props":18312,"children":18313},{"class":119,"line":189},[18314,18319,18324,18328,18332,18336],{"type":29,"tag":117,"props":18315,"children":18316},{"style":5976},[18317],{"type":34,"value":18318},"        PaymentMethod",{"type":29,"tag":117,"props":18320,"children":18321},{"style":378},[18322],{"type":34,"value":18323}," creditCard ",{"type":29,"tag":117,"props":18325,"children":18326},{"style":160},[18327],{"type":34,"value":6061},{"type":29,"tag":117,"props":18329,"children":18330},{"style":143},[18331],{"type":34,"value":6066},{"type":29,"tag":117,"props":18333,"children":18334},{"style":372},[18335],{"type":34,"value":8631},{"type":29,"tag":117,"props":18337,"children":18338},{"style":384},[18339],{"type":34,"value":9375},{"type":29,"tag":117,"props":18341,"children":18342},{"class":119,"line":198},[18343,18348,18352,18356,18360,18365],{"type":29,"tag":117,"props":18344,"children":18345},{"style":378},[18346],{"type":34,"value":18347},"        processor",{"type":29,"tag":117,"props":18349,"children":18350},{"style":384},[18351],{"type":34,"value":369},{"type":29,"tag":117,"props":18353,"children":18354},{"style":372},[18355],{"type":34,"value":9885},{"type":29,"tag":117,"props":18357,"children":18358},{"style":384},[18359],{"type":34,"value":1108},{"type":29,"tag":117,"props":18361,"children":18362},{"style":378},[18363],{"type":34,"value":18364},"creditCard",{"type":29,"tag":117,"props":18366,"children":18367},{"style":384},[18368],{"type":34,"value":5675},{"type":29,"tag":117,"props":18370,"children":18371},{"class":119,"line":207},[18372],{"type":29,"tag":117,"props":18373,"children":18374},{"emptyLinePlaceholder":13},[18375],{"type":34,"value":136},{"type":29,"tag":117,"props":18377,"children":18378},{"class":119,"line":215},[18379],{"type":29,"tag":117,"props":18380,"children":18381},{"style":124},[18382],{"type":34,"value":18383},"        \u002F\u002F Utilisation de PayPal\n",{"type":29,"tag":117,"props":18385,"children":18386},{"class":119,"line":224},[18387,18391,18396,18400,18404,18408],{"type":29,"tag":117,"props":18388,"children":18389},{"style":5976},[18390],{"type":34,"value":18318},{"type":29,"tag":117,"props":18392,"children":18393},{"style":378},[18394],{"type":34,"value":18395}," paypal ",{"type":29,"tag":117,"props":18397,"children":18398},{"style":160},[18399],{"type":34,"value":6061},{"type":29,"tag":117,"props":18401,"children":18402},{"style":143},[18403],{"type":34,"value":6066},{"type":29,"tag":117,"props":18405,"children":18406},{"style":372},[18407],{"type":34,"value":8724},{"type":29,"tag":117,"props":18409,"children":18410},{"style":384},[18411],{"type":34,"value":9375},{"type":29,"tag":117,"props":18413,"children":18414},{"class":119,"line":233},[18415,18419,18423,18427,18431,18436],{"type":29,"tag":117,"props":18416,"children":18417},{"style":378},[18418],{"type":34,"value":18347},{"type":29,"tag":117,"props":18420,"children":18421},{"style":384},[18422],{"type":34,"value":369},{"type":29,"tag":117,"props":18424,"children":18425},{"style":372},[18426],{"type":34,"value":9885},{"type":29,"tag":117,"props":18428,"children":18429},{"style":384},[18430],{"type":34,"value":1108},{"type":29,"tag":117,"props":18432,"children":18433},{"style":378},[18434],{"type":34,"value":18435},"paypal",{"type":29,"tag":117,"props":18437,"children":18438},{"style":384},[18439],{"type":34,"value":5675},{"type":29,"tag":117,"props":18441,"children":18442},{"class":119,"line":242},[18443],{"type":29,"tag":117,"props":18444,"children":18445},{"emptyLinePlaceholder":13},[18446],{"type":34,"value":136},{"type":29,"tag":117,"props":18448,"children":18449},{"class":119,"line":251},[18450],{"type":29,"tag":117,"props":18451,"children":18452},{"style":124},[18453],{"type":34,"value":18454},"        \u002F\u002F Utilisation d'un portefeuille électronique\n",{"type":29,"tag":117,"props":18456,"children":18457},{"class":119,"line":260},[18458,18462,18467,18471,18475,18479],{"type":29,"tag":117,"props":18459,"children":18460},{"style":5976},[18461],{"type":34,"value":18318},{"type":29,"tag":117,"props":18463,"children":18464},{"style":378},[18465],{"type":34,"value":18466}," ewallet ",{"type":29,"tag":117,"props":18468,"children":18469},{"style":160},[18470],{"type":34,"value":6061},{"type":29,"tag":117,"props":18472,"children":18473},{"style":143},[18474],{"type":34,"value":6066},{"type":29,"tag":117,"props":18476,"children":18477},{"style":372},[18478],{"type":34,"value":18087},{"type":29,"tag":117,"props":18480,"children":18481},{"style":384},[18482],{"type":34,"value":9375},{"type":29,"tag":117,"props":18484,"children":18485},{"class":119,"line":269},[18486,18490,18494,18498,18502,18507],{"type":29,"tag":117,"props":18487,"children":18488},{"style":378},[18489],{"type":34,"value":18347},{"type":29,"tag":117,"props":18491,"children":18492},{"style":384},[18493],{"type":34,"value":369},{"type":29,"tag":117,"props":18495,"children":18496},{"style":372},[18497],{"type":34,"value":9885},{"type":29,"tag":117,"props":18499,"children":18500},{"style":384},[18501],{"type":34,"value":1108},{"type":29,"tag":117,"props":18503,"children":18504},{"style":378},[18505],{"type":34,"value":18506},"ewallet",{"type":29,"tag":117,"props":18508,"children":18509},{"style":384},[18510],{"type":34,"value":5675},{"type":29,"tag":117,"props":18512,"children":18513},{"class":119,"line":278},[18514],{"type":29,"tag":117,"props":18515,"children":18516},{"style":384},[18517],{"type":34,"value":5632},{"type":29,"tag":117,"props":18519,"children":18520},{"class":119,"line":286},[18521],{"type":29,"tag":117,"props":18522,"children":18523},{"style":384},[18524],{"type":34,"value":2903},{"type":29,"tag":51,"props":18526,"children":18527},{},[],{"type":29,"tag":5462,"props":18529,"children":18530},{"type":5464},[18531],{"type":29,"tag":30,"props":18532,"children":18533},{},[18534,18539],{"type":29,"tag":45,"props":18535,"children":18536},{},[18537],{"type":34,"value":18538},"Utilisez des interfaces ou des classes abstraites",{"type":34,"value":18540}," pour éviter de toucher au code déjà testé. C'est ce qui rend l'extension de l'application possible sans régression.",{"type":29,"tag":55,"props":18542,"children":18544},{"id":18543},"_3-principe-de-substitution-de-liskov-liskov-substitution-principle-lsp",[18545],{"type":34,"value":18546},"3. Principe de Substitution de Liskov (Liskov Substitution Principle - LSP)",{"type":29,"tag":30,"props":18548,"children":18549},{},[18550],{"type":34,"value":18551},"Le principe de substitution de Liskov (LSP) stipule que les sous-classes doivent pouvoir être substituées à leurs classes mères sans que cela ne perturbe le bon fonctionnement du programme. Autrement dit, une classe dérivée doit pouvoir remplacer la classe parente sans modifier le comportement attendu du système.",{"type":29,"tag":4530,"props":18553,"children":18555},{"id":18554},"pourquoi-cest-important-2",[18556],{"type":34,"value":16515},{"type":29,"tag":30,"props":18558,"children":18559},{},[18560],{"type":34,"value":18561},"Si vous brisez ce principe, l'héritage peut causer des problèmes inattendus. Par exemple, certaines méthodes ou comportements pourraient ne pas fonctionner correctement, ce qui peut engendrer des bugs subtils et rendre le système imprévisible.",{"type":29,"tag":4530,"props":18563,"children":18565},{"id":18564},"exemple-concret-en-java-2",[18566],{"type":34,"value":16526},{"type":29,"tag":30,"props":18568,"children":18569},{},[18570,18572,18578,18580,18586],{"type":34,"value":18571},"Imaginons que nous ayons une classe ",{"type":29,"tag":113,"props":18573,"children":18575},{"className":18574},[],[18576],{"type":34,"value":18577},"Rectangle",{"type":34,"value":18579}," et une sous-classe ",{"type":29,"tag":113,"props":18581,"children":18583},{"className":18582},[],[18584],{"type":34,"value":18585},"Square",{"type":34,"value":18587}," (carré), puisque, mathématiquement, un carré est un cas particulier de rectangle.",{"type":29,"tag":7528,"props":18589,"children":18591},{"id":18590},"exemple-sans-lsp",[18592],{"type":34,"value":18593},"Exemple sans LSP :",{"type":29,"tag":30,"props":18595,"children":18596},{},[18597,18599,18604,18606,18611],{"type":34,"value":18598},"Voici une implémentation basique où ",{"type":29,"tag":113,"props":18600,"children":18602},{"className":18601},[],[18603],{"type":34,"value":18585},{"type":34,"value":18605}," hérite de ",{"type":29,"tag":113,"props":18607,"children":18609},{"className":18608},[],[18610],{"type":34,"value":18577},{"type":34,"value":1866},{"type":29,"tag":106,"props":18613,"children":18615},{"className":5519,"code":18614,"language":5521,"meta":8,"style":8},"public class Rectangle {\n    protected int width;\n    protected int height;\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n\n    public int getArea() {\n        return width * height;\n    }\n}\n\npublic class Square extends Rectangle {\n    @Override\n    public void setWidth(int width) {\n        this.width = width;\n        this.height = width; \u002F\u002F Contraintes du carré\n    }\n\n    @Override\n    public void setHeight(int height) {\n        this.height = height;\n        this.width = height; \u002F\u002F Contraintes du carré\n    }\n}\n",[18616],{"type":29,"tag":113,"props":18617,"children":18618},{"__ignoreMap":8},[18619,18639,18660,18680,18687,18723,18751,18758,18765,18772,18779,18815,18843,18850,18857,18881,18905,18912,18919,18926,18955,18966,19001,19028,19060,19067,19074,19085,19120,19147,19178,19185],{"type":29,"tag":117,"props":18620,"children":18621},{"class":119,"line":120},[18622,18626,18630,18635],{"type":29,"tag":117,"props":18623,"children":18624},{"style":143},[18625],{"type":34,"value":5541},{"type":29,"tag":117,"props":18627,"children":18628},{"style":143},[18629],{"type":34,"value":7575},{"type":29,"tag":117,"props":18631,"children":18632},{"style":2863},[18633],{"type":34,"value":18634}," Rectangle",{"type":29,"tag":117,"props":18636,"children":18637},{"style":384},[18638],{"type":34,"value":3461},{"type":29,"tag":117,"props":18640,"children":18641},{"class":119,"line":130},[18642,18647,18651,18656],{"type":29,"tag":117,"props":18643,"children":18644},{"style":143},[18645],{"type":34,"value":18646},"    protected",{"type":29,"tag":117,"props":18648,"children":18649},{"style":143},[18650],{"type":34,"value":5546},{"type":29,"tag":117,"props":18652,"children":18653},{"style":378},[18654],{"type":34,"value":18655}," width",{"type":29,"tag":117,"props":18657,"children":18658},{"style":384},[18659],{"type":34,"value":387},{"type":29,"tag":117,"props":18661,"children":18662},{"class":119,"line":139},[18663,18667,18671,18676],{"type":29,"tag":117,"props":18664,"children":18665},{"style":143},[18666],{"type":34,"value":18646},{"type":29,"tag":117,"props":18668,"children":18669},{"style":143},[18670],{"type":34,"value":5546},{"type":29,"tag":117,"props":18672,"children":18673},{"style":378},[18674],{"type":34,"value":18675}," height",{"type":29,"tag":117,"props":18677,"children":18678},{"style":384},[18679],{"type":34,"value":387},{"type":29,"tag":117,"props":18681,"children":18682},{"class":119,"line":172},[18683],{"type":29,"tag":117,"props":18684,"children":18685},{"emptyLinePlaceholder":13},[18686],{"type":34,"value":136},{"type":29,"tag":117,"props":18688,"children":18689},{"class":119,"line":181},[18690,18694,18698,18703,18707,18711,18715,18719],{"type":29,"tag":117,"props":18691,"children":18692},{"style":143},[18693],{"type":34,"value":7641},{"type":29,"tag":117,"props":18695,"children":18696},{"style":143},[18697],{"type":34,"value":7762},{"type":29,"tag":117,"props":18699,"children":18700},{"style":372},[18701],{"type":34,"value":18702}," setWidth",{"type":29,"tag":117,"props":18704,"children":18705},{"style":384},[18706],{"type":34,"value":1108},{"type":29,"tag":117,"props":18708,"children":18709},{"style":143},[18710],{"type":34,"value":5560},{"type":29,"tag":117,"props":18712,"children":18713},{"style":7657},[18714],{"type":34,"value":18655},{"type":29,"tag":117,"props":18716,"children":18717},{"style":384},[18718],{"type":34,"value":2803},{"type":29,"tag":117,"props":18720,"children":18721},{"style":384},[18722],{"type":34,"value":3461},{"type":29,"tag":117,"props":18724,"children":18725},{"class":119,"line":189},[18726,18730,18734,18739,18743,18747],{"type":29,"tag":117,"props":18727,"children":18728},{"style":6700},[18729],{"type":34,"value":7687},{"type":29,"tag":117,"props":18731,"children":18732},{"style":384},[18733],{"type":34,"value":369},{"type":29,"tag":117,"props":18735,"children":18736},{"style":378},[18737],{"type":34,"value":18738},"width ",{"type":29,"tag":117,"props":18740,"children":18741},{"style":160},[18742],{"type":34,"value":6061},{"type":29,"tag":117,"props":18744,"children":18745},{"style":378},[18746],{"type":34,"value":18655},{"type":29,"tag":117,"props":18748,"children":18749},{"style":384},[18750],{"type":34,"value":387},{"type":29,"tag":117,"props":18752,"children":18753},{"class":119,"line":198},[18754],{"type":29,"tag":117,"props":18755,"children":18756},{"style":384},[18757],{"type":34,"value":5632},{"type":29,"tag":117,"props":18759,"children":18760},{"class":119,"line":207},[18761],{"type":29,"tag":117,"props":18762,"children":18763},{"emptyLinePlaceholder":13},[18764],{"type":34,"value":136},{"type":29,"tag":117,"props":18766,"children":18767},{"class":119,"line":215},[18768],{"type":29,"tag":117,"props":18769,"children":18770},{"emptyLinePlaceholder":13},[18771],{"type":34,"value":136},{"type":29,"tag":117,"props":18773,"children":18774},{"class":119,"line":224},[18775],{"type":29,"tag":117,"props":18776,"children":18777},{"emptyLinePlaceholder":13},[18778],{"type":34,"value":136},{"type":29,"tag":117,"props":18780,"children":18781},{"class":119,"line":233},[18782,18786,18790,18795,18799,18803,18807,18811],{"type":29,"tag":117,"props":18783,"children":18784},{"style":143},[18785],{"type":34,"value":7641},{"type":29,"tag":117,"props":18787,"children":18788},{"style":143},[18789],{"type":34,"value":7762},{"type":29,"tag":117,"props":18791,"children":18792},{"style":372},[18793],{"type":34,"value":18794}," setHeight",{"type":29,"tag":117,"props":18796,"children":18797},{"style":384},[18798],{"type":34,"value":1108},{"type":29,"tag":117,"props":18800,"children":18801},{"style":143},[18802],{"type":34,"value":5560},{"type":29,"tag":117,"props":18804,"children":18805},{"style":7657},[18806],{"type":34,"value":18675},{"type":29,"tag":117,"props":18808,"children":18809},{"style":384},[18810],{"type":34,"value":2803},{"type":29,"tag":117,"props":18812,"children":18813},{"style":384},[18814],{"type":34,"value":3461},{"type":29,"tag":117,"props":18816,"children":18817},{"class":119,"line":242},[18818,18822,18826,18831,18835,18839],{"type":29,"tag":117,"props":18819,"children":18820},{"style":6700},[18821],{"type":34,"value":7687},{"type":29,"tag":117,"props":18823,"children":18824},{"style":384},[18825],{"type":34,"value":369},{"type":29,"tag":117,"props":18827,"children":18828},{"style":378},[18829],{"type":34,"value":18830},"height ",{"type":29,"tag":117,"props":18832,"children":18833},{"style":160},[18834],{"type":34,"value":6061},{"type":29,"tag":117,"props":18836,"children":18837},{"style":378},[18838],{"type":34,"value":18675},{"type":29,"tag":117,"props":18840,"children":18841},{"style":384},[18842],{"type":34,"value":387},{"type":29,"tag":117,"props":18844,"children":18845},{"class":119,"line":251},[18846],{"type":29,"tag":117,"props":18847,"children":18848},{"style":384},[18849],{"type":34,"value":5632},{"type":29,"tag":117,"props":18851,"children":18852},{"class":119,"line":260},[18853],{"type":29,"tag":117,"props":18854,"children":18855},{"emptyLinePlaceholder":13},[18856],{"type":34,"value":136},{"type":29,"tag":117,"props":18858,"children":18859},{"class":119,"line":269},[18860,18864,18868,18873,18877],{"type":29,"tag":117,"props":18861,"children":18862},{"style":143},[18863],{"type":34,"value":7641},{"type":29,"tag":117,"props":18865,"children":18866},{"style":143},[18867],{"type":34,"value":5546},{"type":29,"tag":117,"props":18869,"children":18870},{"style":372},[18871],{"type":34,"value":18872}," getArea",{"type":29,"tag":117,"props":18874,"children":18875},{"style":384},[18876],{"type":34,"value":381},{"type":29,"tag":117,"props":18878,"children":18879},{"style":384},[18880],{"type":34,"value":3461},{"type":29,"tag":117,"props":18882,"children":18883},{"class":119,"line":278},[18884,18888,18893,18897,18901],{"type":29,"tag":117,"props":18885,"children":18886},{"style":143},[18887],{"type":34,"value":5616},{"type":29,"tag":117,"props":18889,"children":18890},{"style":378},[18891],{"type":34,"value":18892}," width ",{"type":29,"tag":117,"props":18894,"children":18895},{"style":160},[18896],{"type":34,"value":5649},{"type":29,"tag":117,"props":18898,"children":18899},{"style":378},[18900],{"type":34,"value":18675},{"type":29,"tag":117,"props":18902,"children":18903},{"style":384},[18904],{"type":34,"value":387},{"type":29,"tag":117,"props":18906,"children":18907},{"class":119,"line":286},[18908],{"type":29,"tag":117,"props":18909,"children":18910},{"style":384},[18911],{"type":34,"value":5632},{"type":29,"tag":117,"props":18913,"children":18914},{"class":119,"line":295},[18915],{"type":29,"tag":117,"props":18916,"children":18917},{"style":384},[18918],{"type":34,"value":2903},{"type":29,"tag":117,"props":18920,"children":18921},{"class":119,"line":304},[18922],{"type":29,"tag":117,"props":18923,"children":18924},{"emptyLinePlaceholder":13},[18925],{"type":34,"value":136},{"type":29,"tag":117,"props":18927,"children":18928},{"class":119,"line":313},[18929,18933,18937,18942,18947,18951],{"type":29,"tag":117,"props":18930,"children":18931},{"style":143},[18932],{"type":34,"value":5541},{"type":29,"tag":117,"props":18934,"children":18935},{"style":143},[18936],{"type":34,"value":7575},{"type":29,"tag":117,"props":18938,"children":18939},{"style":2863},[18940],{"type":34,"value":18941}," Square",{"type":29,"tag":117,"props":18943,"children":18944},{"style":143},[18945],{"type":34,"value":18946}," extends",{"type":29,"tag":117,"props":18948,"children":18949},{"style":2863},[18950],{"type":34,"value":18634},{"type":29,"tag":117,"props":18952,"children":18953},{"style":384},[18954],{"type":34,"value":3461},{"type":29,"tag":117,"props":18956,"children":18957},{"class":119,"line":322},[18958,18962],{"type":29,"tag":117,"props":18959,"children":18960},{"style":10083},[18961],{"type":34,"value":10086},{"type":29,"tag":117,"props":18963,"children":18964},{"style":10089},[18965],{"type":34,"value":17746},{"type":29,"tag":117,"props":18967,"children":18968},{"class":119,"line":331},[18969,18973,18977,18981,18985,18989,18993,18997],{"type":29,"tag":117,"props":18970,"children":18971},{"style":143},[18972],{"type":34,"value":7641},{"type":29,"tag":117,"props":18974,"children":18975},{"style":143},[18976],{"type":34,"value":7762},{"type":29,"tag":117,"props":18978,"children":18979},{"style":372},[18980],{"type":34,"value":18702},{"type":29,"tag":117,"props":18982,"children":18983},{"style":384},[18984],{"type":34,"value":1108},{"type":29,"tag":117,"props":18986,"children":18987},{"style":143},[18988],{"type":34,"value":5560},{"type":29,"tag":117,"props":18990,"children":18991},{"style":7657},[18992],{"type":34,"value":18655},{"type":29,"tag":117,"props":18994,"children":18995},{"style":384},[18996],{"type":34,"value":2803},{"type":29,"tag":117,"props":18998,"children":18999},{"style":384},[19000],{"type":34,"value":3461},{"type":29,"tag":117,"props":19002,"children":19003},{"class":119,"line":340},[19004,19008,19012,19016,19020,19024],{"type":29,"tag":117,"props":19005,"children":19006},{"style":6700},[19007],{"type":34,"value":7687},{"type":29,"tag":117,"props":19009,"children":19010},{"style":384},[19011],{"type":34,"value":369},{"type":29,"tag":117,"props":19013,"children":19014},{"style":378},[19015],{"type":34,"value":18738},{"type":29,"tag":117,"props":19017,"children":19018},{"style":160},[19019],{"type":34,"value":6061},{"type":29,"tag":117,"props":19021,"children":19022},{"style":378},[19023],{"type":34,"value":18655},{"type":29,"tag":117,"props":19025,"children":19026},{"style":384},[19027],{"type":34,"value":387},{"type":29,"tag":117,"props":19029,"children":19030},{"class":119,"line":348},[19031,19035,19039,19043,19047,19051,19055],{"type":29,"tag":117,"props":19032,"children":19033},{"style":6700},[19034],{"type":34,"value":7687},{"type":29,"tag":117,"props":19036,"children":19037},{"style":384},[19038],{"type":34,"value":369},{"type":29,"tag":117,"props":19040,"children":19041},{"style":378},[19042],{"type":34,"value":18830},{"type":29,"tag":117,"props":19044,"children":19045},{"style":160},[19046],{"type":34,"value":6061},{"type":29,"tag":117,"props":19048,"children":19049},{"style":378},[19050],{"type":34,"value":18655},{"type":29,"tag":117,"props":19052,"children":19053},{"style":384},[19054],{"type":34,"value":2722},{"type":29,"tag":117,"props":19056,"children":19057},{"style":124},[19058],{"type":34,"value":19059}," \u002F\u002F Contraintes du carré\n",{"type":29,"tag":117,"props":19061,"children":19062},{"class":119,"line":357},[19063],{"type":29,"tag":117,"props":19064,"children":19065},{"style":384},[19066],{"type":34,"value":5632},{"type":29,"tag":117,"props":19068,"children":19069},{"class":119,"line":1768},[19070],{"type":29,"tag":117,"props":19071,"children":19072},{"emptyLinePlaceholder":13},[19073],{"type":34,"value":136},{"type":29,"tag":117,"props":19075,"children":19076},{"class":119,"line":953},[19077,19081],{"type":29,"tag":117,"props":19078,"children":19079},{"style":10083},[19080],{"type":34,"value":10086},{"type":29,"tag":117,"props":19082,"children":19083},{"style":10089},[19084],{"type":34,"value":17746},{"type":29,"tag":117,"props":19086,"children":19087},{"class":119,"line":9833},[19088,19092,19096,19100,19104,19108,19112,19116],{"type":29,"tag":117,"props":19089,"children":19090},{"style":143},[19091],{"type":34,"value":7641},{"type":29,"tag":117,"props":19093,"children":19094},{"style":143},[19095],{"type":34,"value":7762},{"type":29,"tag":117,"props":19097,"children":19098},{"style":372},[19099],{"type":34,"value":18794},{"type":29,"tag":117,"props":19101,"children":19102},{"style":384},[19103],{"type":34,"value":1108},{"type":29,"tag":117,"props":19105,"children":19106},{"style":143},[19107],{"type":34,"value":5560},{"type":29,"tag":117,"props":19109,"children":19110},{"style":7657},[19111],{"type":34,"value":18675},{"type":29,"tag":117,"props":19113,"children":19114},{"style":384},[19115],{"type":34,"value":2803},{"type":29,"tag":117,"props":19117,"children":19118},{"style":384},[19119],{"type":34,"value":3461},{"type":29,"tag":117,"props":19121,"children":19122},{"class":119,"line":9870},[19123,19127,19131,19135,19139,19143],{"type":29,"tag":117,"props":19124,"children":19125},{"style":6700},[19126],{"type":34,"value":7687},{"type":29,"tag":117,"props":19128,"children":19129},{"style":384},[19130],{"type":34,"value":369},{"type":29,"tag":117,"props":19132,"children":19133},{"style":378},[19134],{"type":34,"value":18830},{"type":29,"tag":117,"props":19136,"children":19137},{"style":160},[19138],{"type":34,"value":6061},{"type":29,"tag":117,"props":19140,"children":19141},{"style":378},[19142],{"type":34,"value":18675},{"type":29,"tag":117,"props":19144,"children":19145},{"style":384},[19146],{"type":34,"value":387},{"type":29,"tag":117,"props":19148,"children":19149},{"class":119,"line":9901},[19150,19154,19158,19162,19166,19170,19174],{"type":29,"tag":117,"props":19151,"children":19152},{"style":6700},[19153],{"type":34,"value":7687},{"type":29,"tag":117,"props":19155,"children":19156},{"style":384},[19157],{"type":34,"value":369},{"type":29,"tag":117,"props":19159,"children":19160},{"style":378},[19161],{"type":34,"value":18738},{"type":29,"tag":117,"props":19163,"children":19164},{"style":160},[19165],{"type":34,"value":6061},{"type":29,"tag":117,"props":19167,"children":19168},{"style":378},[19169],{"type":34,"value":18675},{"type":29,"tag":117,"props":19171,"children":19172},{"style":384},[19173],{"type":34,"value":2722},{"type":29,"tag":117,"props":19175,"children":19176},{"style":124},[19177],{"type":34,"value":19059},{"type":29,"tag":117,"props":19179,"children":19180},{"class":119,"line":9909},[19181],{"type":29,"tag":117,"props":19182,"children":19183},{"style":384},[19184],{"type":34,"value":5632},{"type":29,"tag":117,"props":19186,"children":19188},{"class":119,"line":19187},32,[19189],{"type":29,"tag":117,"props":19190,"children":19191},{"style":384},[19192],{"type":34,"value":2903},{"type":29,"tag":30,"props":19194,"children":19195},{},[19196,19198,19203,19205,19210,19212,19218,19219,19225],{"type":34,"value":19197},"À première vue, cela semble correct. Cependant, cette implémentation brise le principe de substitution de Liskov. Si l'on remplace un ",{"type":29,"tag":113,"props":19199,"children":19201},{"className":19200},[],[19202],{"type":34,"value":18577},{"type":34,"value":19204}," par un ",{"type":29,"tag":113,"props":19206,"children":19208},{"className":19207},[],[19209],{"type":34,"value":18585},{"type":34,"value":19211},", le comportement de la méthode ",{"type":29,"tag":113,"props":19213,"children":19215},{"className":19214},[],[19216],{"type":34,"value":19217},"setWidth()",{"type":34,"value":14287},{"type":29,"tag":113,"props":19220,"children":19222},{"className":19221},[],[19223],{"type":34,"value":19224},"setHeight()",{"type":34,"value":19226}," devient imprévisible. Un carré ne peut pas fonctionner exactement comme un rectangle, car modifier la largeur affecte également la hauteur (et vice versa). Cela peut causer des bugs, notamment si on essaye de modifier indépendamment la largeur et la hauteur d’un carré en tant que rectangle.",{"type":29,"tag":7528,"props":19228,"children":19230},{"id":19229},"exemple-avec-lsp-appliqué",[19231],{"type":34,"value":19232},"Exemple avec LSP appliqué :",{"type":29,"tag":30,"props":19234,"children":19235},{},[19236],{"type":34,"value":19237},"Pour respecter le principe de substitution de Liskov, il est préférable d’éviter d’utiliser l’héritage ici, car un carré n'est pas un rectangle en termes de comportement. Nous devrions plutôt créer des classes distinctes qui n’essaient pas d’être substituées l'une à l'autre.",{"type":29,"tag":106,"props":19239,"children":19241},{"className":5519,"code":19240,"language":5521,"meta":8,"style":8},"\u002F\u002F Classe Rectangle\npublic class Rectangle {\n    private int width;\n    private int height;\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n\n    public int getArea() {\n        return width * height;\n    }\n}\n\n\u002F\u002F Classe Square avec son propre comportement\npublic class Square {\n    private int side;\n\n    public void setSide(int side) {\n        this.side = side;\n    }\n\n    public int getArea() {\n        return side * side;\n    }\n}\n",[19242],{"type":29,"tag":113,"props":19243,"children":19244},{"__ignoreMap":8},[19245,19253,19272,19291,19310,19317,19352,19379,19386,19393,19428,19455,19462,19469,19492,19515,19522,19529,19536,19544,19563,19583,19590,19626,19654,19661,19668,19691,19715,19722],{"type":29,"tag":117,"props":19246,"children":19247},{"class":119,"line":120},[19248],{"type":29,"tag":117,"props":19249,"children":19250},{"style":124},[19251],{"type":34,"value":19252},"\u002F\u002F Classe Rectangle\n",{"type":29,"tag":117,"props":19254,"children":19255},{"class":119,"line":130},[19256,19260,19264,19268],{"type":29,"tag":117,"props":19257,"children":19258},{"style":143},[19259],{"type":34,"value":5541},{"type":29,"tag":117,"props":19261,"children":19262},{"style":143},[19263],{"type":34,"value":7575},{"type":29,"tag":117,"props":19265,"children":19266},{"style":2863},[19267],{"type":34,"value":18634},{"type":29,"tag":117,"props":19269,"children":19270},{"style":384},[19271],{"type":34,"value":3461},{"type":29,"tag":117,"props":19273,"children":19274},{"class":119,"line":139},[19275,19279,19283,19287],{"type":29,"tag":117,"props":19276,"children":19277},{"style":143},[19278],{"type":34,"value":7592},{"type":29,"tag":117,"props":19280,"children":19281},{"style":143},[19282],{"type":34,"value":5546},{"type":29,"tag":117,"props":19284,"children":19285},{"style":378},[19286],{"type":34,"value":18655},{"type":29,"tag":117,"props":19288,"children":19289},{"style":384},[19290],{"type":34,"value":387},{"type":29,"tag":117,"props":19292,"children":19293},{"class":119,"line":172},[19294,19298,19302,19306],{"type":29,"tag":117,"props":19295,"children":19296},{"style":143},[19297],{"type":34,"value":7592},{"type":29,"tag":117,"props":19299,"children":19300},{"style":143},[19301],{"type":34,"value":5546},{"type":29,"tag":117,"props":19303,"children":19304},{"style":378},[19305],{"type":34,"value":18675},{"type":29,"tag":117,"props":19307,"children":19308},{"style":384},[19309],{"type":34,"value":387},{"type":29,"tag":117,"props":19311,"children":19312},{"class":119,"line":181},[19313],{"type":29,"tag":117,"props":19314,"children":19315},{"emptyLinePlaceholder":13},[19316],{"type":34,"value":136},{"type":29,"tag":117,"props":19318,"children":19319},{"class":119,"line":189},[19320,19324,19328,19332,19336,19340,19344,19348],{"type":29,"tag":117,"props":19321,"children":19322},{"style":143},[19323],{"type":34,"value":7641},{"type":29,"tag":117,"props":19325,"children":19326},{"style":143},[19327],{"type":34,"value":7762},{"type":29,"tag":117,"props":19329,"children":19330},{"style":372},[19331],{"type":34,"value":18702},{"type":29,"tag":117,"props":19333,"children":19334},{"style":384},[19335],{"type":34,"value":1108},{"type":29,"tag":117,"props":19337,"children":19338},{"style":143},[19339],{"type":34,"value":5560},{"type":29,"tag":117,"props":19341,"children":19342},{"style":7657},[19343],{"type":34,"value":18655},{"type":29,"tag":117,"props":19345,"children":19346},{"style":384},[19347],{"type":34,"value":2803},{"type":29,"tag":117,"props":19349,"children":19350},{"style":384},[19351],{"type":34,"value":3461},{"type":29,"tag":117,"props":19353,"children":19354},{"class":119,"line":198},[19355,19359,19363,19367,19371,19375],{"type":29,"tag":117,"props":19356,"children":19357},{"style":6700},[19358],{"type":34,"value":7687},{"type":29,"tag":117,"props":19360,"children":19361},{"style":384},[19362],{"type":34,"value":369},{"type":29,"tag":117,"props":19364,"children":19365},{"style":378},[19366],{"type":34,"value":18738},{"type":29,"tag":117,"props":19368,"children":19369},{"style":160},[19370],{"type":34,"value":6061},{"type":29,"tag":117,"props":19372,"children":19373},{"style":378},[19374],{"type":34,"value":18655},{"type":29,"tag":117,"props":19376,"children":19377},{"style":384},[19378],{"type":34,"value":387},{"type":29,"tag":117,"props":19380,"children":19381},{"class":119,"line":207},[19382],{"type":29,"tag":117,"props":19383,"children":19384},{"style":384},[19385],{"type":34,"value":5632},{"type":29,"tag":117,"props":19387,"children":19388},{"class":119,"line":215},[19389],{"type":29,"tag":117,"props":19390,"children":19391},{"emptyLinePlaceholder":13},[19392],{"type":34,"value":136},{"type":29,"tag":117,"props":19394,"children":19395},{"class":119,"line":224},[19396,19400,19404,19408,19412,19416,19420,19424],{"type":29,"tag":117,"props":19397,"children":19398},{"style":143},[19399],{"type":34,"value":7641},{"type":29,"tag":117,"props":19401,"children":19402},{"style":143},[19403],{"type":34,"value":7762},{"type":29,"tag":117,"props":19405,"children":19406},{"style":372},[19407],{"type":34,"value":18794},{"type":29,"tag":117,"props":19409,"children":19410},{"style":384},[19411],{"type":34,"value":1108},{"type":29,"tag":117,"props":19413,"children":19414},{"style":143},[19415],{"type":34,"value":5560},{"type":29,"tag":117,"props":19417,"children":19418},{"style":7657},[19419],{"type":34,"value":18675},{"type":29,"tag":117,"props":19421,"children":19422},{"style":384},[19423],{"type":34,"value":2803},{"type":29,"tag":117,"props":19425,"children":19426},{"style":384},[19427],{"type":34,"value":3461},{"type":29,"tag":117,"props":19429,"children":19430},{"class":119,"line":233},[19431,19435,19439,19443,19447,19451],{"type":29,"tag":117,"props":19432,"children":19433},{"style":6700},[19434],{"type":34,"value":7687},{"type":29,"tag":117,"props":19436,"children":19437},{"style":384},[19438],{"type":34,"value":369},{"type":29,"tag":117,"props":19440,"children":19441},{"style":378},[19442],{"type":34,"value":18830},{"type":29,"tag":117,"props":19444,"children":19445},{"style":160},[19446],{"type":34,"value":6061},{"type":29,"tag":117,"props":19448,"children":19449},{"style":378},[19450],{"type":34,"value":18675},{"type":29,"tag":117,"props":19452,"children":19453},{"style":384},[19454],{"type":34,"value":387},{"type":29,"tag":117,"props":19456,"children":19457},{"class":119,"line":242},[19458],{"type":29,"tag":117,"props":19459,"children":19460},{"style":384},[19461],{"type":34,"value":5632},{"type":29,"tag":117,"props":19463,"children":19464},{"class":119,"line":251},[19465],{"type":29,"tag":117,"props":19466,"children":19467},{"emptyLinePlaceholder":13},[19468],{"type":34,"value":136},{"type":29,"tag":117,"props":19470,"children":19471},{"class":119,"line":260},[19472,19476,19480,19484,19488],{"type":29,"tag":117,"props":19473,"children":19474},{"style":143},[19475],{"type":34,"value":7641},{"type":29,"tag":117,"props":19477,"children":19478},{"style":143},[19479],{"type":34,"value":5546},{"type":29,"tag":117,"props":19481,"children":19482},{"style":372},[19483],{"type":34,"value":18872},{"type":29,"tag":117,"props":19485,"children":19486},{"style":384},[19487],{"type":34,"value":381},{"type":29,"tag":117,"props":19489,"children":19490},{"style":384},[19491],{"type":34,"value":3461},{"type":29,"tag":117,"props":19493,"children":19494},{"class":119,"line":269},[19495,19499,19503,19507,19511],{"type":29,"tag":117,"props":19496,"children":19497},{"style":143},[19498],{"type":34,"value":5616},{"type":29,"tag":117,"props":19500,"children":19501},{"style":378},[19502],{"type":34,"value":18892},{"type":29,"tag":117,"props":19504,"children":19505},{"style":160},[19506],{"type":34,"value":5649},{"type":29,"tag":117,"props":19508,"children":19509},{"style":378},[19510],{"type":34,"value":18675},{"type":29,"tag":117,"props":19512,"children":19513},{"style":384},[19514],{"type":34,"value":387},{"type":29,"tag":117,"props":19516,"children":19517},{"class":119,"line":278},[19518],{"type":29,"tag":117,"props":19519,"children":19520},{"style":384},[19521],{"type":34,"value":5632},{"type":29,"tag":117,"props":19523,"children":19524},{"class":119,"line":286},[19525],{"type":29,"tag":117,"props":19526,"children":19527},{"style":384},[19528],{"type":34,"value":2903},{"type":29,"tag":117,"props":19530,"children":19531},{"class":119,"line":295},[19532],{"type":29,"tag":117,"props":19533,"children":19534},{"emptyLinePlaceholder":13},[19535],{"type":34,"value":136},{"type":29,"tag":117,"props":19537,"children":19538},{"class":119,"line":304},[19539],{"type":29,"tag":117,"props":19540,"children":19541},{"style":124},[19542],{"type":34,"value":19543},"\u002F\u002F Classe Square avec son propre comportement\n",{"type":29,"tag":117,"props":19545,"children":19546},{"class":119,"line":313},[19547,19551,19555,19559],{"type":29,"tag":117,"props":19548,"children":19549},{"style":143},[19550],{"type":34,"value":5541},{"type":29,"tag":117,"props":19552,"children":19553},{"style":143},[19554],{"type":34,"value":7575},{"type":29,"tag":117,"props":19556,"children":19557},{"style":2863},[19558],{"type":34,"value":18941},{"type":29,"tag":117,"props":19560,"children":19561},{"style":384},[19562],{"type":34,"value":3461},{"type":29,"tag":117,"props":19564,"children":19565},{"class":119,"line":322},[19566,19570,19574,19579],{"type":29,"tag":117,"props":19567,"children":19568},{"style":143},[19569],{"type":34,"value":7592},{"type":29,"tag":117,"props":19571,"children":19572},{"style":143},[19573],{"type":34,"value":5546},{"type":29,"tag":117,"props":19575,"children":19576},{"style":378},[19577],{"type":34,"value":19578}," side",{"type":29,"tag":117,"props":19580,"children":19581},{"style":384},[19582],{"type":34,"value":387},{"type":29,"tag":117,"props":19584,"children":19585},{"class":119,"line":331},[19586],{"type":29,"tag":117,"props":19587,"children":19588},{"emptyLinePlaceholder":13},[19589],{"type":34,"value":136},{"type":29,"tag":117,"props":19591,"children":19592},{"class":119,"line":340},[19593,19597,19601,19606,19610,19614,19618,19622],{"type":29,"tag":117,"props":19594,"children":19595},{"style":143},[19596],{"type":34,"value":7641},{"type":29,"tag":117,"props":19598,"children":19599},{"style":143},[19600],{"type":34,"value":7762},{"type":29,"tag":117,"props":19602,"children":19603},{"style":372},[19604],{"type":34,"value":19605}," setSide",{"type":29,"tag":117,"props":19607,"children":19608},{"style":384},[19609],{"type":34,"value":1108},{"type":29,"tag":117,"props":19611,"children":19612},{"style":143},[19613],{"type":34,"value":5560},{"type":29,"tag":117,"props":19615,"children":19616},{"style":7657},[19617],{"type":34,"value":19578},{"type":29,"tag":117,"props":19619,"children":19620},{"style":384},[19621],{"type":34,"value":2803},{"type":29,"tag":117,"props":19623,"children":19624},{"style":384},[19625],{"type":34,"value":3461},{"type":29,"tag":117,"props":19627,"children":19628},{"class":119,"line":348},[19629,19633,19637,19642,19646,19650],{"type":29,"tag":117,"props":19630,"children":19631},{"style":6700},[19632],{"type":34,"value":7687},{"type":29,"tag":117,"props":19634,"children":19635},{"style":384},[19636],{"type":34,"value":369},{"type":29,"tag":117,"props":19638,"children":19639},{"style":378},[19640],{"type":34,"value":19641},"side ",{"type":29,"tag":117,"props":19643,"children":19644},{"style":160},[19645],{"type":34,"value":6061},{"type":29,"tag":117,"props":19647,"children":19648},{"style":378},[19649],{"type":34,"value":19578},{"type":29,"tag":117,"props":19651,"children":19652},{"style":384},[19653],{"type":34,"value":387},{"type":29,"tag":117,"props":19655,"children":19656},{"class":119,"line":357},[19657],{"type":29,"tag":117,"props":19658,"children":19659},{"style":384},[19660],{"type":34,"value":5632},{"type":29,"tag":117,"props":19662,"children":19663},{"class":119,"line":1768},[19664],{"type":29,"tag":117,"props":19665,"children":19666},{"emptyLinePlaceholder":13},[19667],{"type":34,"value":136},{"type":29,"tag":117,"props":19669,"children":19670},{"class":119,"line":953},[19671,19675,19679,19683,19687],{"type":29,"tag":117,"props":19672,"children":19673},{"style":143},[19674],{"type":34,"value":7641},{"type":29,"tag":117,"props":19676,"children":19677},{"style":143},[19678],{"type":34,"value":5546},{"type":29,"tag":117,"props":19680,"children":19681},{"style":372},[19682],{"type":34,"value":18872},{"type":29,"tag":117,"props":19684,"children":19685},{"style":384},[19686],{"type":34,"value":381},{"type":29,"tag":117,"props":19688,"children":19689},{"style":384},[19690],{"type":34,"value":3461},{"type":29,"tag":117,"props":19692,"children":19693},{"class":119,"line":9833},[19694,19698,19703,19707,19711],{"type":29,"tag":117,"props":19695,"children":19696},{"style":143},[19697],{"type":34,"value":5616},{"type":29,"tag":117,"props":19699,"children":19700},{"style":378},[19701],{"type":34,"value":19702}," side ",{"type":29,"tag":117,"props":19704,"children":19705},{"style":160},[19706],{"type":34,"value":5649},{"type":29,"tag":117,"props":19708,"children":19709},{"style":378},[19710],{"type":34,"value":19578},{"type":29,"tag":117,"props":19712,"children":19713},{"style":384},[19714],{"type":34,"value":387},{"type":29,"tag":117,"props":19716,"children":19717},{"class":119,"line":9870},[19718],{"type":29,"tag":117,"props":19719,"children":19720},{"style":384},[19721],{"type":34,"value":5632},{"type":29,"tag":117,"props":19723,"children":19724},{"class":119,"line":9901},[19725],{"type":29,"tag":117,"props":19726,"children":19727},{"style":384},[19728],{"type":34,"value":2903},{"type":29,"tag":51,"props":19730,"children":19731},{},[],{"type":29,"tag":5462,"props":19733,"children":19734},{"type":5464},[19735],{"type":29,"tag":30,"props":19736,"children":19737},{},[19738,19743],{"type":29,"tag":45,"props":19739,"children":19740},{},[19741],{"type":34,"value":19742},"Évitez l'héritage si les comportements diffèrent",{"type":34,"value":19744}," trop entre la classe parente et la sous-classe. Utilisez des classes séparées ou le polymorphisme si nécessaire, pour éviter les surprises lors de l'exécution du programme.",{"type":29,"tag":55,"props":19746,"children":19748},{"id":19747},"_4-principe-de-ségrégation-des-interfaces-interface-segregation-principle-isp",[19749],{"type":34,"value":19750},"4. Principe de Ségrégation des Interfaces (Interface Segregation Principle - ISP)",{"type":29,"tag":30,"props":19752,"children":19753},{},[19754],{"type":34,"value":19755},"Le principe de ségrégation des interfaces stipule qu'un client ne doit pas être forcé d'implémenter des interfaces dont il n'a pas besoin. Cela signifie qu’il vaut mieux avoir plusieurs petites interfaces spécifiques à des besoins qu'une seule interface générale contenant des méthodes inutiles pour certains clients.",{"type":29,"tag":4530,"props":19757,"children":19759},{"id":19758},"pourquoi-cest-important-3",[19760],{"type":34,"value":16515},{"type":29,"tag":30,"props":19762,"children":19763},{},[19764],{"type":34,"value":19765},"Une interface trop large oblige toutes les classes qui l'implémentent à porter des méthodes inutiles. Le couplage explose et le code devient pénible à maintenir. Diviser cette interface en plusieurs interfaces ciblées ramène chaque classe à ce qu'elle fait réellement, et le système redevient modulaire.",{"type":29,"tag":4530,"props":19767,"children":19769},{"id":19768},"exemple-concret-en-java-3",[19770],{"type":34,"value":16526},{"type":29,"tag":30,"props":19772,"children":19773},{},[19774,19776,19782],{"type":34,"value":19775},"Imaginons que nous ayons un système qui gère différentes sortes d'oiseaux. Nous avons une interface ",{"type":29,"tag":113,"props":19777,"children":19779},{"className":19778},[],[19780],{"type":34,"value":19781},"Bird",{"type":34,"value":19783}," qui contient des méthodes communes pour les oiseaux.",{"type":29,"tag":7528,"props":19785,"children":19787},{"id":19786},"exemple-sans-isp",[19788],{"type":34,"value":19789},"Exemple sans ISP :",{"type":29,"tag":30,"props":19791,"children":19792},{},[19793],{"type":34,"value":19794},"Voici une interface qui regroupe trop de responsabilités :",{"type":29,"tag":106,"props":19796,"children":19798},{"className":5519,"code":19797,"language":5521,"meta":8,"style":8},"public interface Bird {\n    void fly();\n    void swim();\n    void makeSound();\n}\n",[19799],{"type":29,"tag":113,"props":19800,"children":19801},{"__ignoreMap":8},[19802,19822,19838,19854,19870],{"type":29,"tag":117,"props":19803,"children":19804},{"class":119,"line":120},[19805,19809,19813,19818],{"type":29,"tag":117,"props":19806,"children":19807},{"style":143},[19808],{"type":34,"value":5541},{"type":29,"tag":117,"props":19810,"children":19811},{"style":143},[19812],{"type":34,"value":8561},{"type":29,"tag":117,"props":19814,"children":19815},{"style":2863},[19816],{"type":34,"value":19817}," Bird",{"type":29,"tag":117,"props":19819,"children":19820},{"style":384},[19821],{"type":34,"value":3461},{"type":29,"tag":117,"props":19823,"children":19824},{"class":119,"line":130},[19825,19829,19834],{"type":29,"tag":117,"props":19826,"children":19827},{"style":143},[19828],{"type":34,"value":8578},{"type":29,"tag":117,"props":19830,"children":19831},{"style":372},[19832],{"type":34,"value":19833}," fly",{"type":29,"tag":117,"props":19835,"children":19836},{"style":384},[19837],{"type":34,"value":9375},{"type":29,"tag":117,"props":19839,"children":19840},{"class":119,"line":139},[19841,19845,19850],{"type":29,"tag":117,"props":19842,"children":19843},{"style":143},[19844],{"type":34,"value":8578},{"type":29,"tag":117,"props":19846,"children":19847},{"style":372},[19848],{"type":34,"value":19849}," swim",{"type":29,"tag":117,"props":19851,"children":19852},{"style":384},[19853],{"type":34,"value":9375},{"type":29,"tag":117,"props":19855,"children":19856},{"class":119,"line":172},[19857,19861,19866],{"type":29,"tag":117,"props":19858,"children":19859},{"style":143},[19860],{"type":34,"value":8578},{"type":29,"tag":117,"props":19862,"children":19863},{"style":372},[19864],{"type":34,"value":19865}," makeSound",{"type":29,"tag":117,"props":19867,"children":19868},{"style":384},[19869],{"type":34,"value":9375},{"type":29,"tag":117,"props":19871,"children":19872},{"class":119,"line":181},[19873],{"type":29,"tag":117,"props":19874,"children":19875},{"style":384},[19876],{"type":34,"value":2903},{"type":29,"tag":30,"props":19878,"children":19879},{},[19880,19882,19888,19889,19895,19896,19902],{"type":34,"value":19881},"Toutes les classes qui implémentent cette interface devront fournir des implémentations pour ",{"type":29,"tag":113,"props":19883,"children":19885},{"className":19884},[],[19886],{"type":34,"value":19887},"fly()",{"type":34,"value":2468},{"type":29,"tag":113,"props":19890,"children":19892},{"className":19891},[],[19893],{"type":34,"value":19894},"swim()",{"type":34,"value":4679},{"type":29,"tag":113,"props":19897,"children":19899},{"className":19898},[],[19900],{"type":34,"value":19901},"makeSound()",{"type":34,"value":19903},". Cela peut poser problème pour des oiseaux comme les pingouins, qui ne volent pas mais nagent, ou les autruches, qui ne nagent ni ne volent.",{"type":29,"tag":30,"props":19905,"children":19906},{},[19907],{"type":34,"value":19908},"Voici une implémentation pour un pingouin, qui enfreint clairement l'ISP :",{"type":29,"tag":106,"props":19910,"children":19912},{"className":5519,"code":19911,"language":5521,"meta":8,"style":8},"public class Penguin implements Bird {\n    @Override\n    public void fly() {\n        \u002F\u002F Pingouin ne peut pas voler, on laisse la méthode vide\n    }\n\n    @Override\n    public void swim() {\n        System.out.println(\"Le pingouin nage.\");\n    }\n\n    @Override\n    public void makeSound() {\n        System.out.println(\"Le pingouin émet un son.\");\n    }\n}\n",[19913],{"type":29,"tag":113,"props":19914,"children":19915},{"__ignoreMap":8},[19916,19944,19955,19978,19986,19993,20000,20011,20034,20070,20077,20084,20095,20118,20154,20161],{"type":29,"tag":117,"props":19917,"children":19918},{"class":119,"line":120},[19919,19923,19927,19932,19936,19940],{"type":29,"tag":117,"props":19920,"children":19921},{"style":143},[19922],{"type":34,"value":5541},{"type":29,"tag":117,"props":19924,"children":19925},{"style":143},[19926],{"type":34,"value":7575},{"type":29,"tag":117,"props":19928,"children":19929},{"style":2863},[19930],{"type":34,"value":19931}," Penguin",{"type":29,"tag":117,"props":19933,"children":19934},{"style":143},[19935],{"type":34,"value":8636},{"type":29,"tag":117,"props":19937,"children":19938},{"style":2863},[19939],{"type":34,"value":19817},{"type":29,"tag":117,"props":19941,"children":19942},{"style":384},[19943],{"type":34,"value":3461},{"type":29,"tag":117,"props":19945,"children":19946},{"class":119,"line":130},[19947,19951],{"type":29,"tag":117,"props":19948,"children":19949},{"style":10083},[19950],{"type":34,"value":10086},{"type":29,"tag":117,"props":19952,"children":19953},{"style":10089},[19954],{"type":34,"value":17746},{"type":29,"tag":117,"props":19956,"children":19957},{"class":119,"line":139},[19958,19962,19966,19970,19974],{"type":29,"tag":117,"props":19959,"children":19960},{"style":143},[19961],{"type":34,"value":7641},{"type":29,"tag":117,"props":19963,"children":19964},{"style":143},[19965],{"type":34,"value":7762},{"type":29,"tag":117,"props":19967,"children":19968},{"style":372},[19969],{"type":34,"value":19833},{"type":29,"tag":117,"props":19971,"children":19972},{"style":384},[19973],{"type":34,"value":381},{"type":29,"tag":117,"props":19975,"children":19976},{"style":384},[19977],{"type":34,"value":3461},{"type":29,"tag":117,"props":19979,"children":19980},{"class":119,"line":172},[19981],{"type":29,"tag":117,"props":19982,"children":19983},{"style":124},[19984],{"type":34,"value":19985},"        \u002F\u002F Pingouin ne peut pas voler, on laisse la méthode vide\n",{"type":29,"tag":117,"props":19987,"children":19988},{"class":119,"line":181},[19989],{"type":29,"tag":117,"props":19990,"children":19991},{"style":384},[19992],{"type":34,"value":5632},{"type":29,"tag":117,"props":19994,"children":19995},{"class":119,"line":189},[19996],{"type":29,"tag":117,"props":19997,"children":19998},{"emptyLinePlaceholder":13},[19999],{"type":34,"value":136},{"type":29,"tag":117,"props":20001,"children":20002},{"class":119,"line":198},[20003,20007],{"type":29,"tag":117,"props":20004,"children":20005},{"style":10083},[20006],{"type":34,"value":10086},{"type":29,"tag":117,"props":20008,"children":20009},{"style":10089},[20010],{"type":34,"value":17746},{"type":29,"tag":117,"props":20012,"children":20013},{"class":119,"line":207},[20014,20018,20022,20026,20030],{"type":29,"tag":117,"props":20015,"children":20016},{"style":143},[20017],{"type":34,"value":7641},{"type":29,"tag":117,"props":20019,"children":20020},{"style":143},[20021],{"type":34,"value":7762},{"type":29,"tag":117,"props":20023,"children":20024},{"style":372},[20025],{"type":34,"value":19849},{"type":29,"tag":117,"props":20027,"children":20028},{"style":384},[20029],{"type":34,"value":381},{"type":29,"tag":117,"props":20031,"children":20032},{"style":384},[20033],{"type":34,"value":3461},{"type":29,"tag":117,"props":20035,"children":20036},{"class":119,"line":215},[20037,20041,20045,20049,20053,20057,20061,20066],{"type":29,"tag":117,"props":20038,"children":20039},{"style":378},[20040],{"type":34,"value":16717},{"type":29,"tag":117,"props":20042,"children":20043},{"style":384},[20044],{"type":34,"value":369},{"type":29,"tag":117,"props":20046,"children":20047},{"style":378},[20048],{"type":34,"value":15075},{"type":29,"tag":117,"props":20050,"children":20051},{"style":384},[20052],{"type":34,"value":369},{"type":29,"tag":117,"props":20054,"children":20055},{"style":372},[20056],{"type":34,"value":15084},{"type":29,"tag":117,"props":20058,"children":20059},{"style":384},[20060],{"type":34,"value":1108},{"type":29,"tag":117,"props":20062,"children":20063},{"style":166},[20064],{"type":34,"value":20065},"\"Le pingouin nage.\"",{"type":29,"tag":117,"props":20067,"children":20068},{"style":384},[20069],{"type":34,"value":5675},{"type":29,"tag":117,"props":20071,"children":20072},{"class":119,"line":224},[20073],{"type":29,"tag":117,"props":20074,"children":20075},{"style":384},[20076],{"type":34,"value":5632},{"type":29,"tag":117,"props":20078,"children":20079},{"class":119,"line":233},[20080],{"type":29,"tag":117,"props":20081,"children":20082},{"emptyLinePlaceholder":13},[20083],{"type":34,"value":136},{"type":29,"tag":117,"props":20085,"children":20086},{"class":119,"line":242},[20087,20091],{"type":29,"tag":117,"props":20088,"children":20089},{"style":10083},[20090],{"type":34,"value":10086},{"type":29,"tag":117,"props":20092,"children":20093},{"style":10089},[20094],{"type":34,"value":17746},{"type":29,"tag":117,"props":20096,"children":20097},{"class":119,"line":251},[20098,20102,20106,20110,20114],{"type":29,"tag":117,"props":20099,"children":20100},{"style":143},[20101],{"type":34,"value":7641},{"type":29,"tag":117,"props":20103,"children":20104},{"style":143},[20105],{"type":34,"value":7762},{"type":29,"tag":117,"props":20107,"children":20108},{"style":372},[20109],{"type":34,"value":19865},{"type":29,"tag":117,"props":20111,"children":20112},{"style":384},[20113],{"type":34,"value":381},{"type":29,"tag":117,"props":20115,"children":20116},{"style":384},[20117],{"type":34,"value":3461},{"type":29,"tag":117,"props":20119,"children":20120},{"class":119,"line":260},[20121,20125,20129,20133,20137,20141,20145,20150],{"type":29,"tag":117,"props":20122,"children":20123},{"style":378},[20124],{"type":34,"value":16717},{"type":29,"tag":117,"props":20126,"children":20127},{"style":384},[20128],{"type":34,"value":369},{"type":29,"tag":117,"props":20130,"children":20131},{"style":378},[20132],{"type":34,"value":15075},{"type":29,"tag":117,"props":20134,"children":20135},{"style":384},[20136],{"type":34,"value":369},{"type":29,"tag":117,"props":20138,"children":20139},{"style":372},[20140],{"type":34,"value":15084},{"type":29,"tag":117,"props":20142,"children":20143},{"style":384},[20144],{"type":34,"value":1108},{"type":29,"tag":117,"props":20146,"children":20147},{"style":166},[20148],{"type":34,"value":20149},"\"Le pingouin émet un son.\"",{"type":29,"tag":117,"props":20151,"children":20152},{"style":384},[20153],{"type":34,"value":5675},{"type":29,"tag":117,"props":20155,"children":20156},{"class":119,"line":269},[20157],{"type":29,"tag":117,"props":20158,"children":20159},{"style":384},[20160],{"type":34,"value":5632},{"type":29,"tag":117,"props":20162,"children":20163},{"class":119,"line":278},[20164],{"type":29,"tag":117,"props":20165,"children":20166},{"style":384},[20167],{"type":34,"value":2903},{"type":29,"tag":30,"props":20169,"children":20170},{},[20171,20173,20178,20180,20185],{"type":34,"value":20172},"La méthode ",{"type":29,"tag":113,"props":20174,"children":20176},{"className":20175},[],[20177],{"type":34,"value":19887},{"type":34,"value":20179}," est ici inutile, mais nous devons quand même la définir parce que l'interface ",{"type":29,"tag":113,"props":20181,"children":20183},{"className":20182},[],[20184],{"type":34,"value":19781},{"type":34,"value":20186}," l'impose. Cela entraîne du code mort et une mauvaise conception.",{"type":29,"tag":7528,"props":20188,"children":20190},{"id":20189},"exemple-avec-isp-appliqué",[20191],{"type":34,"value":20192},"Exemple avec ISP appliqué :",{"type":29,"tag":30,"props":20194,"children":20195},{},[20196,20198,20203],{"type":34,"value":20197},"Pour corriger cela, nous allons séparer l'interface ",{"type":29,"tag":113,"props":20199,"children":20201},{"className":20200},[],[20202],{"type":34,"value":19781},{"type":34,"value":20204}," en plusieurs petites interfaces spécifiques à des capacités d’oiseaux.",{"type":29,"tag":106,"props":20206,"children":20208},{"className":5519,"code":20207,"language":5521,"meta":8,"style":8},"\u002F\u002F Interface pour les oiseaux qui volent\npublic interface FlyingBird {\n    void fly();\n}\n\n\u002F\u002F Interface pour les oiseaux qui nagent\npublic interface SwimmingBird {\n    void swim();\n}\n\n\u002F\u002F Interface pour les oiseaux qui émettent des sons\npublic interface SoundingBird {\n    void makeSound();\n}\n",[20209],{"type":29,"tag":113,"props":20210,"children":20211},{"__ignoreMap":8},[20212,20220,20240,20255,20262,20269,20277,20297,20312,20319,20326,20334,20354,20369],{"type":29,"tag":117,"props":20213,"children":20214},{"class":119,"line":120},[20215],{"type":29,"tag":117,"props":20216,"children":20217},{"style":124},[20218],{"type":34,"value":20219},"\u002F\u002F Interface pour les oiseaux qui volent\n",{"type":29,"tag":117,"props":20221,"children":20222},{"class":119,"line":130},[20223,20227,20231,20236],{"type":29,"tag":117,"props":20224,"children":20225},{"style":143},[20226],{"type":34,"value":5541},{"type":29,"tag":117,"props":20228,"children":20229},{"style":143},[20230],{"type":34,"value":8561},{"type":29,"tag":117,"props":20232,"children":20233},{"style":2863},[20234],{"type":34,"value":20235}," FlyingBird",{"type":29,"tag":117,"props":20237,"children":20238},{"style":384},[20239],{"type":34,"value":3461},{"type":29,"tag":117,"props":20241,"children":20242},{"class":119,"line":139},[20243,20247,20251],{"type":29,"tag":117,"props":20244,"children":20245},{"style":143},[20246],{"type":34,"value":8578},{"type":29,"tag":117,"props":20248,"children":20249},{"style":372},[20250],{"type":34,"value":19833},{"type":29,"tag":117,"props":20252,"children":20253},{"style":384},[20254],{"type":34,"value":9375},{"type":29,"tag":117,"props":20256,"children":20257},{"class":119,"line":172},[20258],{"type":29,"tag":117,"props":20259,"children":20260},{"style":384},[20261],{"type":34,"value":2903},{"type":29,"tag":117,"props":20263,"children":20264},{"class":119,"line":181},[20265],{"type":29,"tag":117,"props":20266,"children":20267},{"emptyLinePlaceholder":13},[20268],{"type":34,"value":136},{"type":29,"tag":117,"props":20270,"children":20271},{"class":119,"line":189},[20272],{"type":29,"tag":117,"props":20273,"children":20274},{"style":124},[20275],{"type":34,"value":20276},"\u002F\u002F Interface pour les oiseaux qui nagent\n",{"type":29,"tag":117,"props":20278,"children":20279},{"class":119,"line":198},[20280,20284,20288,20293],{"type":29,"tag":117,"props":20281,"children":20282},{"style":143},[20283],{"type":34,"value":5541},{"type":29,"tag":117,"props":20285,"children":20286},{"style":143},[20287],{"type":34,"value":8561},{"type":29,"tag":117,"props":20289,"children":20290},{"style":2863},[20291],{"type":34,"value":20292}," SwimmingBird",{"type":29,"tag":117,"props":20294,"children":20295},{"style":384},[20296],{"type":34,"value":3461},{"type":29,"tag":117,"props":20298,"children":20299},{"class":119,"line":207},[20300,20304,20308],{"type":29,"tag":117,"props":20301,"children":20302},{"style":143},[20303],{"type":34,"value":8578},{"type":29,"tag":117,"props":20305,"children":20306},{"style":372},[20307],{"type":34,"value":19849},{"type":29,"tag":117,"props":20309,"children":20310},{"style":384},[20311],{"type":34,"value":9375},{"type":29,"tag":117,"props":20313,"children":20314},{"class":119,"line":215},[20315],{"type":29,"tag":117,"props":20316,"children":20317},{"style":384},[20318],{"type":34,"value":2903},{"type":29,"tag":117,"props":20320,"children":20321},{"class":119,"line":224},[20322],{"type":29,"tag":117,"props":20323,"children":20324},{"emptyLinePlaceholder":13},[20325],{"type":34,"value":136},{"type":29,"tag":117,"props":20327,"children":20328},{"class":119,"line":233},[20329],{"type":29,"tag":117,"props":20330,"children":20331},{"style":124},[20332],{"type":34,"value":20333},"\u002F\u002F Interface pour les oiseaux qui émettent des sons\n",{"type":29,"tag":117,"props":20335,"children":20336},{"class":119,"line":242},[20337,20341,20345,20350],{"type":29,"tag":117,"props":20338,"children":20339},{"style":143},[20340],{"type":34,"value":5541},{"type":29,"tag":117,"props":20342,"children":20343},{"style":143},[20344],{"type":34,"value":8561},{"type":29,"tag":117,"props":20346,"children":20347},{"style":2863},[20348],{"type":34,"value":20349}," SoundingBird",{"type":29,"tag":117,"props":20351,"children":20352},{"style":384},[20353],{"type":34,"value":3461},{"type":29,"tag":117,"props":20355,"children":20356},{"class":119,"line":251},[20357,20361,20365],{"type":29,"tag":117,"props":20358,"children":20359},{"style":143},[20360],{"type":34,"value":8578},{"type":29,"tag":117,"props":20362,"children":20363},{"style":372},[20364],{"type":34,"value":19865},{"type":29,"tag":117,"props":20366,"children":20367},{"style":384},[20368],{"type":34,"value":9375},{"type":29,"tag":117,"props":20370,"children":20371},{"class":119,"line":260},[20372],{"type":29,"tag":117,"props":20373,"children":20374},{"style":384},[20375],{"type":34,"value":2903},{"type":29,"tag":30,"props":20377,"children":20378},{},[20379],{"type":34,"value":20380},"Maintenant, nous pouvons créer des classes qui implémentent uniquement les interfaces dont elles ont besoin :",{"type":29,"tag":106,"props":20382,"children":20384},{"className":5519,"code":20383,"language":5521,"meta":8,"style":8},"\u002F\u002F Le pingouin nage et émet des sons, mais ne vole pas\npublic class Penguin implements SwimmingBird, SoundingBird {\n    @Override\n    public void swim() {\n        System.out.println(\"Le pingouin nage.\");\n    }\n\n    @Override\n    public void makeSound() {\n        System.out.println(\"Le pingouin émet un son.\");\n    }\n}\n\n\u002F\u002F L'aigle vole et émet des sons\npublic class Eagle implements FlyingBird, SoundingBird {\n    @Override\n    public void fly() {\n        System.out.println(\"L'aigle vole.\");\n    }\n\n    @Override\n    public void makeSound() {\n        System.out.println(\"L'aigle émet un son.\");\n    }\n}\n",[20385],{"type":29,"tag":113,"props":20386,"children":20387},{"__ignoreMap":8},[20388,20396,20431,20442,20465,20500,20507,20514,20525,20548,20583,20590,20597,20604,20612,20648,20659,20682,20718,20725,20732,20743,20766,20802,20809],{"type":29,"tag":117,"props":20389,"children":20390},{"class":119,"line":120},[20391],{"type":29,"tag":117,"props":20392,"children":20393},{"style":124},[20394],{"type":34,"value":20395},"\u002F\u002F Le pingouin nage et émet des sons, mais ne vole pas\n",{"type":29,"tag":117,"props":20397,"children":20398},{"class":119,"line":130},[20399,20403,20407,20411,20415,20419,20423,20427],{"type":29,"tag":117,"props":20400,"children":20401},{"style":143},[20402],{"type":34,"value":5541},{"type":29,"tag":117,"props":20404,"children":20405},{"style":143},[20406],{"type":34,"value":7575},{"type":29,"tag":117,"props":20408,"children":20409},{"style":2863},[20410],{"type":34,"value":19931},{"type":29,"tag":117,"props":20412,"children":20413},{"style":143},[20414],{"type":34,"value":8636},{"type":29,"tag":117,"props":20416,"children":20417},{"style":2863},[20418],{"type":34,"value":20292},{"type":29,"tag":117,"props":20420,"children":20421},{"style":384},[20422],{"type":34,"value":1118},{"type":29,"tag":117,"props":20424,"children":20425},{"style":2863},[20426],{"type":34,"value":20349},{"type":29,"tag":117,"props":20428,"children":20429},{"style":384},[20430],{"type":34,"value":3461},{"type":29,"tag":117,"props":20432,"children":20433},{"class":119,"line":139},[20434,20438],{"type":29,"tag":117,"props":20435,"children":20436},{"style":10083},[20437],{"type":34,"value":10086},{"type":29,"tag":117,"props":20439,"children":20440},{"style":10089},[20441],{"type":34,"value":17746},{"type":29,"tag":117,"props":20443,"children":20444},{"class":119,"line":172},[20445,20449,20453,20457,20461],{"type":29,"tag":117,"props":20446,"children":20447},{"style":143},[20448],{"type":34,"value":7641},{"type":29,"tag":117,"props":20450,"children":20451},{"style":143},[20452],{"type":34,"value":7762},{"type":29,"tag":117,"props":20454,"children":20455},{"style":372},[20456],{"type":34,"value":19849},{"type":29,"tag":117,"props":20458,"children":20459},{"style":384},[20460],{"type":34,"value":381},{"type":29,"tag":117,"props":20462,"children":20463},{"style":384},[20464],{"type":34,"value":3461},{"type":29,"tag":117,"props":20466,"children":20467},{"class":119,"line":181},[20468,20472,20476,20480,20484,20488,20492,20496],{"type":29,"tag":117,"props":20469,"children":20470},{"style":378},[20471],{"type":34,"value":16717},{"type":29,"tag":117,"props":20473,"children":20474},{"style":384},[20475],{"type":34,"value":369},{"type":29,"tag":117,"props":20477,"children":20478},{"style":378},[20479],{"type":34,"value":15075},{"type":29,"tag":117,"props":20481,"children":20482},{"style":384},[20483],{"type":34,"value":369},{"type":29,"tag":117,"props":20485,"children":20486},{"style":372},[20487],{"type":34,"value":15084},{"type":29,"tag":117,"props":20489,"children":20490},{"style":384},[20491],{"type":34,"value":1108},{"type":29,"tag":117,"props":20493,"children":20494},{"style":166},[20495],{"type":34,"value":20065},{"type":29,"tag":117,"props":20497,"children":20498},{"style":384},[20499],{"type":34,"value":5675},{"type":29,"tag":117,"props":20501,"children":20502},{"class":119,"line":189},[20503],{"type":29,"tag":117,"props":20504,"children":20505},{"style":384},[20506],{"type":34,"value":5632},{"type":29,"tag":117,"props":20508,"children":20509},{"class":119,"line":198},[20510],{"type":29,"tag":117,"props":20511,"children":20512},{"emptyLinePlaceholder":13},[20513],{"type":34,"value":136},{"type":29,"tag":117,"props":20515,"children":20516},{"class":119,"line":207},[20517,20521],{"type":29,"tag":117,"props":20518,"children":20519},{"style":10083},[20520],{"type":34,"value":10086},{"type":29,"tag":117,"props":20522,"children":20523},{"style":10089},[20524],{"type":34,"value":17746},{"type":29,"tag":117,"props":20526,"children":20527},{"class":119,"line":215},[20528,20532,20536,20540,20544],{"type":29,"tag":117,"props":20529,"children":20530},{"style":143},[20531],{"type":34,"value":7641},{"type":29,"tag":117,"props":20533,"children":20534},{"style":143},[20535],{"type":34,"value":7762},{"type":29,"tag":117,"props":20537,"children":20538},{"style":372},[20539],{"type":34,"value":19865},{"type":29,"tag":117,"props":20541,"children":20542},{"style":384},[20543],{"type":34,"value":381},{"type":29,"tag":117,"props":20545,"children":20546},{"style":384},[20547],{"type":34,"value":3461},{"type":29,"tag":117,"props":20549,"children":20550},{"class":119,"line":224},[20551,20555,20559,20563,20567,20571,20575,20579],{"type":29,"tag":117,"props":20552,"children":20553},{"style":378},[20554],{"type":34,"value":16717},{"type":29,"tag":117,"props":20556,"children":20557},{"style":384},[20558],{"type":34,"value":369},{"type":29,"tag":117,"props":20560,"children":20561},{"style":378},[20562],{"type":34,"value":15075},{"type":29,"tag":117,"props":20564,"children":20565},{"style":384},[20566],{"type":34,"value":369},{"type":29,"tag":117,"props":20568,"children":20569},{"style":372},[20570],{"type":34,"value":15084},{"type":29,"tag":117,"props":20572,"children":20573},{"style":384},[20574],{"type":34,"value":1108},{"type":29,"tag":117,"props":20576,"children":20577},{"style":166},[20578],{"type":34,"value":20149},{"type":29,"tag":117,"props":20580,"children":20581},{"style":384},[20582],{"type":34,"value":5675},{"type":29,"tag":117,"props":20584,"children":20585},{"class":119,"line":233},[20586],{"type":29,"tag":117,"props":20587,"children":20588},{"style":384},[20589],{"type":34,"value":5632},{"type":29,"tag":117,"props":20591,"children":20592},{"class":119,"line":242},[20593],{"type":29,"tag":117,"props":20594,"children":20595},{"style":384},[20596],{"type":34,"value":2903},{"type":29,"tag":117,"props":20598,"children":20599},{"class":119,"line":251},[20600],{"type":29,"tag":117,"props":20601,"children":20602},{"emptyLinePlaceholder":13},[20603],{"type":34,"value":136},{"type":29,"tag":117,"props":20605,"children":20606},{"class":119,"line":260},[20607],{"type":29,"tag":117,"props":20608,"children":20609},{"style":124},[20610],{"type":34,"value":20611},"\u002F\u002F L'aigle vole et émet des sons\n",{"type":29,"tag":117,"props":20613,"children":20614},{"class":119,"line":269},[20615,20619,20623,20628,20632,20636,20640,20644],{"type":29,"tag":117,"props":20616,"children":20617},{"style":143},[20618],{"type":34,"value":5541},{"type":29,"tag":117,"props":20620,"children":20621},{"style":143},[20622],{"type":34,"value":7575},{"type":29,"tag":117,"props":20624,"children":20625},{"style":2863},[20626],{"type":34,"value":20627}," Eagle",{"type":29,"tag":117,"props":20629,"children":20630},{"style":143},[20631],{"type":34,"value":8636},{"type":29,"tag":117,"props":20633,"children":20634},{"style":2863},[20635],{"type":34,"value":20235},{"type":29,"tag":117,"props":20637,"children":20638},{"style":384},[20639],{"type":34,"value":1118},{"type":29,"tag":117,"props":20641,"children":20642},{"style":2863},[20643],{"type":34,"value":20349},{"type":29,"tag":117,"props":20645,"children":20646},{"style":384},[20647],{"type":34,"value":3461},{"type":29,"tag":117,"props":20649,"children":20650},{"class":119,"line":278},[20651,20655],{"type":29,"tag":117,"props":20652,"children":20653},{"style":10083},[20654],{"type":34,"value":10086},{"type":29,"tag":117,"props":20656,"children":20657},{"style":10089},[20658],{"type":34,"value":17746},{"type":29,"tag":117,"props":20660,"children":20661},{"class":119,"line":286},[20662,20666,20670,20674,20678],{"type":29,"tag":117,"props":20663,"children":20664},{"style":143},[20665],{"type":34,"value":7641},{"type":29,"tag":117,"props":20667,"children":20668},{"style":143},[20669],{"type":34,"value":7762},{"type":29,"tag":117,"props":20671,"children":20672},{"style":372},[20673],{"type":34,"value":19833},{"type":29,"tag":117,"props":20675,"children":20676},{"style":384},[20677],{"type":34,"value":381},{"type":29,"tag":117,"props":20679,"children":20680},{"style":384},[20681],{"type":34,"value":3461},{"type":29,"tag":117,"props":20683,"children":20684},{"class":119,"line":295},[20685,20689,20693,20697,20701,20705,20709,20714],{"type":29,"tag":117,"props":20686,"children":20687},{"style":378},[20688],{"type":34,"value":16717},{"type":29,"tag":117,"props":20690,"children":20691},{"style":384},[20692],{"type":34,"value":369},{"type":29,"tag":117,"props":20694,"children":20695},{"style":378},[20696],{"type":34,"value":15075},{"type":29,"tag":117,"props":20698,"children":20699},{"style":384},[20700],{"type":34,"value":369},{"type":29,"tag":117,"props":20702,"children":20703},{"style":372},[20704],{"type":34,"value":15084},{"type":29,"tag":117,"props":20706,"children":20707},{"style":384},[20708],{"type":34,"value":1108},{"type":29,"tag":117,"props":20710,"children":20711},{"style":166},[20712],{"type":34,"value":20713},"\"L'aigle vole.\"",{"type":29,"tag":117,"props":20715,"children":20716},{"style":384},[20717],{"type":34,"value":5675},{"type":29,"tag":117,"props":20719,"children":20720},{"class":119,"line":304},[20721],{"type":29,"tag":117,"props":20722,"children":20723},{"style":384},[20724],{"type":34,"value":5632},{"type":29,"tag":117,"props":20726,"children":20727},{"class":119,"line":313},[20728],{"type":29,"tag":117,"props":20729,"children":20730},{"emptyLinePlaceholder":13},[20731],{"type":34,"value":136},{"type":29,"tag":117,"props":20733,"children":20734},{"class":119,"line":322},[20735,20739],{"type":29,"tag":117,"props":20736,"children":20737},{"style":10083},[20738],{"type":34,"value":10086},{"type":29,"tag":117,"props":20740,"children":20741},{"style":10089},[20742],{"type":34,"value":17746},{"type":29,"tag":117,"props":20744,"children":20745},{"class":119,"line":331},[20746,20750,20754,20758,20762],{"type":29,"tag":117,"props":20747,"children":20748},{"style":143},[20749],{"type":34,"value":7641},{"type":29,"tag":117,"props":20751,"children":20752},{"style":143},[20753],{"type":34,"value":7762},{"type":29,"tag":117,"props":20755,"children":20756},{"style":372},[20757],{"type":34,"value":19865},{"type":29,"tag":117,"props":20759,"children":20760},{"style":384},[20761],{"type":34,"value":381},{"type":29,"tag":117,"props":20763,"children":20764},{"style":384},[20765],{"type":34,"value":3461},{"type":29,"tag":117,"props":20767,"children":20768},{"class":119,"line":340},[20769,20773,20777,20781,20785,20789,20793,20798],{"type":29,"tag":117,"props":20770,"children":20771},{"style":378},[20772],{"type":34,"value":16717},{"type":29,"tag":117,"props":20774,"children":20775},{"style":384},[20776],{"type":34,"value":369},{"type":29,"tag":117,"props":20778,"children":20779},{"style":378},[20780],{"type":34,"value":15075},{"type":29,"tag":117,"props":20782,"children":20783},{"style":384},[20784],{"type":34,"value":369},{"type":29,"tag":117,"props":20786,"children":20787},{"style":372},[20788],{"type":34,"value":15084},{"type":29,"tag":117,"props":20790,"children":20791},{"style":384},[20792],{"type":34,"value":1108},{"type":29,"tag":117,"props":20794,"children":20795},{"style":166},[20796],{"type":34,"value":20797},"\"L'aigle émet un son.\"",{"type":29,"tag":117,"props":20799,"children":20800},{"style":384},[20801],{"type":34,"value":5675},{"type":29,"tag":117,"props":20803,"children":20804},{"class":119,"line":348},[20805],{"type":29,"tag":117,"props":20806,"children":20807},{"style":384},[20808],{"type":34,"value":5632},{"type":29,"tag":117,"props":20810,"children":20811},{"class":119,"line":357},[20812],{"type":29,"tag":117,"props":20813,"children":20814},{"style":384},[20815],{"type":34,"value":2903},{"type":29,"tag":51,"props":20817,"children":20818},{},[],{"type":29,"tag":5462,"props":20820,"children":20821},{"type":5464},[20822],{"type":29,"tag":30,"props":20823,"children":20824},{},[20825,20830],{"type":29,"tag":45,"props":20826,"children":20827},{},[20828],{"type":34,"value":20829},"Divisez vos interfaces selon les besoins réels",{"type":34,"value":20831},". Ne regroupez pas des méthodes non liées dans une même interface. Cela rendra vos classes plus légères et plus faciles à tester.",{"type":29,"tag":55,"props":20833,"children":20835},{"id":20834},"_5-principe-dinversion-des-dépendances-dependency-inversion-principle-dip",[20836],{"type":34,"value":20837},"5. Principe d'Inversion des Dépendances (Dependency Inversion Principle - DIP)",{"type":29,"tag":30,"props":20839,"children":20840},{},[20841],{"type":34,"value":20842},"Le principe d'inversion des dépendances stipule que les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Tous deux doivent dépendre d'abstractions. En d'autres termes, plutôt que de lier directement des classes concrètes, il est préférable de dépendre d'interfaces ou de classes abstraites.",{"type":29,"tag":4530,"props":20844,"children":20846},{"id":20845},"pourquoi-cest-important-4",[20847],{"type":34,"value":16515},{"type":29,"tag":30,"props":20849,"children":20850},{},[20851],{"type":34,"value":20852},"Quand un module de haut niveau dépend directement d'un module de bas niveau, le couplage devient rigide : impossible de modifier ou tester l'un sans l'autre. Introduire une abstraction entre les deux casse cette dépendance directe et ouvre la porte au remplacement des implémentations de bas niveau sans toucher au reste du système.",{"type":29,"tag":4530,"props":20854,"children":20856},{"id":20855},"exemple-concret-en-java-4",[20857],{"type":34,"value":16526},{"type":29,"tag":30,"props":20859,"children":20860},{},[20861,20862,20868],{"type":34,"value":18571},{"type":29,"tag":113,"props":20863,"children":20865},{"className":20864},[],[20866],{"type":34,"value":20867},"NotificationService",{"type":34,"value":20869}," qui envoie des notifications par email. Si cette classe dépend directement d'une implémentation concrète d'email, nous brisons le DIP.",{"type":29,"tag":7528,"props":20871,"children":20873},{"id":20872},"exemple-sans-dip",[20874],{"type":34,"value":20875},"Exemple sans DIP :",{"type":29,"tag":30,"props":20877,"children":20878},{},[20879,20881,20887],{"type":34,"value":20880},"Voici une implémentation où le service de notification dépend directement de la classe ",{"type":29,"tag":113,"props":20882,"children":20884},{"className":20883},[],[20885],{"type":34,"value":20886},"EmailService",{"type":34,"value":1866},{"type":29,"tag":106,"props":20889,"children":20891},{"className":5519,"code":20890,"language":5521,"meta":8,"style":8},"public class EmailService {\n    public void sendEmail(String message) {\n        System.out.println(\"Envoi de l'email : \" + message);\n    }\n}\n\npublic class NotificationService {\n    private EmailService emailService;\n\n    public NotificationService() {\n        this.emailService = new EmailService();\n    }\n\n    public void sendNotification(String message) {\n        emailService.sendEmail(message);\n    }\n}\n",[20892],{"type":29,"tag":113,"props":20893,"children":20894},{"__ignoreMap":8},[20895,20915,20952,20996,21003,21010,21017,21037,21057,21064,21083,21115,21122,21129,21165,21195,21202],{"type":29,"tag":117,"props":20896,"children":20897},{"class":119,"line":120},[20898,20902,20906,20911],{"type":29,"tag":117,"props":20899,"children":20900},{"style":143},[20901],{"type":34,"value":5541},{"type":29,"tag":117,"props":20903,"children":20904},{"style":143},[20905],{"type":34,"value":7575},{"type":29,"tag":117,"props":20907,"children":20908},{"style":2863},[20909],{"type":34,"value":20910}," EmailService",{"type":29,"tag":117,"props":20912,"children":20913},{"style":384},[20914],{"type":34,"value":3461},{"type":29,"tag":117,"props":20916,"children":20917},{"class":119,"line":130},[20918,20922,20926,20931,20935,20939,20944,20948],{"type":29,"tag":117,"props":20919,"children":20920},{"style":143},[20921],{"type":34,"value":7641},{"type":29,"tag":117,"props":20923,"children":20924},{"style":143},[20925],{"type":34,"value":7762},{"type":29,"tag":117,"props":20927,"children":20928},{"style":372},[20929],{"type":34,"value":20930}," sendEmail",{"type":29,"tag":117,"props":20932,"children":20933},{"style":384},[20934],{"type":34,"value":1108},{"type":29,"tag":117,"props":20936,"children":20937},{"style":5976},[20938],{"type":34,"value":7654},{"type":29,"tag":117,"props":20940,"children":20941},{"style":7657},[20942],{"type":34,"value":20943}," message",{"type":29,"tag":117,"props":20945,"children":20946},{"style":384},[20947],{"type":34,"value":2803},{"type":29,"tag":117,"props":20949,"children":20950},{"style":384},[20951],{"type":34,"value":3461},{"type":29,"tag":117,"props":20953,"children":20954},{"class":119,"line":139},[20955,20959,20963,20967,20971,20975,20979,20984,20988,20992],{"type":29,"tag":117,"props":20956,"children":20957},{"style":378},[20958],{"type":34,"value":16717},{"type":29,"tag":117,"props":20960,"children":20961},{"style":384},[20962],{"type":34,"value":369},{"type":29,"tag":117,"props":20964,"children":20965},{"style":378},[20966],{"type":34,"value":15075},{"type":29,"tag":117,"props":20968,"children":20969},{"style":384},[20970],{"type":34,"value":369},{"type":29,"tag":117,"props":20972,"children":20973},{"style":372},[20974],{"type":34,"value":15084},{"type":29,"tag":117,"props":20976,"children":20977},{"style":384},[20978],{"type":34,"value":1108},{"type":29,"tag":117,"props":20980,"children":20981},{"style":166},[20982],{"type":34,"value":20983},"\"Envoi de l'email : \"",{"type":29,"tag":117,"props":20985,"children":20986},{"style":160},[20987],{"type":34,"value":15098},{"type":29,"tag":117,"props":20989,"children":20990},{"style":378},[20991],{"type":34,"value":20943},{"type":29,"tag":117,"props":20993,"children":20994},{"style":384},[20995],{"type":34,"value":5675},{"type":29,"tag":117,"props":20997,"children":20998},{"class":119,"line":172},[20999],{"type":29,"tag":117,"props":21000,"children":21001},{"style":384},[21002],{"type":34,"value":5632},{"type":29,"tag":117,"props":21004,"children":21005},{"class":119,"line":181},[21006],{"type":29,"tag":117,"props":21007,"children":21008},{"style":384},[21009],{"type":34,"value":2903},{"type":29,"tag":117,"props":21011,"children":21012},{"class":119,"line":189},[21013],{"type":29,"tag":117,"props":21014,"children":21015},{"emptyLinePlaceholder":13},[21016],{"type":34,"value":136},{"type":29,"tag":117,"props":21018,"children":21019},{"class":119,"line":198},[21020,21024,21028,21033],{"type":29,"tag":117,"props":21021,"children":21022},{"style":143},[21023],{"type":34,"value":5541},{"type":29,"tag":117,"props":21025,"children":21026},{"style":143},[21027],{"type":34,"value":7575},{"type":29,"tag":117,"props":21029,"children":21030},{"style":2863},[21031],{"type":34,"value":21032}," NotificationService",{"type":29,"tag":117,"props":21034,"children":21035},{"style":384},[21036],{"type":34,"value":3461},{"type":29,"tag":117,"props":21038,"children":21039},{"class":119,"line":207},[21040,21044,21048,21053],{"type":29,"tag":117,"props":21041,"children":21042},{"style":143},[21043],{"type":34,"value":7592},{"type":29,"tag":117,"props":21045,"children":21046},{"style":5976},[21047],{"type":34,"value":20910},{"type":29,"tag":117,"props":21049,"children":21050},{"style":378},[21051],{"type":34,"value":21052}," emailService",{"type":29,"tag":117,"props":21054,"children":21055},{"style":384},[21056],{"type":34,"value":387},{"type":29,"tag":117,"props":21058,"children":21059},{"class":119,"line":215},[21060],{"type":29,"tag":117,"props":21061,"children":21062},{"emptyLinePlaceholder":13},[21063],{"type":34,"value":136},{"type":29,"tag":117,"props":21065,"children":21066},{"class":119,"line":224},[21067,21071,21075,21079],{"type":29,"tag":117,"props":21068,"children":21069},{"style":143},[21070],{"type":34,"value":7641},{"type":29,"tag":117,"props":21072,"children":21073},{"style":372},[21074],{"type":34,"value":21032},{"type":29,"tag":117,"props":21076,"children":21077},{"style":384},[21078],{"type":34,"value":381},{"type":29,"tag":117,"props":21080,"children":21081},{"style":384},[21082],{"type":34,"value":3461},{"type":29,"tag":117,"props":21084,"children":21085},{"class":119,"line":233},[21086,21090,21094,21099,21103,21107,21111],{"type":29,"tag":117,"props":21087,"children":21088},{"style":6700},[21089],{"type":34,"value":7687},{"type":29,"tag":117,"props":21091,"children":21092},{"style":384},[21093],{"type":34,"value":369},{"type":29,"tag":117,"props":21095,"children":21096},{"style":378},[21097],{"type":34,"value":21098},"emailService ",{"type":29,"tag":117,"props":21100,"children":21101},{"style":160},[21102],{"type":34,"value":6061},{"type":29,"tag":117,"props":21104,"children":21105},{"style":143},[21106],{"type":34,"value":6066},{"type":29,"tag":117,"props":21108,"children":21109},{"style":372},[21110],{"type":34,"value":20910},{"type":29,"tag":117,"props":21112,"children":21113},{"style":384},[21114],{"type":34,"value":9375},{"type":29,"tag":117,"props":21116,"children":21117},{"class":119,"line":242},[21118],{"type":29,"tag":117,"props":21119,"children":21120},{"style":384},[21121],{"type":34,"value":5632},{"type":29,"tag":117,"props":21123,"children":21124},{"class":119,"line":251},[21125],{"type":29,"tag":117,"props":21126,"children":21127},{"emptyLinePlaceholder":13},[21128],{"type":34,"value":136},{"type":29,"tag":117,"props":21130,"children":21131},{"class":119,"line":260},[21132,21136,21140,21145,21149,21153,21157,21161],{"type":29,"tag":117,"props":21133,"children":21134},{"style":143},[21135],{"type":34,"value":7641},{"type":29,"tag":117,"props":21137,"children":21138},{"style":143},[21139],{"type":34,"value":7762},{"type":29,"tag":117,"props":21141,"children":21142},{"style":372},[21143],{"type":34,"value":21144}," sendNotification",{"type":29,"tag":117,"props":21146,"children":21147},{"style":384},[21148],{"type":34,"value":1108},{"type":29,"tag":117,"props":21150,"children":21151},{"style":5976},[21152],{"type":34,"value":7654},{"type":29,"tag":117,"props":21154,"children":21155},{"style":7657},[21156],{"type":34,"value":20943},{"type":29,"tag":117,"props":21158,"children":21159},{"style":384},[21160],{"type":34,"value":2803},{"type":29,"tag":117,"props":21162,"children":21163},{"style":384},[21164],{"type":34,"value":3461},{"type":29,"tag":117,"props":21166,"children":21167},{"class":119,"line":269},[21168,21173,21177,21182,21186,21191],{"type":29,"tag":117,"props":21169,"children":21170},{"style":378},[21171],{"type":34,"value":21172},"        emailService",{"type":29,"tag":117,"props":21174,"children":21175},{"style":384},[21176],{"type":34,"value":369},{"type":29,"tag":117,"props":21178,"children":21179},{"style":372},[21180],{"type":34,"value":21181},"sendEmail",{"type":29,"tag":117,"props":21183,"children":21184},{"style":384},[21185],{"type":34,"value":1108},{"type":29,"tag":117,"props":21187,"children":21188},{"style":378},[21189],{"type":34,"value":21190},"message",{"type":29,"tag":117,"props":21192,"children":21193},{"style":384},[21194],{"type":34,"value":5675},{"type":29,"tag":117,"props":21196,"children":21197},{"class":119,"line":278},[21198],{"type":29,"tag":117,"props":21199,"children":21200},{"style":384},[21201],{"type":34,"value":5632},{"type":29,"tag":117,"props":21203,"children":21204},{"class":119,"line":286},[21205],{"type":29,"tag":117,"props":21206,"children":21207},{"style":384},[21208],{"type":34,"value":2903},{"type":29,"tag":30,"props":21210,"children":21211},{},[21212,21214,21219,21221,21226,21228,21233],{"type":34,"value":21213},"Dans cet exemple, ",{"type":29,"tag":113,"props":21215,"children":21217},{"className":21216},[],[21218],{"type":34,"value":20867},{"type":34,"value":21220}," est étroitement couplé à ",{"type":29,"tag":113,"props":21222,"children":21224},{"className":21223},[],[21225],{"type":34,"value":20886},{"type":34,"value":21227},". Si nous voulions envoyer une notification par SMS au lieu d’un email, nous devrions modifier la classe ",{"type":29,"tag":113,"props":21229,"children":21231},{"className":21230},[],[21232],{"type":34,"value":20867},{"type":34,"value":21234},", ce qui va à l'encontre du principe DIP.",{"type":29,"tag":7528,"props":21236,"children":21238},{"id":21237},"exemple-avec-dip-appliqué",[21239],{"type":34,"value":21240},"Exemple avec DIP appliqué :",{"type":29,"tag":30,"props":21242,"children":21243},{},[21244,21246,21252],{"type":34,"value":21245},"Pour respecter le principe d'inversion des dépendances, nous allons introduire une abstraction sous forme d'une interface ",{"type":29,"tag":113,"props":21247,"children":21249},{"className":21248},[],[21250],{"type":34,"value":21251},"NotificationSender",{"type":34,"value":21253}," que toutes les implémentations concrètes (Email, SMS, etc.) respecteront.",{"type":29,"tag":106,"props":21255,"children":21257},{"className":5519,"code":21256,"language":5521,"meta":8,"style":8},"\u002F\u002F Interface pour les services d'envoi de notifications\npublic interface NotificationSender {\n    void send(String message);\n}\n\n\u002F\u002F Implémentation pour l'email\npublic class EmailSender implements NotificationSender {\n    @Override\n    public void send(String message) {\n        System.out.println(\"Envoi de l'email : \" + message);\n    }\n}\n\n\u002F\u002F Implémentation pour SMS\npublic class SMSSender implements NotificationSender {\n    @Override\n    public void send(String message) {\n        System.out.println(\"Envoi du SMS : \" + message);\n    }\n}\n\n\u002F\u002F Service de notification utilisant l'interface NotificationSender\npublic class NotificationService {\n    private NotificationSender sender;\n\n    \u002F\u002F Injection de dépendance via le constructeur\n    public NotificationService(NotificationSender sender) {\n        this.sender = sender;\n    }\n\n    public void sendNotification(String message) {\n        sender.send(message);\n    }\n}\n",[21258],{"type":29,"tag":113,"props":21259,"children":21260},{"__ignoreMap":8},[21261,21269,21289,21317,21324,21331,21339,21367,21378,21413,21456,21463,21470,21477,21485,21513,21524,21559,21603,21610,21617,21624,21632,21651,21671,21678,21686,21717,21745,21752,21759,21794,21823,21831],{"type":29,"tag":117,"props":21262,"children":21263},{"class":119,"line":120},[21264],{"type":29,"tag":117,"props":21265,"children":21266},{"style":124},[21267],{"type":34,"value":21268},"\u002F\u002F Interface pour les services d'envoi de notifications\n",{"type":29,"tag":117,"props":21270,"children":21271},{"class":119,"line":130},[21272,21276,21280,21285],{"type":29,"tag":117,"props":21273,"children":21274},{"style":143},[21275],{"type":34,"value":5541},{"type":29,"tag":117,"props":21277,"children":21278},{"style":143},[21279],{"type":34,"value":8561},{"type":29,"tag":117,"props":21281,"children":21282},{"style":2863},[21283],{"type":34,"value":21284}," NotificationSender",{"type":29,"tag":117,"props":21286,"children":21287},{"style":384},[21288],{"type":34,"value":3461},{"type":29,"tag":117,"props":21290,"children":21291},{"class":119,"line":139},[21292,21296,21301,21305,21309,21313],{"type":29,"tag":117,"props":21293,"children":21294},{"style":143},[21295],{"type":34,"value":8578},{"type":29,"tag":117,"props":21297,"children":21298},{"style":372},[21299],{"type":34,"value":21300}," send",{"type":29,"tag":117,"props":21302,"children":21303},{"style":384},[21304],{"type":34,"value":1108},{"type":29,"tag":117,"props":21306,"children":21307},{"style":5976},[21308],{"type":34,"value":7654},{"type":29,"tag":117,"props":21310,"children":21311},{"style":7657},[21312],{"type":34,"value":20943},{"type":29,"tag":117,"props":21314,"children":21315},{"style":384},[21316],{"type":34,"value":5675},{"type":29,"tag":117,"props":21318,"children":21319},{"class":119,"line":172},[21320],{"type":29,"tag":117,"props":21321,"children":21322},{"style":384},[21323],{"type":34,"value":2903},{"type":29,"tag":117,"props":21325,"children":21326},{"class":119,"line":181},[21327],{"type":29,"tag":117,"props":21328,"children":21329},{"emptyLinePlaceholder":13},[21330],{"type":34,"value":136},{"type":29,"tag":117,"props":21332,"children":21333},{"class":119,"line":189},[21334],{"type":29,"tag":117,"props":21335,"children":21336},{"style":124},[21337],{"type":34,"value":21338},"\u002F\u002F Implémentation pour l'email\n",{"type":29,"tag":117,"props":21340,"children":21341},{"class":119,"line":198},[21342,21346,21350,21355,21359,21363],{"type":29,"tag":117,"props":21343,"children":21344},{"style":143},[21345],{"type":34,"value":5541},{"type":29,"tag":117,"props":21347,"children":21348},{"style":143},[21349],{"type":34,"value":7575},{"type":29,"tag":117,"props":21351,"children":21352},{"style":2863},[21353],{"type":34,"value":21354}," EmailSender",{"type":29,"tag":117,"props":21356,"children":21357},{"style":143},[21358],{"type":34,"value":8636},{"type":29,"tag":117,"props":21360,"children":21361},{"style":2863},[21362],{"type":34,"value":21284},{"type":29,"tag":117,"props":21364,"children":21365},{"style":384},[21366],{"type":34,"value":3461},{"type":29,"tag":117,"props":21368,"children":21369},{"class":119,"line":207},[21370,21374],{"type":29,"tag":117,"props":21371,"children":21372},{"style":10083},[21373],{"type":34,"value":10086},{"type":29,"tag":117,"props":21375,"children":21376},{"style":10089},[21377],{"type":34,"value":17746},{"type":29,"tag":117,"props":21379,"children":21380},{"class":119,"line":215},[21381,21385,21389,21393,21397,21401,21405,21409],{"type":29,"tag":117,"props":21382,"children":21383},{"style":143},[21384],{"type":34,"value":7641},{"type":29,"tag":117,"props":21386,"children":21387},{"style":143},[21388],{"type":34,"value":7762},{"type":29,"tag":117,"props":21390,"children":21391},{"style":372},[21392],{"type":34,"value":21300},{"type":29,"tag":117,"props":21394,"children":21395},{"style":384},[21396],{"type":34,"value":1108},{"type":29,"tag":117,"props":21398,"children":21399},{"style":5976},[21400],{"type":34,"value":7654},{"type":29,"tag":117,"props":21402,"children":21403},{"style":7657},[21404],{"type":34,"value":20943},{"type":29,"tag":117,"props":21406,"children":21407},{"style":384},[21408],{"type":34,"value":2803},{"type":29,"tag":117,"props":21410,"children":21411},{"style":384},[21412],{"type":34,"value":3461},{"type":29,"tag":117,"props":21414,"children":21415},{"class":119,"line":224},[21416,21420,21424,21428,21432,21436,21440,21444,21448,21452],{"type":29,"tag":117,"props":21417,"children":21418},{"style":378},[21419],{"type":34,"value":16717},{"type":29,"tag":117,"props":21421,"children":21422},{"style":384},[21423],{"type":34,"value":369},{"type":29,"tag":117,"props":21425,"children":21426},{"style":378},[21427],{"type":34,"value":15075},{"type":29,"tag":117,"props":21429,"children":21430},{"style":384},[21431],{"type":34,"value":369},{"type":29,"tag":117,"props":21433,"children":21434},{"style":372},[21435],{"type":34,"value":15084},{"type":29,"tag":117,"props":21437,"children":21438},{"style":384},[21439],{"type":34,"value":1108},{"type":29,"tag":117,"props":21441,"children":21442},{"style":166},[21443],{"type":34,"value":20983},{"type":29,"tag":117,"props":21445,"children":21446},{"style":160},[21447],{"type":34,"value":15098},{"type":29,"tag":117,"props":21449,"children":21450},{"style":378},[21451],{"type":34,"value":20943},{"type":29,"tag":117,"props":21453,"children":21454},{"style":384},[21455],{"type":34,"value":5675},{"type":29,"tag":117,"props":21457,"children":21458},{"class":119,"line":233},[21459],{"type":29,"tag":117,"props":21460,"children":21461},{"style":384},[21462],{"type":34,"value":5632},{"type":29,"tag":117,"props":21464,"children":21465},{"class":119,"line":242},[21466],{"type":29,"tag":117,"props":21467,"children":21468},{"style":384},[21469],{"type":34,"value":2903},{"type":29,"tag":117,"props":21471,"children":21472},{"class":119,"line":251},[21473],{"type":29,"tag":117,"props":21474,"children":21475},{"emptyLinePlaceholder":13},[21476],{"type":34,"value":136},{"type":29,"tag":117,"props":21478,"children":21479},{"class":119,"line":260},[21480],{"type":29,"tag":117,"props":21481,"children":21482},{"style":124},[21483],{"type":34,"value":21484},"\u002F\u002F Implémentation pour SMS\n",{"type":29,"tag":117,"props":21486,"children":21487},{"class":119,"line":269},[21488,21492,21496,21501,21505,21509],{"type":29,"tag":117,"props":21489,"children":21490},{"style":143},[21491],{"type":34,"value":5541},{"type":29,"tag":117,"props":21493,"children":21494},{"style":143},[21495],{"type":34,"value":7575},{"type":29,"tag":117,"props":21497,"children":21498},{"style":2863},[21499],{"type":34,"value":21500}," SMSSender",{"type":29,"tag":117,"props":21502,"children":21503},{"style":143},[21504],{"type":34,"value":8636},{"type":29,"tag":117,"props":21506,"children":21507},{"style":2863},[21508],{"type":34,"value":21284},{"type":29,"tag":117,"props":21510,"children":21511},{"style":384},[21512],{"type":34,"value":3461},{"type":29,"tag":117,"props":21514,"children":21515},{"class":119,"line":278},[21516,21520],{"type":29,"tag":117,"props":21517,"children":21518},{"style":10083},[21519],{"type":34,"value":10086},{"type":29,"tag":117,"props":21521,"children":21522},{"style":10089},[21523],{"type":34,"value":17746},{"type":29,"tag":117,"props":21525,"children":21526},{"class":119,"line":286},[21527,21531,21535,21539,21543,21547,21551,21555],{"type":29,"tag":117,"props":21528,"children":21529},{"style":143},[21530],{"type":34,"value":7641},{"type":29,"tag":117,"props":21532,"children":21533},{"style":143},[21534],{"type":34,"value":7762},{"type":29,"tag":117,"props":21536,"children":21537},{"style":372},[21538],{"type":34,"value":21300},{"type":29,"tag":117,"props":21540,"children":21541},{"style":384},[21542],{"type":34,"value":1108},{"type":29,"tag":117,"props":21544,"children":21545},{"style":5976},[21546],{"type":34,"value":7654},{"type":29,"tag":117,"props":21548,"children":21549},{"style":7657},[21550],{"type":34,"value":20943},{"type":29,"tag":117,"props":21552,"children":21553},{"style":384},[21554],{"type":34,"value":2803},{"type":29,"tag":117,"props":21556,"children":21557},{"style":384},[21558],{"type":34,"value":3461},{"type":29,"tag":117,"props":21560,"children":21561},{"class":119,"line":295},[21562,21566,21570,21574,21578,21582,21586,21591,21595,21599],{"type":29,"tag":117,"props":21563,"children":21564},{"style":378},[21565],{"type":34,"value":16717},{"type":29,"tag":117,"props":21567,"children":21568},{"style":384},[21569],{"type":34,"value":369},{"type":29,"tag":117,"props":21571,"children":21572},{"style":378},[21573],{"type":34,"value":15075},{"type":29,"tag":117,"props":21575,"children":21576},{"style":384},[21577],{"type":34,"value":369},{"type":29,"tag":117,"props":21579,"children":21580},{"style":372},[21581],{"type":34,"value":15084},{"type":29,"tag":117,"props":21583,"children":21584},{"style":384},[21585],{"type":34,"value":1108},{"type":29,"tag":117,"props":21587,"children":21588},{"style":166},[21589],{"type":34,"value":21590},"\"Envoi du SMS : \"",{"type":29,"tag":117,"props":21592,"children":21593},{"style":160},[21594],{"type":34,"value":15098},{"type":29,"tag":117,"props":21596,"children":21597},{"style":378},[21598],{"type":34,"value":20943},{"type":29,"tag":117,"props":21600,"children":21601},{"style":384},[21602],{"type":34,"value":5675},{"type":29,"tag":117,"props":21604,"children":21605},{"class":119,"line":304},[21606],{"type":29,"tag":117,"props":21607,"children":21608},{"style":384},[21609],{"type":34,"value":5632},{"type":29,"tag":117,"props":21611,"children":21612},{"class":119,"line":313},[21613],{"type":29,"tag":117,"props":21614,"children":21615},{"style":384},[21616],{"type":34,"value":2903},{"type":29,"tag":117,"props":21618,"children":21619},{"class":119,"line":322},[21620],{"type":29,"tag":117,"props":21621,"children":21622},{"emptyLinePlaceholder":13},[21623],{"type":34,"value":136},{"type":29,"tag":117,"props":21625,"children":21626},{"class":119,"line":331},[21627],{"type":29,"tag":117,"props":21628,"children":21629},{"style":124},[21630],{"type":34,"value":21631},"\u002F\u002F Service de notification utilisant l'interface NotificationSender\n",{"type":29,"tag":117,"props":21633,"children":21634},{"class":119,"line":340},[21635,21639,21643,21647],{"type":29,"tag":117,"props":21636,"children":21637},{"style":143},[21638],{"type":34,"value":5541},{"type":29,"tag":117,"props":21640,"children":21641},{"style":143},[21642],{"type":34,"value":7575},{"type":29,"tag":117,"props":21644,"children":21645},{"style":2863},[21646],{"type":34,"value":21032},{"type":29,"tag":117,"props":21648,"children":21649},{"style":384},[21650],{"type":34,"value":3461},{"type":29,"tag":117,"props":21652,"children":21653},{"class":119,"line":348},[21654,21658,21662,21667],{"type":29,"tag":117,"props":21655,"children":21656},{"style":143},[21657],{"type":34,"value":7592},{"type":29,"tag":117,"props":21659,"children":21660},{"style":5976},[21661],{"type":34,"value":21284},{"type":29,"tag":117,"props":21663,"children":21664},{"style":378},[21665],{"type":34,"value":21666}," sender",{"type":29,"tag":117,"props":21668,"children":21669},{"style":384},[21670],{"type":34,"value":387},{"type":29,"tag":117,"props":21672,"children":21673},{"class":119,"line":357},[21674],{"type":29,"tag":117,"props":21675,"children":21676},{"emptyLinePlaceholder":13},[21677],{"type":34,"value":136},{"type":29,"tag":117,"props":21679,"children":21680},{"class":119,"line":1768},[21681],{"type":29,"tag":117,"props":21682,"children":21683},{"style":124},[21684],{"type":34,"value":21685},"    \u002F\u002F Injection de dépendance via le constructeur\n",{"type":29,"tag":117,"props":21687,"children":21688},{"class":119,"line":953},[21689,21693,21697,21701,21705,21709,21713],{"type":29,"tag":117,"props":21690,"children":21691},{"style":143},[21692],{"type":34,"value":7641},{"type":29,"tag":117,"props":21694,"children":21695},{"style":372},[21696],{"type":34,"value":21032},{"type":29,"tag":117,"props":21698,"children":21699},{"style":384},[21700],{"type":34,"value":1108},{"type":29,"tag":117,"props":21702,"children":21703},{"style":5976},[21704],{"type":34,"value":21251},{"type":29,"tag":117,"props":21706,"children":21707},{"style":7657},[21708],{"type":34,"value":21666},{"type":29,"tag":117,"props":21710,"children":21711},{"style":384},[21712],{"type":34,"value":2803},{"type":29,"tag":117,"props":21714,"children":21715},{"style":384},[21716],{"type":34,"value":3461},{"type":29,"tag":117,"props":21718,"children":21719},{"class":119,"line":9833},[21720,21724,21728,21733,21737,21741],{"type":29,"tag":117,"props":21721,"children":21722},{"style":6700},[21723],{"type":34,"value":7687},{"type":29,"tag":117,"props":21725,"children":21726},{"style":384},[21727],{"type":34,"value":369},{"type":29,"tag":117,"props":21729,"children":21730},{"style":378},[21731],{"type":34,"value":21732},"sender ",{"type":29,"tag":117,"props":21734,"children":21735},{"style":160},[21736],{"type":34,"value":6061},{"type":29,"tag":117,"props":21738,"children":21739},{"style":378},[21740],{"type":34,"value":21666},{"type":29,"tag":117,"props":21742,"children":21743},{"style":384},[21744],{"type":34,"value":387},{"type":29,"tag":117,"props":21746,"children":21747},{"class":119,"line":9870},[21748],{"type":29,"tag":117,"props":21749,"children":21750},{"style":384},[21751],{"type":34,"value":5632},{"type":29,"tag":117,"props":21753,"children":21754},{"class":119,"line":9901},[21755],{"type":29,"tag":117,"props":21756,"children":21757},{"emptyLinePlaceholder":13},[21758],{"type":34,"value":136},{"type":29,"tag":117,"props":21760,"children":21761},{"class":119,"line":9909},[21762,21766,21770,21774,21778,21782,21786,21790],{"type":29,"tag":117,"props":21763,"children":21764},{"style":143},[21765],{"type":34,"value":7641},{"type":29,"tag":117,"props":21767,"children":21768},{"style":143},[21769],{"type":34,"value":7762},{"type":29,"tag":117,"props":21771,"children":21772},{"style":372},[21773],{"type":34,"value":21144},{"type":29,"tag":117,"props":21775,"children":21776},{"style":384},[21777],{"type":34,"value":1108},{"type":29,"tag":117,"props":21779,"children":21780},{"style":5976},[21781],{"type":34,"value":7654},{"type":29,"tag":117,"props":21783,"children":21784},{"style":7657},[21785],{"type":34,"value":20943},{"type":29,"tag":117,"props":21787,"children":21788},{"style":384},[21789],{"type":34,"value":2803},{"type":29,"tag":117,"props":21791,"children":21792},{"style":384},[21793],{"type":34,"value":3461},{"type":29,"tag":117,"props":21795,"children":21796},{"class":119,"line":19187},[21797,21802,21806,21811,21815,21819],{"type":29,"tag":117,"props":21798,"children":21799},{"style":378},[21800],{"type":34,"value":21801},"        sender",{"type":29,"tag":117,"props":21803,"children":21804},{"style":384},[21805],{"type":34,"value":369},{"type":29,"tag":117,"props":21807,"children":21808},{"style":372},[21809],{"type":34,"value":21810},"send",{"type":29,"tag":117,"props":21812,"children":21813},{"style":384},[21814],{"type":34,"value":1108},{"type":29,"tag":117,"props":21816,"children":21817},{"style":378},[21818],{"type":34,"value":21190},{"type":29,"tag":117,"props":21820,"children":21821},{"style":384},[21822],{"type":34,"value":5675},{"type":29,"tag":117,"props":21824,"children":21826},{"class":119,"line":21825},33,[21827],{"type":29,"tag":117,"props":21828,"children":21829},{"style":384},[21830],{"type":34,"value":5632},{"type":29,"tag":117,"props":21832,"children":21834},{"class":119,"line":21833},34,[21835],{"type":29,"tag":117,"props":21836,"children":21837},{"style":384},[21838],{"type":34,"value":2903},{"type":29,"tag":30,"props":21840,"children":21841},{},[21842,21843,21848,21850,21856,21858,21863,21865,21871,21873,21878],{"type":34,"value":11677},{"type":29,"tag":113,"props":21844,"children":21846},{"className":21845},[],[21847],{"type":34,"value":20867},{"type":34,"value":21849}," ne dépend plus d'une implémentation concrète comme ",{"type":29,"tag":113,"props":21851,"children":21853},{"className":21852},[],[21854],{"type":34,"value":21855},"EmailSender",{"type":34,"value":21857},", mais d'une abstraction (",{"type":29,"tag":113,"props":21859,"children":21861},{"className":21860},[],[21862],{"type":34,"value":21251},{"type":34,"value":21864},"). Changer d'implémentation devient trivial : pour envoyer des SMS à la place des emails, il suffit de passer un ",{"type":29,"tag":113,"props":21866,"children":21868},{"className":21867},[],[21869],{"type":34,"value":21870},"SMSSender",{"type":34,"value":21872}," au lieu d'un ",{"type":29,"tag":113,"props":21874,"children":21876},{"className":21875},[],[21877],{"type":34,"value":21855},{"type":34,"value":1866},{"type":29,"tag":106,"props":21880,"children":21882},{"className":5519,"code":21881,"language":5521,"meta":8,"style":8},"public class Main {\n    public static void main(String[] args) {\n        \u002F\u002F Envoi de notification par email\n        NotificationSender emailSender = new EmailSender();\n        NotificationService notificationService = new NotificationService(emailSender);\n        notificationService.sendNotification(\"Message par email\");\n\n        \u002F\u002F Envoi de notification par SMS\n        NotificationSender smsSender = new SMSSender();\n        NotificationService smsNotificationService\n\n = new NotificationService(smsSender);\n        smsNotificationService.sendNotification(\"Message par SMS\");\n    }\n}\n",[21883],{"type":29,"tag":113,"props":21884,"children":21885},{"__ignoreMap":8},[21886,21905,21948,21956,21985,22023,22053,22060,22068,22096,22108,22115,22143,22172,22179],{"type":29,"tag":117,"props":21887,"children":21888},{"class":119,"line":120},[21889,21893,21897,21901],{"type":29,"tag":117,"props":21890,"children":21891},{"style":143},[21892],{"type":34,"value":5541},{"type":29,"tag":117,"props":21894,"children":21895},{"style":143},[21896],{"type":34,"value":7575},{"type":29,"tag":117,"props":21898,"children":21899},{"style":2863},[21900],{"type":34,"value":18217},{"type":29,"tag":117,"props":21902,"children":21903},{"style":384},[21904],{"type":34,"value":3461},{"type":29,"tag":117,"props":21906,"children":21907},{"class":119,"line":130},[21908,21912,21916,21920,21924,21928,21932,21936,21940,21944],{"type":29,"tag":117,"props":21909,"children":21910},{"style":143},[21911],{"type":34,"value":7641},{"type":29,"tag":117,"props":21913,"children":21914},{"style":143},[21915],{"type":34,"value":9213},{"type":29,"tag":117,"props":21917,"children":21918},{"style":143},[21919],{"type":34,"value":7762},{"type":29,"tag":117,"props":21921,"children":21922},{"style":372},[21923],{"type":34,"value":18241},{"type":29,"tag":117,"props":21925,"children":21926},{"style":384},[21927],{"type":34,"value":1108},{"type":29,"tag":117,"props":21929,"children":21930},{"style":143},[21931],{"type":34,"value":7654},{"type":29,"tag":117,"props":21933,"children":21934},{"style":384},[21935],{"type":34,"value":2872},{"type":29,"tag":117,"props":21937,"children":21938},{"style":7657},[21939],{"type":34,"value":18258},{"type":29,"tag":117,"props":21941,"children":21942},{"style":384},[21943],{"type":34,"value":2803},{"type":29,"tag":117,"props":21945,"children":21946},{"style":384},[21947],{"type":34,"value":3461},{"type":29,"tag":117,"props":21949,"children":21950},{"class":119,"line":139},[21951],{"type":29,"tag":117,"props":21952,"children":21953},{"style":124},[21954],{"type":34,"value":21955},"        \u002F\u002F Envoi de notification par email\n",{"type":29,"tag":117,"props":21957,"children":21958},{"class":119,"line":172},[21959,21964,21969,21973,21977,21981],{"type":29,"tag":117,"props":21960,"children":21961},{"style":5976},[21962],{"type":34,"value":21963},"        NotificationSender",{"type":29,"tag":117,"props":21965,"children":21966},{"style":378},[21967],{"type":34,"value":21968}," emailSender ",{"type":29,"tag":117,"props":21970,"children":21971},{"style":160},[21972],{"type":34,"value":6061},{"type":29,"tag":117,"props":21974,"children":21975},{"style":143},[21976],{"type":34,"value":6066},{"type":29,"tag":117,"props":21978,"children":21979},{"style":372},[21980],{"type":34,"value":21354},{"type":29,"tag":117,"props":21982,"children":21983},{"style":384},[21984],{"type":34,"value":9375},{"type":29,"tag":117,"props":21986,"children":21987},{"class":119,"line":181},[21988,21993,21998,22002,22006,22010,22014,22019],{"type":29,"tag":117,"props":21989,"children":21990},{"style":5976},[21991],{"type":34,"value":21992},"        NotificationService",{"type":29,"tag":117,"props":21994,"children":21995},{"style":378},[21996],{"type":34,"value":21997}," notificationService ",{"type":29,"tag":117,"props":21999,"children":22000},{"style":160},[22001],{"type":34,"value":6061},{"type":29,"tag":117,"props":22003,"children":22004},{"style":143},[22005],{"type":34,"value":6066},{"type":29,"tag":117,"props":22007,"children":22008},{"style":372},[22009],{"type":34,"value":21032},{"type":29,"tag":117,"props":22011,"children":22012},{"style":384},[22013],{"type":34,"value":1108},{"type":29,"tag":117,"props":22015,"children":22016},{"style":378},[22017],{"type":34,"value":22018},"emailSender",{"type":29,"tag":117,"props":22020,"children":22021},{"style":384},[22022],{"type":34,"value":5675},{"type":29,"tag":117,"props":22024,"children":22025},{"class":119,"line":189},[22026,22031,22035,22040,22044,22049],{"type":29,"tag":117,"props":22027,"children":22028},{"style":378},[22029],{"type":34,"value":22030},"        notificationService",{"type":29,"tag":117,"props":22032,"children":22033},{"style":384},[22034],{"type":34,"value":369},{"type":29,"tag":117,"props":22036,"children":22037},{"style":372},[22038],{"type":34,"value":22039},"sendNotification",{"type":29,"tag":117,"props":22041,"children":22042},{"style":384},[22043],{"type":34,"value":1108},{"type":29,"tag":117,"props":22045,"children":22046},{"style":166},[22047],{"type":34,"value":22048},"\"Message par email\"",{"type":29,"tag":117,"props":22050,"children":22051},{"style":384},[22052],{"type":34,"value":5675},{"type":29,"tag":117,"props":22054,"children":22055},{"class":119,"line":198},[22056],{"type":29,"tag":117,"props":22057,"children":22058},{"emptyLinePlaceholder":13},[22059],{"type":34,"value":136},{"type":29,"tag":117,"props":22061,"children":22062},{"class":119,"line":207},[22063],{"type":29,"tag":117,"props":22064,"children":22065},{"style":124},[22066],{"type":34,"value":22067},"        \u002F\u002F Envoi de notification par SMS\n",{"type":29,"tag":117,"props":22069,"children":22070},{"class":119,"line":215},[22071,22075,22080,22084,22088,22092],{"type":29,"tag":117,"props":22072,"children":22073},{"style":5976},[22074],{"type":34,"value":21963},{"type":29,"tag":117,"props":22076,"children":22077},{"style":378},[22078],{"type":34,"value":22079}," smsSender ",{"type":29,"tag":117,"props":22081,"children":22082},{"style":160},[22083],{"type":34,"value":6061},{"type":29,"tag":117,"props":22085,"children":22086},{"style":143},[22087],{"type":34,"value":6066},{"type":29,"tag":117,"props":22089,"children":22090},{"style":372},[22091],{"type":34,"value":21500},{"type":29,"tag":117,"props":22093,"children":22094},{"style":384},[22095],{"type":34,"value":9375},{"type":29,"tag":117,"props":22097,"children":22098},{"class":119,"line":224},[22099,22103],{"type":29,"tag":117,"props":22100,"children":22101},{"style":5976},[22102],{"type":34,"value":21992},{"type":29,"tag":117,"props":22104,"children":22105},{"style":378},[22106],{"type":34,"value":22107}," smsNotificationService\n",{"type":29,"tag":117,"props":22109,"children":22110},{"class":119,"line":233},[22111],{"type":29,"tag":117,"props":22112,"children":22113},{"emptyLinePlaceholder":13},[22114],{"type":34,"value":136},{"type":29,"tag":117,"props":22116,"children":22117},{"class":119,"line":242},[22118,22122,22126,22130,22134,22139],{"type":29,"tag":117,"props":22119,"children":22120},{"style":160},[22121],{"type":34,"value":163},{"type":29,"tag":117,"props":22123,"children":22124},{"style":143},[22125],{"type":34,"value":6066},{"type":29,"tag":117,"props":22127,"children":22128},{"style":372},[22129],{"type":34,"value":21032},{"type":29,"tag":117,"props":22131,"children":22132},{"style":384},[22133],{"type":34,"value":1108},{"type":29,"tag":117,"props":22135,"children":22136},{"style":378},[22137],{"type":34,"value":22138},"smsSender",{"type":29,"tag":117,"props":22140,"children":22141},{"style":384},[22142],{"type":34,"value":5675},{"type":29,"tag":117,"props":22144,"children":22145},{"class":119,"line":251},[22146,22151,22155,22159,22163,22168],{"type":29,"tag":117,"props":22147,"children":22148},{"style":378},[22149],{"type":34,"value":22150},"        smsNotificationService",{"type":29,"tag":117,"props":22152,"children":22153},{"style":384},[22154],{"type":34,"value":369},{"type":29,"tag":117,"props":22156,"children":22157},{"style":372},[22158],{"type":34,"value":22039},{"type":29,"tag":117,"props":22160,"children":22161},{"style":384},[22162],{"type":34,"value":1108},{"type":29,"tag":117,"props":22164,"children":22165},{"style":166},[22166],{"type":34,"value":22167},"\"Message par SMS\"",{"type":29,"tag":117,"props":22169,"children":22170},{"style":384},[22171],{"type":34,"value":5675},{"type":29,"tag":117,"props":22173,"children":22174},{"class":119,"line":260},[22175],{"type":29,"tag":117,"props":22176,"children":22177},{"style":384},[22178],{"type":34,"value":5632},{"type":29,"tag":117,"props":22180,"children":22181},{"class":119,"line":269},[22182],{"type":29,"tag":117,"props":22183,"children":22184},{"style":384},[22185],{"type":34,"value":2903},{"type":29,"tag":51,"props":22187,"children":22188},{},[],{"type":29,"tag":5462,"props":22190,"children":22191},{"type":5464},[22192],{"type":29,"tag":30,"props":22193,"children":22194},{},[22195,22200],{"type":29,"tag":45,"props":22196,"children":22197},{},[22198],{"type":34,"value":22199},"Injectez vos dépendances",{"type":34,"value":22201}," via des interfaces ou des classes abstraites plutôt que d'utiliser des classes concrètes. Cela rendra vos modules de haut niveau plus flexibles et plus faciles à modifier à l'avenir.",{"type":29,"tag":55,"props":22203,"children":22205},{"id":22204},"_6-exemples-concrets-de-chaque-principe-en-java",[22206],{"type":34,"value":22207},"6. Exemples concrets de chaque principe en Java",{"type":29,"tag":4212,"props":22209,"children":22210},{},[22211,22235,22252,22283,22322],{"type":29,"tag":1589,"props":22212,"children":22213},{},[22214,22219,22220],{"type":29,"tag":45,"props":22215,"children":22216},{},[22217],{"type":34,"value":22218},"Single Responsibility Principle (SRP)",{"type":34,"value":1866},{"type":29,"tag":1585,"props":22221,"children":22222},{},[22223],{"type":29,"tag":1589,"props":22224,"children":22225},{},[22226,22228,22233],{"type":34,"value":22227},"Exemple : Une classe ",{"type":29,"tag":113,"props":22229,"children":22231},{"className":22230},[],[22232],{"type":34,"value":16537},{"type":34,"value":22234}," qui génère des rapports ne doit pas aussi gérer l'enregistrement des fichiers PDF. Divisez ces responsabilités en deux classes distinctes.",{"type":29,"tag":1589,"props":22236,"children":22237},{},[22238,22243,22244],{"type":29,"tag":45,"props":22239,"children":22240},{},[22241],{"type":34,"value":22242},"Open\u002FClosed Principle (OCP)",{"type":34,"value":1866},{"type":29,"tag":1585,"props":22245,"children":22246},{},[22247],{"type":29,"tag":1589,"props":22248,"children":22249},{},[22250],{"type":34,"value":22251},"Exemple : Une classe de traitement de paiements qui supporte plusieurs méthodes de paiement (carte bancaire, PayPal, e-wallet) doit être extensible via de nouvelles implémentations de méthodes de paiement sans modifier la classe de base.",{"type":29,"tag":1589,"props":22253,"children":22254},{},[22255,22260,22261],{"type":29,"tag":45,"props":22256,"children":22257},{},[22258],{"type":34,"value":22259},"Liskov Substitution Principle (LSP)",{"type":34,"value":1866},{"type":29,"tag":1585,"props":22262,"children":22263},{},[22264],{"type":29,"tag":1589,"props":22265,"children":22266},{},[22267,22269,22274,22276,22281],{"type":34,"value":22268},"Exemple : Évitez d'utiliser l'héritage entre une classe ",{"type":29,"tag":113,"props":22270,"children":22272},{"className":22271},[],[22273],{"type":34,"value":18577},{"type":34,"value":22275}," et une classe ",{"type":29,"tag":113,"props":22277,"children":22279},{"className":22278},[],[22280],{"type":34,"value":18585},{"type":34,"value":22282}," si leurs comportements sont fondamentalement différents (comme les changements indépendants de largeur et de hauteur).",{"type":29,"tag":1589,"props":22284,"children":22285},{},[22286,22291,22292],{"type":29,"tag":45,"props":22287,"children":22288},{},[22289],{"type":34,"value":22290},"Interface Segregation Principle (ISP)",{"type":34,"value":1866},{"type":29,"tag":1585,"props":22293,"children":22294},{},[22295],{"type":29,"tag":1589,"props":22296,"children":22297},{},[22298,22300,22306,22307,22313,22315,22320],{"type":34,"value":22299},"Exemple : Créez des interfaces spécifiques (",{"type":29,"tag":113,"props":22301,"children":22303},{"className":22302},[],[22304],{"type":34,"value":22305},"FlyingBird",{"type":34,"value":2468},{"type":29,"tag":113,"props":22308,"children":22310},{"className":22309},[],[22311],{"type":34,"value":22312},"SwimmingBird",{"type":34,"value":22314},", etc.) au lieu d'une seule interface générale ",{"type":29,"tag":113,"props":22316,"children":22318},{"className":22317},[],[22319],{"type":34,"value":19781},{"type":34,"value":22321}," qui oblige toutes les classes à implémenter des méthodes non pertinentes.",{"type":29,"tag":1589,"props":22323,"children":22324},{},[22325,22330,22331],{"type":29,"tag":45,"props":22326,"children":22327},{},[22328],{"type":34,"value":22329},"Dependency Inversion Principle (DIP)",{"type":34,"value":1866},{"type":29,"tag":1585,"props":22332,"children":22333},{},[22334],{"type":29,"tag":1589,"props":22335,"children":22336},{},[22337,22339,22344,22346,22351],{"type":34,"value":22338},"Exemple : Au lieu de dépendre directement d'une classe ",{"type":29,"tag":113,"props":22340,"children":22342},{"className":22341},[],[22343],{"type":34,"value":20886},{"type":34,"value":22345},", utilisez une interface ",{"type":29,"tag":113,"props":22347,"children":22349},{"className":22348},[],[22350],{"type":34,"value":21251},{"type":34,"value":22352}," pour injecter des services d'envoi de notifications par email, SMS, etc.",{"type":29,"tag":567,"props":22354,"children":22356},{"cta":805,"href":806,"title":22355,"type":808},"SOLID, ce sont 5 leviers : il en existe 100 pour coder propre",[22357],{"type":29,"tag":30,"props":22358,"children":22359},{},[22360],{"type":34,"value":22361},"Cet article détaille les cinq principes SOLID, mais bien écrire ne s'arrête pas là. Le Craft Bundle réunit les 100 pratiques que j'applique au quotidien pour garder un code lisible et faible en couplage, du nommage à la gestion des dépendances. Ce sont celles que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues tenir sur dix ans de production.",{"type":29,"tag":51,"props":22363,"children":22364},{},[],{"type":29,"tag":55,"props":22366,"children":22368},{"id":22367},"_7-faq-sur-les-principes-solid-en-java",[22369],{"type":34,"value":22370},"7. FAQ sur les principes SOLID en Java",{"type":29,"tag":825,"props":22372,"children":22373},{},[22374,22379],{"type":29,"tag":829,"props":22375,"children":22376},{},[22377],{"type":34,"value":22378},"Pourquoi appliquer les principes SOLID en Java ?",{"type":29,"tag":30,"props":22380,"children":22381},{},[22382],{"type":34,"value":22383},"Les principes SOLID conduisent à un code plus propre, plus modulaire et plus maintenable. Ils réduisent les risques de régression lors des modifications et rendent l'ajout de nouvelles fonctionnalités plus sûr.",{"type":29,"tag":825,"props":22385,"children":22386},{},[22387,22392],{"type":29,"tag":829,"props":22388,"children":22389},{},[22390],{"type":34,"value":22391},"Est-ce que les principes SOLID sont applicables à tous les projets Java ?",{"type":29,"tag":30,"props":22393,"children":22394},{},[22395],{"type":34,"value":22396},"Oui, du petit projet aux grands systèmes, ces principes aident à tenir la qualité du code. Évitez l'application zélée pour autant : utilisez le bon outil pour le bon problème : sur-abstraire vaut souvent pire que rien.",{"type":29,"tag":825,"props":22398,"children":22399},{},[22400,22405],{"type":29,"tag":829,"props":22401,"children":22402},{},[22403],{"type":34,"value":22404},"Quel est le principe SOLID le plus important ?",{"type":29,"tag":30,"props":22406,"children":22407},{},[22408],{"type":34,"value":22409},"Tous les principes sont importants, mais si vous débutez, le SRP (principe de responsabilité unique) et le OCP (principe ouvert\u002Ffermé) sont souvent les plus critiques pour améliorer la maintenabilité de votre code.",{"type":29,"tag":825,"props":22411,"children":22412},{},[22413,22418],{"type":29,"tag":829,"props":22414,"children":22415},{},[22416],{"type":34,"value":22417},"Comment appliquer SOLID dans un projet existant ?",{"type":29,"tag":30,"props":22419,"children":22420},{},[22421],{"type":34,"value":22422},"Appliquez progressivement les principes en identifiant les endroits où le code est fortement couplé ou difficile à maintenir. Refactorisez au fur et à mesure, en créant des abstractions et en séparant les responsabilités lorsque nécessaire.",{"type":29,"tag":51,"props":22424,"children":22425},{},[],{"type":29,"tag":567,"props":22427,"children":22428},{"cta":2379,"href":918,"title":16346,"type":920},[22429],{"type":29,"tag":30,"props":22430,"children":22431},{},[22432],{"type":34,"value":22433},"30 questions, 5 dimensions, score sur 100. Mesurez la maturité engineering de votre équipe et identifiez les 3 chantiers qui débloquent immédiatement votre vélocité.",{"type":29,"tag":928,"props":22435,"children":22436},{},[22437],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":22439},[22440,22441,22442,22446,22450,22454,22458,22462,22463],{"id":16389,"depth":130,"text":16392},{"id":16480,"depth":130,"text":16483},{"id":16494,"depth":130,"text":16497,"children":22443},[22444,22445],{"id":16512,"depth":139,"text":16515},{"id":16523,"depth":139,"text":16526},{"id":17273,"depth":130,"text":17276,"children":22447},[22448,22449],{"id":17298,"depth":139,"text":16515},{"id":17308,"depth":139,"text":16526},{"id":18543,"depth":130,"text":18546,"children":22451},[22452,22453],{"id":18554,"depth":139,"text":16515},{"id":18564,"depth":139,"text":16526},{"id":19747,"depth":130,"text":19750,"children":22455},[22456,22457],{"id":19758,"depth":139,"text":16515},{"id":19768,"depth":139,"text":16526},{"id":20834,"depth":130,"text":20837,"children":22459},[22460,22461],{"id":20845,"depth":139,"text":16515},{"id":20855,"depth":139,"text":16526},{"id":22204,"depth":130,"text":22207},{"id":22367,"depth":130,"text":22370},"content:fr:architecture-craft:principes-solid-java-exemples.md","fr\u002Farchitecture-craft\u002Fprincipes-solid-java-exemples.md","fr\u002Farchitecture-craft\u002Fprincipes-solid-java-exemples",{"_path":16472,"_dir":16372,"_draft":7,"_partial":7,"_locale":8,"title":22468,"description":22469,"id":22470,"date":22471,"listed":13,"nocomments":7,"hidden":7,"categories":22472,"tags":22473,"cover":22474,"readingTime":22475,"body":22480,"_type":942,"_id":25818,"_source":944,"_file":25819,"_stem":25820,"_extension":947},"Comprendre et appliquer le principe DIP en Java pour un code plus flexible","Découvrez comment le principe DIP (Dependency Inversion Principle) améliore la flexibilité et la maintenabilité de votre code Java. Apprenez à...",45,"2024-04-01",[16372],[5391,18],"covers\u002Farticles\u002Fprincipe-dip.jpg",{"text":22476,"minutes":22477,"time":22478,"words":22479},"13 min read",12.14,728400,2428,{"type":26,"children":22481,"toc":25799},[22482,22488,22493,22512,22523,22526,22532,22548,22560,22571,22614,22623,22626,22635,22641,22659,22665,22670,22682,22688,22693,22715,22718,22761,22764,22770,22781,22787,22792,23101,23132,23138,23163,23745,23778,24066,24072,24083,24094,24109,24124,24127,24133,24157,24163,24181,24204,24207,24213,24218,24230,24587,24625,24861,24873,24878,25133,25140,25233,25239,25276,25501,25514,25522,25525,25534,25537,25543,25561,25593,25619,25645,25658,25695,25739,25742,25746,25763,25768,25788,25795],{"type":29,"tag":55,"props":22483,"children":22485},{"id":22484},"introduction-au-dip-dependency-inversion-principle",[22486],{"type":34,"value":22487},"Introduction au DIP (Dependency Inversion Principle)",{"type":29,"tag":30,"props":22489,"children":22490},{},[22491],{"type":34,"value":22492},"Une petite modification dans un service ou une couche d'accès aux données, et c'est la cascade : tests cassés, modules qui ne compilent plus, dépendances absurdes entre classes de haut et de bas niveau. C'est le quotidien de la plupart des bases de code que j'audite.",{"type":29,"tag":30,"props":22494,"children":22495},{},[22496,22498,22503,22505,22510],{"type":34,"value":22497},"Le principe de l'inversion des dépendances (",{"type":29,"tag":45,"props":22499,"children":22500},{},[22501],{"type":34,"value":22502},"DIP",{"type":34,"value":22504},", Dependency Inversion Principle) attaque exactement cette ",{"type":29,"tag":45,"props":22506,"children":22507},{},[22508],{"type":34,"value":22509},"rigidité",{"type":34,"value":22511}," qui rend chaque modification coûteuse. Mieux modulariser, mieux tester, casser le couplage : c'est ce que le DIP apporte concrètement.",{"type":29,"tag":30,"props":22513,"children":22514},{},[22515,22517,22521],{"type":34,"value":22516},"Dans une grande DSI du secteur assurance, le couplage entre services métier et infrastructure retardait chaque livraison de plusieurs semaines. Appliquer le DIP a découplé les couches et raccourci les cycles. Cet article explique comment ce principe fonctionne, pourquoi il est central en Software Craftsmanship (formalisé par Robert C. Martin dans ",{"type":29,"tag":5410,"props":22518,"children":22519},{},[22520],{"type":34,"value":16407},{"type":34,"value":22522},"), et comment l'appliquer dans vos projets Java.",{"type":29,"tag":51,"props":22524,"children":22525},{},[],{"type":29,"tag":55,"props":22527,"children":22529},{"id":22528},"pourquoi-le-dip-est-essentiel-dans-le-software-craftsmanship",[22530],{"type":34,"value":22531},"Pourquoi le DIP est essentiel dans le Software Craftsmanship",{"type":29,"tag":30,"props":22533,"children":22534},{},[22535,22536,22540,22542,22546],{"type":34,"value":7167},{"type":29,"tag":45,"props":22537,"children":22538},{},[22539],{"type":34,"value":13956},{"type":34,"value":22541}," repose sur l'idée que le code doit être traité comme un artisanat. Un bon code ne se limite pas à fonctionner ; il doit être propre, maintenable et flexible. C'est ici que le ",{"type":29,"tag":45,"props":22543,"children":22544},{},[22545],{"type":34,"value":22502},{"type":34,"value":22547}," joue un rôle crucial.",{"type":29,"tag":30,"props":22549,"children":22550},{},[22551,22553,22558],{"type":34,"value":22552},"Le principe de l'inversion des dépendances nous apprend que les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Au lieu de cela, tous deux doivent dépendre d’abstractions. De plus, ces abstractions ne doivent pas dépendre des détails d'implémentation, mais c'est plutôt ces détails qui doivent dépendre d’abstractions. Autrement dit, le DIP encourage la ",{"type":29,"tag":45,"props":22554,"children":22555},{},[22556],{"type":34,"value":22557},"séparation des préoccupations",{"type":34,"value":22559}," et aide à découpler les différentes parties du système.",{"type":29,"tag":30,"props":22561,"children":22562},{},[22563,22565,22569],{"type":34,"value":22564},"Voici pourquoi le DIP est essentiel dans une démarche de ",{"type":29,"tag":45,"props":22566,"children":22567},{},[22568],{"type":34,"value":13956},{"type":34,"value":22570}," :",{"type":29,"tag":1585,"props":22572,"children":22573},{},[22574,22584,22594,22604],{"type":29,"tag":1589,"props":22575,"children":22576},{},[22577,22582],{"type":29,"tag":45,"props":22578,"children":22579},{},[22580],{"type":34,"value":22581},"Réduction des couplages forts",{"type":34,"value":22583}," : le couplage fort entre modules est l'une des causes principales des bugs et des cauchemars de maintenance. Le DIP brise cette dépendance directe en intercalant des interfaces et des abstractions.",{"type":29,"tag":1589,"props":22585,"children":22586},{},[22587,22592],{"type":29,"tag":45,"props":22588,"children":22589},{},[22590],{"type":34,"value":22591},"Facilite les tests",{"type":34,"value":22593}," : un code qui suit le DIP devient testable. Remplacer une implémentation concrète par un mock ou un stub se fait sans rien casser dans les modules de haut niveau.",{"type":29,"tag":1589,"props":22595,"children":22596},{},[22597,22602],{"type":29,"tag":45,"props":22598,"children":22599},{},[22600],{"type":34,"value":22601},"Encourage la réutilisabilité",{"type":34,"value":22603}," : avec des modules découplés, certains composants se réutilisent directement dans d'autres contextes, sans rien toucher au reste du système.",{"type":29,"tag":1589,"props":22605,"children":22606},{},[22607,22612],{"type":29,"tag":45,"props":22608,"children":22609},{},[22610],{"type":34,"value":22611},"Simplification des évolutions",{"type":34,"value":22613}," : faire évoluer une implémentation devient une opération locale. Modifier ou remplacer une classe de bas niveau n'impacte plus les modules de haut niveau, et les cycles de développement raccourcissent.",{"type":29,"tag":5462,"props":22615,"children":22617},{"type":22616},"warning",[22618],{"type":29,"tag":30,"props":22619,"children":22620},{},[22621],{"type":34,"value":22622},"Si vous négligez d’appliquer le DIP, vous risquez d’avoir un code rigide où la moindre modification entraînera des effets secondaires inattendus dans plusieurs modules. Cela rendra votre code difficile à maintenir à long terme.",{"type":29,"tag":51,"props":22624,"children":22625},{},[],{"type":29,"tag":567,"props":22627,"children":22629},{"cta":569,"href":570,"title":22628,"type":572},"Vous voulez savoir placer une abstraction là où elle découple vraiment, et pas partout par réflexe ?",[22630],{"type":29,"tag":30,"props":22631,"children":22632},{},[22633],{"type":34,"value":22634},"Inverser une dépendance au bon endroit, ça ne s'apprend pas en mémorisant la définition du DIP : ça se travaille sur votre vrai code. En mentoring 1:1, je relis vos services et vos couches d'accès avec vous, on identifie les couplages qui font mal et ceux qui peuvent rester, et vous repartez avec le réflexe de concevoir l'interface avant l'implémentation.",{"type":29,"tag":55,"props":22636,"children":22638},{"id":22637},"les-deux-règles-principales-du-dip",[22639],{"type":34,"value":22640},"Les deux règles principales du DIP",{"type":29,"tag":30,"props":22642,"children":22643},{},[22644,22645,22649,22651,22657],{"type":34,"value":7167},{"type":29,"tag":45,"props":22646,"children":22647},{},[22648],{"type":34,"value":22502},{"type":34,"value":22650}," (Dependency Inversion Principle) repose sur deux règles simples mais puissantes. En les respectant, vous pourrez transformer votre code en un ensemble de modules bien découplés et faciles à maintenir. C'est ce même principe qui est au cœur de la ",{"type":29,"tag":453,"props":22652,"children":22654},{"href":22653},"\u002Ffr\u002Farchitecture-craft\u002Fclean-architecture-3-regles",[22655],{"type":34,"value":22656},"Clean Architecture",{"type":34,"value":22658}," : les flèches de dépendance pointent toujours vers le domaine métier, jamais vers l'infrastructure. Voyons ces deux règles en détail :",{"type":29,"tag":4530,"props":22660,"children":22662},{"id":22661},"_1-les-modules-de-haut-niveau-ne-doivent-pas-dépendre-des-modules-de-bas-niveau-tous-deux-doivent-dépendre-dabstractions",[22663],{"type":34,"value":22664},"1. Les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Tous deux doivent dépendre d'abstractions.",{"type":29,"tag":30,"props":22666,"children":22667},{},[22668],{"type":34,"value":22669},"Dans un système classique, les classes de haut niveau (comme les contrôleurs ou les services principaux) ont souvent des dépendances directes sur des classes de bas niveau (par exemple, les couches d’accès aux données). Cela crée une forte interdépendance entre ces différentes couches. Le problème ici, c'est que toute modification dans les détails d'implémentation des classes de bas niveau va entraîner des changements dans les classes de haut niveau.",{"type":29,"tag":30,"props":22671,"children":22672},{},[22673,22675,22680],{"type":34,"value":22674},"En appliquant le DIP, vous devez introduire des ",{"type":29,"tag":45,"props":22676,"children":22677},{},[22678],{"type":34,"value":22679},"interfaces ou des abstractions",{"type":34,"value":22681}," entre ces couches. Ainsi, les classes de haut et de bas niveau ne communiquent plus directement. Par exemple, une classe de service ne devrait pas connaître la classe d’accès aux données spécifique, mais plutôt dépendre d’une interface générale pour interagir avec la base de données.",{"type":29,"tag":4530,"props":22683,"children":22685},{"id":22684},"_2-les-abstractions-ne-doivent-pas-dépendre-des-détails-ce-sont-les-détails-qui-doivent-dépendre-des-abstractions",[22686],{"type":34,"value":22687},"2. Les abstractions ne doivent pas dépendre des détails. Ce sont les détails qui doivent dépendre des abstractions.",{"type":29,"tag":30,"props":22689,"children":22690},{},[22691],{"type":34,"value":22692},"Dans cette seconde règle, il s’agit d’inverser la dépendance traditionnelle. Autrement dit, les interfaces et abstractions doivent être stables et définir des comportements génériques, tandis que les classes concrètes (les \"détails\") doivent dépendre de ces abstractions.",{"type":29,"tag":5462,"props":22694,"children":22695},{"type":5464},[22696],{"type":29,"tag":30,"props":22697,"children":22698},{},[22699,22701,22706,22708,22713],{"type":34,"value":22700},"Pour respecter ces deux règles, je vous recommande de toujours concevoir des ",{"type":29,"tag":45,"props":22702,"children":22703},{},[22704],{"type":34,"value":22705},"interfaces",{"type":34,"value":22707}," ou des ",{"type":29,"tag":45,"props":22709,"children":22710},{},[22711],{"type":34,"value":22712},"abstractions",{"type":34,"value":22714}," avant de créer des implémentations concrètes. Cela vous permet d’anticiper les changements et d’introduire de la flexibilité dans votre code.",{"type":29,"tag":51,"props":22716,"children":22717},{},[],{"type":29,"tag":30,"props":22719,"children":22720},{},[22721,22723,22729,22731,22737,22738,22744,22746,22752,22753,22759],{"type":34,"value":22722},"Prenons un exemple concret : avec une interface ",{"type":29,"tag":113,"props":22724,"children":22726},{"className":22725},[],[22727],{"type":34,"value":22728},"IDatabase",{"type":34,"value":22730}," qui définit ",{"type":29,"tag":113,"props":22732,"children":22734},{"className":22733},[],[22735],{"type":34,"value":22736},"save()",{"type":34,"value":5923},{"type":29,"tag":113,"props":22739,"children":22741},{"className":22740},[],[22742],{"type":34,"value":22743},"find()",{"type":34,"value":22745},", ce sont les implémentations (",{"type":29,"tag":113,"props":22747,"children":22749},{"className":22748},[],[22750],{"type":34,"value":22751},"MySQLDatabase",{"type":34,"value":2468},{"type":29,"tag":113,"props":22754,"children":22756},{"className":22755},[],[22757],{"type":34,"value":22758},"MongoDatabase",{"type":34,"value":22760},") qui s'adaptent à l'abstraction, jamais l'inverse. Vous changez d'implémentation (par exemple, MySQL vers MongoDB) sans toucher au reste du système.",{"type":29,"tag":51,"props":22762,"children":22763},{},[],{"type":29,"tag":55,"props":22765,"children":22767},{"id":22766},"exemples-concrets-de-violation-et-application-du-dip-en-java",[22768],{"type":34,"value":22769},"Exemples concrets de violation et application du DIP en Java",{"type":29,"tag":30,"props":22771,"children":22772},{},[22773,22775,22779],{"type":34,"value":22774},"Pour bien comprendre le ",{"type":29,"tag":45,"props":22776,"children":22777},{},[22778],{"type":34,"value":22502},{"type":34,"value":22780},", il est utile de voir à quoi ressemble une violation de ce principe et comment on peut corriger cela. Voici un exemple en Java pour illustrer à la fois le problème et la solution.",{"type":29,"tag":4530,"props":22782,"children":22784},{"id":22783},"exemple-de-violation-du-dip",[22785],{"type":34,"value":22786},"Exemple de violation du DIP",{"type":29,"tag":30,"props":22788,"children":22789},{},[22790],{"type":34,"value":22791},"Voici un cas simple où une classe de service dépend directement d’une classe de bas niveau, comme un service de messagerie qui envoie des emails :",{"type":29,"tag":106,"props":22793,"children":22795},{"className":5519,"code":22794,"language":5521,"meta":8,"style":8},"public class NotificationService {\n    private EmailSender emailSender;\n\n    public NotificationService() {\n        this.emailSender = new EmailSender();\n    }\n\n    public void sendNotification(String message) {\n        emailSender.sendEmail(message);\n    }\n}\n\nclass EmailSender {\n    public void sendEmail(String message) {\n        System.out.println(\"Envoi de l'email : \" + message);\n    }\n}\n",[22796],{"type":29,"tag":113,"props":22797,"children":22798},{"__ignoreMap":8},[22799,22818,22838,22845,22864,22896,22903,22910,22945,22973,22980,22987,22994,23009,23044,23087,23094],{"type":29,"tag":117,"props":22800,"children":22801},{"class":119,"line":120},[22802,22806,22810,22814],{"type":29,"tag":117,"props":22803,"children":22804},{"style":143},[22805],{"type":34,"value":5541},{"type":29,"tag":117,"props":22807,"children":22808},{"style":143},[22809],{"type":34,"value":7575},{"type":29,"tag":117,"props":22811,"children":22812},{"style":2863},[22813],{"type":34,"value":21032},{"type":29,"tag":117,"props":22815,"children":22816},{"style":384},[22817],{"type":34,"value":3461},{"type":29,"tag":117,"props":22819,"children":22820},{"class":119,"line":130},[22821,22825,22829,22834],{"type":29,"tag":117,"props":22822,"children":22823},{"style":143},[22824],{"type":34,"value":7592},{"type":29,"tag":117,"props":22826,"children":22827},{"style":5976},[22828],{"type":34,"value":21354},{"type":29,"tag":117,"props":22830,"children":22831},{"style":378},[22832],{"type":34,"value":22833}," emailSender",{"type":29,"tag":117,"props":22835,"children":22836},{"style":384},[22837],{"type":34,"value":387},{"type":29,"tag":117,"props":22839,"children":22840},{"class":119,"line":139},[22841],{"type":29,"tag":117,"props":22842,"children":22843},{"emptyLinePlaceholder":13},[22844],{"type":34,"value":136},{"type":29,"tag":117,"props":22846,"children":22847},{"class":119,"line":172},[22848,22852,22856,22860],{"type":29,"tag":117,"props":22849,"children":22850},{"style":143},[22851],{"type":34,"value":7641},{"type":29,"tag":117,"props":22853,"children":22854},{"style":372},[22855],{"type":34,"value":21032},{"type":29,"tag":117,"props":22857,"children":22858},{"style":384},[22859],{"type":34,"value":381},{"type":29,"tag":117,"props":22861,"children":22862},{"style":384},[22863],{"type":34,"value":3461},{"type":29,"tag":117,"props":22865,"children":22866},{"class":119,"line":181},[22867,22871,22875,22880,22884,22888,22892],{"type":29,"tag":117,"props":22868,"children":22869},{"style":6700},[22870],{"type":34,"value":7687},{"type":29,"tag":117,"props":22872,"children":22873},{"style":384},[22874],{"type":34,"value":369},{"type":29,"tag":117,"props":22876,"children":22877},{"style":378},[22878],{"type":34,"value":22879},"emailSender ",{"type":29,"tag":117,"props":22881,"children":22882},{"style":160},[22883],{"type":34,"value":6061},{"type":29,"tag":117,"props":22885,"children":22886},{"style":143},[22887],{"type":34,"value":6066},{"type":29,"tag":117,"props":22889,"children":22890},{"style":372},[22891],{"type":34,"value":21354},{"type":29,"tag":117,"props":22893,"children":22894},{"style":384},[22895],{"type":34,"value":9375},{"type":29,"tag":117,"props":22897,"children":22898},{"class":119,"line":189},[22899],{"type":29,"tag":117,"props":22900,"children":22901},{"style":384},[22902],{"type":34,"value":5632},{"type":29,"tag":117,"props":22904,"children":22905},{"class":119,"line":198},[22906],{"type":29,"tag":117,"props":22907,"children":22908},{"emptyLinePlaceholder":13},[22909],{"type":34,"value":136},{"type":29,"tag":117,"props":22911,"children":22912},{"class":119,"line":207},[22913,22917,22921,22925,22929,22933,22937,22941],{"type":29,"tag":117,"props":22914,"children":22915},{"style":143},[22916],{"type":34,"value":7641},{"type":29,"tag":117,"props":22918,"children":22919},{"style":143},[22920],{"type":34,"value":7762},{"type":29,"tag":117,"props":22922,"children":22923},{"style":372},[22924],{"type":34,"value":21144},{"type":29,"tag":117,"props":22926,"children":22927},{"style":384},[22928],{"type":34,"value":1108},{"type":29,"tag":117,"props":22930,"children":22931},{"style":5976},[22932],{"type":34,"value":7654},{"type":29,"tag":117,"props":22934,"children":22935},{"style":7657},[22936],{"type":34,"value":20943},{"type":29,"tag":117,"props":22938,"children":22939},{"style":384},[22940],{"type":34,"value":2803},{"type":29,"tag":117,"props":22942,"children":22943},{"style":384},[22944],{"type":34,"value":3461},{"type":29,"tag":117,"props":22946,"children":22947},{"class":119,"line":215},[22948,22953,22957,22961,22965,22969],{"type":29,"tag":117,"props":22949,"children":22950},{"style":378},[22951],{"type":34,"value":22952},"        emailSender",{"type":29,"tag":117,"props":22954,"children":22955},{"style":384},[22956],{"type":34,"value":369},{"type":29,"tag":117,"props":22958,"children":22959},{"style":372},[22960],{"type":34,"value":21181},{"type":29,"tag":117,"props":22962,"children":22963},{"style":384},[22964],{"type":34,"value":1108},{"type":29,"tag":117,"props":22966,"children":22967},{"style":378},[22968],{"type":34,"value":21190},{"type":29,"tag":117,"props":22970,"children":22971},{"style":384},[22972],{"type":34,"value":5675},{"type":29,"tag":117,"props":22974,"children":22975},{"class":119,"line":224},[22976],{"type":29,"tag":117,"props":22977,"children":22978},{"style":384},[22979],{"type":34,"value":5632},{"type":29,"tag":117,"props":22981,"children":22982},{"class":119,"line":233},[22983],{"type":29,"tag":117,"props":22984,"children":22985},{"style":384},[22986],{"type":34,"value":2903},{"type":29,"tag":117,"props":22988,"children":22989},{"class":119,"line":242},[22990],{"type":29,"tag":117,"props":22991,"children":22992},{"emptyLinePlaceholder":13},[22993],{"type":34,"value":136},{"type":29,"tag":117,"props":22995,"children":22996},{"class":119,"line":251},[22997,23001,23005],{"type":29,"tag":117,"props":22998,"children":22999},{"style":143},[23000],{"type":34,"value":16091},{"type":29,"tag":117,"props":23002,"children":23003},{"style":2863},[23004],{"type":34,"value":21354},{"type":29,"tag":117,"props":23006,"children":23007},{"style":384},[23008],{"type":34,"value":3461},{"type":29,"tag":117,"props":23010,"children":23011},{"class":119,"line":260},[23012,23016,23020,23024,23028,23032,23036,23040],{"type":29,"tag":117,"props":23013,"children":23014},{"style":143},[23015],{"type":34,"value":7641},{"type":29,"tag":117,"props":23017,"children":23018},{"style":143},[23019],{"type":34,"value":7762},{"type":29,"tag":117,"props":23021,"children":23022},{"style":372},[23023],{"type":34,"value":20930},{"type":29,"tag":117,"props":23025,"children":23026},{"style":384},[23027],{"type":34,"value":1108},{"type":29,"tag":117,"props":23029,"children":23030},{"style":5976},[23031],{"type":34,"value":7654},{"type":29,"tag":117,"props":23033,"children":23034},{"style":7657},[23035],{"type":34,"value":20943},{"type":29,"tag":117,"props":23037,"children":23038},{"style":384},[23039],{"type":34,"value":2803},{"type":29,"tag":117,"props":23041,"children":23042},{"style":384},[23043],{"type":34,"value":3461},{"type":29,"tag":117,"props":23045,"children":23046},{"class":119,"line":269},[23047,23051,23055,23059,23063,23067,23071,23075,23079,23083],{"type":29,"tag":117,"props":23048,"children":23049},{"style":378},[23050],{"type":34,"value":16717},{"type":29,"tag":117,"props":23052,"children":23053},{"style":384},[23054],{"type":34,"value":369},{"type":29,"tag":117,"props":23056,"children":23057},{"style":378},[23058],{"type":34,"value":15075},{"type":29,"tag":117,"props":23060,"children":23061},{"style":384},[23062],{"type":34,"value":369},{"type":29,"tag":117,"props":23064,"children":23065},{"style":372},[23066],{"type":34,"value":15084},{"type":29,"tag":117,"props":23068,"children":23069},{"style":384},[23070],{"type":34,"value":1108},{"type":29,"tag":117,"props":23072,"children":23073},{"style":166},[23074],{"type":34,"value":20983},{"type":29,"tag":117,"props":23076,"children":23077},{"style":160},[23078],{"type":34,"value":15098},{"type":29,"tag":117,"props":23080,"children":23081},{"style":378},[23082],{"type":34,"value":20943},{"type":29,"tag":117,"props":23084,"children":23085},{"style":384},[23086],{"type":34,"value":5675},{"type":29,"tag":117,"props":23088,"children":23089},{"class":119,"line":278},[23090],{"type":29,"tag":117,"props":23091,"children":23092},{"style":384},[23093],{"type":34,"value":5632},{"type":29,"tag":117,"props":23095,"children":23096},{"class":119,"line":286},[23097],{"type":29,"tag":117,"props":23098,"children":23099},{"style":384},[23100],{"type":34,"value":2903},{"type":29,"tag":30,"props":23102,"children":23103},{},[23104,23105,23110,23112,23117,23119,23123,23125,23130],{"type":34,"value":7966},{"type":29,"tag":113,"props":23106,"children":23108},{"className":23107},[],[23109],{"type":34,"value":20867},{"type":34,"value":23111}," dépend directement de ",{"type":29,"tag":113,"props":23113,"children":23115},{"className":23114},[],[23116],{"type":34,"value":21855},{"type":34,"value":23118},", ce qui viole le ",{"type":29,"tag":45,"props":23120,"children":23121},{},[23122],{"type":34,"value":22502},{"type":34,"value":23124},". Si un jour on veut changer le mode de notification (par exemple, passer à un SMS ou à un système de notifications push), il faudrait modifier ",{"type":29,"tag":113,"props":23126,"children":23128},{"className":23127},[],[23129],{"type":34,"value":20867},{"type":34,"value":23131},", ce qui n’est pas optimal.",{"type":29,"tag":4530,"props":23133,"children":23135},{"id":23134},"correction-avec-le-dip",[23136],{"type":34,"value":23137},"Correction avec le DIP",{"type":29,"tag":30,"props":23139,"children":23140},{},[23141,23143,23147,23149,23154,23156,23161],{"type":34,"value":23142},"Pour appliquer le ",{"type":29,"tag":45,"props":23144,"children":23145},{},[23146],{"type":34,"value":22502},{"type":34,"value":23148},", nous allons introduire une ",{"type":29,"tag":45,"props":23150,"children":23151},{},[23152],{"type":34,"value":23153},"interface",{"type":34,"value":23155}," pour définir le comportement attendu d'un système d'envoi de notifications, et faire en sorte que ",{"type":29,"tag":113,"props":23157,"children":23159},{"className":23158},[],[23160],{"type":34,"value":20867},{"type":34,"value":23162}," dépende de cette abstraction :",{"type":29,"tag":106,"props":23164,"children":23166},{"className":5519,"code":23165,"language":5521,"meta":8,"style":8},"\u002F\u002F Interface qui respecte le DIP\npublic interface MessageSender {\n    void sendMessage(String message);\n}\n\n\u002F\u002F Implémentation pour l'envoi d'emails\npublic class EmailSender implements MessageSender {\n    @Override\n    public void sendMessage(String message) {\n        System.out.println(\"Envoi de l'email : \" + message);\n    }\n}\n\n\u002F\u002F Implémentation pour l'envoi de SMS\npublic class SmsSender implements MessageSender {\n    @Override\n    public void sendMessage(String message) {\n        System.out.println(\"Envoi du SMS : \" + message);\n    }\n}\n\n\u002F\u002F Service de notification respectant le DIP\npublic class NotificationService {\n    private MessageSender messageSender;\n\n    \u002F\u002F Injection de la dépendance via le constructeur\n    public NotificationService(MessageSender messageSender) {\n        this.messageSender = messageSender;\n    }\n\n    public void sendNotification(String message) {\n        messageSender.sendMessage(message);\n    }\n}\n",[23167],{"type":29,"tag":113,"props":23168,"children":23169},{"__ignoreMap":8},[23170,23178,23198,23226,23233,23240,23248,23275,23286,23321,23364,23371,23378,23385,23393,23421,23432,23467,23510,23517,23524,23531,23539,23558,23578,23585,23593,23625,23653,23660,23667,23702,23731,23738],{"type":29,"tag":117,"props":23171,"children":23172},{"class":119,"line":120},[23173],{"type":29,"tag":117,"props":23174,"children":23175},{"style":124},[23176],{"type":34,"value":23177},"\u002F\u002F Interface qui respecte le DIP\n",{"type":29,"tag":117,"props":23179,"children":23180},{"class":119,"line":130},[23181,23185,23189,23194],{"type":29,"tag":117,"props":23182,"children":23183},{"style":143},[23184],{"type":34,"value":5541},{"type":29,"tag":117,"props":23186,"children":23187},{"style":143},[23188],{"type":34,"value":8561},{"type":29,"tag":117,"props":23190,"children":23191},{"style":2863},[23192],{"type":34,"value":23193}," MessageSender",{"type":29,"tag":117,"props":23195,"children":23196},{"style":384},[23197],{"type":34,"value":3461},{"type":29,"tag":117,"props":23199,"children":23200},{"class":119,"line":139},[23201,23205,23210,23214,23218,23222],{"type":29,"tag":117,"props":23202,"children":23203},{"style":143},[23204],{"type":34,"value":8578},{"type":29,"tag":117,"props":23206,"children":23207},{"style":372},[23208],{"type":34,"value":23209}," sendMessage",{"type":29,"tag":117,"props":23211,"children":23212},{"style":384},[23213],{"type":34,"value":1108},{"type":29,"tag":117,"props":23215,"children":23216},{"style":5976},[23217],{"type":34,"value":7654},{"type":29,"tag":117,"props":23219,"children":23220},{"style":7657},[23221],{"type":34,"value":20943},{"type":29,"tag":117,"props":23223,"children":23224},{"style":384},[23225],{"type":34,"value":5675},{"type":29,"tag":117,"props":23227,"children":23228},{"class":119,"line":172},[23229],{"type":29,"tag":117,"props":23230,"children":23231},{"style":384},[23232],{"type":34,"value":2903},{"type":29,"tag":117,"props":23234,"children":23235},{"class":119,"line":181},[23236],{"type":29,"tag":117,"props":23237,"children":23238},{"emptyLinePlaceholder":13},[23239],{"type":34,"value":136},{"type":29,"tag":117,"props":23241,"children":23242},{"class":119,"line":189},[23243],{"type":29,"tag":117,"props":23244,"children":23245},{"style":124},[23246],{"type":34,"value":23247},"\u002F\u002F Implémentation pour l'envoi d'emails\n",{"type":29,"tag":117,"props":23249,"children":23250},{"class":119,"line":198},[23251,23255,23259,23263,23267,23271],{"type":29,"tag":117,"props":23252,"children":23253},{"style":143},[23254],{"type":34,"value":5541},{"type":29,"tag":117,"props":23256,"children":23257},{"style":143},[23258],{"type":34,"value":7575},{"type":29,"tag":117,"props":23260,"children":23261},{"style":2863},[23262],{"type":34,"value":21354},{"type":29,"tag":117,"props":23264,"children":23265},{"style":143},[23266],{"type":34,"value":8636},{"type":29,"tag":117,"props":23268,"children":23269},{"style":2863},[23270],{"type":34,"value":23193},{"type":29,"tag":117,"props":23272,"children":23273},{"style":384},[23274],{"type":34,"value":3461},{"type":29,"tag":117,"props":23276,"children":23277},{"class":119,"line":207},[23278,23282],{"type":29,"tag":117,"props":23279,"children":23280},{"style":10083},[23281],{"type":34,"value":10086},{"type":29,"tag":117,"props":23283,"children":23284},{"style":10089},[23285],{"type":34,"value":17746},{"type":29,"tag":117,"props":23287,"children":23288},{"class":119,"line":215},[23289,23293,23297,23301,23305,23309,23313,23317],{"type":29,"tag":117,"props":23290,"children":23291},{"style":143},[23292],{"type":34,"value":7641},{"type":29,"tag":117,"props":23294,"children":23295},{"style":143},[23296],{"type":34,"value":7762},{"type":29,"tag":117,"props":23298,"children":23299},{"style":372},[23300],{"type":34,"value":23209},{"type":29,"tag":117,"props":23302,"children":23303},{"style":384},[23304],{"type":34,"value":1108},{"type":29,"tag":117,"props":23306,"children":23307},{"style":5976},[23308],{"type":34,"value":7654},{"type":29,"tag":117,"props":23310,"children":23311},{"style":7657},[23312],{"type":34,"value":20943},{"type":29,"tag":117,"props":23314,"children":23315},{"style":384},[23316],{"type":34,"value":2803},{"type":29,"tag":117,"props":23318,"children":23319},{"style":384},[23320],{"type":34,"value":3461},{"type":29,"tag":117,"props":23322,"children":23323},{"class":119,"line":224},[23324,23328,23332,23336,23340,23344,23348,23352,23356,23360],{"type":29,"tag":117,"props":23325,"children":23326},{"style":378},[23327],{"type":34,"value":16717},{"type":29,"tag":117,"props":23329,"children":23330},{"style":384},[23331],{"type":34,"value":369},{"type":29,"tag":117,"props":23333,"children":23334},{"style":378},[23335],{"type":34,"value":15075},{"type":29,"tag":117,"props":23337,"children":23338},{"style":384},[23339],{"type":34,"value":369},{"type":29,"tag":117,"props":23341,"children":23342},{"style":372},[23343],{"type":34,"value":15084},{"type":29,"tag":117,"props":23345,"children":23346},{"style":384},[23347],{"type":34,"value":1108},{"type":29,"tag":117,"props":23349,"children":23350},{"style":166},[23351],{"type":34,"value":20983},{"type":29,"tag":117,"props":23353,"children":23354},{"style":160},[23355],{"type":34,"value":15098},{"type":29,"tag":117,"props":23357,"children":23358},{"style":378},[23359],{"type":34,"value":20943},{"type":29,"tag":117,"props":23361,"children":23362},{"style":384},[23363],{"type":34,"value":5675},{"type":29,"tag":117,"props":23365,"children":23366},{"class":119,"line":233},[23367],{"type":29,"tag":117,"props":23368,"children":23369},{"style":384},[23370],{"type":34,"value":5632},{"type":29,"tag":117,"props":23372,"children":23373},{"class":119,"line":242},[23374],{"type":29,"tag":117,"props":23375,"children":23376},{"style":384},[23377],{"type":34,"value":2903},{"type":29,"tag":117,"props":23379,"children":23380},{"class":119,"line":251},[23381],{"type":29,"tag":117,"props":23382,"children":23383},{"emptyLinePlaceholder":13},[23384],{"type":34,"value":136},{"type":29,"tag":117,"props":23386,"children":23387},{"class":119,"line":260},[23388],{"type":29,"tag":117,"props":23389,"children":23390},{"style":124},[23391],{"type":34,"value":23392},"\u002F\u002F Implémentation pour l'envoi de SMS\n",{"type":29,"tag":117,"props":23394,"children":23395},{"class":119,"line":269},[23396,23400,23404,23409,23413,23417],{"type":29,"tag":117,"props":23397,"children":23398},{"style":143},[23399],{"type":34,"value":5541},{"type":29,"tag":117,"props":23401,"children":23402},{"style":143},[23403],{"type":34,"value":7575},{"type":29,"tag":117,"props":23405,"children":23406},{"style":2863},[23407],{"type":34,"value":23408}," SmsSender",{"type":29,"tag":117,"props":23410,"children":23411},{"style":143},[23412],{"type":34,"value":8636},{"type":29,"tag":117,"props":23414,"children":23415},{"style":2863},[23416],{"type":34,"value":23193},{"type":29,"tag":117,"props":23418,"children":23419},{"style":384},[23420],{"type":34,"value":3461},{"type":29,"tag":117,"props":23422,"children":23423},{"class":119,"line":278},[23424,23428],{"type":29,"tag":117,"props":23425,"children":23426},{"style":10083},[23427],{"type":34,"value":10086},{"type":29,"tag":117,"props":23429,"children":23430},{"style":10089},[23431],{"type":34,"value":17746},{"type":29,"tag":117,"props":23433,"children":23434},{"class":119,"line":286},[23435,23439,23443,23447,23451,23455,23459,23463],{"type":29,"tag":117,"props":23436,"children":23437},{"style":143},[23438],{"type":34,"value":7641},{"type":29,"tag":117,"props":23440,"children":23441},{"style":143},[23442],{"type":34,"value":7762},{"type":29,"tag":117,"props":23444,"children":23445},{"style":372},[23446],{"type":34,"value":23209},{"type":29,"tag":117,"props":23448,"children":23449},{"style":384},[23450],{"type":34,"value":1108},{"type":29,"tag":117,"props":23452,"children":23453},{"style":5976},[23454],{"type":34,"value":7654},{"type":29,"tag":117,"props":23456,"children":23457},{"style":7657},[23458],{"type":34,"value":20943},{"type":29,"tag":117,"props":23460,"children":23461},{"style":384},[23462],{"type":34,"value":2803},{"type":29,"tag":117,"props":23464,"children":23465},{"style":384},[23466],{"type":34,"value":3461},{"type":29,"tag":117,"props":23468,"children":23469},{"class":119,"line":295},[23470,23474,23478,23482,23486,23490,23494,23498,23502,23506],{"type":29,"tag":117,"props":23471,"children":23472},{"style":378},[23473],{"type":34,"value":16717},{"type":29,"tag":117,"props":23475,"children":23476},{"style":384},[23477],{"type":34,"value":369},{"type":29,"tag":117,"props":23479,"children":23480},{"style":378},[23481],{"type":34,"value":15075},{"type":29,"tag":117,"props":23483,"children":23484},{"style":384},[23485],{"type":34,"value":369},{"type":29,"tag":117,"props":23487,"children":23488},{"style":372},[23489],{"type":34,"value":15084},{"type":29,"tag":117,"props":23491,"children":23492},{"style":384},[23493],{"type":34,"value":1108},{"type":29,"tag":117,"props":23495,"children":23496},{"style":166},[23497],{"type":34,"value":21590},{"type":29,"tag":117,"props":23499,"children":23500},{"style":160},[23501],{"type":34,"value":15098},{"type":29,"tag":117,"props":23503,"children":23504},{"style":378},[23505],{"type":34,"value":20943},{"type":29,"tag":117,"props":23507,"children":23508},{"style":384},[23509],{"type":34,"value":5675},{"type":29,"tag":117,"props":23511,"children":23512},{"class":119,"line":304},[23513],{"type":29,"tag":117,"props":23514,"children":23515},{"style":384},[23516],{"type":34,"value":5632},{"type":29,"tag":117,"props":23518,"children":23519},{"class":119,"line":313},[23520],{"type":29,"tag":117,"props":23521,"children":23522},{"style":384},[23523],{"type":34,"value":2903},{"type":29,"tag":117,"props":23525,"children":23526},{"class":119,"line":322},[23527],{"type":29,"tag":117,"props":23528,"children":23529},{"emptyLinePlaceholder":13},[23530],{"type":34,"value":136},{"type":29,"tag":117,"props":23532,"children":23533},{"class":119,"line":331},[23534],{"type":29,"tag":117,"props":23535,"children":23536},{"style":124},[23537],{"type":34,"value":23538},"\u002F\u002F Service de notification respectant le DIP\n",{"type":29,"tag":117,"props":23540,"children":23541},{"class":119,"line":340},[23542,23546,23550,23554],{"type":29,"tag":117,"props":23543,"children":23544},{"style":143},[23545],{"type":34,"value":5541},{"type":29,"tag":117,"props":23547,"children":23548},{"style":143},[23549],{"type":34,"value":7575},{"type":29,"tag":117,"props":23551,"children":23552},{"style":2863},[23553],{"type":34,"value":21032},{"type":29,"tag":117,"props":23555,"children":23556},{"style":384},[23557],{"type":34,"value":3461},{"type":29,"tag":117,"props":23559,"children":23560},{"class":119,"line":348},[23561,23565,23569,23574],{"type":29,"tag":117,"props":23562,"children":23563},{"style":143},[23564],{"type":34,"value":7592},{"type":29,"tag":117,"props":23566,"children":23567},{"style":5976},[23568],{"type":34,"value":23193},{"type":29,"tag":117,"props":23570,"children":23571},{"style":378},[23572],{"type":34,"value":23573}," messageSender",{"type":29,"tag":117,"props":23575,"children":23576},{"style":384},[23577],{"type":34,"value":387},{"type":29,"tag":117,"props":23579,"children":23580},{"class":119,"line":357},[23581],{"type":29,"tag":117,"props":23582,"children":23583},{"emptyLinePlaceholder":13},[23584],{"type":34,"value":136},{"type":29,"tag":117,"props":23586,"children":23587},{"class":119,"line":1768},[23588],{"type":29,"tag":117,"props":23589,"children":23590},{"style":124},[23591],{"type":34,"value":23592},"    \u002F\u002F Injection de la dépendance via le constructeur\n",{"type":29,"tag":117,"props":23594,"children":23595},{"class":119,"line":953},[23596,23600,23604,23608,23613,23617,23621],{"type":29,"tag":117,"props":23597,"children":23598},{"style":143},[23599],{"type":34,"value":7641},{"type":29,"tag":117,"props":23601,"children":23602},{"style":372},[23603],{"type":34,"value":21032},{"type":29,"tag":117,"props":23605,"children":23606},{"style":384},[23607],{"type":34,"value":1108},{"type":29,"tag":117,"props":23609,"children":23610},{"style":5976},[23611],{"type":34,"value":23612},"MessageSender",{"type":29,"tag":117,"props":23614,"children":23615},{"style":7657},[23616],{"type":34,"value":23573},{"type":29,"tag":117,"props":23618,"children":23619},{"style":384},[23620],{"type":34,"value":2803},{"type":29,"tag":117,"props":23622,"children":23623},{"style":384},[23624],{"type":34,"value":3461},{"type":29,"tag":117,"props":23626,"children":23627},{"class":119,"line":9833},[23628,23632,23636,23641,23645,23649],{"type":29,"tag":117,"props":23629,"children":23630},{"style":6700},[23631],{"type":34,"value":7687},{"type":29,"tag":117,"props":23633,"children":23634},{"style":384},[23635],{"type":34,"value":369},{"type":29,"tag":117,"props":23637,"children":23638},{"style":378},[23639],{"type":34,"value":23640},"messageSender ",{"type":29,"tag":117,"props":23642,"children":23643},{"style":160},[23644],{"type":34,"value":6061},{"type":29,"tag":117,"props":23646,"children":23647},{"style":378},[23648],{"type":34,"value":23573},{"type":29,"tag":117,"props":23650,"children":23651},{"style":384},[23652],{"type":34,"value":387},{"type":29,"tag":117,"props":23654,"children":23655},{"class":119,"line":9870},[23656],{"type":29,"tag":117,"props":23657,"children":23658},{"style":384},[23659],{"type":34,"value":5632},{"type":29,"tag":117,"props":23661,"children":23662},{"class":119,"line":9901},[23663],{"type":29,"tag":117,"props":23664,"children":23665},{"emptyLinePlaceholder":13},[23666],{"type":34,"value":136},{"type":29,"tag":117,"props":23668,"children":23669},{"class":119,"line":9909},[23670,23674,23678,23682,23686,23690,23694,23698],{"type":29,"tag":117,"props":23671,"children":23672},{"style":143},[23673],{"type":34,"value":7641},{"type":29,"tag":117,"props":23675,"children":23676},{"style":143},[23677],{"type":34,"value":7762},{"type":29,"tag":117,"props":23679,"children":23680},{"style":372},[23681],{"type":34,"value":21144},{"type":29,"tag":117,"props":23683,"children":23684},{"style":384},[23685],{"type":34,"value":1108},{"type":29,"tag":117,"props":23687,"children":23688},{"style":5976},[23689],{"type":34,"value":7654},{"type":29,"tag":117,"props":23691,"children":23692},{"style":7657},[23693],{"type":34,"value":20943},{"type":29,"tag":117,"props":23695,"children":23696},{"style":384},[23697],{"type":34,"value":2803},{"type":29,"tag":117,"props":23699,"children":23700},{"style":384},[23701],{"type":34,"value":3461},{"type":29,"tag":117,"props":23703,"children":23704},{"class":119,"line":19187},[23705,23710,23714,23719,23723,23727],{"type":29,"tag":117,"props":23706,"children":23707},{"style":378},[23708],{"type":34,"value":23709},"        messageSender",{"type":29,"tag":117,"props":23711,"children":23712},{"style":384},[23713],{"type":34,"value":369},{"type":29,"tag":117,"props":23715,"children":23716},{"style":372},[23717],{"type":34,"value":23718},"sendMessage",{"type":29,"tag":117,"props":23720,"children":23721},{"style":384},[23722],{"type":34,"value":1108},{"type":29,"tag":117,"props":23724,"children":23725},{"style":378},[23726],{"type":34,"value":21190},{"type":29,"tag":117,"props":23728,"children":23729},{"style":384},[23730],{"type":34,"value":5675},{"type":29,"tag":117,"props":23732,"children":23733},{"class":119,"line":21825},[23734],{"type":29,"tag":117,"props":23735,"children":23736},{"style":384},[23737],{"type":34,"value":5632},{"type":29,"tag":117,"props":23739,"children":23740},{"class":119,"line":21833},[23741],{"type":29,"tag":117,"props":23742,"children":23743},{"style":384},[23744],{"type":34,"value":2903},{"type":29,"tag":30,"props":23746,"children":23747},{},[23748,23750,23755,23757,23762,23764,23769,23771,23776],{"type":34,"value":23749},"Dans ce nouvel exemple, ",{"type":29,"tag":113,"props":23751,"children":23753},{"className":23752},[],[23754],{"type":34,"value":20867},{"type":34,"value":23756}," dépend d'une abstraction (",{"type":29,"tag":113,"props":23758,"children":23760},{"className":23759},[],[23761],{"type":34,"value":23612},{"type":34,"value":23763},"), plus d'une implémentation concrète comme ",{"type":29,"tag":113,"props":23765,"children":23767},{"className":23766},[],[23768],{"type":34,"value":21855},{"type":34,"value":23770},". Changer le mode d'envoi devient trivial, sans modifier ",{"type":29,"tag":113,"props":23772,"children":23774},{"className":23773},[],[23775],{"type":34,"value":20867},{"type":34,"value":23777},". Pour passer aux SMS au lieu des emails :",{"type":29,"tag":106,"props":23779,"children":23781},{"className":5519,"code":23780,"language":5521,"meta":8,"style":8},"public class Main {\n    public static void main(String[] args) {\n        \u002F\u002F Injection d'une implémentation concrète\n        MessageSender emailSender = new EmailSender();\n        NotificationService notificationService = new NotificationService(emailSender);\n        notificationService.sendNotification(\"Hello par Email!\");\n\n        \u002F\u002F Changement facile d'implémentation sans modifier NotificationService\n        MessageSender smsSender = new SmsSender();\n        NotificationService smsNotificationService = new NotificationService(smsSender);\n        smsNotificationService.sendNotification(\"Hello par SMS!\");\n    }\n}\n",[23782],{"type":29,"tag":113,"props":23783,"children":23784},{"__ignoreMap":8},[23785,23804,23847,23855,23883,23918,23946,23953,23961,23988,24024,24052,24059],{"type":29,"tag":117,"props":23786,"children":23787},{"class":119,"line":120},[23788,23792,23796,23800],{"type":29,"tag":117,"props":23789,"children":23790},{"style":143},[23791],{"type":34,"value":5541},{"type":29,"tag":117,"props":23793,"children":23794},{"style":143},[23795],{"type":34,"value":7575},{"type":29,"tag":117,"props":23797,"children":23798},{"style":2863},[23799],{"type":34,"value":18217},{"type":29,"tag":117,"props":23801,"children":23802},{"style":384},[23803],{"type":34,"value":3461},{"type":29,"tag":117,"props":23805,"children":23806},{"class":119,"line":130},[23807,23811,23815,23819,23823,23827,23831,23835,23839,23843],{"type":29,"tag":117,"props":23808,"children":23809},{"style":143},[23810],{"type":34,"value":7641},{"type":29,"tag":117,"props":23812,"children":23813},{"style":143},[23814],{"type":34,"value":9213},{"type":29,"tag":117,"props":23816,"children":23817},{"style":143},[23818],{"type":34,"value":7762},{"type":29,"tag":117,"props":23820,"children":23821},{"style":372},[23822],{"type":34,"value":18241},{"type":29,"tag":117,"props":23824,"children":23825},{"style":384},[23826],{"type":34,"value":1108},{"type":29,"tag":117,"props":23828,"children":23829},{"style":143},[23830],{"type":34,"value":7654},{"type":29,"tag":117,"props":23832,"children":23833},{"style":384},[23834],{"type":34,"value":2872},{"type":29,"tag":117,"props":23836,"children":23837},{"style":7657},[23838],{"type":34,"value":18258},{"type":29,"tag":117,"props":23840,"children":23841},{"style":384},[23842],{"type":34,"value":2803},{"type":29,"tag":117,"props":23844,"children":23845},{"style":384},[23846],{"type":34,"value":3461},{"type":29,"tag":117,"props":23848,"children":23849},{"class":119,"line":139},[23850],{"type":29,"tag":117,"props":23851,"children":23852},{"style":124},[23853],{"type":34,"value":23854},"        \u002F\u002F Injection d'une implémentation concrète\n",{"type":29,"tag":117,"props":23856,"children":23857},{"class":119,"line":172},[23858,23863,23867,23871,23875,23879],{"type":29,"tag":117,"props":23859,"children":23860},{"style":5976},[23861],{"type":34,"value":23862},"        MessageSender",{"type":29,"tag":117,"props":23864,"children":23865},{"style":378},[23866],{"type":34,"value":21968},{"type":29,"tag":117,"props":23868,"children":23869},{"style":160},[23870],{"type":34,"value":6061},{"type":29,"tag":117,"props":23872,"children":23873},{"style":143},[23874],{"type":34,"value":6066},{"type":29,"tag":117,"props":23876,"children":23877},{"style":372},[23878],{"type":34,"value":21354},{"type":29,"tag":117,"props":23880,"children":23881},{"style":384},[23882],{"type":34,"value":9375},{"type":29,"tag":117,"props":23884,"children":23885},{"class":119,"line":181},[23886,23890,23894,23898,23902,23906,23910,23914],{"type":29,"tag":117,"props":23887,"children":23888},{"style":5976},[23889],{"type":34,"value":21992},{"type":29,"tag":117,"props":23891,"children":23892},{"style":378},[23893],{"type":34,"value":21997},{"type":29,"tag":117,"props":23895,"children":23896},{"style":160},[23897],{"type":34,"value":6061},{"type":29,"tag":117,"props":23899,"children":23900},{"style":143},[23901],{"type":34,"value":6066},{"type":29,"tag":117,"props":23903,"children":23904},{"style":372},[23905],{"type":34,"value":21032},{"type":29,"tag":117,"props":23907,"children":23908},{"style":384},[23909],{"type":34,"value":1108},{"type":29,"tag":117,"props":23911,"children":23912},{"style":378},[23913],{"type":34,"value":22018},{"type":29,"tag":117,"props":23915,"children":23916},{"style":384},[23917],{"type":34,"value":5675},{"type":29,"tag":117,"props":23919,"children":23920},{"class":119,"line":189},[23921,23925,23929,23933,23937,23942],{"type":29,"tag":117,"props":23922,"children":23923},{"style":378},[23924],{"type":34,"value":22030},{"type":29,"tag":117,"props":23926,"children":23927},{"style":384},[23928],{"type":34,"value":369},{"type":29,"tag":117,"props":23930,"children":23931},{"style":372},[23932],{"type":34,"value":22039},{"type":29,"tag":117,"props":23934,"children":23935},{"style":384},[23936],{"type":34,"value":1108},{"type":29,"tag":117,"props":23938,"children":23939},{"style":166},[23940],{"type":34,"value":23941},"\"Hello par Email!\"",{"type":29,"tag":117,"props":23943,"children":23944},{"style":384},[23945],{"type":34,"value":5675},{"type":29,"tag":117,"props":23947,"children":23948},{"class":119,"line":198},[23949],{"type":29,"tag":117,"props":23950,"children":23951},{"emptyLinePlaceholder":13},[23952],{"type":34,"value":136},{"type":29,"tag":117,"props":23954,"children":23955},{"class":119,"line":207},[23956],{"type":29,"tag":117,"props":23957,"children":23958},{"style":124},[23959],{"type":34,"value":23960},"        \u002F\u002F Changement facile d'implémentation sans modifier NotificationService\n",{"type":29,"tag":117,"props":23962,"children":23963},{"class":119,"line":215},[23964,23968,23972,23976,23980,23984],{"type":29,"tag":117,"props":23965,"children":23966},{"style":5976},[23967],{"type":34,"value":23862},{"type":29,"tag":117,"props":23969,"children":23970},{"style":378},[23971],{"type":34,"value":22079},{"type":29,"tag":117,"props":23973,"children":23974},{"style":160},[23975],{"type":34,"value":6061},{"type":29,"tag":117,"props":23977,"children":23978},{"style":143},[23979],{"type":34,"value":6066},{"type":29,"tag":117,"props":23981,"children":23982},{"style":372},[23983],{"type":34,"value":23408},{"type":29,"tag":117,"props":23985,"children":23986},{"style":384},[23987],{"type":34,"value":9375},{"type":29,"tag":117,"props":23989,"children":23990},{"class":119,"line":224},[23991,23995,24000,24004,24008,24012,24016,24020],{"type":29,"tag":117,"props":23992,"children":23993},{"style":5976},[23994],{"type":34,"value":21992},{"type":29,"tag":117,"props":23996,"children":23997},{"style":378},[23998],{"type":34,"value":23999}," smsNotificationService ",{"type":29,"tag":117,"props":24001,"children":24002},{"style":160},[24003],{"type":34,"value":6061},{"type":29,"tag":117,"props":24005,"children":24006},{"style":143},[24007],{"type":34,"value":6066},{"type":29,"tag":117,"props":24009,"children":24010},{"style":372},[24011],{"type":34,"value":21032},{"type":29,"tag":117,"props":24013,"children":24014},{"style":384},[24015],{"type":34,"value":1108},{"type":29,"tag":117,"props":24017,"children":24018},{"style":378},[24019],{"type":34,"value":22138},{"type":29,"tag":117,"props":24021,"children":24022},{"style":384},[24023],{"type":34,"value":5675},{"type":29,"tag":117,"props":24025,"children":24026},{"class":119,"line":233},[24027,24031,24035,24039,24043,24048],{"type":29,"tag":117,"props":24028,"children":24029},{"style":378},[24030],{"type":34,"value":22150},{"type":29,"tag":117,"props":24032,"children":24033},{"style":384},[24034],{"type":34,"value":369},{"type":29,"tag":117,"props":24036,"children":24037},{"style":372},[24038],{"type":34,"value":22039},{"type":29,"tag":117,"props":24040,"children":24041},{"style":384},[24042],{"type":34,"value":1108},{"type":29,"tag":117,"props":24044,"children":24045},{"style":166},[24046],{"type":34,"value":24047},"\"Hello par SMS!\"",{"type":29,"tag":117,"props":24049,"children":24050},{"style":384},[24051],{"type":34,"value":5675},{"type":29,"tag":117,"props":24053,"children":24054},{"class":119,"line":242},[24055],{"type":29,"tag":117,"props":24056,"children":24057},{"style":384},[24058],{"type":34,"value":5632},{"type":29,"tag":117,"props":24060,"children":24061},{"class":119,"line":251},[24062],{"type":29,"tag":117,"props":24063,"children":24064},{"style":384},[24065],{"type":34,"value":2903},{"type":29,"tag":4530,"props":24067,"children":24069},{"id":24068},"ce-que-nous-avons-corrigé",[24070],{"type":34,"value":24071},"Ce que nous avons corrigé :",{"type":29,"tag":1585,"props":24073,"children":24074},{},[24075],{"type":29,"tag":1589,"props":24076,"children":24077},{},[24078,24079],{"type":34,"value":7099},{"type":29,"tag":45,"props":24080,"children":24081},{},[24082],{"type":34,"value":20867},{"type":29,"tag":30,"props":24084,"children":24085},{},[24086,24088,24093],{"type":34,"value":24087},"n’a plus besoin de connaître les détails d'implémentation de la manière dont les messages sont envoyés (email, SMS, etc.). Elle dépend uniquement d'une interface abstraite (",{"type":29,"tag":113,"props":24089,"children":24091},{"className":24090},[],[24092],{"type":34,"value":23612},{"type":34,"value":14223},{"type":29,"tag":1585,"props":24095,"children":24096},{},[24097],{"type":29,"tag":1589,"props":24098,"children":24099},{},[24100,24102,24107],{"type":34,"value":24101},"Si nous devons un jour ajouter une nouvelle manière d'envoyer des notifications (par exemple via une API de notifications push), nous pourrons simplement créer une nouvelle classe qui implémente ",{"type":29,"tag":113,"props":24103,"children":24105},{"className":24104},[],[24106],{"type":34,"value":23612},{"type":34,"value":24108}," sans toucher au code existant.",{"type":29,"tag":5462,"props":24110,"children":24112},{"type":24111},"tip",[24113],{"type":29,"tag":30,"props":24114,"children":24115},{},[24116,24118,24122],{"type":34,"value":24117},"Je vous recommande de toujours préférer l'injection de dépendances via des ",{"type":29,"tag":45,"props":24119,"children":24120},{},[24121],{"type":34,"value":22705},{"type":34,"value":24123},". Cela vous permettra de changer facilement les implémentations sans avoir à modifier plusieurs classes.",{"type":29,"tag":51,"props":24125,"children":24126},{},[],{"type":29,"tag":55,"props":24128,"children":24130},{"id":24129},"comment-appliquer-le-dip-dans-un-projet-java",[24131],{"type":34,"value":24132},"Comment appliquer le DIP dans un projet Java",{"type":29,"tag":30,"props":24134,"children":24135},{},[24136,24138,24143,24145,24149,24151,24156],{"type":34,"value":24137},"Le principe d'inversion des dépendances peut sembler simple en théorie, mais lorsqu'il s'agit de l'appliquer dans un projet Java de grande envergure, les choses peuvent se compliquer un peu. Heureusement, des frameworks comme ",{"type":29,"tag":45,"props":24139,"children":24140},{},[24141],{"type":34,"value":24142},"Spring",{"type":34,"value":24144}," nous facilitent grandement l'implémentation du ",{"type":29,"tag":45,"props":24146,"children":24147},{},[24148],{"type":34,"value":22502},{"type":34,"value":24150}," grâce à des concepts comme l'",{"type":29,"tag":45,"props":24152,"children":24153},{},[24154],{"type":34,"value":24155},"injection de dépendances",{"type":34,"value":369},{"type":29,"tag":4530,"props":24158,"children":24160},{"id":24159},"utiliser-spring-pour-appliquer-le-dip",[24161],{"type":34,"value":24162},"Utiliser Spring pour appliquer le DIP",{"type":29,"tag":30,"props":24164,"children":24165},{},[24166,24168,24173,24175,24179],{"type":34,"value":24167},"Dans un projet Java classique, vous pourriez vous retrouver à instancier et gérer manuellement vos dépendances, comme dans les exemples précédents. Mais dans un projet de plus grande taille, cela peut devenir difficile à gérer. C’est là que le ",{"type":29,"tag":45,"props":24169,"children":24170},{},[24171],{"type":34,"value":24172},"framework Spring",{"type":34,"value":24174}," entre en jeu. Spring facilite l’application du ",{"type":29,"tag":45,"props":24176,"children":24177},{},[24178],{"type":34,"value":22502},{"type":34,"value":24180}," en fournissant un conteneur d’injection de dépendances qui gère la création et l’injection des objets à votre place.",{"type":29,"tag":5462,"props":24182,"children":24183},{"type":24111},[24184],{"type":29,"tag":30,"props":24185,"children":24186},{},[24187,24189,24195,24196,24202],{"type":34,"value":24188},"Utilisez les annotations ",{"type":29,"tag":113,"props":24190,"children":24192},{"className":24191},[],[24193],{"type":34,"value":24194},"@Autowired",{"type":34,"value":5923},{"type":29,"tag":113,"props":24197,"children":24199},{"className":24198},[],[24200],{"type":34,"value":24201},"@Component",{"type":34,"value":24203}," de Spring pour que le framework gère automatiquement l'injection des dépendances. Cela simplifie grandement la gestion des dépendances dans des projets complexes.",{"type":29,"tag":51,"props":24205,"children":24206},{},[],{"type":29,"tag":4530,"props":24208,"children":24210},{"id":24209},"exemple-avec-spring",[24211],{"type":34,"value":24212},"Exemple avec Spring",{"type":29,"tag":30,"props":24214,"children":24215},{},[24216],{"type":34,"value":24217},"Supposons que nous ayons le même système de notification que dans l’exemple précédent, mais cette fois, nous allons utiliser Spring pour gérer les dépendances :",{"type":29,"tag":4212,"props":24219,"children":24220},{},[24221],{"type":29,"tag":1589,"props":24222,"children":24223},{},[24224,24229],{"type":29,"tag":45,"props":24225,"children":24226},{},[24227],{"type":34,"value":24228},"Définir les interfaces et implémentations comme avant",{"type":34,"value":1866},{"type":29,"tag":106,"props":24231,"children":24233},{"className":5519,"code":24232,"language":5521,"meta":8,"style":8},"public interface MessageSender {\n    void sendMessage(String message);\n}\n\n@Component\npublic class EmailSender implements MessageSender {\n    @Override\n    public void sendMessage(String message) {\n        System.out.println(\"Envoi de l'email : \" + message);\n    }\n}\n\n@Component\npublic class SmsSender implements MessageSender {\n    @Override\n    public void sendMessage(String message) {\n        System.out.println(\"Envoi du SMS : \" + message);\n    }\n}\n",[24234],{"type":29,"tag":113,"props":24235,"children":24236},{"__ignoreMap":8},[24237,24256,24283,24290,24297,24309,24336,24347,24382,24425,24432,24439,24446,24457,24484,24495,24530,24573,24580],{"type":29,"tag":117,"props":24238,"children":24239},{"class":119,"line":120},[24240,24244,24248,24252],{"type":29,"tag":117,"props":24241,"children":24242},{"style":143},[24243],{"type":34,"value":5541},{"type":29,"tag":117,"props":24245,"children":24246},{"style":143},[24247],{"type":34,"value":8561},{"type":29,"tag":117,"props":24249,"children":24250},{"style":2863},[24251],{"type":34,"value":23193},{"type":29,"tag":117,"props":24253,"children":24254},{"style":384},[24255],{"type":34,"value":3461},{"type":29,"tag":117,"props":24257,"children":24258},{"class":119,"line":130},[24259,24263,24267,24271,24275,24279],{"type":29,"tag":117,"props":24260,"children":24261},{"style":143},[24262],{"type":34,"value":8578},{"type":29,"tag":117,"props":24264,"children":24265},{"style":372},[24266],{"type":34,"value":23209},{"type":29,"tag":117,"props":24268,"children":24269},{"style":384},[24270],{"type":34,"value":1108},{"type":29,"tag":117,"props":24272,"children":24273},{"style":5976},[24274],{"type":34,"value":7654},{"type":29,"tag":117,"props":24276,"children":24277},{"style":7657},[24278],{"type":34,"value":20943},{"type":29,"tag":117,"props":24280,"children":24281},{"style":384},[24282],{"type":34,"value":5675},{"type":29,"tag":117,"props":24284,"children":24285},{"class":119,"line":139},[24286],{"type":29,"tag":117,"props":24287,"children":24288},{"style":384},[24289],{"type":34,"value":2903},{"type":29,"tag":117,"props":24291,"children":24292},{"class":119,"line":172},[24293],{"type":29,"tag":117,"props":24294,"children":24295},{"emptyLinePlaceholder":13},[24296],{"type":34,"value":136},{"type":29,"tag":117,"props":24298,"children":24299},{"class":119,"line":181},[24300,24304],{"type":29,"tag":117,"props":24301,"children":24302},{"style":10083},[24303],{"type":34,"value":14335},{"type":29,"tag":117,"props":24305,"children":24306},{"style":10089},[24307],{"type":34,"value":24308},"Component\n",{"type":29,"tag":117,"props":24310,"children":24311},{"class":119,"line":189},[24312,24316,24320,24324,24328,24332],{"type":29,"tag":117,"props":24313,"children":24314},{"style":143},[24315],{"type":34,"value":5541},{"type":29,"tag":117,"props":24317,"children":24318},{"style":143},[24319],{"type":34,"value":7575},{"type":29,"tag":117,"props":24321,"children":24322},{"style":2863},[24323],{"type":34,"value":21354},{"type":29,"tag":117,"props":24325,"children":24326},{"style":143},[24327],{"type":34,"value":8636},{"type":29,"tag":117,"props":24329,"children":24330},{"style":2863},[24331],{"type":34,"value":23193},{"type":29,"tag":117,"props":24333,"children":24334},{"style":384},[24335],{"type":34,"value":3461},{"type":29,"tag":117,"props":24337,"children":24338},{"class":119,"line":198},[24339,24343],{"type":29,"tag":117,"props":24340,"children":24341},{"style":10083},[24342],{"type":34,"value":10086},{"type":29,"tag":117,"props":24344,"children":24345},{"style":10089},[24346],{"type":34,"value":17746},{"type":29,"tag":117,"props":24348,"children":24349},{"class":119,"line":207},[24350,24354,24358,24362,24366,24370,24374,24378],{"type":29,"tag":117,"props":24351,"children":24352},{"style":143},[24353],{"type":34,"value":7641},{"type":29,"tag":117,"props":24355,"children":24356},{"style":143},[24357],{"type":34,"value":7762},{"type":29,"tag":117,"props":24359,"children":24360},{"style":372},[24361],{"type":34,"value":23209},{"type":29,"tag":117,"props":24363,"children":24364},{"style":384},[24365],{"type":34,"value":1108},{"type":29,"tag":117,"props":24367,"children":24368},{"style":5976},[24369],{"type":34,"value":7654},{"type":29,"tag":117,"props":24371,"children":24372},{"style":7657},[24373],{"type":34,"value":20943},{"type":29,"tag":117,"props":24375,"children":24376},{"style":384},[24377],{"type":34,"value":2803},{"type":29,"tag":117,"props":24379,"children":24380},{"style":384},[24381],{"type":34,"value":3461},{"type":29,"tag":117,"props":24383,"children":24384},{"class":119,"line":215},[24385,24389,24393,24397,24401,24405,24409,24413,24417,24421],{"type":29,"tag":117,"props":24386,"children":24387},{"style":378},[24388],{"type":34,"value":16717},{"type":29,"tag":117,"props":24390,"children":24391},{"style":384},[24392],{"type":34,"value":369},{"type":29,"tag":117,"props":24394,"children":24395},{"style":378},[24396],{"type":34,"value":15075},{"type":29,"tag":117,"props":24398,"children":24399},{"style":384},[24400],{"type":34,"value":369},{"type":29,"tag":117,"props":24402,"children":24403},{"style":372},[24404],{"type":34,"value":15084},{"type":29,"tag":117,"props":24406,"children":24407},{"style":384},[24408],{"type":34,"value":1108},{"type":29,"tag":117,"props":24410,"children":24411},{"style":166},[24412],{"type":34,"value":20983},{"type":29,"tag":117,"props":24414,"children":24415},{"style":160},[24416],{"type":34,"value":15098},{"type":29,"tag":117,"props":24418,"children":24419},{"style":378},[24420],{"type":34,"value":20943},{"type":29,"tag":117,"props":24422,"children":24423},{"style":384},[24424],{"type":34,"value":5675},{"type":29,"tag":117,"props":24426,"children":24427},{"class":119,"line":224},[24428],{"type":29,"tag":117,"props":24429,"children":24430},{"style":384},[24431],{"type":34,"value":5632},{"type":29,"tag":117,"props":24433,"children":24434},{"class":119,"line":233},[24435],{"type":29,"tag":117,"props":24436,"children":24437},{"style":384},[24438],{"type":34,"value":2903},{"type":29,"tag":117,"props":24440,"children":24441},{"class":119,"line":242},[24442],{"type":29,"tag":117,"props":24443,"children":24444},{"emptyLinePlaceholder":13},[24445],{"type":34,"value":136},{"type":29,"tag":117,"props":24447,"children":24448},{"class":119,"line":251},[24449,24453],{"type":29,"tag":117,"props":24450,"children":24451},{"style":10083},[24452],{"type":34,"value":14335},{"type":29,"tag":117,"props":24454,"children":24455},{"style":10089},[24456],{"type":34,"value":24308},{"type":29,"tag":117,"props":24458,"children":24459},{"class":119,"line":260},[24460,24464,24468,24472,24476,24480],{"type":29,"tag":117,"props":24461,"children":24462},{"style":143},[24463],{"type":34,"value":5541},{"type":29,"tag":117,"props":24465,"children":24466},{"style":143},[24467],{"type":34,"value":7575},{"type":29,"tag":117,"props":24469,"children":24470},{"style":2863},[24471],{"type":34,"value":23408},{"type":29,"tag":117,"props":24473,"children":24474},{"style":143},[24475],{"type":34,"value":8636},{"type":29,"tag":117,"props":24477,"children":24478},{"style":2863},[24479],{"type":34,"value":23193},{"type":29,"tag":117,"props":24481,"children":24482},{"style":384},[24483],{"type":34,"value":3461},{"type":29,"tag":117,"props":24485,"children":24486},{"class":119,"line":269},[24487,24491],{"type":29,"tag":117,"props":24488,"children":24489},{"style":10083},[24490],{"type":34,"value":10086},{"type":29,"tag":117,"props":24492,"children":24493},{"style":10089},[24494],{"type":34,"value":17746},{"type":29,"tag":117,"props":24496,"children":24497},{"class":119,"line":278},[24498,24502,24506,24510,24514,24518,24522,24526],{"type":29,"tag":117,"props":24499,"children":24500},{"style":143},[24501],{"type":34,"value":7641},{"type":29,"tag":117,"props":24503,"children":24504},{"style":143},[24505],{"type":34,"value":7762},{"type":29,"tag":117,"props":24507,"children":24508},{"style":372},[24509],{"type":34,"value":23209},{"type":29,"tag":117,"props":24511,"children":24512},{"style":384},[24513],{"type":34,"value":1108},{"type":29,"tag":117,"props":24515,"children":24516},{"style":5976},[24517],{"type":34,"value":7654},{"type":29,"tag":117,"props":24519,"children":24520},{"style":7657},[24521],{"type":34,"value":20943},{"type":29,"tag":117,"props":24523,"children":24524},{"style":384},[24525],{"type":34,"value":2803},{"type":29,"tag":117,"props":24527,"children":24528},{"style":384},[24529],{"type":34,"value":3461},{"type":29,"tag":117,"props":24531,"children":24532},{"class":119,"line":286},[24533,24537,24541,24545,24549,24553,24557,24561,24565,24569],{"type":29,"tag":117,"props":24534,"children":24535},{"style":378},[24536],{"type":34,"value":16717},{"type":29,"tag":117,"props":24538,"children":24539},{"style":384},[24540],{"type":34,"value":369},{"type":29,"tag":117,"props":24542,"children":24543},{"style":378},[24544],{"type":34,"value":15075},{"type":29,"tag":117,"props":24546,"children":24547},{"style":384},[24548],{"type":34,"value":369},{"type":29,"tag":117,"props":24550,"children":24551},{"style":372},[24552],{"type":34,"value":15084},{"type":29,"tag":117,"props":24554,"children":24555},{"style":384},[24556],{"type":34,"value":1108},{"type":29,"tag":117,"props":24558,"children":24559},{"style":166},[24560],{"type":34,"value":21590},{"type":29,"tag":117,"props":24562,"children":24563},{"style":160},[24564],{"type":34,"value":15098},{"type":29,"tag":117,"props":24566,"children":24567},{"style":378},[24568],{"type":34,"value":20943},{"type":29,"tag":117,"props":24570,"children":24571},{"style":384},[24572],{"type":34,"value":5675},{"type":29,"tag":117,"props":24574,"children":24575},{"class":119,"line":295},[24576],{"type":29,"tag":117,"props":24577,"children":24578},{"style":384},[24579],{"type":34,"value":5632},{"type":29,"tag":117,"props":24581,"children":24582},{"class":119,"line":304},[24583],{"type":29,"tag":117,"props":24584,"children":24585},{"style":384},[24586],{"type":34,"value":2903},{"type":29,"tag":4212,"props":24588,"children":24589},{"start":130},[24590],{"type":29,"tag":1589,"props":24591,"children":24592},{},[24593,24598,24599,24602,24604,24609,24611,24616,24618,24623],{"type":29,"tag":45,"props":24594,"children":24595},{},[24596],{"type":34,"value":24597},"Injection de dépendances avec Spring",{"type":34,"value":1866},{"type":29,"tag":8411,"props":24600,"children":24601},{},[],{"type":34,"value":24603},"Nous allons maintenant utiliser l'annotation ",{"type":29,"tag":113,"props":24605,"children":24607},{"className":24606},[],[24608],{"type":34,"value":24194},{"type":34,"value":24610}," de Spring pour injecter l'implémentation concrète de ",{"type":29,"tag":113,"props":24612,"children":24614},{"className":24613},[],[24615],{"type":34,"value":23612},{"type":34,"value":24617}," dans ",{"type":29,"tag":113,"props":24619,"children":24621},{"className":24620},[],[24622],{"type":34,"value":20867},{"type":34,"value":24624},", sans avoir à gérer manuellement l'instanciation.",{"type":29,"tag":106,"props":24626,"children":24628},{"className":5519,"code":24627,"language":5521,"meta":8,"style":8},"@Component\npublic class NotificationService {\n    private final MessageSender messageSender;\n\n    \u002F\u002F Injection de la dépendance par constructeur\n    @Autowired\n    public NotificationService(MessageSender messageSender) {\n        this.messageSender = messageSender;\n    }\n\n    public void sendNotification(String message) {\n        messageSender.sendMessage(message);\n    }\n}\n",[24629],{"type":29,"tag":113,"props":24630,"children":24631},{"__ignoreMap":8},[24632,24643,24662,24686,24693,24701,24713,24744,24771,24778,24785,24820,24847,24854],{"type":29,"tag":117,"props":24633,"children":24634},{"class":119,"line":120},[24635,24639],{"type":29,"tag":117,"props":24636,"children":24637},{"style":10083},[24638],{"type":34,"value":14335},{"type":29,"tag":117,"props":24640,"children":24641},{"style":10089},[24642],{"type":34,"value":24308},{"type":29,"tag":117,"props":24644,"children":24645},{"class":119,"line":130},[24646,24650,24654,24658],{"type":29,"tag":117,"props":24647,"children":24648},{"style":143},[24649],{"type":34,"value":5541},{"type":29,"tag":117,"props":24651,"children":24652},{"style":143},[24653],{"type":34,"value":7575},{"type":29,"tag":117,"props":24655,"children":24656},{"style":2863},[24657],{"type":34,"value":21032},{"type":29,"tag":117,"props":24659,"children":24660},{"style":384},[24661],{"type":34,"value":3461},{"type":29,"tag":117,"props":24663,"children":24664},{"class":119,"line":139},[24665,24669,24674,24678,24682],{"type":29,"tag":117,"props":24666,"children":24667},{"style":143},[24668],{"type":34,"value":7592},{"type":29,"tag":117,"props":24670,"children":24671},{"style":143},[24672],{"type":34,"value":24673}," final",{"type":29,"tag":117,"props":24675,"children":24676},{"style":5976},[24677],{"type":34,"value":23193},{"type":29,"tag":117,"props":24679,"children":24680},{"style":378},[24681],{"type":34,"value":23573},{"type":29,"tag":117,"props":24683,"children":24684},{"style":384},[24685],{"type":34,"value":387},{"type":29,"tag":117,"props":24687,"children":24688},{"class":119,"line":172},[24689],{"type":29,"tag":117,"props":24690,"children":24691},{"emptyLinePlaceholder":13},[24692],{"type":34,"value":136},{"type":29,"tag":117,"props":24694,"children":24695},{"class":119,"line":181},[24696],{"type":29,"tag":117,"props":24697,"children":24698},{"style":124},[24699],{"type":34,"value":24700},"    \u002F\u002F Injection de la dépendance par constructeur\n",{"type":29,"tag":117,"props":24702,"children":24703},{"class":119,"line":189},[24704,24708],{"type":29,"tag":117,"props":24705,"children":24706},{"style":10083},[24707],{"type":34,"value":10086},{"type":29,"tag":117,"props":24709,"children":24710},{"style":10089},[24711],{"type":34,"value":24712},"Autowired\n",{"type":29,"tag":117,"props":24714,"children":24715},{"class":119,"line":198},[24716,24720,24724,24728,24732,24736,24740],{"type":29,"tag":117,"props":24717,"children":24718},{"style":143},[24719],{"type":34,"value":7641},{"type":29,"tag":117,"props":24721,"children":24722},{"style":372},[24723],{"type":34,"value":21032},{"type":29,"tag":117,"props":24725,"children":24726},{"style":384},[24727],{"type":34,"value":1108},{"type":29,"tag":117,"props":24729,"children":24730},{"style":5976},[24731],{"type":34,"value":23612},{"type":29,"tag":117,"props":24733,"children":24734},{"style":7657},[24735],{"type":34,"value":23573},{"type":29,"tag":117,"props":24737,"children":24738},{"style":384},[24739],{"type":34,"value":2803},{"type":29,"tag":117,"props":24741,"children":24742},{"style":384},[24743],{"type":34,"value":3461},{"type":29,"tag":117,"props":24745,"children":24746},{"class":119,"line":207},[24747,24751,24755,24759,24763,24767],{"type":29,"tag":117,"props":24748,"children":24749},{"style":6700},[24750],{"type":34,"value":7687},{"type":29,"tag":117,"props":24752,"children":24753},{"style":384},[24754],{"type":34,"value":369},{"type":29,"tag":117,"props":24756,"children":24757},{"style":378},[24758],{"type":34,"value":23640},{"type":29,"tag":117,"props":24760,"children":24761},{"style":160},[24762],{"type":34,"value":6061},{"type":29,"tag":117,"props":24764,"children":24765},{"style":378},[24766],{"type":34,"value":23573},{"type":29,"tag":117,"props":24768,"children":24769},{"style":384},[24770],{"type":34,"value":387},{"type":29,"tag":117,"props":24772,"children":24773},{"class":119,"line":215},[24774],{"type":29,"tag":117,"props":24775,"children":24776},{"style":384},[24777],{"type":34,"value":5632},{"type":29,"tag":117,"props":24779,"children":24780},{"class":119,"line":224},[24781],{"type":29,"tag":117,"props":24782,"children":24783},{"emptyLinePlaceholder":13},[24784],{"type":34,"value":136},{"type":29,"tag":117,"props":24786,"children":24787},{"class":119,"line":233},[24788,24792,24796,24800,24804,24808,24812,24816],{"type":29,"tag":117,"props":24789,"children":24790},{"style":143},[24791],{"type":34,"value":7641},{"type":29,"tag":117,"props":24793,"children":24794},{"style":143},[24795],{"type":34,"value":7762},{"type":29,"tag":117,"props":24797,"children":24798},{"style":372},[24799],{"type":34,"value":21144},{"type":29,"tag":117,"props":24801,"children":24802},{"style":384},[24803],{"type":34,"value":1108},{"type":29,"tag":117,"props":24805,"children":24806},{"style":5976},[24807],{"type":34,"value":7654},{"type":29,"tag":117,"props":24809,"children":24810},{"style":7657},[24811],{"type":34,"value":20943},{"type":29,"tag":117,"props":24813,"children":24814},{"style":384},[24815],{"type":34,"value":2803},{"type":29,"tag":117,"props":24817,"children":24818},{"style":384},[24819],{"type":34,"value":3461},{"type":29,"tag":117,"props":24821,"children":24822},{"class":119,"line":242},[24823,24827,24831,24835,24839,24843],{"type":29,"tag":117,"props":24824,"children":24825},{"style":378},[24826],{"type":34,"value":23709},{"type":29,"tag":117,"props":24828,"children":24829},{"style":384},[24830],{"type":34,"value":369},{"type":29,"tag":117,"props":24832,"children":24833},{"style":372},[24834],{"type":34,"value":23718},{"type":29,"tag":117,"props":24836,"children":24837},{"style":384},[24838],{"type":34,"value":1108},{"type":29,"tag":117,"props":24840,"children":24841},{"style":378},[24842],{"type":34,"value":21190},{"type":29,"tag":117,"props":24844,"children":24845},{"style":384},[24846],{"type":34,"value":5675},{"type":29,"tag":117,"props":24848,"children":24849},{"class":119,"line":251},[24850],{"type":29,"tag":117,"props":24851,"children":24852},{"style":384},[24853],{"type":34,"value":5632},{"type":29,"tag":117,"props":24855,"children":24856},{"class":119,"line":260},[24857],{"type":29,"tag":117,"props":24858,"children":24859},{"style":384},[24860],{"type":34,"value":2903},{"type":29,"tag":4212,"props":24862,"children":24863},{"start":139},[24864],{"type":29,"tag":1589,"props":24865,"children":24866},{},[24867,24872],{"type":29,"tag":45,"props":24868,"children":24869},{},[24870],{"type":34,"value":24871},"Configurer et exécuter l’application",{"type":34,"value":1866},{"type":29,"tag":30,"props":24874,"children":24875},{},[24876],{"type":34,"value":24877},"Enfin, vous n’avez plus qu’à configurer votre application Spring pour que le framework se charge d’injecter les dépendances au moment de l’exécution.",{"type":29,"tag":106,"props":24879,"children":24881},{"className":5519,"code":24880,"language":5521,"meta":8,"style":8},"@SpringBootApplication\npublic class DipExampleApplication {\n\n    public static void main(String[] args) {\n        ApplicationContext context = SpringApplication.run(DipExampleApplication.class, args);\n\n        \u002F\u002F Obtenir NotificationService du contexte Spring\n        NotificationService notificationService = context.getBean(NotificationService.class);\n        notificationService.sendNotification(\"Hello via Spring!\");\n    }\n}\n",[24882],{"type":29,"tag":113,"props":24883,"children":24884},{"__ignoreMap":8},[24885,24897,24917,24924,24967,25027,25034,25042,25091,25119,25126],{"type":29,"tag":117,"props":24886,"children":24887},{"class":119,"line":120},[24888,24892],{"type":29,"tag":117,"props":24889,"children":24890},{"style":10083},[24891],{"type":34,"value":14335},{"type":29,"tag":117,"props":24893,"children":24894},{"style":10089},[24895],{"type":34,"value":24896},"SpringBootApplication\n",{"type":29,"tag":117,"props":24898,"children":24899},{"class":119,"line":130},[24900,24904,24908,24913],{"type":29,"tag":117,"props":24901,"children":24902},{"style":143},[24903],{"type":34,"value":5541},{"type":29,"tag":117,"props":24905,"children":24906},{"style":143},[24907],{"type":34,"value":7575},{"type":29,"tag":117,"props":24909,"children":24910},{"style":2863},[24911],{"type":34,"value":24912}," DipExampleApplication",{"type":29,"tag":117,"props":24914,"children":24915},{"style":384},[24916],{"type":34,"value":3461},{"type":29,"tag":117,"props":24918,"children":24919},{"class":119,"line":139},[24920],{"type":29,"tag":117,"props":24921,"children":24922},{"emptyLinePlaceholder":13},[24923],{"type":34,"value":136},{"type":29,"tag":117,"props":24925,"children":24926},{"class":119,"line":172},[24927,24931,24935,24939,24943,24947,24951,24955,24959,24963],{"type":29,"tag":117,"props":24928,"children":24929},{"style":143},[24930],{"type":34,"value":7641},{"type":29,"tag":117,"props":24932,"children":24933},{"style":143},[24934],{"type":34,"value":9213},{"type":29,"tag":117,"props":24936,"children":24937},{"style":143},[24938],{"type":34,"value":7762},{"type":29,"tag":117,"props":24940,"children":24941},{"style":372},[24942],{"type":34,"value":18241},{"type":29,"tag":117,"props":24944,"children":24945},{"style":384},[24946],{"type":34,"value":1108},{"type":29,"tag":117,"props":24948,"children":24949},{"style":143},[24950],{"type":34,"value":7654},{"type":29,"tag":117,"props":24952,"children":24953},{"style":384},[24954],{"type":34,"value":2872},{"type":29,"tag":117,"props":24956,"children":24957},{"style":7657},[24958],{"type":34,"value":18258},{"type":29,"tag":117,"props":24960,"children":24961},{"style":384},[24962],{"type":34,"value":2803},{"type":29,"tag":117,"props":24964,"children":24965},{"style":384},[24966],{"type":34,"value":3461},{"type":29,"tag":117,"props":24968,"children":24969},{"class":119,"line":181},[24970,24975,24980,24984,24989,24993,24998,25002,25007,25011,25015,25019,25023],{"type":29,"tag":117,"props":24971,"children":24972},{"style":5976},[24973],{"type":34,"value":24974},"        ApplicationContext",{"type":29,"tag":117,"props":24976,"children":24977},{"style":378},[24978],{"type":34,"value":24979}," context ",{"type":29,"tag":117,"props":24981,"children":24982},{"style":160},[24983],{"type":34,"value":6061},{"type":29,"tag":117,"props":24985,"children":24986},{"style":378},[24987],{"type":34,"value":24988}," SpringApplication",{"type":29,"tag":117,"props":24990,"children":24991},{"style":384},[24992],{"type":34,"value":369},{"type":29,"tag":117,"props":24994,"children":24995},{"style":372},[24996],{"type":34,"value":24997},"run",{"type":29,"tag":117,"props":24999,"children":25000},{"style":384},[25001],{"type":34,"value":1108},{"type":29,"tag":117,"props":25003,"children":25004},{"style":378},[25005],{"type":34,"value":25006},"DipExampleApplication",{"type":29,"tag":117,"props":25008,"children":25009},{"style":384},[25010],{"type":34,"value":369},{"type":29,"tag":117,"props":25012,"children":25013},{"style":378},[25014],{"type":34,"value":16091},{"type":29,"tag":117,"props":25016,"children":25017},{"style":384},[25018],{"type":34,"value":1118},{"type":29,"tag":117,"props":25020,"children":25021},{"style":378},[25022],{"type":34,"value":18258},{"type":29,"tag":117,"props":25024,"children":25025},{"style":384},[25026],{"type":34,"value":5675},{"type":29,"tag":117,"props":25028,"children":25029},{"class":119,"line":189},[25030],{"type":29,"tag":117,"props":25031,"children":25032},{"emptyLinePlaceholder":13},[25033],{"type":34,"value":136},{"type":29,"tag":117,"props":25035,"children":25036},{"class":119,"line":198},[25037],{"type":29,"tag":117,"props":25038,"children":25039},{"style":124},[25040],{"type":34,"value":25041},"        \u002F\u002F Obtenir NotificationService du contexte Spring\n",{"type":29,"tag":117,"props":25043,"children":25044},{"class":119,"line":207},[25045,25049,25053,25057,25062,25066,25071,25075,25079,25083,25087],{"type":29,"tag":117,"props":25046,"children":25047},{"style":5976},[25048],{"type":34,"value":21992},{"type":29,"tag":117,"props":25050,"children":25051},{"style":378},[25052],{"type":34,"value":21997},{"type":29,"tag":117,"props":25054,"children":25055},{"style":160},[25056],{"type":34,"value":6061},{"type":29,"tag":117,"props":25058,"children":25059},{"style":378},[25060],{"type":34,"value":25061}," context",{"type":29,"tag":117,"props":25063,"children":25064},{"style":384},[25065],{"type":34,"value":369},{"type":29,"tag":117,"props":25067,"children":25068},{"style":372},[25069],{"type":34,"value":25070},"getBean",{"type":29,"tag":117,"props":25072,"children":25073},{"style":384},[25074],{"type":34,"value":1108},{"type":29,"tag":117,"props":25076,"children":25077},{"style":378},[25078],{"type":34,"value":20867},{"type":29,"tag":117,"props":25080,"children":25081},{"style":384},[25082],{"type":34,"value":369},{"type":29,"tag":117,"props":25084,"children":25085},{"style":378},[25086],{"type":34,"value":16091},{"type":29,"tag":117,"props":25088,"children":25089},{"style":384},[25090],{"type":34,"value":5675},{"type":29,"tag":117,"props":25092,"children":25093},{"class":119,"line":215},[25094,25098,25102,25106,25110,25115],{"type":29,"tag":117,"props":25095,"children":25096},{"style":378},[25097],{"type":34,"value":22030},{"type":29,"tag":117,"props":25099,"children":25100},{"style":384},[25101],{"type":34,"value":369},{"type":29,"tag":117,"props":25103,"children":25104},{"style":372},[25105],{"type":34,"value":22039},{"type":29,"tag":117,"props":25107,"children":25108},{"style":384},[25109],{"type":34,"value":1108},{"type":29,"tag":117,"props":25111,"children":25112},{"style":166},[25113],{"type":34,"value":25114},"\"Hello via Spring!\"",{"type":29,"tag":117,"props":25116,"children":25117},{"style":384},[25118],{"type":34,"value":5675},{"type":29,"tag":117,"props":25120,"children":25121},{"class":119,"line":224},[25122],{"type":29,"tag":117,"props":25123,"children":25124},{"style":384},[25125],{"type":34,"value":5632},{"type":29,"tag":117,"props":25127,"children":25128},{"class":119,"line":233},[25129],{"type":29,"tag":117,"props":25130,"children":25131},{"style":384},[25132],{"type":34,"value":2903},{"type":29,"tag":25134,"props":25135,"children":25137},"h5",{"id":25136},"ce-que-spring-fait-pour-vous",[25138],{"type":34,"value":25139},"Ce que Spring fait pour vous :",{"type":29,"tag":1585,"props":25141,"children":25142},{},[25143,25180,25210],{"type":29,"tag":1589,"props":25144,"children":25145},{},[25146,25151,25153,25158,25160,25165,25166,25172,25174,25179],{"type":29,"tag":45,"props":25147,"children":25148},{},[25149],{"type":34,"value":25150},"Gestion automatique des dépendances",{"type":34,"value":25152}," : Grâce à Spring, vous n’avez pas besoin de créer manuellement les objets de type ",{"type":29,"tag":113,"props":25154,"children":25156},{"className":25155},[],[25157],{"type":34,"value":23612},{"type":34,"value":25159},". Spring instancie automatiquement la classe ",{"type":29,"tag":113,"props":25161,"children":25163},{"className":25162},[],[25164],{"type":34,"value":21855},{"type":34,"value":14287},{"type":29,"tag":113,"props":25167,"children":25169},{"className":25168},[],[25170],{"type":34,"value":25171},"SmsSender",{"type":34,"value":25173}," (selon la configuration) et l’injecte dans ",{"type":29,"tag":113,"props":25175,"children":25177},{"className":25176},[],[25178],{"type":34,"value":20867},{"type":34,"value":369},{"type":29,"tag":1589,"props":25181,"children":25182},{},[25183,25188,25190,25195,25197,25202,25204,25209],{"type":29,"tag":45,"props":25184,"children":25185},{},[25186],{"type":34,"value":25187},"Découplage",{"type":34,"value":25189}," : Comme ",{"type":29,"tag":113,"props":25191,"children":25193},{"className":25192},[],[25194],{"type":34,"value":20867},{"type":34,"value":25196}," dépend de l’interface ",{"type":29,"tag":113,"props":25198,"children":25200},{"className":25199},[],[25201],{"type":34,"value":23612},{"type":34,"value":25203},", vous pouvez facilement changer l’implémentation injectée sans modifier le code de ",{"type":29,"tag":113,"props":25205,"children":25207},{"className":25206},[],[25208],{"type":34,"value":20867},{"type":34,"value":369},{"type":29,"tag":1589,"props":25211,"children":25212},{},[25213,25218,25220,25225,25226,25231],{"type":29,"tag":45,"props":25214,"children":25215},{},[25216],{"type":34,"value":25217},"Facilité de configuration",{"type":34,"value":25219}," : Avec des annotations comme ",{"type":29,"tag":113,"props":25221,"children":25223},{"className":25222},[],[25224],{"type":34,"value":24201},{"type":34,"value":5923},{"type":29,"tag":113,"props":25227,"children":25229},{"className":25228},[],[25230],{"type":34,"value":24194},{"type":34,"value":25232},", la configuration des dépendances est claire et concise. Vous n’avez plus à vous soucier de l’instanciation manuelle ou de l’injection de dépendances au runtime.",{"type":29,"tag":7528,"props":25234,"children":25236},{"id":25235},"avantages-dappliquer-le-dip-dans-un-projet-spring",[25237],{"type":34,"value":25238},"Avantages d’appliquer le DIP dans un projet Spring",{"type":29,"tag":4212,"props":25240,"children":25241},{},[25242,25252],{"type":29,"tag":1589,"props":25243,"children":25244},{},[25245,25250],{"type":29,"tag":45,"props":25246,"children":25247},{},[25248],{"type":34,"value":25249},"Flexibilité accrue",{"type":34,"value":25251}," : avec des interfaces injectées, remplacer un composant ne demande rien d'autre : passer d'un envoi d'emails à des notifications push devient trivial.",{"type":29,"tag":1589,"props":25253,"children":25254},{},[25255,25260,25262,25267,25269,25274],{"type":29,"tag":45,"props":25256,"children":25257},{},[25258],{"type":34,"value":25259},"Tests unitaires simplifiés",{"type":34,"value":25261}," : grâce aux abstractions, mocker ou stubber les dépendances dans les tests unitaires devient direct. Tester ",{"type":29,"tag":113,"props":25263,"children":25265},{"className":25264},[],[25266],{"type":34,"value":20867},{"type":34,"value":25268}," sans implémenter un vrai ",{"type":29,"tag":113,"props":25270,"children":25272},{"className":25271},[],[25273],{"type":34,"value":23612},{"type":34,"value":25275}," se résume à :",{"type":29,"tag":106,"props":25277,"children":25279},{"className":5519,"code":25278,"language":5521,"meta":8,"style":8},"@Test\npublic void testSendNotification() {\n    MessageSender mockSender = Mockito.mock(MessageSender.class);\n    NotificationService service = new NotificationService(mockSender);\n\n    service.sendNotification(\"Test message\");\n\n    Mockito.verify(mockSender).sendMessage(\"Test message\");\n}\n",[25280],{"type":29,"tag":113,"props":25281,"children":25282},{"__ignoreMap":8},[25283,25294,25318,25369,25406,25413,25442,25449,25494],{"type":29,"tag":117,"props":25284,"children":25285},{"class":119,"line":120},[25286,25290],{"type":29,"tag":117,"props":25287,"children":25288},{"style":10083},[25289],{"type":34,"value":14335},{"type":29,"tag":117,"props":25291,"children":25292},{"style":10089},[25293],{"type":34,"value":10092},{"type":29,"tag":117,"props":25295,"children":25296},{"class":119,"line":130},[25297,25301,25305,25310,25314],{"type":29,"tag":117,"props":25298,"children":25299},{"style":143},[25300],{"type":34,"value":5541},{"type":29,"tag":117,"props":25302,"children":25303},{"style":143},[25304],{"type":34,"value":7762},{"type":29,"tag":117,"props":25306,"children":25307},{"style":372},[25308],{"type":34,"value":25309}," testSendNotification",{"type":29,"tag":117,"props":25311,"children":25312},{"style":384},[25313],{"type":34,"value":381},{"type":29,"tag":117,"props":25315,"children":25316},{"style":384},[25317],{"type":34,"value":3461},{"type":29,"tag":117,"props":25319,"children":25320},{"class":119,"line":139},[25321,25326,25331,25335,25340,25344,25349,25353,25357,25361,25365],{"type":29,"tag":117,"props":25322,"children":25323},{"style":5976},[25324],{"type":34,"value":25325},"    MessageSender",{"type":29,"tag":117,"props":25327,"children":25328},{"style":378},[25329],{"type":34,"value":25330}," mockSender ",{"type":29,"tag":117,"props":25332,"children":25333},{"style":160},[25334],{"type":34,"value":6061},{"type":29,"tag":117,"props":25336,"children":25337},{"style":378},[25338],{"type":34,"value":25339}," Mockito",{"type":29,"tag":117,"props":25341,"children":25342},{"style":384},[25343],{"type":34,"value":369},{"type":29,"tag":117,"props":25345,"children":25346},{"style":372},[25347],{"type":34,"value":25348},"mock",{"type":29,"tag":117,"props":25350,"children":25351},{"style":384},[25352],{"type":34,"value":1108},{"type":29,"tag":117,"props":25354,"children":25355},{"style":378},[25356],{"type":34,"value":23612},{"type":29,"tag":117,"props":25358,"children":25359},{"style":384},[25360],{"type":34,"value":369},{"type":29,"tag":117,"props":25362,"children":25363},{"style":378},[25364],{"type":34,"value":16091},{"type":29,"tag":117,"props":25366,"children":25367},{"style":384},[25368],{"type":34,"value":5675},{"type":29,"tag":117,"props":25370,"children":25371},{"class":119,"line":172},[25372,25377,25381,25385,25389,25393,25397,25402],{"type":29,"tag":117,"props":25373,"children":25374},{"style":5976},[25375],{"type":34,"value":25376},"    NotificationService",{"type":29,"tag":117,"props":25378,"children":25379},{"style":378},[25380],{"type":34,"value":16064},{"type":29,"tag":117,"props":25382,"children":25383},{"style":160},[25384],{"type":34,"value":6061},{"type":29,"tag":117,"props":25386,"children":25387},{"style":143},[25388],{"type":34,"value":6066},{"type":29,"tag":117,"props":25390,"children":25391},{"style":372},[25392],{"type":34,"value":21032},{"type":29,"tag":117,"props":25394,"children":25395},{"style":384},[25396],{"type":34,"value":1108},{"type":29,"tag":117,"props":25398,"children":25399},{"style":378},[25400],{"type":34,"value":25401},"mockSender",{"type":29,"tag":117,"props":25403,"children":25404},{"style":384},[25405],{"type":34,"value":5675},{"type":29,"tag":117,"props":25407,"children":25408},{"class":119,"line":181},[25409],{"type":29,"tag":117,"props":25410,"children":25411},{"emptyLinePlaceholder":13},[25412],{"type":34,"value":136},{"type":29,"tag":117,"props":25414,"children":25415},{"class":119,"line":189},[25416,25421,25425,25429,25433,25438],{"type":29,"tag":117,"props":25417,"children":25418},{"style":378},[25419],{"type":34,"value":25420},"    service",{"type":29,"tag":117,"props":25422,"children":25423},{"style":384},[25424],{"type":34,"value":369},{"type":29,"tag":117,"props":25426,"children":25427},{"style":372},[25428],{"type":34,"value":22039},{"type":29,"tag":117,"props":25430,"children":25431},{"style":384},[25432],{"type":34,"value":1108},{"type":29,"tag":117,"props":25434,"children":25435},{"style":166},[25436],{"type":34,"value":25437},"\"Test message\"",{"type":29,"tag":117,"props":25439,"children":25440},{"style":384},[25441],{"type":34,"value":5675},{"type":29,"tag":117,"props":25443,"children":25444},{"class":119,"line":198},[25445],{"type":29,"tag":117,"props":25446,"children":25447},{"emptyLinePlaceholder":13},[25448],{"type":34,"value":136},{"type":29,"tag":117,"props":25450,"children":25451},{"class":119,"line":207},[25452,25457,25461,25466,25470,25474,25478,25482,25486,25490],{"type":29,"tag":117,"props":25453,"children":25454},{"style":378},[25455],{"type":34,"value":25456},"    Mockito",{"type":29,"tag":117,"props":25458,"children":25459},{"style":384},[25460],{"type":34,"value":369},{"type":29,"tag":117,"props":25462,"children":25463},{"style":372},[25464],{"type":34,"value":25465},"verify",{"type":29,"tag":117,"props":25467,"children":25468},{"style":384},[25469],{"type":34,"value":1108},{"type":29,"tag":117,"props":25471,"children":25472},{"style":378},[25473],{"type":34,"value":25401},{"type":29,"tag":117,"props":25475,"children":25476},{"style":384},[25477],{"type":34,"value":14223},{"type":29,"tag":117,"props":25479,"children":25480},{"style":372},[25481],{"type":34,"value":23718},{"type":29,"tag":117,"props":25483,"children":25484},{"style":384},[25485],{"type":34,"value":1108},{"type":29,"tag":117,"props":25487,"children":25488},{"style":166},[25489],{"type":34,"value":25437},{"type":29,"tag":117,"props":25491,"children":25492},{"style":384},[25493],{"type":34,"value":5675},{"type":29,"tag":117,"props":25495,"children":25496},{"class":119,"line":215},[25497],{"type":29,"tag":117,"props":25498,"children":25499},{"style":384},[25500],{"type":34,"value":2903},{"type":29,"tag":4212,"props":25502,"children":25503},{"start":139},[25504],{"type":29,"tag":1589,"props":25505,"children":25506},{},[25507,25512],{"type":29,"tag":45,"props":25508,"children":25509},{},[25510],{"type":34,"value":25511},"Scalabilité",{"type":34,"value":25513}," : avec un framework comme Spring, le DIP ouvre la voie à des systèmes évolutifs où chaque module se modifie, se teste ou se remplace sans impact significatif sur les autres composants.",{"type":29,"tag":5462,"props":25515,"children":25516},{"type":22616},[25517],{"type":29,"tag":30,"props":25518,"children":25519},{},[25520],{"type":34,"value":25521},"Veillez à ne pas tomber dans le piège de créer trop d'abstractions inutiles. Le DIP doit être utilisé de manière pragmatique pour éviter de sur-complexifier le système.",{"type":29,"tag":51,"props":25523,"children":25524},{},[],{"type":29,"tag":567,"props":25526,"children":25528},{"cta":805,"href":806,"title":25527,"type":808},"Le DIP n'est qu'une pratique parmi les 100 que j'applique pour garder un code propre",[25529],{"type":29,"tag":30,"props":25530,"children":25531},{},[25532],{"type":34,"value":25533},"Cet article détaille une seule pratique : inverser ses dépendances pour découpler le métier de l'infrastructure. Le Craft Bundle réunit les 100 pratiques craft que j'applique au quotidien pour concevoir, tester et faire évoluer du code sans le casser, celles que l'IA ne vous apprendra jamais parce qu'elle ne les a jamais vues tenir sur la durée en production.",{"type":29,"tag":51,"props":25535,"children":25536},{},[],{"type":29,"tag":55,"props":25538,"children":25540},{"id":25539},"faq-réponses-aux-questions-fréquentes-sur-le-dip",[25541],{"type":34,"value":25542},"FAQ : Réponses aux questions fréquentes sur le DIP",{"type":29,"tag":825,"props":25544,"children":25545},{},[25546,25551],{"type":29,"tag":829,"props":25547,"children":25548},{},[25549],{"type":34,"value":25550},"1. Qu’est-ce que le DIP en termes simples ?",{"type":29,"tag":30,"props":25552,"children":25553},{},[25554,25555,25559],{"type":34,"value":7167},{"type":29,"tag":45,"props":25556,"children":25557},{},[25558],{"type":34,"value":22502},{"type":34,"value":25560}," (Dependency Inversion Principle) est un principe de conception : les modules de haut niveau ne doivent pas dépendre des modules de bas niveau, les deux doivent dépendre d'abstractions (interfaces). Résultat : des composants découplés, plus flexibles et plus simples à maintenir.",{"type":29,"tag":825,"props":25562,"children":25563},{},[25564,25569],{"type":29,"tag":829,"props":25565,"children":25566},{},[25567],{"type":34,"value":25568},"2. Pourquoi est-il si important d’appliquer le DIP ?",{"type":29,"tag":30,"props":25570,"children":25571},{},[25572,25574,25579,25580,25585,25586,25591],{"type":34,"value":25573},"Le DIP réduit le couplage entre les différentes parties d'une application. Vous pouvez modifier une partie sans toucher au reste, ce qui rend le code ",{"type":29,"tag":45,"props":25575,"children":25576},{},[25577],{"type":34,"value":25578},"flexible",{"type":34,"value":2468},{"type":29,"tag":45,"props":25581,"children":25582},{},[25583],{"type":34,"value":25584},"évolutif",{"type":34,"value":5923},{"type":29,"tag":45,"props":25587,"children":25588},{},[25589],{"type":34,"value":25590},"testable",{"type":34,"value":25592},". Décisif dans des projets à long terme ou de grande envergure.",{"type":29,"tag":825,"props":25594,"children":25595},{},[25596,25601],{"type":29,"tag":829,"props":25597,"children":25598},{},[25599],{"type":34,"value":25600},"3. Est-ce que le DIP rend le code plus complexe ?",{"type":29,"tag":30,"props":25602,"children":25603},{},[25604,25606,25610,25612,25617],{"type":34,"value":25605},"Cela peut paraître plus complexe au début, car vous ajoutez des ",{"type":29,"tag":45,"props":25607,"children":25608},{},[25609],{"type":34,"value":22705},{"type":34,"value":25611}," et des abstractions. Cependant, cette complexité initiale est compensée par les avantages à long terme : un code plus facile à tester, à maintenir et à faire évoluer. Il s’agit d’un ",{"type":29,"tag":45,"props":25613,"children":25614},{},[25615],{"type":34,"value":25616},"investissement",{"type":34,"value":25618}," en qualité.",{"type":29,"tag":825,"props":25620,"children":25621},{},[25622,25627,25632],{"type":29,"tag":829,"props":25623,"children":25624},{},[25625],{"type":34,"value":25626},"4. Dois-je appliquer le DIP dans tous mes projets, même les petits ?",{"type":29,"tag":30,"props":25628,"children":25629},{},[25630],{"type":34,"value":25631},"Le DIP est particulièrement utile dans les projets de grande taille, où les modifications fréquentes peuvent rendre la maintenance difficile. Pour les petits projets, il n’est pas toujours nécessaire de tout structurer de cette manière. Cependant, même dans des projets plus modestes, adopter de bonnes pratiques comme le DIP peut vous éviter des surprises désagréables à mesure que le projet grandit.",{"type":29,"tag":2164,"props":25633,"children":25634},{},[25635],{"type":29,"tag":30,"props":25636,"children":25637},{},[25638,25643],{"type":29,"tag":45,"props":25639,"children":25640},{},[25641],{"type":34,"value":25642},"TIP :",{"type":34,"value":25644}," Si vous travaillez sur un petit projet, vous pouvez choisir d’appliquer le DIP uniquement dans les parties critiques du système, comme les services ou les accès aux données, plutôt que sur toutes les classes.",{"type":29,"tag":825,"props":25646,"children":25647},{},[25648,25653],{"type":29,"tag":829,"props":25649,"children":25650},{},[25651],{"type":34,"value":25652},"5. Comment puis-je savoir si mon code viole le DIP ?",{"type":29,"tag":30,"props":25654,"children":25655},{},[25656],{"type":34,"value":25657},"Votre code viole le DIP si une classe de haut niveau dépend directement d’une implémentation concrète, plutôt que d’une interface ou d’une abstraction. Si un changement dans une classe bas niveau (comme une classe d’accès aux données) provoque des modifications dans les classes de haut niveau (comme les services ou les contrôleurs), c’est un signe de violation du DIP.",{"type":29,"tag":825,"props":25659,"children":25660},{},[25661,25666],{"type":29,"tag":829,"props":25662,"children":25663},{},[25664],{"type":34,"value":25665},"6. Comment le DIP fonctionne-t-il avec d’autres principes SOLID ?",{"type":29,"tag":30,"props":25667,"children":25668},{},[25669,25671,25676,25678,25682,25683,25687,25689,25693],{"type":34,"value":25670},"Le DIP est étroitement lié à d’autres principes du ",{"type":29,"tag":45,"props":25672,"children":25673},{},[25674],{"type":34,"value":25675},"SOLID",{"type":34,"value":25677},". Par exemple, il complète le ",{"type":29,"tag":45,"props":25679,"children":25680},{},[25681],{"type":34,"value":22259},{"type":34,"value":7128},{"type":29,"tag":45,"props":25684,"children":25685},{},[25686],{"type":34,"value":22242},{"type":34,"value":25688},", car il permet de remplacer des implémentations sans affecter les clients de ces implémentations. En appliquant le DIP, vous facilitez également le respect du ",{"type":29,"tag":45,"props":25690,"children":25691},{},[25692],{"type":34,"value":22218},{"type":34,"value":25694},", car chaque module devient responsable d’une tâche unique.",{"type":29,"tag":825,"props":25696,"children":25697},{},[25698,25703],{"type":29,"tag":829,"props":25699,"children":25700},{},[25701],{"type":34,"value":25702},"7. Quels outils et frameworks peuvent m’aider à appliquer le DIP en Java ?",{"type":29,"tag":30,"props":25704,"children":25705},{},[25706,25707,25711,25713,25717,25719,25724,25726,25731,25732,25737],{"type":34,"value":7167},{"type":29,"tag":45,"props":25708,"children":25709},{},[25710],{"type":34,"value":24172},{"type":34,"value":25712}," est l’un des outils les plus populaires pour appliquer le DIP en Java. Avec des concepts comme l’",{"type":29,"tag":45,"props":25714,"children":25715},{},[25716],{"type":34,"value":24155},{"type":34,"value":25718}," (DI) et l’utilisation d’annotations comme ",{"type":29,"tag":113,"props":25720,"children":25722},{"className":25721},[],[25723],{"type":34,"value":24194},{"type":34,"value":25725},", vous pouvez facilement structurer vos applications en respectant le DIP. D’autres frameworks comme ",{"type":29,"tag":45,"props":25727,"children":25728},{},[25729],{"type":34,"value":25730},"Guice",{"type":34,"value":14287},{"type":29,"tag":45,"props":25733,"children":25734},{},[25735],{"type":34,"value":25736},"Jakarta EE CDI",{"type":34,"value":25738}," offrent également des solutions pour gérer les dépendances.",{"type":29,"tag":51,"props":25740,"children":25741},{},[],{"type":29,"tag":55,"props":25743,"children":25744},{"id":12615},[25745],{"type":34,"value":12618},{"type":29,"tag":30,"props":25747,"children":25748},{},[25749,25751,25755,25757,25761],{"type":34,"value":25750},"Cinquième des ",{"type":29,"tag":453,"props":25752,"children":25753},{"href":6919},[25754],{"type":34,"value":6922},{"type":34,"value":25756},", le ",{"type":29,"tag":45,"props":25758,"children":25759},{},[25760],{"type":34,"value":22502},{"type":34,"value":25762}," est un levier puissant pour la qualité du code. Découpler les modules rend l'application plus flexible, plus évolutive, plus testable. L'effort initial est réel. Le retour sur investissement, lui, ne se discute pas sur le long terme.",{"type":29,"tag":30,"props":25764,"children":25765},{},[25766],{"type":34,"value":25767},"Pour un code plus maintenable, commencez à adopter le DIP dès maintenant. Avec ou sans Spring, le principe reste bénéfique.",{"type":29,"tag":2164,"props":25769,"children":25770},{},[25771],{"type":29,"tag":30,"props":25772,"children":25773},{},[25774,25779,25781,25786],{"type":29,"tag":45,"props":25775,"children":25776},{},[25777],{"type":34,"value":25778},"Attention :",{"type":34,"value":25780}," L’objectif du DIP est de rendre votre code ",{"type":29,"tag":45,"props":25782,"children":25783},{},[25784],{"type":34,"value":25785},"modulable et adaptable",{"type":34,"value":25787},". N’utilisez pas le DIP simplement pour suivre une mode, mais pour résoudre des problèmes spécifiques de dépendance dans votre projet.",{"type":29,"tag":567,"props":25789,"children":25790},{"cta":7028,"href":918,"title":7029,"type":920},[25791],{"type":29,"tag":30,"props":25792,"children":25793},{},[25794],{"type":34,"value":7035},{"type":29,"tag":928,"props":25796,"children":25797},{},[25798],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":25800},[25801,25802,25803,25807,25812,25816,25817],{"id":22484,"depth":130,"text":22487},{"id":22528,"depth":130,"text":22531},{"id":22637,"depth":130,"text":22640,"children":25804},[25805,25806],{"id":22661,"depth":139,"text":22664},{"id":22684,"depth":139,"text":22687},{"id":22766,"depth":130,"text":22769,"children":25808},[25809,25810,25811],{"id":22783,"depth":139,"text":22786},{"id":23134,"depth":139,"text":23137},{"id":24068,"depth":139,"text":24071},{"id":24129,"depth":130,"text":24132,"children":25813},[25814,25815],{"id":24159,"depth":139,"text":24162},{"id":24209,"depth":139,"text":24212},{"id":25539,"depth":130,"text":25542},{"id":12615,"depth":130,"text":12618},"content:fr:architecture-craft:principe-inversion-dependances-dip-java-guide-complet.md","fr\u002Farchitecture-craft\u002Fprincipe-inversion-dependances-dip-java-guide-complet.md","fr\u002Farchitecture-craft\u002Fprincipe-inversion-dependances-dip-java-guide-complet",{"_path":16461,"_dir":16372,"_draft":7,"_partial":7,"_locale":8,"title":25822,"description":25823,"id":25824,"date":25825,"listed":13,"nocomments":7,"hidden":7,"categories":25826,"tags":25827,"cover":25828,"readingTime":25829,"body":25834,"_type":942,"_id":28649,"_source":944,"_file":28650,"_stem":28651,"_extension":947},"Principe ISP en Software Craftsmanship, Guide Pratique avec Exemples Java","Découvrez le principe de séparation d'interface (ISP) en Software Craftsmanship avec des exemples de code Java et des conseils pratiques pour un code...",43,"2024-03-27",[16372],[5391,18],"covers\u002Farticles\u002Fprincipe-isp.jpg",{"text":25830,"minutes":25831,"time":25832,"words":25833},"12 min read",11.17,670200,2234,{"type":26,"children":25835,"toc":28629},[25836,25849,25854,25865,25868,25874,25885,25890,25896,25924,25929,25942,25948,25975,25981,25986,25992,25997,26010,26013,26019,26024,26030,26042,26124,26137,26367,26379,26399,26405,26417,26564,26583,26700,26727,26938,26943,26955,26961,26974,27056,27077,27190,27202,27405,27432,27727,27732,27735,27744,27750,27755,27761,27766,27774,27923,27928,27940,27946,27951,27958,28056,28069,28075,28087,28095,28411,28423,28429,28434,28446,28449,28458,28461,28467,28480,28493,28513,28526,28545,28558,28571,28584,28597,28600,28612,28615,28625],{"type":29,"tag":30,"props":25837,"children":25838},{},[25839,25841,25847],{"type":34,"value":25840},"Sur une mission récente dans la banque, j'ai retrouvé une interface ",{"type":29,"tag":113,"props":25842,"children":25844},{"className":25843},[],[25845],{"type":34,"value":25846},"Service",{"type":34,"value":25848}," qui rassemblait 23 méthodes. Toutes les classes qui l'implémentaient en ignoraient au moins la moitié. À chaque ajout de fonctionnalité, le code mort prolifère et le moindre changement casse des implémentations qui n'avaient rien demandé.",{"type":29,"tag":30,"props":25850,"children":25851},{},[25852],{"type":34,"value":25853},"C'est la signature classique d'une mauvaise conception d'interface, et le principe de séparation d'interface (ISP) attaque exactement ce problème. Quatrième des cinq principes SOLID, ISP impose une règle simple : une interface ne doit jamais forcer une classe à implémenter des méthodes dont elle n'a pas besoin.",{"type":29,"tag":30,"props":25855,"children":25856},{},[25857,25859,25863],{"type":34,"value":25858},"Dans le secteur financier, ce type d'interface \"fourre-tout\" est endémique : j'en ai croisé sur la plupart de mes missions. Robert C. Martin, dans ",{"type":29,"tag":5410,"props":25860,"children":25861},{},[25862],{"type":34,"value":16407},{"type":34,"value":25864},", formalise d'ailleurs ISP comme l'un des piliers d'une architecture orientée objet saine. Cet article montre comment l'appliquer en Java, exemples à l'appui, avec les erreurs typiques à éviter.",{"type":29,"tag":51,"props":25866,"children":25867},{},[],{"type":29,"tag":55,"props":25869,"children":25871},{"id":25870},"pourquoi-respecter-le-principe-isp",[25872],{"type":34,"value":25873},"Pourquoi respecter le principe ISP ?",{"type":29,"tag":30,"props":25875,"children":25876},{},[25877,25879,25883],{"type":34,"value":25878},"Le principe de séparation d’interface (ISP) fait partie des cinq ",{"type":29,"tag":453,"props":25880,"children":25881},{"href":6919},[25882],{"type":34,"value":6922},{"type":34,"value":25884},", qui sont des lignes directrices destinées à rendre notre code plus modulable, maintenable et évolutif. ISP stipule qu’une interface ne doit pas forcer une classe à implémenter des méthodes dont elle n’a pas besoin.",{"type":29,"tag":30,"props":25886,"children":25887},{},[25888],{"type":34,"value":25889},"Mais pourquoi est-ce si important ?",{"type":29,"tag":4530,"props":25891,"children":25893},{"id":25892},"_1-faciliter-la-maintenance-et-lévolution-du-code",[25894],{"type":34,"value":25895},"1. Faciliter la maintenance et l’évolution du code",{"type":29,"tag":30,"props":25897,"children":25898},{},[25899,25901,25907,25909,25915,25916,25922],{"type":34,"value":25900},"Avec une interface trop large, le moindre ajout impacte toutes les classes qui l'implémentent, même celles qui ne sont pas concernées. Prenez une interface ",{"type":29,"tag":113,"props":25902,"children":25904},{"className":25903},[],[25905],{"type":34,"value":25906},"Employe",{"type":34,"value":25908}," avec ",{"type":29,"tag":113,"props":25910,"children":25912},{"className":25911},[],[25913],{"type":34,"value":25914},"calculerSalaire()",{"type":34,"value":5923},{"type":29,"tag":113,"props":25917,"children":25919},{"className":25918},[],[25920],{"type":34,"value":25921},"gererProjets()",{"type":34,"value":25923}," : toutes les classes qui l'implémentent, développeur comme responsable de projet, devront fournir une implémentation pour les deux méthodes, même si l'une est inutile pour elles.",{"type":29,"tag":30,"props":25925,"children":25926},{},[25927],{"type":34,"value":25928},"Résultat : chaque changement dans cette interface déclenche des bugs inattendus et alourdit l'évolution du code.",{"type":29,"tag":2164,"props":25930,"children":25931},{},[25932],{"type":29,"tag":30,"props":25933,"children":25934},{},[25935,25940],{"type":29,"tag":45,"props":25936,"children":25937},{},[25938],{"type":34,"value":25939},"Tip",{"type":34,"value":25941}," : si plusieurs classes implémentent une interface sans utiliser toutes ses méthodes, c'est un signal clair que cette interface est trop large. Découpez-la.",{"type":29,"tag":4530,"props":25943,"children":25945},{"id":25944},"_2-favoriser-la-réutilisabilité",[25946],{"type":34,"value":25947},"2. Favoriser la réutilisabilité",{"type":29,"tag":30,"props":25949,"children":25950},{},[25951,25953,25958,25960,25966,25967,25973],{"type":34,"value":25952},"Une interface spécifique, centrée sur une seule tâche, ouvre la voie à la réutilisabilité. Si vous divisez ",{"type":29,"tag":113,"props":25954,"children":25956},{"className":25955},[],[25957],{"type":34,"value":25906},{"type":34,"value":25959}," en deux interfaces ciblées (",{"type":29,"tag":113,"props":25961,"children":25963},{"className":25962},[],[25964],{"type":34,"value":25965},"Salarie",{"type":34,"value":5923},{"type":29,"tag":113,"props":25968,"children":25970},{"className":25969},[],[25971],{"type":34,"value":25972},"Manager",{"type":34,"value":25974},"), chaque classe n'implémente que ce dont elle a besoin. Le code reste propre et les classes deviennent réutilisables sans risquer de casser le reste.",{"type":29,"tag":4530,"props":25976,"children":25978},{"id":25977},"_3-réduire-le-couplage",[25979],{"type":34,"value":25980},"3. Réduire le couplage",{"type":29,"tag":30,"props":25982,"children":25983},{},[25984],{"type":34,"value":25985},"Respecter ISP réduit aussi le couplage entre les différentes parties du code. Une classe qui dépend d'une interface large se retrouve liée à plusieurs fonctionnalités, ce qui complique sa modification ou son remplacement. Avec des interfaces ciblées, les classes sont moins couplées et chacune se modifie sans casser le reste du système.",{"type":29,"tag":4530,"props":25987,"children":25989},{"id":25988},"_4-améliorer-les-tests-unitaires",[25990],{"type":34,"value":25991},"4. Améliorer les tests unitaires",{"type":29,"tag":30,"props":25993,"children":25994},{},[25995],{"type":34,"value":25996},"Les interfaces ciblées simplifient les tests unitaires. Une classe qui dépend uniquement des méthodes qui la concernent se mocke en quelques lignes. Avec une interface trop large, vous vous retrouvez à gérer des méthodes inutiles dans chaque test, ce qui alourdit la suite.",{"type":29,"tag":2164,"props":25998,"children":25999},{},[26000],{"type":29,"tag":30,"props":26001,"children":26002},{},[26003,26008],{"type":29,"tag":45,"props":26004,"children":26005},{},[26006],{"type":34,"value":26007},"Alerte",{"type":34,"value":26009}," : Des interfaces larges et mal segmentées augmentent le couplage, ce qui rend vos tests plus difficiles à écrire et à maintenir.",{"type":29,"tag":51,"props":26011,"children":26012},{},[],{"type":29,"tag":55,"props":26014,"children":26016},{"id":26015},"comment-appliquer-isp-en-java",[26017],{"type":34,"value":26018},"Comment appliquer ISP en Java ?",{"type":29,"tag":30,"props":26020,"children":26021},{},[26022],{"type":34,"value":26023},"Le principe de séparation d’interface peut sembler abstrait à première vue, mais il est très facile à comprendre une fois qu’on voit comment il s’applique dans un projet. Voici quelques exemples concrets en Java qui illustrent comment respecter ce principe.",{"type":29,"tag":4530,"props":26025,"children":26027},{"id":26026},"exemple-1-une-interface-trop-large",[26028],{"type":34,"value":26029},"Exemple 1 : Une interface trop large",{"type":29,"tag":30,"props":26031,"children":26032},{},[26033,26035,26040],{"type":34,"value":26034},"Prenons une interface ",{"type":29,"tag":113,"props":26036,"children":26038},{"className":26037},[],[26039],{"type":34,"value":25906},{"type":34,"value":26041}," qui contient plusieurs méthodes. Cette interface est mal conçue car elle impose à toutes les classes qui l’implémentent de définir des méthodes dont elles n’ont peut-être pas besoin :",{"type":29,"tag":106,"props":26043,"children":26045},{"className":5519,"code":26044,"language":5521,"meta":8,"style":8},"public interface Employe {\n    void travailler();\n    void gererProjets();\n    void calculerSalaire();\n}\n",[26046],{"type":29,"tag":113,"props":26047,"children":26048},{"__ignoreMap":8},[26049,26069,26085,26101,26117],{"type":29,"tag":117,"props":26050,"children":26051},{"class":119,"line":120},[26052,26056,26060,26065],{"type":29,"tag":117,"props":26053,"children":26054},{"style":143},[26055],{"type":34,"value":5541},{"type":29,"tag":117,"props":26057,"children":26058},{"style":143},[26059],{"type":34,"value":8561},{"type":29,"tag":117,"props":26061,"children":26062},{"style":2863},[26063],{"type":34,"value":26064}," Employe",{"type":29,"tag":117,"props":26066,"children":26067},{"style":384},[26068],{"type":34,"value":3461},{"type":29,"tag":117,"props":26070,"children":26071},{"class":119,"line":130},[26072,26076,26081],{"type":29,"tag":117,"props":26073,"children":26074},{"style":143},[26075],{"type":34,"value":8578},{"type":29,"tag":117,"props":26077,"children":26078},{"style":372},[26079],{"type":34,"value":26080}," travailler",{"type":29,"tag":117,"props":26082,"children":26083},{"style":384},[26084],{"type":34,"value":9375},{"type":29,"tag":117,"props":26086,"children":26087},{"class":119,"line":139},[26088,26092,26097],{"type":29,"tag":117,"props":26089,"children":26090},{"style":143},[26091],{"type":34,"value":8578},{"type":29,"tag":117,"props":26093,"children":26094},{"style":372},[26095],{"type":34,"value":26096}," gererProjets",{"type":29,"tag":117,"props":26098,"children":26099},{"style":384},[26100],{"type":34,"value":9375},{"type":29,"tag":117,"props":26102,"children":26103},{"class":119,"line":172},[26104,26108,26113],{"type":29,"tag":117,"props":26105,"children":26106},{"style":143},[26107],{"type":34,"value":8578},{"type":29,"tag":117,"props":26109,"children":26110},{"style":372},[26111],{"type":34,"value":26112}," calculerSalaire",{"type":29,"tag":117,"props":26114,"children":26115},{"style":384},[26116],{"type":34,"value":9375},{"type":29,"tag":117,"props":26118,"children":26119},{"class":119,"line":181},[26120],{"type":29,"tag":117,"props":26121,"children":26122},{"style":384},[26123],{"type":34,"value":2903},{"type":29,"tag":30,"props":26125,"children":26126},{},[26127,26129,26135],{"type":34,"value":26128},"Dans ce cas, une classe ",{"type":29,"tag":113,"props":26130,"children":26132},{"className":26131},[],[26133],{"type":34,"value":26134},"Developpeur",{"type":34,"value":26136}," doit implémenter toutes ces méthodes, même si un développeur n’a pas à gérer des projets ou à calculer des salaires.",{"type":29,"tag":106,"props":26138,"children":26140},{"className":5519,"code":26139,"language":5521,"meta":8,"style":8},"public class Developpeur implements Employe {\n    @Override\n    public void travailler() {\n        System.out.println(\"Le développeur écrit du code.\");\n    }\n\n    @Override\n    public void gererProjets() {\n        \u002F\u002F Non pertinent pour un développeur.\n    }\n\n    @Override\n    public void calculerSalaire() {\n        \u002F\u002F Non pertinent pour un développeur.\n    }\n}\n",[26141],{"type":29,"tag":113,"props":26142,"children":26143},{"__ignoreMap":8},[26144,26172,26183,26206,26242,26249,26256,26267,26290,26298,26305,26312,26323,26346,26353,26360],{"type":29,"tag":117,"props":26145,"children":26146},{"class":119,"line":120},[26147,26151,26155,26160,26164,26168],{"type":29,"tag":117,"props":26148,"children":26149},{"style":143},[26150],{"type":34,"value":5541},{"type":29,"tag":117,"props":26152,"children":26153},{"style":143},[26154],{"type":34,"value":7575},{"type":29,"tag":117,"props":26156,"children":26157},{"style":2863},[26158],{"type":34,"value":26159}," Developpeur",{"type":29,"tag":117,"props":26161,"children":26162},{"style":143},[26163],{"type":34,"value":8636},{"type":29,"tag":117,"props":26165,"children":26166},{"style":2863},[26167],{"type":34,"value":26064},{"type":29,"tag":117,"props":26169,"children":26170},{"style":384},[26171],{"type":34,"value":3461},{"type":29,"tag":117,"props":26173,"children":26174},{"class":119,"line":130},[26175,26179],{"type":29,"tag":117,"props":26176,"children":26177},{"style":10083},[26178],{"type":34,"value":10086},{"type":29,"tag":117,"props":26180,"children":26181},{"style":10089},[26182],{"type":34,"value":17746},{"type":29,"tag":117,"props":26184,"children":26185},{"class":119,"line":139},[26186,26190,26194,26198,26202],{"type":29,"tag":117,"props":26187,"children":26188},{"style":143},[26189],{"type":34,"value":7641},{"type":29,"tag":117,"props":26191,"children":26192},{"style":143},[26193],{"type":34,"value":7762},{"type":29,"tag":117,"props":26195,"children":26196},{"style":372},[26197],{"type":34,"value":26080},{"type":29,"tag":117,"props":26199,"children":26200},{"style":384},[26201],{"type":34,"value":381},{"type":29,"tag":117,"props":26203,"children":26204},{"style":384},[26205],{"type":34,"value":3461},{"type":29,"tag":117,"props":26207,"children":26208},{"class":119,"line":172},[26209,26213,26217,26221,26225,26229,26233,26238],{"type":29,"tag":117,"props":26210,"children":26211},{"style":378},[26212],{"type":34,"value":16717},{"type":29,"tag":117,"props":26214,"children":26215},{"style":384},[26216],{"type":34,"value":369},{"type":29,"tag":117,"props":26218,"children":26219},{"style":378},[26220],{"type":34,"value":15075},{"type":29,"tag":117,"props":26222,"children":26223},{"style":384},[26224],{"type":34,"value":369},{"type":29,"tag":117,"props":26226,"children":26227},{"style":372},[26228],{"type":34,"value":15084},{"type":29,"tag":117,"props":26230,"children":26231},{"style":384},[26232],{"type":34,"value":1108},{"type":29,"tag":117,"props":26234,"children":26235},{"style":166},[26236],{"type":34,"value":26237},"\"Le développeur écrit du code.\"",{"type":29,"tag":117,"props":26239,"children":26240},{"style":384},[26241],{"type":34,"value":5675},{"type":29,"tag":117,"props":26243,"children":26244},{"class":119,"line":181},[26245],{"type":29,"tag":117,"props":26246,"children":26247},{"style":384},[26248],{"type":34,"value":5632},{"type":29,"tag":117,"props":26250,"children":26251},{"class":119,"line":189},[26252],{"type":29,"tag":117,"props":26253,"children":26254},{"emptyLinePlaceholder":13},[26255],{"type":34,"value":136},{"type":29,"tag":117,"props":26257,"children":26258},{"class":119,"line":198},[26259,26263],{"type":29,"tag":117,"props":26260,"children":26261},{"style":10083},[26262],{"type":34,"value":10086},{"type":29,"tag":117,"props":26264,"children":26265},{"style":10089},[26266],{"type":34,"value":17746},{"type":29,"tag":117,"props":26268,"children":26269},{"class":119,"line":207},[26270,26274,26278,26282,26286],{"type":29,"tag":117,"props":26271,"children":26272},{"style":143},[26273],{"type":34,"value":7641},{"type":29,"tag":117,"props":26275,"children":26276},{"style":143},[26277],{"type":34,"value":7762},{"type":29,"tag":117,"props":26279,"children":26280},{"style":372},[26281],{"type":34,"value":26096},{"type":29,"tag":117,"props":26283,"children":26284},{"style":384},[26285],{"type":34,"value":381},{"type":29,"tag":117,"props":26287,"children":26288},{"style":384},[26289],{"type":34,"value":3461},{"type":29,"tag":117,"props":26291,"children":26292},{"class":119,"line":215},[26293],{"type":29,"tag":117,"props":26294,"children":26295},{"style":124},[26296],{"type":34,"value":26297},"        \u002F\u002F Non pertinent pour un développeur.\n",{"type":29,"tag":117,"props":26299,"children":26300},{"class":119,"line":224},[26301],{"type":29,"tag":117,"props":26302,"children":26303},{"style":384},[26304],{"type":34,"value":5632},{"type":29,"tag":117,"props":26306,"children":26307},{"class":119,"line":233},[26308],{"type":29,"tag":117,"props":26309,"children":26310},{"emptyLinePlaceholder":13},[26311],{"type":34,"value":136},{"type":29,"tag":117,"props":26313,"children":26314},{"class":119,"line":242},[26315,26319],{"type":29,"tag":117,"props":26316,"children":26317},{"style":10083},[26318],{"type":34,"value":10086},{"type":29,"tag":117,"props":26320,"children":26321},{"style":10089},[26322],{"type":34,"value":17746},{"type":29,"tag":117,"props":26324,"children":26325},{"class":119,"line":251},[26326,26330,26334,26338,26342],{"type":29,"tag":117,"props":26327,"children":26328},{"style":143},[26329],{"type":34,"value":7641},{"type":29,"tag":117,"props":26331,"children":26332},{"style":143},[26333],{"type":34,"value":7762},{"type":29,"tag":117,"props":26335,"children":26336},{"style":372},[26337],{"type":34,"value":26112},{"type":29,"tag":117,"props":26339,"children":26340},{"style":384},[26341],{"type":34,"value":381},{"type":29,"tag":117,"props":26343,"children":26344},{"style":384},[26345],{"type":34,"value":3461},{"type":29,"tag":117,"props":26347,"children":26348},{"class":119,"line":260},[26349],{"type":29,"tag":117,"props":26350,"children":26351},{"style":124},[26352],{"type":34,"value":26297},{"type":29,"tag":117,"props":26354,"children":26355},{"class":119,"line":269},[26356],{"type":29,"tag":117,"props":26357,"children":26358},{"style":384},[26359],{"type":34,"value":5632},{"type":29,"tag":117,"props":26361,"children":26362},{"class":119,"line":278},[26363],{"type":29,"tag":117,"props":26364,"children":26365},{"style":384},[26366],{"type":34,"value":2903},{"type":29,"tag":30,"props":26368,"children":26369},{},[26370,26372,26377],{"type":34,"value":26371},"Ici, ",{"type":29,"tag":113,"props":26373,"children":26375},{"className":26374},[],[26376],{"type":34,"value":26134},{"type":34,"value":26378}," se retrouve à implémenter des méthodes inutiles, ce qui est une violation directe du principe ISP.",{"type":29,"tag":2164,"props":26380,"children":26381},{},[26382],{"type":29,"tag":30,"props":26383,"children":26384},{},[26385,26389,26391,26397],{"type":29,"tag":45,"props":26386,"children":26387},{},[26388],{"type":34,"value":26007},{"type":34,"value":26390}," : Si vous vous retrouvez à laisser des méthodes vides ou à lever des exceptions ",{"type":29,"tag":113,"props":26392,"children":26394},{"className":26393},[],[26395],{"type":34,"value":26396},"UnsupportedOperationException",{"type":34,"value":26398},", c'est un signal clair qu'une interface est trop large.",{"type":29,"tag":4530,"props":26400,"children":26402},{"id":26401},"exemple-2-appliquer-le-principe-isp-avec-des-interfaces-spécifiques",[26403],{"type":34,"value":26404},"Exemple 2 : Appliquer le principe ISP avec des interfaces spécifiques",{"type":29,"tag":30,"props":26406,"children":26407},{},[26408,26410,26415],{"type":34,"value":26409},"Pour corriger cette conception, nous devons diviser l'interface ",{"type":29,"tag":113,"props":26411,"children":26413},{"className":26412},[],[26414],{"type":34,"value":25906},{"type":34,"value":26416}," en plusieurs interfaces plus spécifiques. Chaque interface doit refléter un comportement précis, que seules les classes pertinentes implémenteront.",{"type":29,"tag":106,"props":26418,"children":26420},{"className":5519,"code":26419,"language":5521,"meta":8,"style":8},"public interface Travailleur {\n    void travailler();\n}\n\npublic interface Manager {\n    void gererProjets();\n}\n\npublic interface Salarie {\n    void calculerSalaire();\n}\n",[26421],{"type":29,"tag":113,"props":26422,"children":26423},{"__ignoreMap":8},[26424,26444,26459,26466,26473,26493,26508,26515,26522,26542,26557],{"type":29,"tag":117,"props":26425,"children":26426},{"class":119,"line":120},[26427,26431,26435,26440],{"type":29,"tag":117,"props":26428,"children":26429},{"style":143},[26430],{"type":34,"value":5541},{"type":29,"tag":117,"props":26432,"children":26433},{"style":143},[26434],{"type":34,"value":8561},{"type":29,"tag":117,"props":26436,"children":26437},{"style":2863},[26438],{"type":34,"value":26439}," Travailleur",{"type":29,"tag":117,"props":26441,"children":26442},{"style":384},[26443],{"type":34,"value":3461},{"type":29,"tag":117,"props":26445,"children":26446},{"class":119,"line":130},[26447,26451,26455],{"type":29,"tag":117,"props":26448,"children":26449},{"style":143},[26450],{"type":34,"value":8578},{"type":29,"tag":117,"props":26452,"children":26453},{"style":372},[26454],{"type":34,"value":26080},{"type":29,"tag":117,"props":26456,"children":26457},{"style":384},[26458],{"type":34,"value":9375},{"type":29,"tag":117,"props":26460,"children":26461},{"class":119,"line":139},[26462],{"type":29,"tag":117,"props":26463,"children":26464},{"style":384},[26465],{"type":34,"value":2903},{"type":29,"tag":117,"props":26467,"children":26468},{"class":119,"line":172},[26469],{"type":29,"tag":117,"props":26470,"children":26471},{"emptyLinePlaceholder":13},[26472],{"type":34,"value":136},{"type":29,"tag":117,"props":26474,"children":26475},{"class":119,"line":181},[26476,26480,26484,26489],{"type":29,"tag":117,"props":26477,"children":26478},{"style":143},[26479],{"type":34,"value":5541},{"type":29,"tag":117,"props":26481,"children":26482},{"style":143},[26483],{"type":34,"value":8561},{"type":29,"tag":117,"props":26485,"children":26486},{"style":2863},[26487],{"type":34,"value":26488}," Manager",{"type":29,"tag":117,"props":26490,"children":26491},{"style":384},[26492],{"type":34,"value":3461},{"type":29,"tag":117,"props":26494,"children":26495},{"class":119,"line":189},[26496,26500,26504],{"type":29,"tag":117,"props":26497,"children":26498},{"style":143},[26499],{"type":34,"value":8578},{"type":29,"tag":117,"props":26501,"children":26502},{"style":372},[26503],{"type":34,"value":26096},{"type":29,"tag":117,"props":26505,"children":26506},{"style":384},[26507],{"type":34,"value":9375},{"type":29,"tag":117,"props":26509,"children":26510},{"class":119,"line":198},[26511],{"type":29,"tag":117,"props":26512,"children":26513},{"style":384},[26514],{"type":34,"value":2903},{"type":29,"tag":117,"props":26516,"children":26517},{"class":119,"line":207},[26518],{"type":29,"tag":117,"props":26519,"children":26520},{"emptyLinePlaceholder":13},[26521],{"type":34,"value":136},{"type":29,"tag":117,"props":26523,"children":26524},{"class":119,"line":215},[26525,26529,26533,26538],{"type":29,"tag":117,"props":26526,"children":26527},{"style":143},[26528],{"type":34,"value":5541},{"type":29,"tag":117,"props":26530,"children":26531},{"style":143},[26532],{"type":34,"value":8561},{"type":29,"tag":117,"props":26534,"children":26535},{"style":2863},[26536],{"type":34,"value":26537}," Salarie",{"type":29,"tag":117,"props":26539,"children":26540},{"style":384},[26541],{"type":34,"value":3461},{"type":29,"tag":117,"props":26543,"children":26544},{"class":119,"line":224},[26545,26549,26553],{"type":29,"tag":117,"props":26546,"children":26547},{"style":143},[26548],{"type":34,"value":8578},{"type":29,"tag":117,"props":26550,"children":26551},{"style":372},[26552],{"type":34,"value":26112},{"type":29,"tag":117,"props":26554,"children":26555},{"style":384},[26556],{"type":34,"value":9375},{"type":29,"tag":117,"props":26558,"children":26559},{"class":119,"line":233},[26560],{"type":29,"tag":117,"props":26561,"children":26562},{"style":384},[26563],{"type":34,"value":2903},{"type":29,"tag":30,"props":26565,"children":26566},{},[26567,26569,26574,26576,26582],{"type":34,"value":26568},"Maintenant, la classe ",{"type":29,"tag":113,"props":26570,"children":26572},{"className":26571},[],[26573],{"type":34,"value":26134},{"type":34,"value":26575}," n’a plus besoin d’implémenter des méthodes qui ne sont pas pertinentes pour elle. Elle n’implémente que l’interface ",{"type":29,"tag":113,"props":26577,"children":26579},{"className":26578},[],[26580],{"type":34,"value":26581},"Travailleur",{"type":34,"value":1866},{"type":29,"tag":106,"props":26584,"children":26586},{"className":5519,"code":26585,"language":5521,"meta":8,"style":8},"public class Developpeur implements Travailleur {\n    @Override\n    public void travailler() {\n        System.out.println(\"Le développeur écrit du code.\");\n    }\n}\n",[26587],{"type":29,"tag":113,"props":26588,"children":26589},{"__ignoreMap":8},[26590,26617,26628,26651,26686,26693],{"type":29,"tag":117,"props":26591,"children":26592},{"class":119,"line":120},[26593,26597,26601,26605,26609,26613],{"type":29,"tag":117,"props":26594,"children":26595},{"style":143},[26596],{"type":34,"value":5541},{"type":29,"tag":117,"props":26598,"children":26599},{"style":143},[26600],{"type":34,"value":7575},{"type":29,"tag":117,"props":26602,"children":26603},{"style":2863},[26604],{"type":34,"value":26159},{"type":29,"tag":117,"props":26606,"children":26607},{"style":143},[26608],{"type":34,"value":8636},{"type":29,"tag":117,"props":26610,"children":26611},{"style":2863},[26612],{"type":34,"value":26439},{"type":29,"tag":117,"props":26614,"children":26615},{"style":384},[26616],{"type":34,"value":3461},{"type":29,"tag":117,"props":26618,"children":26619},{"class":119,"line":130},[26620,26624],{"type":29,"tag":117,"props":26621,"children":26622},{"style":10083},[26623],{"type":34,"value":10086},{"type":29,"tag":117,"props":26625,"children":26626},{"style":10089},[26627],{"type":34,"value":17746},{"type":29,"tag":117,"props":26629,"children":26630},{"class":119,"line":139},[26631,26635,26639,26643,26647],{"type":29,"tag":117,"props":26632,"children":26633},{"style":143},[26634],{"type":34,"value":7641},{"type":29,"tag":117,"props":26636,"children":26637},{"style":143},[26638],{"type":34,"value":7762},{"type":29,"tag":117,"props":26640,"children":26641},{"style":372},[26642],{"type":34,"value":26080},{"type":29,"tag":117,"props":26644,"children":26645},{"style":384},[26646],{"type":34,"value":381},{"type":29,"tag":117,"props":26648,"children":26649},{"style":384},[26650],{"type":34,"value":3461},{"type":29,"tag":117,"props":26652,"children":26653},{"class":119,"line":172},[26654,26658,26662,26666,26670,26674,26678,26682],{"type":29,"tag":117,"props":26655,"children":26656},{"style":378},[26657],{"type":34,"value":16717},{"type":29,"tag":117,"props":26659,"children":26660},{"style":384},[26661],{"type":34,"value":369},{"type":29,"tag":117,"props":26663,"children":26664},{"style":378},[26665],{"type":34,"value":15075},{"type":29,"tag":117,"props":26667,"children":26668},{"style":384},[26669],{"type":34,"value":369},{"type":29,"tag":117,"props":26671,"children":26672},{"style":372},[26673],{"type":34,"value":15084},{"type":29,"tag":117,"props":26675,"children":26676},{"style":384},[26677],{"type":34,"value":1108},{"type":29,"tag":117,"props":26679,"children":26680},{"style":166},[26681],{"type":34,"value":26237},{"type":29,"tag":117,"props":26683,"children":26684},{"style":384},[26685],{"type":34,"value":5675},{"type":29,"tag":117,"props":26687,"children":26688},{"class":119,"line":181},[26689],{"type":29,"tag":117,"props":26690,"children":26691},{"style":384},[26692],{"type":34,"value":5632},{"type":29,"tag":117,"props":26694,"children":26695},{"class":119,"line":189},[26696],{"type":29,"tag":117,"props":26697,"children":26698},{"style":384},[26699],{"type":34,"value":2903},{"type":29,"tag":30,"props":26701,"children":26702},{},[26703,26705,26711,26713,26718,26720,26725],{"type":34,"value":26704},"De même, un ",{"type":29,"tag":113,"props":26706,"children":26708},{"className":26707},[],[26709],{"type":34,"value":26710},"ResponsableProjet",{"type":34,"value":26712}," pourrait implémenter l’interface ",{"type":29,"tag":113,"props":26714,"children":26716},{"className":26715},[],[26717],{"type":34,"value":25972},{"type":34,"value":26719}," et l’interface ",{"type":29,"tag":113,"props":26721,"children":26723},{"className":26722},[],[26724],{"type":34,"value":26581},{"type":34,"value":26726}," s'il gère des projets tout en travaillant :",{"type":29,"tag":106,"props":26728,"children":26730},{"className":5519,"code":26729,"language":5521,"meta":8,"style":8},"public class ResponsableProjet implements Manager, Travailleur {\n    @Override\n    public void travailler() {\n        System.out.println(\"Le responsable de projet supervise les tâches.\");\n    }\n\n    @Override\n    public void gererProjets() {\n        System.out.println(\"Le responsable de projet gère les équipes.\");\n    }\n}\n",[26731],{"type":29,"tag":113,"props":26732,"children":26733},{"__ignoreMap":8},[26734,26770,26781,26804,26840,26847,26854,26865,26888,26924,26931],{"type":29,"tag":117,"props":26735,"children":26736},{"class":119,"line":120},[26737,26741,26745,26750,26754,26758,26762,26766],{"type":29,"tag":117,"props":26738,"children":26739},{"style":143},[26740],{"type":34,"value":5541},{"type":29,"tag":117,"props":26742,"children":26743},{"style":143},[26744],{"type":34,"value":7575},{"type":29,"tag":117,"props":26746,"children":26747},{"style":2863},[26748],{"type":34,"value":26749}," ResponsableProjet",{"type":29,"tag":117,"props":26751,"children":26752},{"style":143},[26753],{"type":34,"value":8636},{"type":29,"tag":117,"props":26755,"children":26756},{"style":2863},[26757],{"type":34,"value":26488},{"type":29,"tag":117,"props":26759,"children":26760},{"style":384},[26761],{"type":34,"value":1118},{"type":29,"tag":117,"props":26763,"children":26764},{"style":2863},[26765],{"type":34,"value":26439},{"type":29,"tag":117,"props":26767,"children":26768},{"style":384},[26769],{"type":34,"value":3461},{"type":29,"tag":117,"props":26771,"children":26772},{"class":119,"line":130},[26773,26777],{"type":29,"tag":117,"props":26774,"children":26775},{"style":10083},[26776],{"type":34,"value":10086},{"type":29,"tag":117,"props":26778,"children":26779},{"style":10089},[26780],{"type":34,"value":17746},{"type":29,"tag":117,"props":26782,"children":26783},{"class":119,"line":139},[26784,26788,26792,26796,26800],{"type":29,"tag":117,"props":26785,"children":26786},{"style":143},[26787],{"type":34,"value":7641},{"type":29,"tag":117,"props":26789,"children":26790},{"style":143},[26791],{"type":34,"value":7762},{"type":29,"tag":117,"props":26793,"children":26794},{"style":372},[26795],{"type":34,"value":26080},{"type":29,"tag":117,"props":26797,"children":26798},{"style":384},[26799],{"type":34,"value":381},{"type":29,"tag":117,"props":26801,"children":26802},{"style":384},[26803],{"type":34,"value":3461},{"type":29,"tag":117,"props":26805,"children":26806},{"class":119,"line":172},[26807,26811,26815,26819,26823,26827,26831,26836],{"type":29,"tag":117,"props":26808,"children":26809},{"style":378},[26810],{"type":34,"value":16717},{"type":29,"tag":117,"props":26812,"children":26813},{"style":384},[26814],{"type":34,"value":369},{"type":29,"tag":117,"props":26816,"children":26817},{"style":378},[26818],{"type":34,"value":15075},{"type":29,"tag":117,"props":26820,"children":26821},{"style":384},[26822],{"type":34,"value":369},{"type":29,"tag":117,"props":26824,"children":26825},{"style":372},[26826],{"type":34,"value":15084},{"type":29,"tag":117,"props":26828,"children":26829},{"style":384},[26830],{"type":34,"value":1108},{"type":29,"tag":117,"props":26832,"children":26833},{"style":166},[26834],{"type":34,"value":26835},"\"Le responsable de projet supervise les tâches.\"",{"type":29,"tag":117,"props":26837,"children":26838},{"style":384},[26839],{"type":34,"value":5675},{"type":29,"tag":117,"props":26841,"children":26842},{"class":119,"line":181},[26843],{"type":29,"tag":117,"props":26844,"children":26845},{"style":384},[26846],{"type":34,"value":5632},{"type":29,"tag":117,"props":26848,"children":26849},{"class":119,"line":189},[26850],{"type":29,"tag":117,"props":26851,"children":26852},{"emptyLinePlaceholder":13},[26853],{"type":34,"value":136},{"type":29,"tag":117,"props":26855,"children":26856},{"class":119,"line":198},[26857,26861],{"type":29,"tag":117,"props":26858,"children":26859},{"style":10083},[26860],{"type":34,"value":10086},{"type":29,"tag":117,"props":26862,"children":26863},{"style":10089},[26864],{"type":34,"value":17746},{"type":29,"tag":117,"props":26866,"children":26867},{"class":119,"line":207},[26868,26872,26876,26880,26884],{"type":29,"tag":117,"props":26869,"children":26870},{"style":143},[26871],{"type":34,"value":7641},{"type":29,"tag":117,"props":26873,"children":26874},{"style":143},[26875],{"type":34,"value":7762},{"type":29,"tag":117,"props":26877,"children":26878},{"style":372},[26879],{"type":34,"value":26096},{"type":29,"tag":117,"props":26881,"children":26882},{"style":384},[26883],{"type":34,"value":381},{"type":29,"tag":117,"props":26885,"children":26886},{"style":384},[26887],{"type":34,"value":3461},{"type":29,"tag":117,"props":26889,"children":26890},{"class":119,"line":215},[26891,26895,26899,26903,26907,26911,26915,26920],{"type":29,"tag":117,"props":26892,"children":26893},{"style":378},[26894],{"type":34,"value":16717},{"type":29,"tag":117,"props":26896,"children":26897},{"style":384},[26898],{"type":34,"value":369},{"type":29,"tag":117,"props":26900,"children":26901},{"style":378},[26902],{"type":34,"value":15075},{"type":29,"tag":117,"props":26904,"children":26905},{"style":384},[26906],{"type":34,"value":369},{"type":29,"tag":117,"props":26908,"children":26909},{"style":372},[26910],{"type":34,"value":15084},{"type":29,"tag":117,"props":26912,"children":26913},{"style":384},[26914],{"type":34,"value":1108},{"type":29,"tag":117,"props":26916,"children":26917},{"style":166},[26918],{"type":34,"value":26919},"\"Le responsable de projet gère les équipes.\"",{"type":29,"tag":117,"props":26921,"children":26922},{"style":384},[26923],{"type":34,"value":5675},{"type":29,"tag":117,"props":26925,"children":26926},{"class":119,"line":224},[26927],{"type":29,"tag":117,"props":26928,"children":26929},{"style":384},[26930],{"type":34,"value":5632},{"type":29,"tag":117,"props":26932,"children":26933},{"class":119,"line":233},[26934],{"type":29,"tag":117,"props":26935,"children":26936},{"style":384},[26937],{"type":34,"value":2903},{"type":29,"tag":30,"props":26939,"children":26940},{},[26941],{"type":34,"value":26942},"Cette approche respecte parfaitement le principe ISP, car chaque classe n'implémente que les méthodes dont elle a réellement besoin.",{"type":29,"tag":2164,"props":26944,"children":26945},{},[26946],{"type":29,"tag":30,"props":26947,"children":26948},{},[26949,26953],{"type":29,"tag":45,"props":26950,"children":26951},{},[26952],{"type":34,"value":25939},{"type":34,"value":26954}," : Si vous identifiez une interface large, demandez-vous quelles classes l'utilisent et lesquelles de ses méthodes sont vraiment nécessaires. Découpez-la en interfaces spécifiques pour simplifier la conception.",{"type":29,"tag":4530,"props":26956,"children":26958},{"id":26957},"exemple-3-refactoring-dune-interface-lourde",[26959],{"type":34,"value":26960},"Exemple 3 : Refactoring d'une interface lourde",{"type":29,"tag":30,"props":26962,"children":26963},{},[26964,26966,26972],{"type":34,"value":26965},"Imaginons que vous travaillez avec une interface existante qui est trop large, et vous voulez la refactorer pour respecter ISP. Prenons une interface ",{"type":29,"tag":113,"props":26967,"children":26969},{"className":26968},[],[26970],{"type":34,"value":26971},"Machine",{"type":34,"value":26973}," qui force toutes les machines à avoir des comportements différents :",{"type":29,"tag":106,"props":26975,"children":26977},{"className":5519,"code":26976,"language":5521,"meta":8,"style":8},"public interface Machine {\n    void demarrer();\n    void arreter();\n    void nettoyer();\n}\n",[26978],{"type":29,"tag":113,"props":26979,"children":26980},{"__ignoreMap":8},[26981,27001,27017,27033,27049],{"type":29,"tag":117,"props":26982,"children":26983},{"class":119,"line":120},[26984,26988,26992,26997],{"type":29,"tag":117,"props":26985,"children":26986},{"style":143},[26987],{"type":34,"value":5541},{"type":29,"tag":117,"props":26989,"children":26990},{"style":143},[26991],{"type":34,"value":8561},{"type":29,"tag":117,"props":26993,"children":26994},{"style":2863},[26995],{"type":34,"value":26996}," Machine",{"type":29,"tag":117,"props":26998,"children":26999},{"style":384},[27000],{"type":34,"value":3461},{"type":29,"tag":117,"props":27002,"children":27003},{"class":119,"line":130},[27004,27008,27013],{"type":29,"tag":117,"props":27005,"children":27006},{"style":143},[27007],{"type":34,"value":8578},{"type":29,"tag":117,"props":27009,"children":27010},{"style":372},[27011],{"type":34,"value":27012}," demarrer",{"type":29,"tag":117,"props":27014,"children":27015},{"style":384},[27016],{"type":34,"value":9375},{"type":29,"tag":117,"props":27018,"children":27019},{"class":119,"line":139},[27020,27024,27029],{"type":29,"tag":117,"props":27021,"children":27022},{"style":143},[27023],{"type":34,"value":8578},{"type":29,"tag":117,"props":27025,"children":27026},{"style":372},[27027],{"type":34,"value":27028}," arreter",{"type":29,"tag":117,"props":27030,"children":27031},{"style":384},[27032],{"type":34,"value":9375},{"type":29,"tag":117,"props":27034,"children":27035},{"class":119,"line":172},[27036,27040,27045],{"type":29,"tag":117,"props":27037,"children":27038},{"style":143},[27039],{"type":34,"value":8578},{"type":29,"tag":117,"props":27041,"children":27042},{"style":372},[27043],{"type":34,"value":27044}," nettoyer",{"type":29,"tag":117,"props":27046,"children":27047},{"style":384},[27048],{"type":34,"value":9375},{"type":29,"tag":117,"props":27050,"children":27051},{"class":119,"line":181},[27052],{"type":29,"tag":117,"props":27053,"children":27054},{"style":384},[27055],{"type":34,"value":2903},{"type":29,"tag":30,"props":27057,"children":27058},{},[27059,27061,27067,27069,27075],{"type":34,"value":27060},"Si vous implémentez une classe ",{"type":29,"tag":113,"props":27062,"children":27064},{"className":27063},[],[27065],{"type":34,"value":27066},"RobotCuisine",{"type":34,"value":27068},", vous n'avez pas forcément besoin de la méthode ",{"type":29,"tag":113,"props":27070,"children":27072},{"className":27071},[],[27073],{"type":34,"value":27074},"nettoyer",{"type":34,"value":27076},", qui pourrait être propre à une machine spécifique. Pour respecter ISP, je vous recommande de scinder cette interface en plusieurs interfaces plus petites et spécifiques :",{"type":29,"tag":106,"props":27078,"children":27080},{"className":5519,"code":27079,"language":5521,"meta":8,"style":8},"public interface Demarrage {\n    void demarrer();\n    void arreter();\n}\n\npublic interface Nettoyage {\n    void nettoyer();\n}\n",[27081],{"type":29,"tag":113,"props":27082,"children":27083},{"__ignoreMap":8},[27084,27104,27119,27134,27141,27148,27168,27183],{"type":29,"tag":117,"props":27085,"children":27086},{"class":119,"line":120},[27087,27091,27095,27100],{"type":29,"tag":117,"props":27088,"children":27089},{"style":143},[27090],{"type":34,"value":5541},{"type":29,"tag":117,"props":27092,"children":27093},{"style":143},[27094],{"type":34,"value":8561},{"type":29,"tag":117,"props":27096,"children":27097},{"style":2863},[27098],{"type":34,"value":27099}," Demarrage",{"type":29,"tag":117,"props":27101,"children":27102},{"style":384},[27103],{"type":34,"value":3461},{"type":29,"tag":117,"props":27105,"children":27106},{"class":119,"line":130},[27107,27111,27115],{"type":29,"tag":117,"props":27108,"children":27109},{"style":143},[27110],{"type":34,"value":8578},{"type":29,"tag":117,"props":27112,"children":27113},{"style":372},[27114],{"type":34,"value":27012},{"type":29,"tag":117,"props":27116,"children":27117},{"style":384},[27118],{"type":34,"value":9375},{"type":29,"tag":117,"props":27120,"children":27121},{"class":119,"line":139},[27122,27126,27130],{"type":29,"tag":117,"props":27123,"children":27124},{"style":143},[27125],{"type":34,"value":8578},{"type":29,"tag":117,"props":27127,"children":27128},{"style":372},[27129],{"type":34,"value":27028},{"type":29,"tag":117,"props":27131,"children":27132},{"style":384},[27133],{"type":34,"value":9375},{"type":29,"tag":117,"props":27135,"children":27136},{"class":119,"line":172},[27137],{"type":29,"tag":117,"props":27138,"children":27139},{"style":384},[27140],{"type":34,"value":2903},{"type":29,"tag":117,"props":27142,"children":27143},{"class":119,"line":181},[27144],{"type":29,"tag":117,"props":27145,"children":27146},{"emptyLinePlaceholder":13},[27147],{"type":34,"value":136},{"type":29,"tag":117,"props":27149,"children":27150},{"class":119,"line":189},[27151,27155,27159,27164],{"type":29,"tag":117,"props":27152,"children":27153},{"style":143},[27154],{"type":34,"value":5541},{"type":29,"tag":117,"props":27156,"children":27157},{"style":143},[27158],{"type":34,"value":8561},{"type":29,"tag":117,"props":27160,"children":27161},{"style":2863},[27162],{"type":34,"value":27163}," Nettoyage",{"type":29,"tag":117,"props":27165,"children":27166},{"style":384},[27167],{"type":34,"value":3461},{"type":29,"tag":117,"props":27169,"children":27170},{"class":119,"line":198},[27171,27175,27179],{"type":29,"tag":117,"props":27172,"children":27173},{"style":143},[27174],{"type":34,"value":8578},{"type":29,"tag":117,"props":27176,"children":27177},{"style":372},[27178],{"type":34,"value":27044},{"type":29,"tag":117,"props":27180,"children":27181},{"style":384},[27182],{"type":34,"value":9375},{"type":29,"tag":117,"props":27184,"children":27185},{"class":119,"line":207},[27186],{"type":29,"tag":117,"props":27187,"children":27188},{"style":384},[27189],{"type":34,"value":2903},{"type":29,"tag":30,"props":27191,"children":27192},{},[27193,27195,27200],{"type":34,"value":27194},"Ensuite, ",{"type":29,"tag":113,"props":27196,"children":27198},{"className":27197},[],[27199],{"type":34,"value":27066},{"type":34,"value":27201}," n’implémentera que les méthodes nécessaires :",{"type":29,"tag":106,"props":27203,"children":27205},{"className":5519,"code":27204,"language":5521,"meta":8,"style":8},"public class RobotCuisine implements Demarrage {\n    @Override\n    public void demarrer() {\n        System.out.println(\"Le robot démarre.\");\n    }\n\n    @Override\n    public void arreter() {\n        System.out.println(\"Le robot s'arrête.\");\n    }\n}\n",[27206],{"type":29,"tag":113,"props":27207,"children":27208},{"__ignoreMap":8},[27209,27237,27248,27271,27307,27314,27321,27332,27355,27391,27398],{"type":29,"tag":117,"props":27210,"children":27211},{"class":119,"line":120},[27212,27216,27220,27225,27229,27233],{"type":29,"tag":117,"props":27213,"children":27214},{"style":143},[27215],{"type":34,"value":5541},{"type":29,"tag":117,"props":27217,"children":27218},{"style":143},[27219],{"type":34,"value":7575},{"type":29,"tag":117,"props":27221,"children":27222},{"style":2863},[27223],{"type":34,"value":27224}," RobotCuisine",{"type":29,"tag":117,"props":27226,"children":27227},{"style":143},[27228],{"type":34,"value":8636},{"type":29,"tag":117,"props":27230,"children":27231},{"style":2863},[27232],{"type":34,"value":27099},{"type":29,"tag":117,"props":27234,"children":27235},{"style":384},[27236],{"type":34,"value":3461},{"type":29,"tag":117,"props":27238,"children":27239},{"class":119,"line":130},[27240,27244],{"type":29,"tag":117,"props":27241,"children":27242},{"style":10083},[27243],{"type":34,"value":10086},{"type":29,"tag":117,"props":27245,"children":27246},{"style":10089},[27247],{"type":34,"value":17746},{"type":29,"tag":117,"props":27249,"children":27250},{"class":119,"line":139},[27251,27255,27259,27263,27267],{"type":29,"tag":117,"props":27252,"children":27253},{"style":143},[27254],{"type":34,"value":7641},{"type":29,"tag":117,"props":27256,"children":27257},{"style":143},[27258],{"type":34,"value":7762},{"type":29,"tag":117,"props":27260,"children":27261},{"style":372},[27262],{"type":34,"value":27012},{"type":29,"tag":117,"props":27264,"children":27265},{"style":384},[27266],{"type":34,"value":381},{"type":29,"tag":117,"props":27268,"children":27269},{"style":384},[27270],{"type":34,"value":3461},{"type":29,"tag":117,"props":27272,"children":27273},{"class":119,"line":172},[27274,27278,27282,27286,27290,27294,27298,27303],{"type":29,"tag":117,"props":27275,"children":27276},{"style":378},[27277],{"type":34,"value":16717},{"type":29,"tag":117,"props":27279,"children":27280},{"style":384},[27281],{"type":34,"value":369},{"type":29,"tag":117,"props":27283,"children":27284},{"style":378},[27285],{"type":34,"value":15075},{"type":29,"tag":117,"props":27287,"children":27288},{"style":384},[27289],{"type":34,"value":369},{"type":29,"tag":117,"props":27291,"children":27292},{"style":372},[27293],{"type":34,"value":15084},{"type":29,"tag":117,"props":27295,"children":27296},{"style":384},[27297],{"type":34,"value":1108},{"type":29,"tag":117,"props":27299,"children":27300},{"style":166},[27301],{"type":34,"value":27302},"\"Le robot démarre.\"",{"type":29,"tag":117,"props":27304,"children":27305},{"style":384},[27306],{"type":34,"value":5675},{"type":29,"tag":117,"props":27308,"children":27309},{"class":119,"line":181},[27310],{"type":29,"tag":117,"props":27311,"children":27312},{"style":384},[27313],{"type":34,"value":5632},{"type":29,"tag":117,"props":27315,"children":27316},{"class":119,"line":189},[27317],{"type":29,"tag":117,"props":27318,"children":27319},{"emptyLinePlaceholder":13},[27320],{"type":34,"value":136},{"type":29,"tag":117,"props":27322,"children":27323},{"class":119,"line":198},[27324,27328],{"type":29,"tag":117,"props":27325,"children":27326},{"style":10083},[27327],{"type":34,"value":10086},{"type":29,"tag":117,"props":27329,"children":27330},{"style":10089},[27331],{"type":34,"value":17746},{"type":29,"tag":117,"props":27333,"children":27334},{"class":119,"line":207},[27335,27339,27343,27347,27351],{"type":29,"tag":117,"props":27336,"children":27337},{"style":143},[27338],{"type":34,"value":7641},{"type":29,"tag":117,"props":27340,"children":27341},{"style":143},[27342],{"type":34,"value":7762},{"type":29,"tag":117,"props":27344,"children":27345},{"style":372},[27346],{"type":34,"value":27028},{"type":29,"tag":117,"props":27348,"children":27349},{"style":384},[27350],{"type":34,"value":381},{"type":29,"tag":117,"props":27352,"children":27353},{"style":384},[27354],{"type":34,"value":3461},{"type":29,"tag":117,"props":27356,"children":27357},{"class":119,"line":215},[27358,27362,27366,27370,27374,27378,27382,27387],{"type":29,"tag":117,"props":27359,"children":27360},{"style":378},[27361],{"type":34,"value":16717},{"type":29,"tag":117,"props":27363,"children":27364},{"style":384},[27365],{"type":34,"value":369},{"type":29,"tag":117,"props":27367,"children":27368},{"style":378},[27369],{"type":34,"value":15075},{"type":29,"tag":117,"props":27371,"children":27372},{"style":384},[27373],{"type":34,"value":369},{"type":29,"tag":117,"props":27375,"children":27376},{"style":372},[27377],{"type":34,"value":15084},{"type":29,"tag":117,"props":27379,"children":27380},{"style":384},[27381],{"type":34,"value":1108},{"type":29,"tag":117,"props":27383,"children":27384},{"style":166},[27385],{"type":34,"value":27386},"\"Le robot s'arrête.\"",{"type":29,"tag":117,"props":27388,"children":27389},{"style":384},[27390],{"type":34,"value":5675},{"type":29,"tag":117,"props":27392,"children":27393},{"class":119,"line":224},[27394],{"type":29,"tag":117,"props":27395,"children":27396},{"style":384},[27397],{"type":34,"value":5632},{"type":29,"tag":117,"props":27399,"children":27400},{"class":119,"line":233},[27401],{"type":29,"tag":117,"props":27402,"children":27403},{"style":384},[27404],{"type":34,"value":2903},{"type":29,"tag":30,"props":27406,"children":27407},{},[27408,27410,27415,27417,27423,27425,27431],{"type":34,"value":27409},"Si vous avez une autre classe qui a besoin de la méthode ",{"type":29,"tag":113,"props":27411,"children":27413},{"className":27412},[],[27414],{"type":34,"value":27074},{"type":34,"value":27416},", comme une classe ",{"type":29,"tag":113,"props":27418,"children":27420},{"className":27419},[],[27421],{"type":34,"value":27422},"LaveVaisselle",{"type":34,"value":27424},", elle peut implémenter l'interface ",{"type":29,"tag":113,"props":27426,"children":27428},{"className":27427},[],[27429],{"type":34,"value":27430},"Nettoyage",{"type":34,"value":1866},{"type":29,"tag":106,"props":27433,"children":27435},{"className":5519,"code":27434,"language":5521,"meta":8,"style":8},"public class LaveVaisselle implements Demarrage, Nettoyage {\n    @Override\n    public void demarrer() {\n        System.out.println(\"Le lave-vaisselle démarre.\");\n    }\n\n    @Override\n    public void arreter() {\n        System.out.println(\"Le lave-vaisselle s'arrête.\");\n    }\n\n    @Override\n    public void nettoyer() {\n        System.out.println(\"Le lave-vaisselle nettoie.\");\n    }\n}\n",[27436],{"type":29,"tag":113,"props":27437,"children":27438},{"__ignoreMap":8},[27439,27475,27486,27509,27545,27552,27559,27570,27593,27629,27636,27643,27654,27677,27713,27720],{"type":29,"tag":117,"props":27440,"children":27441},{"class":119,"line":120},[27442,27446,27450,27455,27459,27463,27467,27471],{"type":29,"tag":117,"props":27443,"children":27444},{"style":143},[27445],{"type":34,"value":5541},{"type":29,"tag":117,"props":27447,"children":27448},{"style":143},[27449],{"type":34,"value":7575},{"type":29,"tag":117,"props":27451,"children":27452},{"style":2863},[27453],{"type":34,"value":27454}," LaveVaisselle",{"type":29,"tag":117,"props":27456,"children":27457},{"style":143},[27458],{"type":34,"value":8636},{"type":29,"tag":117,"props":27460,"children":27461},{"style":2863},[27462],{"type":34,"value":27099},{"type":29,"tag":117,"props":27464,"children":27465},{"style":384},[27466],{"type":34,"value":1118},{"type":29,"tag":117,"props":27468,"children":27469},{"style":2863},[27470],{"type":34,"value":27163},{"type":29,"tag":117,"props":27472,"children":27473},{"style":384},[27474],{"type":34,"value":3461},{"type":29,"tag":117,"props":27476,"children":27477},{"class":119,"line":130},[27478,27482],{"type":29,"tag":117,"props":27479,"children":27480},{"style":10083},[27481],{"type":34,"value":10086},{"type":29,"tag":117,"props":27483,"children":27484},{"style":10089},[27485],{"type":34,"value":17746},{"type":29,"tag":117,"props":27487,"children":27488},{"class":119,"line":139},[27489,27493,27497,27501,27505],{"type":29,"tag":117,"props":27490,"children":27491},{"style":143},[27492],{"type":34,"value":7641},{"type":29,"tag":117,"props":27494,"children":27495},{"style":143},[27496],{"type":34,"value":7762},{"type":29,"tag":117,"props":27498,"children":27499},{"style":372},[27500],{"type":34,"value":27012},{"type":29,"tag":117,"props":27502,"children":27503},{"style":384},[27504],{"type":34,"value":381},{"type":29,"tag":117,"props":27506,"children":27507},{"style":384},[27508],{"type":34,"value":3461},{"type":29,"tag":117,"props":27510,"children":27511},{"class":119,"line":172},[27512,27516,27520,27524,27528,27532,27536,27541],{"type":29,"tag":117,"props":27513,"children":27514},{"style":378},[27515],{"type":34,"value":16717},{"type":29,"tag":117,"props":27517,"children":27518},{"style":384},[27519],{"type":34,"value":369},{"type":29,"tag":117,"props":27521,"children":27522},{"style":378},[27523],{"type":34,"value":15075},{"type":29,"tag":117,"props":27525,"children":27526},{"style":384},[27527],{"type":34,"value":369},{"type":29,"tag":117,"props":27529,"children":27530},{"style":372},[27531],{"type":34,"value":15084},{"type":29,"tag":117,"props":27533,"children":27534},{"style":384},[27535],{"type":34,"value":1108},{"type":29,"tag":117,"props":27537,"children":27538},{"style":166},[27539],{"type":34,"value":27540},"\"Le lave-vaisselle démarre.\"",{"type":29,"tag":117,"props":27542,"children":27543},{"style":384},[27544],{"type":34,"value":5675},{"type":29,"tag":117,"props":27546,"children":27547},{"class":119,"line":181},[27548],{"type":29,"tag":117,"props":27549,"children":27550},{"style":384},[27551],{"type":34,"value":5632},{"type":29,"tag":117,"props":27553,"children":27554},{"class":119,"line":189},[27555],{"type":29,"tag":117,"props":27556,"children":27557},{"emptyLinePlaceholder":13},[27558],{"type":34,"value":136},{"type":29,"tag":117,"props":27560,"children":27561},{"class":119,"line":198},[27562,27566],{"type":29,"tag":117,"props":27563,"children":27564},{"style":10083},[27565],{"type":34,"value":10086},{"type":29,"tag":117,"props":27567,"children":27568},{"style":10089},[27569],{"type":34,"value":17746},{"type":29,"tag":117,"props":27571,"children":27572},{"class":119,"line":207},[27573,27577,27581,27585,27589],{"type":29,"tag":117,"props":27574,"children":27575},{"style":143},[27576],{"type":34,"value":7641},{"type":29,"tag":117,"props":27578,"children":27579},{"style":143},[27580],{"type":34,"value":7762},{"type":29,"tag":117,"props":27582,"children":27583},{"style":372},[27584],{"type":34,"value":27028},{"type":29,"tag":117,"props":27586,"children":27587},{"style":384},[27588],{"type":34,"value":381},{"type":29,"tag":117,"props":27590,"children":27591},{"style":384},[27592],{"type":34,"value":3461},{"type":29,"tag":117,"props":27594,"children":27595},{"class":119,"line":215},[27596,27600,27604,27608,27612,27616,27620,27625],{"type":29,"tag":117,"props":27597,"children":27598},{"style":378},[27599],{"type":34,"value":16717},{"type":29,"tag":117,"props":27601,"children":27602},{"style":384},[27603],{"type":34,"value":369},{"type":29,"tag":117,"props":27605,"children":27606},{"style":378},[27607],{"type":34,"value":15075},{"type":29,"tag":117,"props":27609,"children":27610},{"style":384},[27611],{"type":34,"value":369},{"type":29,"tag":117,"props":27613,"children":27614},{"style":372},[27615],{"type":34,"value":15084},{"type":29,"tag":117,"props":27617,"children":27618},{"style":384},[27619],{"type":34,"value":1108},{"type":29,"tag":117,"props":27621,"children":27622},{"style":166},[27623],{"type":34,"value":27624},"\"Le lave-vaisselle s'arrête.\"",{"type":29,"tag":117,"props":27626,"children":27627},{"style":384},[27628],{"type":34,"value":5675},{"type":29,"tag":117,"props":27630,"children":27631},{"class":119,"line":224},[27632],{"type":29,"tag":117,"props":27633,"children":27634},{"style":384},[27635],{"type":34,"value":5632},{"type":29,"tag":117,"props":27637,"children":27638},{"class":119,"line":233},[27639],{"type":29,"tag":117,"props":27640,"children":27641},{"emptyLinePlaceholder":13},[27642],{"type":34,"value":136},{"type":29,"tag":117,"props":27644,"children":27645},{"class":119,"line":242},[27646,27650],{"type":29,"tag":117,"props":27647,"children":27648},{"style":10083},[27649],{"type":34,"value":10086},{"type":29,"tag":117,"props":27651,"children":27652},{"style":10089},[27653],{"type":34,"value":17746},{"type":29,"tag":117,"props":27655,"children":27656},{"class":119,"line":251},[27657,27661,27665,27669,27673],{"type":29,"tag":117,"props":27658,"children":27659},{"style":143},[27660],{"type":34,"value":7641},{"type":29,"tag":117,"props":27662,"children":27663},{"style":143},[27664],{"type":34,"value":7762},{"type":29,"tag":117,"props":27666,"children":27667},{"style":372},[27668],{"type":34,"value":27044},{"type":29,"tag":117,"props":27670,"children":27671},{"style":384},[27672],{"type":34,"value":381},{"type":29,"tag":117,"props":27674,"children":27675},{"style":384},[27676],{"type":34,"value":3461},{"type":29,"tag":117,"props":27678,"children":27679},{"class":119,"line":260},[27680,27684,27688,27692,27696,27700,27704,27709],{"type":29,"tag":117,"props":27681,"children":27682},{"style":378},[27683],{"type":34,"value":16717},{"type":29,"tag":117,"props":27685,"children":27686},{"style":384},[27687],{"type":34,"value":369},{"type":29,"tag":117,"props":27689,"children":27690},{"style":378},[27691],{"type":34,"value":15075},{"type":29,"tag":117,"props":27693,"children":27694},{"style":384},[27695],{"type":34,"value":369},{"type":29,"tag":117,"props":27697,"children":27698},{"style":372},[27699],{"type":34,"value":15084},{"type":29,"tag":117,"props":27701,"children":27702},{"style":384},[27703],{"type":34,"value":1108},{"type":29,"tag":117,"props":27705,"children":27706},{"style":166},[27707],{"type":34,"value":27708},"\"Le lave-vaisselle nettoie.\"",{"type":29,"tag":117,"props":27710,"children":27711},{"style":384},[27712],{"type":34,"value":5675},{"type":29,"tag":117,"props":27714,"children":27715},{"class":119,"line":269},[27716],{"type":29,"tag":117,"props":27717,"children":27718},{"style":384},[27719],{"type":34,"value":5632},{"type":29,"tag":117,"props":27721,"children":27722},{"class":119,"line":278},[27723],{"type":29,"tag":117,"props":27724,"children":27725},{"style":384},[27726],{"type":34,"value":2903},{"type":29,"tag":30,"props":27728,"children":27729},{},[27730],{"type":34,"value":27731},"Cette séparation rend le code plus flexible, plus modulaire et plus simple à tester.",{"type":29,"tag":51,"props":27733,"children":27734},{},[],{"type":29,"tag":567,"props":27736,"children":27738},{"cta":569,"href":570,"title":27737,"type":572},"Vous voulez acquérir le réflexe de découper une interface au bon endroit, sans y penser ?",[27739],{"type":29,"tag":30,"props":27740,"children":27741},{},[27742],{"type":34,"value":27743},"Sentir qu'une interface est trop large et savoir exactement où la scinder, ça ne s'apprend pas dans un article : ça se travaille sur votre vrai code. En mentoring 1:1, je relis vos abstractions avec vous, on refactore ensemble vos contrats les plus douloureux, et vous repartez avec le coup d'oeil qui vous fait éviter ces fourre-tout dès la conception.",{"type":29,"tag":55,"props":27745,"children":27747},{"id":27746},"les-erreurs-courantes-à-éviter",[27748],{"type":34,"value":27749},"Les erreurs courantes à éviter",{"type":29,"tag":30,"props":27751,"children":27752},{},[27753],{"type":34,"value":27754},"Même si le principe de séparation d’interface semble simple, il est courant de tomber dans certains pièges lors de son application. Voici quelques erreurs fréquentes à éviter pour que votre code reste propre, modulaire et facile à maintenir.",{"type":29,"tag":4530,"props":27756,"children":27758},{"id":27757},"_1-créer-trop-dinterfaces-inutiles",[27759],{"type":34,"value":27760},"1. Créer trop d'interfaces inutiles",{"type":29,"tag":30,"props":27762,"children":27763},{},[27764],{"type":34,"value":27765},"L'erreur la plus fréquente, c'est de sur-appliquer ISP en créant des dizaines d'interfaces ultra-spécifiques. Le système devient fragmenté, illisible, et le pattern d'origine se perd. Cherchez l'équilibre : assez petites pour ne contenir que ce dont une classe a besoin, mais pas au point de devenir redondantes ou inutilisables.",{"type":29,"tag":30,"props":27767,"children":27768},{},[27769],{"type":29,"tag":45,"props":27770,"children":27771},{},[27772],{"type":34,"value":27773},"Exemple à éviter :",{"type":29,"tag":106,"props":27775,"children":27777},{"className":5519,"code":27776,"language":5521,"meta":8,"style":8},"public interface Travailler {\n    void ecrireCode();\n}\n\npublic interface ManagerProjet {\n    void organiserReunion();\n}\n\npublic interface SalarieEntreprise {\n    void calculerSalaire();\n}\n",[27778],{"type":29,"tag":113,"props":27779,"children":27780},{"__ignoreMap":8},[27781,27801,27817,27824,27831,27851,27867,27874,27881,27901,27916],{"type":29,"tag":117,"props":27782,"children":27783},{"class":119,"line":120},[27784,27788,27792,27797],{"type":29,"tag":117,"props":27785,"children":27786},{"style":143},[27787],{"type":34,"value":5541},{"type":29,"tag":117,"props":27789,"children":27790},{"style":143},[27791],{"type":34,"value":8561},{"type":29,"tag":117,"props":27793,"children":27794},{"style":2863},[27795],{"type":34,"value":27796}," Travailler",{"type":29,"tag":117,"props":27798,"children":27799},{"style":384},[27800],{"type":34,"value":3461},{"type":29,"tag":117,"props":27802,"children":27803},{"class":119,"line":130},[27804,27808,27813],{"type":29,"tag":117,"props":27805,"children":27806},{"style":143},[27807],{"type":34,"value":8578},{"type":29,"tag":117,"props":27809,"children":27810},{"style":372},[27811],{"type":34,"value":27812}," ecrireCode",{"type":29,"tag":117,"props":27814,"children":27815},{"style":384},[27816],{"type":34,"value":9375},{"type":29,"tag":117,"props":27818,"children":27819},{"class":119,"line":139},[27820],{"type":29,"tag":117,"props":27821,"children":27822},{"style":384},[27823],{"type":34,"value":2903},{"type":29,"tag":117,"props":27825,"children":27826},{"class":119,"line":172},[27827],{"type":29,"tag":117,"props":27828,"children":27829},{"emptyLinePlaceholder":13},[27830],{"type":34,"value":136},{"type":29,"tag":117,"props":27832,"children":27833},{"class":119,"line":181},[27834,27838,27842,27847],{"type":29,"tag":117,"props":27835,"children":27836},{"style":143},[27837],{"type":34,"value":5541},{"type":29,"tag":117,"props":27839,"children":27840},{"style":143},[27841],{"type":34,"value":8561},{"type":29,"tag":117,"props":27843,"children":27844},{"style":2863},[27845],{"type":34,"value":27846}," ManagerProjet",{"type":29,"tag":117,"props":27848,"children":27849},{"style":384},[27850],{"type":34,"value":3461},{"type":29,"tag":117,"props":27852,"children":27853},{"class":119,"line":189},[27854,27858,27863],{"type":29,"tag":117,"props":27855,"children":27856},{"style":143},[27857],{"type":34,"value":8578},{"type":29,"tag":117,"props":27859,"children":27860},{"style":372},[27861],{"type":34,"value":27862}," organiserReunion",{"type":29,"tag":117,"props":27864,"children":27865},{"style":384},[27866],{"type":34,"value":9375},{"type":29,"tag":117,"props":27868,"children":27869},{"class":119,"line":198},[27870],{"type":29,"tag":117,"props":27871,"children":27872},{"style":384},[27873],{"type":34,"value":2903},{"type":29,"tag":117,"props":27875,"children":27876},{"class":119,"line":207},[27877],{"type":29,"tag":117,"props":27878,"children":27879},{"emptyLinePlaceholder":13},[27880],{"type":34,"value":136},{"type":29,"tag":117,"props":27882,"children":27883},{"class":119,"line":215},[27884,27888,27892,27897],{"type":29,"tag":117,"props":27885,"children":27886},{"style":143},[27887],{"type":34,"value":5541},{"type":29,"tag":117,"props":27889,"children":27890},{"style":143},[27891],{"type":34,"value":8561},{"type":29,"tag":117,"props":27893,"children":27894},{"style":2863},[27895],{"type":34,"value":27896}," SalarieEntreprise",{"type":29,"tag":117,"props":27898,"children":27899},{"style":384},[27900],{"type":34,"value":3461},{"type":29,"tag":117,"props":27902,"children":27903},{"class":119,"line":224},[27904,27908,27912],{"type":29,"tag":117,"props":27905,"children":27906},{"style":143},[27907],{"type":34,"value":8578},{"type":29,"tag":117,"props":27909,"children":27910},{"style":372},[27911],{"type":34,"value":26112},{"type":29,"tag":117,"props":27913,"children":27914},{"style":384},[27915],{"type":34,"value":9375},{"type":29,"tag":117,"props":27917,"children":27918},{"class":119,"line":233},[27919],{"type":29,"tag":117,"props":27920,"children":27921},{"style":384},[27922],{"type":34,"value":2903},{"type":29,"tag":30,"props":27924,"children":27925},{},[27926],{"type":34,"value":27927},"Cet exemple montre des interfaces beaucoup trop spécifiques. Parfois, il est plus judicieux de regrouper certaines responsabilités sous une seule interface quand cela fait sens.",{"type":29,"tag":2164,"props":27929,"children":27930},{},[27931],{"type":29,"tag":30,"props":27932,"children":27933},{},[27934,27938],{"type":29,"tag":45,"props":27935,"children":27936},{},[27937],{"type":34,"value":25939},{"type":34,"value":27939}," : regrouper des comportements similaires sous une même interface quand le métier l'autorise garde le code simple et évite la sur-segmentation. C'est un équilibre que j'ai appris à trouver chez Agirc-Arrco et Canal+ : ni fragmentation excessive, ni interface \"dieu\".",{"type":29,"tag":4530,"props":27941,"children":27943},{"id":27942},"_2-concevoir-des-interfaces-trop-larges",[27944],{"type":34,"value":27945},"2. Concevoir des interfaces trop larges",{"type":29,"tag":30,"props":27947,"children":27948},{},[27949],{"type":34,"value":27950},"L'autre extrême, c'est l'interface fourre-tout, l'inverse exact d'ISP. Une interface qui regroupe trop de responsabilités force les classes à implémenter des méthodes dont elles n'ont pas besoin. Couplage et complexité explosent pour rien.",{"type":29,"tag":30,"props":27952,"children":27953},{},[27954],{"type":29,"tag":45,"props":27955,"children":27956},{},[27957],{"type":34,"value":27773},{"type":29,"tag":106,"props":27959,"children":27961},{"className":5519,"code":27960,"language":5521,"meta":8,"style":8},"public interface ServiceClient {\n    void traiterCommande();\n    void envoyerFacture();\n    void gererReclamations();\n    void realiserAudit();\n}\n",[27962],{"type":29,"tag":113,"props":27963,"children":27964},{"__ignoreMap":8},[27965,27985,28001,28017,28033,28049],{"type":29,"tag":117,"props":27966,"children":27967},{"class":119,"line":120},[27968,27972,27976,27981],{"type":29,"tag":117,"props":27969,"children":27970},{"style":143},[27971],{"type":34,"value":5541},{"type":29,"tag":117,"props":27973,"children":27974},{"style":143},[27975],{"type":34,"value":8561},{"type":29,"tag":117,"props":27977,"children":27978},{"style":2863},[27979],{"type":34,"value":27980}," ServiceClient",{"type":29,"tag":117,"props":27982,"children":27983},{"style":384},[27984],{"type":34,"value":3461},{"type":29,"tag":117,"props":27986,"children":27987},{"class":119,"line":130},[27988,27992,27997],{"type":29,"tag":117,"props":27989,"children":27990},{"style":143},[27991],{"type":34,"value":8578},{"type":29,"tag":117,"props":27993,"children":27994},{"style":372},[27995],{"type":34,"value":27996}," traiterCommande",{"type":29,"tag":117,"props":27998,"children":27999},{"style":384},[28000],{"type":34,"value":9375},{"type":29,"tag":117,"props":28002,"children":28003},{"class":119,"line":139},[28004,28008,28013],{"type":29,"tag":117,"props":28005,"children":28006},{"style":143},[28007],{"type":34,"value":8578},{"type":29,"tag":117,"props":28009,"children":28010},{"style":372},[28011],{"type":34,"value":28012}," envoyerFacture",{"type":29,"tag":117,"props":28014,"children":28015},{"style":384},[28016],{"type":34,"value":9375},{"type":29,"tag":117,"props":28018,"children":28019},{"class":119,"line":172},[28020,28024,28029],{"type":29,"tag":117,"props":28021,"children":28022},{"style":143},[28023],{"type":34,"value":8578},{"type":29,"tag":117,"props":28025,"children":28026},{"style":372},[28027],{"type":34,"value":28028}," gererReclamations",{"type":29,"tag":117,"props":28030,"children":28031},{"style":384},[28032],{"type":34,"value":9375},{"type":29,"tag":117,"props":28034,"children":28035},{"class":119,"line":181},[28036,28040,28045],{"type":29,"tag":117,"props":28037,"children":28038},{"style":143},[28039],{"type":34,"value":8578},{"type":29,"tag":117,"props":28041,"children":28042},{"style":372},[28043],{"type":34,"value":28044}," realiserAudit",{"type":29,"tag":117,"props":28046,"children":28047},{"style":384},[28048],{"type":34,"value":9375},{"type":29,"tag":117,"props":28050,"children":28051},{"class":119,"line":189},[28052],{"type":29,"tag":117,"props":28053,"children":28054},{"style":384},[28055],{"type":34,"value":2903},{"type":29,"tag":30,"props":28057,"children":28058},{},[28059,28061,28067],{"type":34,"value":28060},"Ici, une interface ",{"type":29,"tag":113,"props":28062,"children":28064},{"className":28063},[],[28065],{"type":34,"value":28066},"ServiceClient",{"type":34,"value":28068}," regroupe des fonctionnalités très différentes, forçant les classes qui l’implémentent à prendre en charge des tâches qui n'ont rien à voir entre elles.",{"type":29,"tag":4530,"props":28070,"children":28072},{"id":28071},"_3-ne-pas-reconnaître-les-symptômes-dune-interface-trop-lourde",[28073],{"type":34,"value":28074},"3. Ne pas reconnaître les symptômes d’une interface trop lourde",{"type":29,"tag":30,"props":28076,"children":28077},{},[28078,28080,28085],{"type":34,"value":28079},"Si vous vous rendez compte que vous devez fréquemment passer des paramètres ",{"type":29,"tag":113,"props":28081,"children":28083},{"className":28082},[],[28084],{"type":34,"value":15629},{"type":34,"value":28086}," ou lever des exceptions pour des méthodes non implémentées, c’est un signe clair que votre interface est trop large. Une bonne interface ne devrait jamais forcer une classe à contourner des méthodes dont elle n’a pas besoin.",{"type":29,"tag":30,"props":28088,"children":28089},{},[28090],{"type":29,"tag":45,"props":28091,"children":28092},{},[28093],{"type":34,"value":28094},"Exemple :",{"type":29,"tag":106,"props":28096,"children":28098},{"className":5519,"code":28097,"language":5521,"meta":8,"style":8},"public class ServiceLivraison implements ServiceClient {\n    @Override\n    public void traiterCommande() {\n        \u002F\u002F Code de traitement de commande\n    }\n\n    @Override\n    public void envoyerFacture() {\n        \u002F\u002F Cette méthode n'est pas pertinente pour ServiceLivraison.\n        throw new UnsupportedOperationException(\"Méthode non supportée.\");\n    }\n\n    @Override\n    public void gererReclamations() {\n        \u002F\u002F Code de gestion des réclamations\n    }\n\n    @Override\n    public void realiserAudit() {\n        \u002F\u002F Non pertinent pour ServiceLivraison.\n        throw new UnsupportedOperationException(\"Méthode non supportée.\");\n    }\n}\n",[28099],{"type":29,"tag":113,"props":28100,"children":28101},{"__ignoreMap":8},[28102,28130,28141,28164,28172,28179,28186,28197,28220,28228,28258,28265,28272,28283,28306,28314,28321,28328,28339,28362,28370,28397,28404],{"type":29,"tag":117,"props":28103,"children":28104},{"class":119,"line":120},[28105,28109,28113,28118,28122,28126],{"type":29,"tag":117,"props":28106,"children":28107},{"style":143},[28108],{"type":34,"value":5541},{"type":29,"tag":117,"props":28110,"children":28111},{"style":143},[28112],{"type":34,"value":7575},{"type":29,"tag":117,"props":28114,"children":28115},{"style":2863},[28116],{"type":34,"value":28117}," ServiceLivraison",{"type":29,"tag":117,"props":28119,"children":28120},{"style":143},[28121],{"type":34,"value":8636},{"type":29,"tag":117,"props":28123,"children":28124},{"style":2863},[28125],{"type":34,"value":27980},{"type":29,"tag":117,"props":28127,"children":28128},{"style":384},[28129],{"type":34,"value":3461},{"type":29,"tag":117,"props":28131,"children":28132},{"class":119,"line":130},[28133,28137],{"type":29,"tag":117,"props":28134,"children":28135},{"style":10083},[28136],{"type":34,"value":10086},{"type":29,"tag":117,"props":28138,"children":28139},{"style":10089},[28140],{"type":34,"value":17746},{"type":29,"tag":117,"props":28142,"children":28143},{"class":119,"line":139},[28144,28148,28152,28156,28160],{"type":29,"tag":117,"props":28145,"children":28146},{"style":143},[28147],{"type":34,"value":7641},{"type":29,"tag":117,"props":28149,"children":28150},{"style":143},[28151],{"type":34,"value":7762},{"type":29,"tag":117,"props":28153,"children":28154},{"style":372},[28155],{"type":34,"value":27996},{"type":29,"tag":117,"props":28157,"children":28158},{"style":384},[28159],{"type":34,"value":381},{"type":29,"tag":117,"props":28161,"children":28162},{"style":384},[28163],{"type":34,"value":3461},{"type":29,"tag":117,"props":28165,"children":28166},{"class":119,"line":172},[28167],{"type":29,"tag":117,"props":28168,"children":28169},{"style":124},[28170],{"type":34,"value":28171},"        \u002F\u002F Code de traitement de commande\n",{"type":29,"tag":117,"props":28173,"children":28174},{"class":119,"line":181},[28175],{"type":29,"tag":117,"props":28176,"children":28177},{"style":384},[28178],{"type":34,"value":5632},{"type":29,"tag":117,"props":28180,"children":28181},{"class":119,"line":189},[28182],{"type":29,"tag":117,"props":28183,"children":28184},{"emptyLinePlaceholder":13},[28185],{"type":34,"value":136},{"type":29,"tag":117,"props":28187,"children":28188},{"class":119,"line":198},[28189,28193],{"type":29,"tag":117,"props":28190,"children":28191},{"style":10083},[28192],{"type":34,"value":10086},{"type":29,"tag":117,"props":28194,"children":28195},{"style":10089},[28196],{"type":34,"value":17746},{"type":29,"tag":117,"props":28198,"children":28199},{"class":119,"line":207},[28200,28204,28208,28212,28216],{"type":29,"tag":117,"props":28201,"children":28202},{"style":143},[28203],{"type":34,"value":7641},{"type":29,"tag":117,"props":28205,"children":28206},{"style":143},[28207],{"type":34,"value":7762},{"type":29,"tag":117,"props":28209,"children":28210},{"style":372},[28211],{"type":34,"value":28012},{"type":29,"tag":117,"props":28213,"children":28214},{"style":384},[28215],{"type":34,"value":381},{"type":29,"tag":117,"props":28217,"children":28218},{"style":384},[28219],{"type":34,"value":3461},{"type":29,"tag":117,"props":28221,"children":28222},{"class":119,"line":215},[28223],{"type":29,"tag":117,"props":28224,"children":28225},{"style":124},[28226],{"type":34,"value":28227},"        \u002F\u002F Cette méthode n'est pas pertinente pour ServiceLivraison.\n",{"type":29,"tag":117,"props":28229,"children":28230},{"class":119,"line":224},[28231,28236,28240,28245,28249,28254],{"type":29,"tag":117,"props":28232,"children":28233},{"style":143},[28234],{"type":34,"value":28235},"        throw",{"type":29,"tag":117,"props":28237,"children":28238},{"style":143},[28239],{"type":34,"value":6066},{"type":29,"tag":117,"props":28241,"children":28242},{"style":372},[28243],{"type":34,"value":28244}," UnsupportedOperationException",{"type":29,"tag":117,"props":28246,"children":28247},{"style":384},[28248],{"type":34,"value":1108},{"type":29,"tag":117,"props":28250,"children":28251},{"style":166},[28252],{"type":34,"value":28253},"\"Méthode non supportée.\"",{"type":29,"tag":117,"props":28255,"children":28256},{"style":384},[28257],{"type":34,"value":5675},{"type":29,"tag":117,"props":28259,"children":28260},{"class":119,"line":233},[28261],{"type":29,"tag":117,"props":28262,"children":28263},{"style":384},[28264],{"type":34,"value":5632},{"type":29,"tag":117,"props":28266,"children":28267},{"class":119,"line":242},[28268],{"type":29,"tag":117,"props":28269,"children":28270},{"emptyLinePlaceholder":13},[28271],{"type":34,"value":136},{"type":29,"tag":117,"props":28273,"children":28274},{"class":119,"line":251},[28275,28279],{"type":29,"tag":117,"props":28276,"children":28277},{"style":10083},[28278],{"type":34,"value":10086},{"type":29,"tag":117,"props":28280,"children":28281},{"style":10089},[28282],{"type":34,"value":17746},{"type":29,"tag":117,"props":28284,"children":28285},{"class":119,"line":260},[28286,28290,28294,28298,28302],{"type":29,"tag":117,"props":28287,"children":28288},{"style":143},[28289],{"type":34,"value":7641},{"type":29,"tag":117,"props":28291,"children":28292},{"style":143},[28293],{"type":34,"value":7762},{"type":29,"tag":117,"props":28295,"children":28296},{"style":372},[28297],{"type":34,"value":28028},{"type":29,"tag":117,"props":28299,"children":28300},{"style":384},[28301],{"type":34,"value":381},{"type":29,"tag":117,"props":28303,"children":28304},{"style":384},[28305],{"type":34,"value":3461},{"type":29,"tag":117,"props":28307,"children":28308},{"class":119,"line":269},[28309],{"type":29,"tag":117,"props":28310,"children":28311},{"style":124},[28312],{"type":34,"value":28313},"        \u002F\u002F Code de gestion des réclamations\n",{"type":29,"tag":117,"props":28315,"children":28316},{"class":119,"line":278},[28317],{"type":29,"tag":117,"props":28318,"children":28319},{"style":384},[28320],{"type":34,"value":5632},{"type":29,"tag":117,"props":28322,"children":28323},{"class":119,"line":286},[28324],{"type":29,"tag":117,"props":28325,"children":28326},{"emptyLinePlaceholder":13},[28327],{"type":34,"value":136},{"type":29,"tag":117,"props":28329,"children":28330},{"class":119,"line":295},[28331,28335],{"type":29,"tag":117,"props":28332,"children":28333},{"style":10083},[28334],{"type":34,"value":10086},{"type":29,"tag":117,"props":28336,"children":28337},{"style":10089},[28338],{"type":34,"value":17746},{"type":29,"tag":117,"props":28340,"children":28341},{"class":119,"line":304},[28342,28346,28350,28354,28358],{"type":29,"tag":117,"props":28343,"children":28344},{"style":143},[28345],{"type":34,"value":7641},{"type":29,"tag":117,"props":28347,"children":28348},{"style":143},[28349],{"type":34,"value":7762},{"type":29,"tag":117,"props":28351,"children":28352},{"style":372},[28353],{"type":34,"value":28044},{"type":29,"tag":117,"props":28355,"children":28356},{"style":384},[28357],{"type":34,"value":381},{"type":29,"tag":117,"props":28359,"children":28360},{"style":384},[28361],{"type":34,"value":3461},{"type":29,"tag":117,"props":28363,"children":28364},{"class":119,"line":313},[28365],{"type":29,"tag":117,"props":28366,"children":28367},{"style":124},[28368],{"type":34,"value":28369},"        \u002F\u002F Non pertinent pour ServiceLivraison.\n",{"type":29,"tag":117,"props":28371,"children":28372},{"class":119,"line":322},[28373,28377,28381,28385,28389,28393],{"type":29,"tag":117,"props":28374,"children":28375},{"style":143},[28376],{"type":34,"value":28235},{"type":29,"tag":117,"props":28378,"children":28379},{"style":143},[28380],{"type":34,"value":6066},{"type":29,"tag":117,"props":28382,"children":28383},{"style":372},[28384],{"type":34,"value":28244},{"type":29,"tag":117,"props":28386,"children":28387},{"style":384},[28388],{"type":34,"value":1108},{"type":29,"tag":117,"props":28390,"children":28391},{"style":166},[28392],{"type":34,"value":28253},{"type":29,"tag":117,"props":28394,"children":28395},{"style":384},[28396],{"type":34,"value":5675},{"type":29,"tag":117,"props":28398,"children":28399},{"class":119,"line":331},[28400],{"type":29,"tag":117,"props":28401,"children":28402},{"style":384},[28403],{"type":34,"value":5632},{"type":29,"tag":117,"props":28405,"children":28406},{"class":119,"line":340},[28407],{"type":29,"tag":117,"props":28408,"children":28409},{"style":384},[28410],{"type":34,"value":2903},{"type":29,"tag":30,"props":28412,"children":28413},{},[28414,28415,28421],{"type":34,"value":7966},{"type":29,"tag":113,"props":28416,"children":28418},{"className":28417},[],[28419],{"type":34,"value":28420},"ServiceLivraison",{"type":34,"value":28422}," est obligée de gérer des méthodes inutiles en lançant des exceptions. Cela viole complètement ISP et rend le code plus difficile à maintenir.",{"type":29,"tag":4530,"props":28424,"children":28426},{"id":28425},"_4-ne-pas-penser-aux-changements-futurs",[28427],{"type":34,"value":28428},"4. Ne pas penser aux changements futurs",{"type":29,"tag":30,"props":28430,"children":28431},{},[28432],{"type":34,"value":28433},"Concevoir des interfaces sans anticiper les évolutions du système est un piège classique. Ajouter une méthode à une interface large impose une modification à toutes les classes qui l'implémentent, y compris celles qui n'ont aucun usage de la nouvelle fonctionnalité. Des interfaces ciblées dès le départ évitent ce problème et rendent le code plus évolutif.",{"type":29,"tag":2164,"props":28435,"children":28436},{},[28437],{"type":29,"tag":30,"props":28438,"children":28439},{},[28440,28444],{"type":29,"tag":45,"props":28441,"children":28442},{},[28443],{"type":34,"value":25939},{"type":34,"value":28445}," : Lorsque vous ajoutez une nouvelle fonctionnalité, vérifiez si elle doit vraiment être implémentée par toutes les classes existantes. Si ce n'est pas le cas, il est probablement préférable de créer une nouvelle interface.",{"type":29,"tag":51,"props":28447,"children":28448},{},[],{"type":29,"tag":567,"props":28450,"children":28452},{"cta":805,"href":806,"title":28451,"type":808},"Bien découper une interface n'est qu'une pratique sur 100",[28453],{"type":29,"tag":30,"props":28454,"children":28455},{},[28456],{"type":34,"value":28457},"Appliquer ISP proprement est un réflexe parmi tous ceux qui séparent un dev senior du reste. Le Craft Bundle réunit les 100 pratiques que j'applique au quotidien pour concevoir des abstractions justes et un code qui reste maintenable. Ce sont celles que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues tenir en production.",{"type":29,"tag":51,"props":28459,"children":28460},{},[],{"type":29,"tag":55,"props":28462,"children":28464},{"id":28463},"faq-sur-le-principe-isp-interface-segregation-principle",[28465],{"type":34,"value":28466},"FAQ sur le principe ISP (Interface Segregation Principle)",{"type":29,"tag":825,"props":28468,"children":28469},{},[28470,28475],{"type":29,"tag":829,"props":28471,"children":28472},{},[28473],{"type":34,"value":28474},"1. Qu’est-ce que le principe de séparation d’interface (ISP) en quelques mots ?",{"type":29,"tag":30,"props":28476,"children":28477},{},[28478],{"type":34,"value":28479},"Le principe de séparation d’interface (ISP) stipule qu’une interface ne doit pas forcer une classe à implémenter des méthodes dont elle n’a pas besoin. Cela signifie que chaque interface doit être spécialisée et conçue pour répondre à un rôle ou une responsabilité précise, plutôt que d’essayer de tout englober.",{"type":29,"tag":825,"props":28481,"children":28482},{},[28483,28488],{"type":29,"tag":829,"props":28484,"children":28485},{},[28486],{"type":34,"value":28487},"2. Pourquoi est-ce important de respecter ISP ?",{"type":29,"tag":30,"props":28489,"children":28490},{},[28491],{"type":34,"value":28492},"Respecter ISP améliore la maintenabilité, la flexibilité et la réutilisabilité de votre code. Si une interface est trop large, cela entraîne un couplage élevé entre les classes, rendant le code difficile à modifier et à tester. Avec ISP, chaque classe n’implémente que les fonctionnalités dont elle a besoin, ce qui rend votre système plus modulaire.",{"type":29,"tag":825,"props":28494,"children":28495},{},[28496,28501],{"type":29,"tag":829,"props":28497,"children":28498},{},[28499],{"type":34,"value":28500},"3. Comment puis-je savoir qu’une interface est trop large ?",{"type":29,"tag":30,"props":28502,"children":28503},{},[28504,28506,28511],{"type":34,"value":28505},"Si vous vous retrouvez à implémenter des méthodes dont votre classe n’a pas besoin ou à lever des exceptions du type ",{"type":29,"tag":113,"props":28507,"children":28509},{"className":28508},[],[28510],{"type":34,"value":26396},{"type":34,"value":28512},", c’est un signe que votre interface est trop large. De plus, si vous êtes obligé de modifier plusieurs classes à chaque fois que vous ajoutez ou modifiez une méthode dans une interface, cela signifie probablement que cette interface regroupe trop de responsabilités.",{"type":29,"tag":825,"props":28514,"children":28515},{},[28516,28521],{"type":29,"tag":829,"props":28517,"children":28518},{},[28519],{"type":34,"value":28520},"4. Combien d’interfaces devrais-je créer ?",{"type":29,"tag":30,"props":28522,"children":28523},{},[28524],{"type":34,"value":28525},"Il n’y a pas de nombre exact d’interfaces à créer. Le principe est de diviser les interfaces de manière à ce qu’elles soient aussi spécifiques que nécessaire, mais pas au point de devenir inutiles ou trop fragmentées. Le but est d’atteindre un équilibre entre la spécificité et la simplicité.",{"type":29,"tag":825,"props":28527,"children":28528},{},[28529,28534],{"type":29,"tag":829,"props":28530,"children":28531},{},[28532],{"type":34,"value":28533},"5. Quelles sont les différences entre ISP et le principe de responsabilité unique (SRP) ?",{"type":29,"tag":30,"props":28535,"children":28536},{},[28537,28539,28543],{"type":34,"value":28538},"ISP et SRP se ressemblent dans l’idée de limiter les responsabilités, mais ils s’appliquent à différents niveaux. SRP concerne le fait qu’une classe ne devrait avoir qu’une seule raison de changer, tandis qu’ISP se focalise sur le fait qu’une interface ne devrait contenir que des méthodes pertinentes pour les classes qui l’implémentent. Les deux principes se complètent : des interfaces bien segmentées facilitent l’application du ",{"type":29,"tag":453,"props":28540,"children":28541},{"href":8507},[28542],{"type":34,"value":8510},{"type":34,"value":28544},", car les modules de haut niveau peuvent dépendre d’abstractions précises plutôt que de contrats fourre-tout.",{"type":29,"tag":825,"props":28546,"children":28547},{},[28548,28553],{"type":29,"tag":829,"props":28549,"children":28550},{},[28551],{"type":34,"value":28552},"6. Quel est le lien entre ISP et les autres principes SOLID ?",{"type":29,"tag":30,"props":28554,"children":28555},{},[28556],{"type":34,"value":28557},"ISP fait partie des cinq principes SOLID, qui sont conçus pour améliorer la qualité du code orienté objet. Il est étroitement lié au principe SRP, car ils cherchent tous deux à réduire la complexité du code en limitant les responsabilités. L’ISP aide aussi à réduire le couplage, ce qui est un objectif clé du principe de l’inversion des dépendances (DIP).",{"type":29,"tag":825,"props":28559,"children":28560},{},[28561,28566],{"type":29,"tag":829,"props":28562,"children":28563},{},[28564],{"type":34,"value":28565},"7. Quels sont les avantages d’ISP pour les tests unitaires ?",{"type":29,"tag":30,"props":28567,"children":28568},{},[28569],{"type":34,"value":28570},"En séparant les interfaces selon leurs responsabilités spécifiques, vous simplifiez les tests unitaires. Comme les classes n’implémentent que ce dont elles ont besoin, il est plus facile de simuler des comportements (via des mocks ou des stubs) et de tester chaque fonctionnalité de manière isolée, sans se soucier des autres méthodes inutiles.",{"type":29,"tag":825,"props":28572,"children":28573},{},[28574,28579],{"type":29,"tag":829,"props":28575,"children":28576},{},[28577],{"type":34,"value":28578},"8. Comment appliquer ISP dans des projets existants sans tout refactorer ?",{"type":29,"tag":30,"props":28580,"children":28581},{},[28582],{"type":34,"value":28583},"Vous pouvez appliquer ISP progressivement dans un projet existant. Commencez par identifier les interfaces trop larges qui causent le plus de problèmes, puis divisez-les en interfaces plus spécifiques. Vous pouvez également adopter ISP lors de la création de nouvelles fonctionnalités, sans forcément refactorer l’intégralité du projet d’un coup.",{"type":29,"tag":825,"props":28585,"children":28586},{},[28587,28592],{"type":29,"tag":829,"props":28588,"children":28589},{},[28590],{"type":34,"value":28591},"9. Peut-on respecter ISP dans des langages autres que Java ?",{"type":29,"tag":30,"props":28593,"children":28594},{},[28595],{"type":34,"value":28596},"Oui, ISP est un principe général du développement orienté objet, donc vous pouvez l’appliquer dans la plupart des langages orientés objet, comme C#, Python, ou même C++. Bien que l’implémentation diffère légèrement selon le langage, l’idée reste la même : garder les interfaces petites et spécifiques.",{"type":29,"tag":51,"props":28598,"children":28599},{},[],{"type":29,"tag":30,"props":28601,"children":28602},{},[28603,28605,28610],{"type":34,"value":28604},"En suivant ces conseils et en évitant les erreurs courantes, vous pourrez tirer le meilleur parti du ",{"type":29,"tag":45,"props":28606,"children":28607},{},[28608],{"type":34,"value":28609},"principe de séparation d'interface (ISP)",{"type":34,"value":28611}," et écrire un code modulaire, maintenable et facile à tester.",{"type":29,"tag":51,"props":28613,"children":28614},{},[],{"type":29,"tag":567,"props":28616,"children":28619},{"cta":28617,"href":918,"title":28618,"type":920},"Télécharger le diagnostic gratuit →","Ressource gratuite : 10 signaux que votre équipe tech est en danger",[28620],{"type":29,"tag":30,"props":28621,"children":28622},{},[28623],{"type":34,"value":28624},"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":928,"props":28626,"children":28627},{},[28628],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":28630},[28631,28637,28642,28648],{"id":25870,"depth":130,"text":25873,"children":28632},[28633,28634,28635,28636],{"id":25892,"depth":139,"text":25895},{"id":25944,"depth":139,"text":25947},{"id":25977,"depth":139,"text":25980},{"id":25988,"depth":139,"text":25991},{"id":26015,"depth":130,"text":26018,"children":28638},[28639,28640,28641],{"id":26026,"depth":139,"text":26029},{"id":26401,"depth":139,"text":26404},{"id":26957,"depth":139,"text":26960},{"id":27746,"depth":130,"text":27749,"children":28643},[28644,28645,28646,28647],{"id":27757,"depth":139,"text":27760},{"id":27942,"depth":139,"text":27945},{"id":28071,"depth":139,"text":28074},{"id":28425,"depth":139,"text":28428},{"id":28463,"depth":130,"text":28466},"content:fr:architecture-craft:principe-isp-software-craftsmanship-exemples-java.md","fr\u002Farchitecture-craft\u002Fprincipe-isp-software-craftsmanship-exemples-java.md","fr\u002Farchitecture-craft\u002Fprincipe-isp-software-craftsmanship-exemples-java",{"_path":16450,"_dir":16372,"_draft":7,"_partial":7,"_locale":8,"title":28653,"description":28654,"id":28655,"date":28656,"listed":13,"nocomments":7,"hidden":7,"categories":28657,"tags":28658,"cover":28659,"readingTime":28660,"body":28665,"_type":942,"_id":32772,"_source":944,"_file":32773,"_stem":32774,"_extension":947},"Principe de substitution de Liskov (LSP), Comprendre et appliquer avec des exemples Java","Découvrez le principe de substitution de Liskov (LSP) avec des exemples concrets en Java. Apprenez à respecter ce principe clé des SOLID pour des conceptions orientées objet robustes.",38,"2024-02-06",[16372],[5391,18],"covers\u002Farticles\u002Fprincipe-lsp.jpg",{"text":28661,"minutes":28662,"time":28663,"words":28664},"10 min read",9.835,590100,1967,{"type":26,"children":28666,"toc":32756},[28667,28673,28683,28694,28699,28702,28708,28713,28719,28724,28730,28778,28784,28795,28798,28807,28813,28832,28844,29262,29274,29287,29610,29644,29650,29661,30088,30094,30128,30154,30157,30163,30181,30187,30206,30223,30228,30239,30648,30660,30672,30950,30996,31002,31021,31604,31609,31634,31640,31671,31677,31689,31695,32210,32216,32550,32553,32559,32564,32570,32588,32594,32612,32615,32624,32627,32633,32646,32659,32690,32703,32716,32729,32742,32745,32752],{"type":29,"tag":55,"props":28668,"children":28670},{"id":28669},"principe-de-liskov-substitution-lsp-pour-les-développeurs-de-logiciels",[28671],{"type":34,"value":28672},"Principe de Liskov Substitution (LSP) pour les développeurs de logiciels",{"type":29,"tag":30,"props":28674,"children":28675},{},[28676,28678],{"type":34,"value":28677},"L'équipe code une hiérarchie d'objets, tout marche. Puis arrive une sous-classe qui ajoute \"juste\" une fonctionnalité, et le comportement attendu de l'application casse en silence, parfois en production seulement, des semaines plus tard. La question revient toujours : ",{"type":29,"tag":5410,"props":28679,"children":28680},{},[28681],{"type":34,"value":28682},"l'héritage a-t-il vraiment été le bon outil ?",{"type":29,"tag":30,"props":28684,"children":28685},{},[28686,28688,28692],{"type":34,"value":28687},"Le principe de substitution de Liskov (LSP), formulé par Barbara Liskov en 1987, attaque exactement ce scénario. Quatrième des cinq ",{"type":29,"tag":453,"props":28689,"children":28690},{"href":6919},[28691],{"type":34,"value":6922},{"type":34,"value":28693},", il s'assure qu'une sous-classe respecte le contrat implicite de sa classe parente : condition non négociable pour qu'un code orienté objet reste flexible et maintenable.",{"type":29,"tag":30,"props":28695,"children":28696},{},[28697],{"type":34,"value":28698},"Cet article explique ce que recouvre vraiment LSP, pourquoi il est central dans la conception de logiciels robustes, et comment l'appliquer concrètement avec des exemples Java.",{"type":29,"tag":51,"props":28700,"children":28701},{},[],{"type":29,"tag":55,"props":28703,"children":28705},{"id":28704},"quest-ce-que-le-principe-de-substitution-de-liskov-lsp",[28706],{"type":34,"value":28707},"Qu’est-ce que le principe de substitution de Liskov (LSP) ?",{"type":29,"tag":30,"props":28709,"children":28710},{},[28711],{"type":34,"value":28712},"Le principe de substitution de Liskov (LSP), introduit par Barbara Liskov en 1987, est l’un des cinq principes SOLID utilisés en programmation orientée objet. Ce principe stipule qu’une sous-classe doit pouvoir être substituée à sa classe parente sans que cela ne modifie le comportement attendu du programme. En d’autres termes, si vous utilisez une classe de base dans votre code, vous devriez pouvoir la remplacer par n’importe quelle sous-classe sans avoir à ajuster le code existant.",{"type":29,"tag":7528,"props":28714,"children":28716},{"id":28715},"en-termes-simples-voici-ce-que-cela-signifie",[28717],{"type":34,"value":28718},"En termes simples, voici ce que cela signifie :",{"type":29,"tag":30,"props":28720,"children":28721},{},[28722],{"type":34,"value":28723},"Si une classe B hérite de la classe A, alors B doit pouvoir être utilisée partout où A est acceptée. Les objets de B doivent se comporter de manière cohérente avec les attentes établies par la classe A.",{"type":29,"tag":25134,"props":28725,"children":28727},{"id":28726},"exemple-classique-pour-mieux-comprendre",[28728],{"type":34,"value":28729},"Exemple classique pour mieux comprendre :",{"type":29,"tag":30,"props":28731,"children":28732},{},[28733,28735,28741,28743,28748,28749,28755,28757,28762,28764,28769,28771,28776],{"type":34,"value":28734},"Imaginez que vous développez une application qui manipule des formes géométriques. Vous avez une classe de base ",{"type":29,"tag":113,"props":28736,"children":28738},{"className":28737},[],[28739],{"type":34,"value":28740},"Forme",{"type":34,"value":28742},", et deux sous-classes : ",{"type":29,"tag":113,"props":28744,"children":28746},{"className":28745},[],[28747],{"type":34,"value":18577},{"type":34,"value":5923},{"type":29,"tag":113,"props":28750,"children":28752},{"className":28751},[],[28753],{"type":34,"value":28754},"Carré",{"type":34,"value":28756},". Comme vous le savez, un carré est un cas particulier de rectangle où tous les côtés sont égaux. Cependant, si vous créez une sous-classe ",{"type":29,"tag":113,"props":28758,"children":28760},{"className":28759},[],[28761],{"type":34,"value":28754},{"type":34,"value":28763}," qui redéfinit le comportement de ",{"type":29,"tag":113,"props":28765,"children":28767},{"className":28766},[],[28768],{"type":34,"value":18577},{"type":34,"value":28770},", vous risquez de casser la logique qui fonctionne parfaitement pour la classe ",{"type":29,"tag":113,"props":28772,"children":28774},{"className":28773},[],[28775],{"type":34,"value":18577},{"type":34,"value":28777},". Cela brise le LSP.",{"type":29,"tag":4530,"props":28779,"children":28781},{"id":28780},"pourquoi-ce-principe-est-il-important",[28782],{"type":34,"value":28783},"Pourquoi ce principe est-il important ?",{"type":29,"tag":30,"props":28785,"children":28786},{},[28787,28789,28793],{"type":34,"value":28788},"Une violation de LSP rend le code dur à comprendre, dur à maintenir, et surtout dur à tester. Quand une sous-classe redéfinit en douce une méthode de sa classe parente, vous obtenez des bugs cachés et un comportement imprévisible. Sur mes missions, ces violations se manifestent presque toujours par des bugs en production difficiles à reproduire : cycles de correction qui s'allongent, coûts de maintenance qui dérapent. C'est précisément pour cette raison que le ",{"type":29,"tag":453,"props":28790,"children":28791},{"href":8507},[28792],{"type":34,"value":8510},{"type":34,"value":28794}," impose de dépendre d'abstractions : une interface fige un contrat que toutes les implémentations doivent respecter, ce qui supprime à la racine la possibilité d'une violation LSP.",{"type":29,"tag":51,"props":28796,"children":28797},{},[],{"type":29,"tag":567,"props":28799,"children":28801},{"cta":569,"href":570,"title":28800,"type":572},"Vous voulez sentir quand un héritage va casser un contrat avant de l'écrire ?",[28802],{"type":29,"tag":30,"props":28803,"children":28804},{},[28805],{"type":34,"value":28806},"Repérer une sous-classe qui trahit sa classe parente, ça ne s'apprend pas en lisant la définition du LSP : ça se travaille sur du vrai code. En mentoring 1:1, je relis vos hiérarchies d'objets avec vous, je vous montre où le contrat se fissure et comment choisir entre héritage, composition ou interface. Vous repartez avec le réflexe de conception, pas juste la théorie.",{"type":29,"tag":55,"props":28808,"children":28810},{"id":28809},"exemple-pratique-briser-le-lsp-ce-quil-ne-faut-pas-faire",[28811],{"type":34,"value":28812},"Exemple pratique - Briser le LSP : Ce qu’il ne faut pas faire",{"type":29,"tag":30,"props":28814,"children":28815},{},[28816,28818,28823,28825,28830],{"type":34,"value":28817},"Prenons l'exemple classique du ",{"type":29,"tag":113,"props":28819,"children":28821},{"className":28820},[],[28822],{"type":34,"value":18577},{"type":34,"value":28824}," et du ",{"type":29,"tag":113,"props":28826,"children":28828},{"className":28827},[],[28829],{"type":34,"value":28754},{"type":34,"value":28831}," en Java pour illustrer une violation du principe de substitution de Liskov (LSP).",{"type":29,"tag":7528,"props":28833,"children":28835},{"id":28834},"classe-rectangle",[28836,28838,28843],{"type":34,"value":28837},"Classe ",{"type":29,"tag":113,"props":28839,"children":28841},{"className":28840},[],[28842],{"type":34,"value":18577},{"type":34,"value":1866},{"type":29,"tag":106,"props":28845,"children":28847},{"className":5519,"code":28846,"language":5521,"meta":8,"style":8},"public class Rectangle {\n    protected int largeur;\n    protected int hauteur;\n\n    public Rectangle(int largeur, int hauteur) {\n        this.largeur = largeur;\n        this.hauteur = hauteur;\n    }\n\n    public void setLargeur(int largeur) {\n        this.largeur = largeur;\n    }\n\n    public void setHauteur(int hauteur) {\n        this.hauteur = hauteur;\n    }\n\n    public int calculerAire() {\n        return this.largeur * this.hauteur;\n    }\n}\n",[28848],{"type":29,"tag":113,"props":28849,"children":28850},{"__ignoreMap":8},[28851,28870,28890,28909,28916,28959,28987,29015,29022,29029,29065,29092,29099,29106,29142,29169,29176,29183,29207,29248,29255],{"type":29,"tag":117,"props":28852,"children":28853},{"class":119,"line":120},[28854,28858,28862,28866],{"type":29,"tag":117,"props":28855,"children":28856},{"style":143},[28857],{"type":34,"value":5541},{"type":29,"tag":117,"props":28859,"children":28860},{"style":143},[28861],{"type":34,"value":7575},{"type":29,"tag":117,"props":28863,"children":28864},{"style":2863},[28865],{"type":34,"value":18634},{"type":29,"tag":117,"props":28867,"children":28868},{"style":384},[28869],{"type":34,"value":3461},{"type":29,"tag":117,"props":28871,"children":28872},{"class":119,"line":130},[28873,28877,28881,28886],{"type":29,"tag":117,"props":28874,"children":28875},{"style":143},[28876],{"type":34,"value":18646},{"type":29,"tag":117,"props":28878,"children":28879},{"style":143},[28880],{"type":34,"value":5546},{"type":29,"tag":117,"props":28882,"children":28883},{"style":378},[28884],{"type":34,"value":28885}," largeur",{"type":29,"tag":117,"props":28887,"children":28888},{"style":384},[28889],{"type":34,"value":387},{"type":29,"tag":117,"props":28891,"children":28892},{"class":119,"line":139},[28893,28897,28901,28905],{"type":29,"tag":117,"props":28894,"children":28895},{"style":143},[28896],{"type":34,"value":18646},{"type":29,"tag":117,"props":28898,"children":28899},{"style":143},[28900],{"type":34,"value":5546},{"type":29,"tag":117,"props":28902,"children":28903},{"style":378},[28904],{"type":34,"value":12937},{"type":29,"tag":117,"props":28906,"children":28907},{"style":384},[28908],{"type":34,"value":387},{"type":29,"tag":117,"props":28910,"children":28911},{"class":119,"line":172},[28912],{"type":29,"tag":117,"props":28913,"children":28914},{"emptyLinePlaceholder":13},[28915],{"type":34,"value":136},{"type":29,"tag":117,"props":28917,"children":28918},{"class":119,"line":181},[28919,28923,28927,28931,28935,28939,28943,28947,28951,28955],{"type":29,"tag":117,"props":28920,"children":28921},{"style":143},[28922],{"type":34,"value":7641},{"type":29,"tag":117,"props":28924,"children":28925},{"style":372},[28926],{"type":34,"value":18634},{"type":29,"tag":117,"props":28928,"children":28929},{"style":384},[28930],{"type":34,"value":1108},{"type":29,"tag":117,"props":28932,"children":28933},{"style":143},[28934],{"type":34,"value":5560},{"type":29,"tag":117,"props":28936,"children":28937},{"style":7657},[28938],{"type":34,"value":28885},{"type":29,"tag":117,"props":28940,"children":28941},{"style":384},[28942],{"type":34,"value":1118},{"type":29,"tag":117,"props":28944,"children":28945},{"style":143},[28946],{"type":34,"value":5546},{"type":29,"tag":117,"props":28948,"children":28949},{"style":7657},[28950],{"type":34,"value":12937},{"type":29,"tag":117,"props":28952,"children":28953},{"style":384},[28954],{"type":34,"value":2803},{"type":29,"tag":117,"props":28956,"children":28957},{"style":384},[28958],{"type":34,"value":3461},{"type":29,"tag":117,"props":28960,"children":28961},{"class":119,"line":189},[28962,28966,28970,28975,28979,28983],{"type":29,"tag":117,"props":28963,"children":28964},{"style":6700},[28965],{"type":34,"value":7687},{"type":29,"tag":117,"props":28967,"children":28968},{"style":384},[28969],{"type":34,"value":369},{"type":29,"tag":117,"props":28971,"children":28972},{"style":378},[28973],{"type":34,"value":28974},"largeur ",{"type":29,"tag":117,"props":28976,"children":28977},{"style":160},[28978],{"type":34,"value":6061},{"type":29,"tag":117,"props":28980,"children":28981},{"style":378},[28982],{"type":34,"value":28885},{"type":29,"tag":117,"props":28984,"children":28985},{"style":384},[28986],{"type":34,"value":387},{"type":29,"tag":117,"props":28988,"children":28989},{"class":119,"line":198},[28990,28994,28998,29003,29007,29011],{"type":29,"tag":117,"props":28991,"children":28992},{"style":6700},[28993],{"type":34,"value":7687},{"type":29,"tag":117,"props":28995,"children":28996},{"style":384},[28997],{"type":34,"value":369},{"type":29,"tag":117,"props":28999,"children":29000},{"style":378},[29001],{"type":34,"value":29002},"hauteur ",{"type":29,"tag":117,"props":29004,"children":29005},{"style":160},[29006],{"type":34,"value":6061},{"type":29,"tag":117,"props":29008,"children":29009},{"style":378},[29010],{"type":34,"value":12937},{"type":29,"tag":117,"props":29012,"children":29013},{"style":384},[29014],{"type":34,"value":387},{"type":29,"tag":117,"props":29016,"children":29017},{"class":119,"line":207},[29018],{"type":29,"tag":117,"props":29019,"children":29020},{"style":384},[29021],{"type":34,"value":5632},{"type":29,"tag":117,"props":29023,"children":29024},{"class":119,"line":215},[29025],{"type":29,"tag":117,"props":29026,"children":29027},{"emptyLinePlaceholder":13},[29028],{"type":34,"value":136},{"type":29,"tag":117,"props":29030,"children":29031},{"class":119,"line":224},[29032,29036,29040,29045,29049,29053,29057,29061],{"type":29,"tag":117,"props":29033,"children":29034},{"style":143},[29035],{"type":34,"value":7641},{"type":29,"tag":117,"props":29037,"children":29038},{"style":143},[29039],{"type":34,"value":7762},{"type":29,"tag":117,"props":29041,"children":29042},{"style":372},[29043],{"type":34,"value":29044}," setLargeur",{"type":29,"tag":117,"props":29046,"children":29047},{"style":384},[29048],{"type":34,"value":1108},{"type":29,"tag":117,"props":29050,"children":29051},{"style":143},[29052],{"type":34,"value":5560},{"type":29,"tag":117,"props":29054,"children":29055},{"style":7657},[29056],{"type":34,"value":28885},{"type":29,"tag":117,"props":29058,"children":29059},{"style":384},[29060],{"type":34,"value":2803},{"type":29,"tag":117,"props":29062,"children":29063},{"style":384},[29064],{"type":34,"value":3461},{"type":29,"tag":117,"props":29066,"children":29067},{"class":119,"line":233},[29068,29072,29076,29080,29084,29088],{"type":29,"tag":117,"props":29069,"children":29070},{"style":6700},[29071],{"type":34,"value":7687},{"type":29,"tag":117,"props":29073,"children":29074},{"style":384},[29075],{"type":34,"value":369},{"type":29,"tag":117,"props":29077,"children":29078},{"style":378},[29079],{"type":34,"value":28974},{"type":29,"tag":117,"props":29081,"children":29082},{"style":160},[29083],{"type":34,"value":6061},{"type":29,"tag":117,"props":29085,"children":29086},{"style":378},[29087],{"type":34,"value":28885},{"type":29,"tag":117,"props":29089,"children":29090},{"style":384},[29091],{"type":34,"value":387},{"type":29,"tag":117,"props":29093,"children":29094},{"class":119,"line":242},[29095],{"type":29,"tag":117,"props":29096,"children":29097},{"style":384},[29098],{"type":34,"value":5632},{"type":29,"tag":117,"props":29100,"children":29101},{"class":119,"line":251},[29102],{"type":29,"tag":117,"props":29103,"children":29104},{"emptyLinePlaceholder":13},[29105],{"type":34,"value":136},{"type":29,"tag":117,"props":29107,"children":29108},{"class":119,"line":260},[29109,29113,29117,29122,29126,29130,29134,29138],{"type":29,"tag":117,"props":29110,"children":29111},{"style":143},[29112],{"type":34,"value":7641},{"type":29,"tag":117,"props":29114,"children":29115},{"style":143},[29116],{"type":34,"value":7762},{"type":29,"tag":117,"props":29118,"children":29119},{"style":372},[29120],{"type":34,"value":29121}," setHauteur",{"type":29,"tag":117,"props":29123,"children":29124},{"style":384},[29125],{"type":34,"value":1108},{"type":29,"tag":117,"props":29127,"children":29128},{"style":143},[29129],{"type":34,"value":5560},{"type":29,"tag":117,"props":29131,"children":29132},{"style":7657},[29133],{"type":34,"value":12937},{"type":29,"tag":117,"props":29135,"children":29136},{"style":384},[29137],{"type":34,"value":2803},{"type":29,"tag":117,"props":29139,"children":29140},{"style":384},[29141],{"type":34,"value":3461},{"type":29,"tag":117,"props":29143,"children":29144},{"class":119,"line":269},[29145,29149,29153,29157,29161,29165],{"type":29,"tag":117,"props":29146,"children":29147},{"style":6700},[29148],{"type":34,"value":7687},{"type":29,"tag":117,"props":29150,"children":29151},{"style":384},[29152],{"type":34,"value":369},{"type":29,"tag":117,"props":29154,"children":29155},{"style":378},[29156],{"type":34,"value":29002},{"type":29,"tag":117,"props":29158,"children":29159},{"style":160},[29160],{"type":34,"value":6061},{"type":29,"tag":117,"props":29162,"children":29163},{"style":378},[29164],{"type":34,"value":12937},{"type":29,"tag":117,"props":29166,"children":29167},{"style":384},[29168],{"type":34,"value":387},{"type":29,"tag":117,"props":29170,"children":29171},{"class":119,"line":278},[29172],{"type":29,"tag":117,"props":29173,"children":29174},{"style":384},[29175],{"type":34,"value":5632},{"type":29,"tag":117,"props":29177,"children":29178},{"class":119,"line":286},[29179],{"type":29,"tag":117,"props":29180,"children":29181},{"emptyLinePlaceholder":13},[29182],{"type":34,"value":136},{"type":29,"tag":117,"props":29184,"children":29185},{"class":119,"line":295},[29186,29190,29194,29199,29203],{"type":29,"tag":117,"props":29187,"children":29188},{"style":143},[29189],{"type":34,"value":7641},{"type":29,"tag":117,"props":29191,"children":29192},{"style":143},[29193],{"type":34,"value":5546},{"type":29,"tag":117,"props":29195,"children":29196},{"style":372},[29197],{"type":34,"value":29198}," calculerAire",{"type":29,"tag":117,"props":29200,"children":29201},{"style":384},[29202],{"type":34,"value":381},{"type":29,"tag":117,"props":29204,"children":29205},{"style":384},[29206],{"type":34,"value":3461},{"type":29,"tag":117,"props":29208,"children":29209},{"class":119,"line":304},[29210,29214,29219,29223,29227,29231,29235,29239,29244],{"type":29,"tag":117,"props":29211,"children":29212},{"style":143},[29213],{"type":34,"value":5616},{"type":29,"tag":117,"props":29215,"children":29216},{"style":6700},[29217],{"type":34,"value":29218}," this",{"type":29,"tag":117,"props":29220,"children":29221},{"style":384},[29222],{"type":34,"value":369},{"type":29,"tag":117,"props":29224,"children":29225},{"style":378},[29226],{"type":34,"value":28974},{"type":29,"tag":117,"props":29228,"children":29229},{"style":160},[29230],{"type":34,"value":5649},{"type":29,"tag":117,"props":29232,"children":29233},{"style":6700},[29234],{"type":34,"value":29218},{"type":29,"tag":117,"props":29236,"children":29237},{"style":384},[29238],{"type":34,"value":369},{"type":29,"tag":117,"props":29240,"children":29241},{"style":378},[29242],{"type":34,"value":29243},"hauteur",{"type":29,"tag":117,"props":29245,"children":29246},{"style":384},[29247],{"type":34,"value":387},{"type":29,"tag":117,"props":29249,"children":29250},{"class":119,"line":313},[29251],{"type":29,"tag":117,"props":29252,"children":29253},{"style":384},[29254],{"type":34,"value":5632},{"type":29,"tag":117,"props":29256,"children":29257},{"class":119,"line":322},[29258],{"type":29,"tag":117,"props":29259,"children":29260},{"style":384},[29261],{"type":34,"value":2903},{"type":29,"tag":30,"props":29263,"children":29264},{},[29265,29267,29272],{"type":34,"value":29266},"Ici, la classe ",{"type":29,"tag":113,"props":29268,"children":29270},{"className":29269},[],[29271],{"type":34,"value":18577},{"type":34,"value":29273}," fonctionne normalement. Elle a des méthodes pour définir la largeur et la hauteur, et pour calculer l'aire.",{"type":29,"tag":7528,"props":29275,"children":29277},{"id":29276},"sous-classe-carre",[29278,29280,29286],{"type":34,"value":29279},"Sous-classe ",{"type":29,"tag":113,"props":29281,"children":29283},{"className":29282},[],[29284],{"type":34,"value":29285},"Carre",{"type":34,"value":1866},{"type":29,"tag":106,"props":29288,"children":29290},{"className":5519,"code":29289,"language":5521,"meta":8,"style":8},"public class Carre extends Rectangle {\n\n    public Carre(int taille) {\n        super(taille, taille);\n    }\n\n    @Override\n    public void setLargeur(int taille) {\n        this.largeur = this.hauteur = taille;\n    }\n\n    @Override\n    public void setHauteur(int taille) {\n        this.largeur = this.hauteur = taille;\n    }\n}\n",[29291],{"type":29,"tag":113,"props":29292,"children":29293},{"__ignoreMap":8},[29294,29322,29329,29361,29390,29397,29404,29415,29450,29493,29500,29507,29518,29553,29596,29603],{"type":29,"tag":117,"props":29295,"children":29296},{"class":119,"line":120},[29297,29301,29305,29310,29314,29318],{"type":29,"tag":117,"props":29298,"children":29299},{"style":143},[29300],{"type":34,"value":5541},{"type":29,"tag":117,"props":29302,"children":29303},{"style":143},[29304],{"type":34,"value":7575},{"type":29,"tag":117,"props":29306,"children":29307},{"style":2863},[29308],{"type":34,"value":29309}," Carre",{"type":29,"tag":117,"props":29311,"children":29312},{"style":143},[29313],{"type":34,"value":18946},{"type":29,"tag":117,"props":29315,"children":29316},{"style":2863},[29317],{"type":34,"value":18634},{"type":29,"tag":117,"props":29319,"children":29320},{"style":384},[29321],{"type":34,"value":3461},{"type":29,"tag":117,"props":29323,"children":29324},{"class":119,"line":130},[29325],{"type":29,"tag":117,"props":29326,"children":29327},{"emptyLinePlaceholder":13},[29328],{"type":34,"value":136},{"type":29,"tag":117,"props":29330,"children":29331},{"class":119,"line":139},[29332,29336,29340,29344,29348,29353,29357],{"type":29,"tag":117,"props":29333,"children":29334},{"style":143},[29335],{"type":34,"value":7641},{"type":29,"tag":117,"props":29337,"children":29338},{"style":372},[29339],{"type":34,"value":29309},{"type":29,"tag":117,"props":29341,"children":29342},{"style":384},[29343],{"type":34,"value":1108},{"type":29,"tag":117,"props":29345,"children":29346},{"style":143},[29347],{"type":34,"value":5560},{"type":29,"tag":117,"props":29349,"children":29350},{"style":7657},[29351],{"type":34,"value":29352}," taille",{"type":29,"tag":117,"props":29354,"children":29355},{"style":384},[29356],{"type":34,"value":2803},{"type":29,"tag":117,"props":29358,"children":29359},{"style":384},[29360],{"type":34,"value":3461},{"type":29,"tag":117,"props":29362,"children":29363},{"class":119,"line":172},[29364,29369,29373,29378,29382,29386],{"type":29,"tag":117,"props":29365,"children":29366},{"style":154},[29367],{"type":34,"value":29368},"        super",{"type":29,"tag":117,"props":29370,"children":29371},{"style":384},[29372],{"type":34,"value":1108},{"type":29,"tag":117,"props":29374,"children":29375},{"style":378},[29376],{"type":34,"value":29377},"taille",{"type":29,"tag":117,"props":29379,"children":29380},{"style":384},[29381],{"type":34,"value":1118},{"type":29,"tag":117,"props":29383,"children":29384},{"style":378},[29385],{"type":34,"value":29352},{"type":29,"tag":117,"props":29387,"children":29388},{"style":384},[29389],{"type":34,"value":5675},{"type":29,"tag":117,"props":29391,"children":29392},{"class":119,"line":181},[29393],{"type":29,"tag":117,"props":29394,"children":29395},{"style":384},[29396],{"type":34,"value":5632},{"type":29,"tag":117,"props":29398,"children":29399},{"class":119,"line":189},[29400],{"type":29,"tag":117,"props":29401,"children":29402},{"emptyLinePlaceholder":13},[29403],{"type":34,"value":136},{"type":29,"tag":117,"props":29405,"children":29406},{"class":119,"line":198},[29407,29411],{"type":29,"tag":117,"props":29408,"children":29409},{"style":10083},[29410],{"type":34,"value":10086},{"type":29,"tag":117,"props":29412,"children":29413},{"style":10089},[29414],{"type":34,"value":17746},{"type":29,"tag":117,"props":29416,"children":29417},{"class":119,"line":207},[29418,29422,29426,29430,29434,29438,29442,29446],{"type":29,"tag":117,"props":29419,"children":29420},{"style":143},[29421],{"type":34,"value":7641},{"type":29,"tag":117,"props":29423,"children":29424},{"style":143},[29425],{"type":34,"value":7762},{"type":29,"tag":117,"props":29427,"children":29428},{"style":372},[29429],{"type":34,"value":29044},{"type":29,"tag":117,"props":29431,"children":29432},{"style":384},[29433],{"type":34,"value":1108},{"type":29,"tag":117,"props":29435,"children":29436},{"style":143},[29437],{"type":34,"value":5560},{"type":29,"tag":117,"props":29439,"children":29440},{"style":7657},[29441],{"type":34,"value":29352},{"type":29,"tag":117,"props":29443,"children":29444},{"style":384},[29445],{"type":34,"value":2803},{"type":29,"tag":117,"props":29447,"children":29448},{"style":384},[29449],{"type":34,"value":3461},{"type":29,"tag":117,"props":29451,"children":29452},{"class":119,"line":215},[29453,29457,29461,29465,29469,29473,29477,29481,29485,29489],{"type":29,"tag":117,"props":29454,"children":29455},{"style":6700},[29456],{"type":34,"value":7687},{"type":29,"tag":117,"props":29458,"children":29459},{"style":384},[29460],{"type":34,"value":369},{"type":29,"tag":117,"props":29462,"children":29463},{"style":378},[29464],{"type":34,"value":28974},{"type":29,"tag":117,"props":29466,"children":29467},{"style":160},[29468],{"type":34,"value":6061},{"type":29,"tag":117,"props":29470,"children":29471},{"style":6700},[29472],{"type":34,"value":29218},{"type":29,"tag":117,"props":29474,"children":29475},{"style":384},[29476],{"type":34,"value":369},{"type":29,"tag":117,"props":29478,"children":29479},{"style":378},[29480],{"type":34,"value":29002},{"type":29,"tag":117,"props":29482,"children":29483},{"style":160},[29484],{"type":34,"value":6061},{"type":29,"tag":117,"props":29486,"children":29487},{"style":378},[29488],{"type":34,"value":29352},{"type":29,"tag":117,"props":29490,"children":29491},{"style":384},[29492],{"type":34,"value":387},{"type":29,"tag":117,"props":29494,"children":29495},{"class":119,"line":224},[29496],{"type":29,"tag":117,"props":29497,"children":29498},{"style":384},[29499],{"type":34,"value":5632},{"type":29,"tag":117,"props":29501,"children":29502},{"class":119,"line":233},[29503],{"type":29,"tag":117,"props":29504,"children":29505},{"emptyLinePlaceholder":13},[29506],{"type":34,"value":136},{"type":29,"tag":117,"props":29508,"children":29509},{"class":119,"line":242},[29510,29514],{"type":29,"tag":117,"props":29511,"children":29512},{"style":10083},[29513],{"type":34,"value":10086},{"type":29,"tag":117,"props":29515,"children":29516},{"style":10089},[29517],{"type":34,"value":17746},{"type":29,"tag":117,"props":29519,"children":29520},{"class":119,"line":251},[29521,29525,29529,29533,29537,29541,29545,29549],{"type":29,"tag":117,"props":29522,"children":29523},{"style":143},[29524],{"type":34,"value":7641},{"type":29,"tag":117,"props":29526,"children":29527},{"style":143},[29528],{"type":34,"value":7762},{"type":29,"tag":117,"props":29530,"children":29531},{"style":372},[29532],{"type":34,"value":29121},{"type":29,"tag":117,"props":29534,"children":29535},{"style":384},[29536],{"type":34,"value":1108},{"type":29,"tag":117,"props":29538,"children":29539},{"style":143},[29540],{"type":34,"value":5560},{"type":29,"tag":117,"props":29542,"children":29543},{"style":7657},[29544],{"type":34,"value":29352},{"type":29,"tag":117,"props":29546,"children":29547},{"style":384},[29548],{"type":34,"value":2803},{"type":29,"tag":117,"props":29550,"children":29551},{"style":384},[29552],{"type":34,"value":3461},{"type":29,"tag":117,"props":29554,"children":29555},{"class":119,"line":260},[29556,29560,29564,29568,29572,29576,29580,29584,29588,29592],{"type":29,"tag":117,"props":29557,"children":29558},{"style":6700},[29559],{"type":34,"value":7687},{"type":29,"tag":117,"props":29561,"children":29562},{"style":384},[29563],{"type":34,"value":369},{"type":29,"tag":117,"props":29565,"children":29566},{"style":378},[29567],{"type":34,"value":28974},{"type":29,"tag":117,"props":29569,"children":29570},{"style":160},[29571],{"type":34,"value":6061},{"type":29,"tag":117,"props":29573,"children":29574},{"style":6700},[29575],{"type":34,"value":29218},{"type":29,"tag":117,"props":29577,"children":29578},{"style":384},[29579],{"type":34,"value":369},{"type":29,"tag":117,"props":29581,"children":29582},{"style":378},[29583],{"type":34,"value":29002},{"type":29,"tag":117,"props":29585,"children":29586},{"style":160},[29587],{"type":34,"value":6061},{"type":29,"tag":117,"props":29589,"children":29590},{"style":378},[29591],{"type":34,"value":29352},{"type":29,"tag":117,"props":29593,"children":29594},{"style":384},[29595],{"type":34,"value":387},{"type":29,"tag":117,"props":29597,"children":29598},{"class":119,"line":269},[29599],{"type":29,"tag":117,"props":29600,"children":29601},{"style":384},[29602],{"type":34,"value":5632},{"type":29,"tag":117,"props":29604,"children":29605},{"class":119,"line":278},[29606],{"type":29,"tag":117,"props":29607,"children":29608},{"style":384},[29609],{"type":34,"value":2903},{"type":29,"tag":30,"props":29611,"children":29612},{},[29613,29615,29620,29622,29627,29629,29635,29636,29642],{"type":34,"value":29614},"Dans cet exemple, nous avons une classe ",{"type":29,"tag":113,"props":29616,"children":29618},{"className":29617},[],[29619],{"type":34,"value":29285},{"type":34,"value":29621}," qui hérite de ",{"type":29,"tag":113,"props":29623,"children":29625},{"className":29624},[],[29626],{"type":34,"value":18577},{"type":34,"value":29628},". Un carré étant un cas particulier de rectangle où tous les côtés sont égaux, nous avons redéfini les méthodes ",{"type":29,"tag":113,"props":29630,"children":29632},{"className":29631},[],[29633],{"type":34,"value":29634},"setLargeur",{"type":34,"value":5923},{"type":29,"tag":113,"props":29637,"children":29639},{"className":29638},[],[29640],{"type":34,"value":29641},"setHauteur",{"type":34,"value":29643}," pour toujours appliquer la même valeur à la largeur et à la hauteur.",{"type":29,"tag":7528,"props":29645,"children":29647},{"id":29646},"problème-avec-le-lsp",[29648],{"type":34,"value":29649},"Problème avec le LSP",{"type":29,"tag":30,"props":29651,"children":29652},{},[29653,29655,29660],{"type":34,"value":29654},"Maintenant, utilisons ces classes dans un programme. Supposons que nous ayons une méthode qui teste les objets ",{"type":29,"tag":113,"props":29656,"children":29658},{"className":29657},[],[29659],{"type":34,"value":18577},{"type":34,"value":1866},{"type":29,"tag":106,"props":29662,"children":29664},{"className":5519,"code":29663,"language":5521,"meta":8,"style":8},"public class Main {\n\n    public static void testerRectangle(Rectangle rect) {\n        rect.setLargeur(5);\n        rect.setHauteur(10);\n        int aire = rect.calculerAire();\n        System.out.println(\"Aire attendue : 50, Aire calculée : \" + aire);\n    }\n\n    public static void main(String[] args) {\n        \u002F\u002F Test avec un Rectangle\n        Rectangle rect = new Rectangle(2, 3);\n        testerRectangle(rect);\n\n        \u002F\u002F Test avec un Carre\n        Carre carre = new Carre(5);\n        testerRectangle(carre);\n    }\n}\n",[29665],{"type":29,"tag":113,"props":29666,"children":29667},{"__ignoreMap":8},[29668,29687,29694,29735,29764,29792,29826,29871,29878,29885,29928,29936,29981,30002,30009,30017,30054,30074,30081],{"type":29,"tag":117,"props":29669,"children":29670},{"class":119,"line":120},[29671,29675,29679,29683],{"type":29,"tag":117,"props":29672,"children":29673},{"style":143},[29674],{"type":34,"value":5541},{"type":29,"tag":117,"props":29676,"children":29677},{"style":143},[29678],{"type":34,"value":7575},{"type":29,"tag":117,"props":29680,"children":29681},{"style":2863},[29682],{"type":34,"value":18217},{"type":29,"tag":117,"props":29684,"children":29685},{"style":384},[29686],{"type":34,"value":3461},{"type":29,"tag":117,"props":29688,"children":29689},{"class":119,"line":130},[29690],{"type":29,"tag":117,"props":29691,"children":29692},{"emptyLinePlaceholder":13},[29693],{"type":34,"value":136},{"type":29,"tag":117,"props":29695,"children":29696},{"class":119,"line":139},[29697,29701,29705,29709,29714,29718,29722,29727,29731],{"type":29,"tag":117,"props":29698,"children":29699},{"style":143},[29700],{"type":34,"value":7641},{"type":29,"tag":117,"props":29702,"children":29703},{"style":143},[29704],{"type":34,"value":9213},{"type":29,"tag":117,"props":29706,"children":29707},{"style":143},[29708],{"type":34,"value":7762},{"type":29,"tag":117,"props":29710,"children":29711},{"style":372},[29712],{"type":34,"value":29713}," testerRectangle",{"type":29,"tag":117,"props":29715,"children":29716},{"style":384},[29717],{"type":34,"value":1108},{"type":29,"tag":117,"props":29719,"children":29720},{"style":5976},[29721],{"type":34,"value":18577},{"type":29,"tag":117,"props":29723,"children":29724},{"style":7657},[29725],{"type":34,"value":29726}," rect",{"type":29,"tag":117,"props":29728,"children":29729},{"style":384},[29730],{"type":34,"value":2803},{"type":29,"tag":117,"props":29732,"children":29733},{"style":384},[29734],{"type":34,"value":3461},{"type":29,"tag":117,"props":29736,"children":29737},{"class":119,"line":172},[29738,29743,29747,29751,29755,29760],{"type":29,"tag":117,"props":29739,"children":29740},{"style":378},[29741],{"type":34,"value":29742},"        rect",{"type":29,"tag":117,"props":29744,"children":29745},{"style":384},[29746],{"type":34,"value":369},{"type":29,"tag":117,"props":29748,"children":29749},{"style":372},[29750],{"type":34,"value":29634},{"type":29,"tag":117,"props":29752,"children":29753},{"style":384},[29754],{"type":34,"value":1108},{"type":29,"tag":117,"props":29756,"children":29757},{"style":3476},[29758],{"type":34,"value":29759},"5",{"type":29,"tag":117,"props":29761,"children":29762},{"style":384},[29763],{"type":34,"value":5675},{"type":29,"tag":117,"props":29765,"children":29766},{"class":119,"line":181},[29767,29771,29775,29779,29783,29788],{"type":29,"tag":117,"props":29768,"children":29769},{"style":378},[29770],{"type":34,"value":29742},{"type":29,"tag":117,"props":29772,"children":29773},{"style":384},[29774],{"type":34,"value":369},{"type":29,"tag":117,"props":29776,"children":29777},{"style":372},[29778],{"type":34,"value":29641},{"type":29,"tag":117,"props":29780,"children":29781},{"style":384},[29782],{"type":34,"value":1108},{"type":29,"tag":117,"props":29784,"children":29785},{"style":3476},[29786],{"type":34,"value":29787},"10",{"type":29,"tag":117,"props":29789,"children":29790},{"style":384},[29791],{"type":34,"value":5675},{"type":29,"tag":117,"props":29793,"children":29794},{"class":119,"line":189},[29795,29800,29805,29809,29813,29817,29822],{"type":29,"tag":117,"props":29796,"children":29797},{"style":143},[29798],{"type":34,"value":29799},"        int",{"type":29,"tag":117,"props":29801,"children":29802},{"style":378},[29803],{"type":34,"value":29804}," aire ",{"type":29,"tag":117,"props":29806,"children":29807},{"style":160},[29808],{"type":34,"value":6061},{"type":29,"tag":117,"props":29810,"children":29811},{"style":378},[29812],{"type":34,"value":29726},{"type":29,"tag":117,"props":29814,"children":29815},{"style":384},[29816],{"type":34,"value":369},{"type":29,"tag":117,"props":29818,"children":29819},{"style":372},[29820],{"type":34,"value":29821},"calculerAire",{"type":29,"tag":117,"props":29823,"children":29824},{"style":384},[29825],{"type":34,"value":9375},{"type":29,"tag":117,"props":29827,"children":29828},{"class":119,"line":198},[29829,29833,29837,29841,29845,29849,29853,29858,29862,29867],{"type":29,"tag":117,"props":29830,"children":29831},{"style":378},[29832],{"type":34,"value":16717},{"type":29,"tag":117,"props":29834,"children":29835},{"style":384},[29836],{"type":34,"value":369},{"type":29,"tag":117,"props":29838,"children":29839},{"style":378},[29840],{"type":34,"value":15075},{"type":29,"tag":117,"props":29842,"children":29843},{"style":384},[29844],{"type":34,"value":369},{"type":29,"tag":117,"props":29846,"children":29847},{"style":372},[29848],{"type":34,"value":15084},{"type":29,"tag":117,"props":29850,"children":29851},{"style":384},[29852],{"type":34,"value":1108},{"type":29,"tag":117,"props":29854,"children":29855},{"style":166},[29856],{"type":34,"value":29857},"\"Aire attendue : 50, Aire calculée : \"",{"type":29,"tag":117,"props":29859,"children":29860},{"style":160},[29861],{"type":34,"value":15098},{"type":29,"tag":117,"props":29863,"children":29864},{"style":378},[29865],{"type":34,"value":29866}," aire",{"type":29,"tag":117,"props":29868,"children":29869},{"style":384},[29870],{"type":34,"value":5675},{"type":29,"tag":117,"props":29872,"children":29873},{"class":119,"line":207},[29874],{"type":29,"tag":117,"props":29875,"children":29876},{"style":384},[29877],{"type":34,"value":5632},{"type":29,"tag":117,"props":29879,"children":29880},{"class":119,"line":215},[29881],{"type":29,"tag":117,"props":29882,"children":29883},{"emptyLinePlaceholder":13},[29884],{"type":34,"value":136},{"type":29,"tag":117,"props":29886,"children":29887},{"class":119,"line":224},[29888,29892,29896,29900,29904,29908,29912,29916,29920,29924],{"type":29,"tag":117,"props":29889,"children":29890},{"style":143},[29891],{"type":34,"value":7641},{"type":29,"tag":117,"props":29893,"children":29894},{"style":143},[29895],{"type":34,"value":9213},{"type":29,"tag":117,"props":29897,"children":29898},{"style":143},[29899],{"type":34,"value":7762},{"type":29,"tag":117,"props":29901,"children":29902},{"style":372},[29903],{"type":34,"value":18241},{"type":29,"tag":117,"props":29905,"children":29906},{"style":384},[29907],{"type":34,"value":1108},{"type":29,"tag":117,"props":29909,"children":29910},{"style":143},[29911],{"type":34,"value":7654},{"type":29,"tag":117,"props":29913,"children":29914},{"style":384},[29915],{"type":34,"value":2872},{"type":29,"tag":117,"props":29917,"children":29918},{"style":7657},[29919],{"type":34,"value":18258},{"type":29,"tag":117,"props":29921,"children":29922},{"style":384},[29923],{"type":34,"value":2803},{"type":29,"tag":117,"props":29925,"children":29926},{"style":384},[29927],{"type":34,"value":3461},{"type":29,"tag":117,"props":29929,"children":29930},{"class":119,"line":233},[29931],{"type":29,"tag":117,"props":29932,"children":29933},{"style":124},[29934],{"type":34,"value":29935},"        \u002F\u002F Test avec un Rectangle\n",{"type":29,"tag":117,"props":29937,"children":29938},{"class":119,"line":242},[29939,29944,29949,29953,29957,29961,29965,29969,29973,29977],{"type":29,"tag":117,"props":29940,"children":29941},{"style":5976},[29942],{"type":34,"value":29943},"        Rectangle",{"type":29,"tag":117,"props":29945,"children":29946},{"style":378},[29947],{"type":34,"value":29948}," rect ",{"type":29,"tag":117,"props":29950,"children":29951},{"style":160},[29952],{"type":34,"value":6061},{"type":29,"tag":117,"props":29954,"children":29955},{"style":143},[29956],{"type":34,"value":6066},{"type":29,"tag":117,"props":29958,"children":29959},{"style":372},[29960],{"type":34,"value":18634},{"type":29,"tag":117,"props":29962,"children":29963},{"style":384},[29964],{"type":34,"value":1108},{"type":29,"tag":117,"props":29966,"children":29967},{"style":3476},[29968],{"type":34,"value":2233},{"type":29,"tag":117,"props":29970,"children":29971},{"style":384},[29972],{"type":34,"value":1118},{"type":29,"tag":117,"props":29974,"children":29975},{"style":3476},[29976],{"type":34,"value":12770},{"type":29,"tag":117,"props":29978,"children":29979},{"style":384},[29980],{"type":34,"value":5675},{"type":29,"tag":117,"props":29982,"children":29983},{"class":119,"line":251},[29984,29989,29993,29998],{"type":29,"tag":117,"props":29985,"children":29986},{"style":372},[29987],{"type":34,"value":29988},"        testerRectangle",{"type":29,"tag":117,"props":29990,"children":29991},{"style":384},[29992],{"type":34,"value":1108},{"type":29,"tag":117,"props":29994,"children":29995},{"style":378},[29996],{"type":34,"value":29997},"rect",{"type":29,"tag":117,"props":29999,"children":30000},{"style":384},[30001],{"type":34,"value":5675},{"type":29,"tag":117,"props":30003,"children":30004},{"class":119,"line":260},[30005],{"type":29,"tag":117,"props":30006,"children":30007},{"emptyLinePlaceholder":13},[30008],{"type":34,"value":136},{"type":29,"tag":117,"props":30010,"children":30011},{"class":119,"line":269},[30012],{"type":29,"tag":117,"props":30013,"children":30014},{"style":124},[30015],{"type":34,"value":30016},"        \u002F\u002F Test avec un Carre\n",{"type":29,"tag":117,"props":30018,"children":30019},{"class":119,"line":278},[30020,30025,30030,30034,30038,30042,30046,30050],{"type":29,"tag":117,"props":30021,"children":30022},{"style":5976},[30023],{"type":34,"value":30024},"        Carre",{"type":29,"tag":117,"props":30026,"children":30027},{"style":378},[30028],{"type":34,"value":30029}," carre ",{"type":29,"tag":117,"props":30031,"children":30032},{"style":160},[30033],{"type":34,"value":6061},{"type":29,"tag":117,"props":30035,"children":30036},{"style":143},[30037],{"type":34,"value":6066},{"type":29,"tag":117,"props":30039,"children":30040},{"style":372},[30041],{"type":34,"value":29309},{"type":29,"tag":117,"props":30043,"children":30044},{"style":384},[30045],{"type":34,"value":1108},{"type":29,"tag":117,"props":30047,"children":30048},{"style":3476},[30049],{"type":34,"value":29759},{"type":29,"tag":117,"props":30051,"children":30052},{"style":384},[30053],{"type":34,"value":5675},{"type":29,"tag":117,"props":30055,"children":30056},{"class":119,"line":286},[30057,30061,30065,30070],{"type":29,"tag":117,"props":30058,"children":30059},{"style":372},[30060],{"type":34,"value":29988},{"type":29,"tag":117,"props":30062,"children":30063},{"style":384},[30064],{"type":34,"value":1108},{"type":29,"tag":117,"props":30066,"children":30067},{"style":378},[30068],{"type":34,"value":30069},"carre",{"type":29,"tag":117,"props":30071,"children":30072},{"style":384},[30073],{"type":34,"value":5675},{"type":29,"tag":117,"props":30075,"children":30076},{"class":119,"line":295},[30077],{"type":29,"tag":117,"props":30078,"children":30079},{"style":384},[30080],{"type":34,"value":5632},{"type":29,"tag":117,"props":30082,"children":30083},{"class":119,"line":304},[30084],{"type":29,"tag":117,"props":30085,"children":30086},{"style":384},[30087],{"type":34,"value":2903},{"type":29,"tag":7528,"props":30089,"children":30091},{"id":30090},"résultat",[30092],{"type":34,"value":30093},"Résultat :",{"type":29,"tag":1585,"props":30095,"children":30096},{},[30097,30109],{"type":29,"tag":1589,"props":30098,"children":30099},{},[30100,30102,30107],{"type":34,"value":30101},"Avec l'objet ",{"type":29,"tag":113,"props":30103,"children":30105},{"className":30104},[],[30106],{"type":34,"value":18577},{"type":34,"value":30108},", tout fonctionne comme prévu. L'aire calculée sera de 50 (5 * 10).",{"type":29,"tag":1589,"props":30110,"children":30111},{},[30112,30113,30118,30120,30126],{"type":34,"value":30101},{"type":29,"tag":113,"props":30114,"children":30116},{"className":30115},[],[30117],{"type":34,"value":29285},{"type":34,"value":30119},", cependant, le calcul ne donnera pas le résultat attendu. En appelant ",{"type":29,"tag":113,"props":30121,"children":30123},{"className":30122},[],[30124],{"type":34,"value":30125},"setHauteur(10)",{"type":34,"value":30127},", nous changeons aussi la largeur à 10, et l'aire calculée sera 100 au lieu de 50.",{"type":29,"tag":30,"props":30129,"children":30130},{},[30131,30133,30138,30140,30145,30147,30152],{"type":34,"value":30132},"Ce comportement brise le LSP, car la classe ",{"type":29,"tag":113,"props":30134,"children":30136},{"className":30135},[],[30137],{"type":34,"value":29285},{"type":34,"value":30139}," ne respecte pas les attentes fixées par ",{"type":29,"tag":113,"props":30141,"children":30143},{"className":30142},[],[30144],{"type":34,"value":18577},{"type":34,"value":30146},". Cela peut causer des bugs ou des comportements inattendus dans les programmes qui s’attendent à ce qu’un ",{"type":29,"tag":113,"props":30148,"children":30150},{"className":30149},[],[30151],{"type":34,"value":18577},{"type":34,"value":30153}," fonctionne d’une certaine manière.",{"type":29,"tag":51,"props":30155,"children":30156},{},[],{"type":29,"tag":55,"props":30158,"children":30160},{"id":30159},"exemple-correct-respecter-le-lsp-ce-quil-faut-faire",[30161],{"type":34,"value":30162},"Exemple correct - Respecter le LSP : Ce qu’il faut faire",{"type":29,"tag":30,"props":30164,"children":30165},{},[30166,30168,30173,30174,30179],{"type":34,"value":30167},"Pour respecter le principe de substitution de Liskov, nous devons nous assurer que les sous-classes n'altèrent pas le comportement attendu de la classe de base. Dans le cas du ",{"type":29,"tag":113,"props":30169,"children":30171},{"className":30170},[],[30172],{"type":34,"value":18577},{"type":34,"value":28824},{"type":29,"tag":113,"props":30175,"children":30177},{"className":30176},[],[30178],{"type":34,"value":29285},{"type":34,"value":30180},", le problème vient du fait que le carré redéfinit la manière dont les dimensions sont définies, brisant ainsi le comportement du rectangle.",{"type":29,"tag":7528,"props":30182,"children":30184},{"id":30183},"solution-séparer-les-concepts",[30185],{"type":34,"value":30186},"Solution : Séparer les concepts",{"type":29,"tag":30,"props":30188,"children":30189},{},[30190,30192,30197,30199,30204],{"type":34,"value":30191},"Une solution consiste à ne pas faire de ",{"type":29,"tag":113,"props":30193,"children":30195},{"className":30194},[],[30196],{"type":34,"value":29285},{"type":34,"value":30198}," une sous-classe de ",{"type":29,"tag":113,"props":30200,"children":30202},{"className":30201},[],[30203],{"type":34,"value":18577},{"type":34,"value":30205},". Bien que mathématiquement, un carré soit un type particulier de rectangle, en termes de conception orientée objet, il est souvent préférable de modéliser ces concepts de manière distincte pour éviter de briser le LSP.",{"type":29,"tag":7528,"props":30207,"children":30209},{"id":30208},"nouvelle-conception-classes-indépendantes-rectangle-et-carre",[30210,30212,30217,30218],{"type":34,"value":30211},"Nouvelle conception : Classes indépendantes ",{"type":29,"tag":113,"props":30213,"children":30215},{"className":30214},[],[30216],{"type":34,"value":18577},{"type":34,"value":5923},{"type":29,"tag":113,"props":30219,"children":30221},{"className":30220},[],[30222],{"type":34,"value":29285},{"type":29,"tag":30,"props":30224,"children":30225},{},[30226],{"type":34,"value":30227},"Voici comment nous pourrions concevoir cela correctement :",{"type":29,"tag":7528,"props":30229,"children":30231},{"id":30230},"classe-rectangle-1",[30232,30233,30238],{"type":34,"value":28837},{"type":29,"tag":113,"props":30234,"children":30236},{"className":30235},[],[30237],{"type":34,"value":18577},{"type":34,"value":1866},{"type":29,"tag":106,"props":30240,"children":30241},{"className":5519,"code":28846,"language":5521,"meta":8,"style":8},[30242],{"type":29,"tag":113,"props":30243,"children":30244},{"__ignoreMap":8},[30245,30264,30283,30302,30309,30352,30379,30406,30413,30420,30455,30482,30489,30496,30531,30558,30565,30572,30595,30634,30641],{"type":29,"tag":117,"props":30246,"children":30247},{"class":119,"line":120},[30248,30252,30256,30260],{"type":29,"tag":117,"props":30249,"children":30250},{"style":143},[30251],{"type":34,"value":5541},{"type":29,"tag":117,"props":30253,"children":30254},{"style":143},[30255],{"type":34,"value":7575},{"type":29,"tag":117,"props":30257,"children":30258},{"style":2863},[30259],{"type":34,"value":18634},{"type":29,"tag":117,"props":30261,"children":30262},{"style":384},[30263],{"type":34,"value":3461},{"type":29,"tag":117,"props":30265,"children":30266},{"class":119,"line":130},[30267,30271,30275,30279],{"type":29,"tag":117,"props":30268,"children":30269},{"style":143},[30270],{"type":34,"value":18646},{"type":29,"tag":117,"props":30272,"children":30273},{"style":143},[30274],{"type":34,"value":5546},{"type":29,"tag":117,"props":30276,"children":30277},{"style":378},[30278],{"type":34,"value":28885},{"type":29,"tag":117,"props":30280,"children":30281},{"style":384},[30282],{"type":34,"value":387},{"type":29,"tag":117,"props":30284,"children":30285},{"class":119,"line":139},[30286,30290,30294,30298],{"type":29,"tag":117,"props":30287,"children":30288},{"style":143},[30289],{"type":34,"value":18646},{"type":29,"tag":117,"props":30291,"children":30292},{"style":143},[30293],{"type":34,"value":5546},{"type":29,"tag":117,"props":30295,"children":30296},{"style":378},[30297],{"type":34,"value":12937},{"type":29,"tag":117,"props":30299,"children":30300},{"style":384},[30301],{"type":34,"value":387},{"type":29,"tag":117,"props":30303,"children":30304},{"class":119,"line":172},[30305],{"type":29,"tag":117,"props":30306,"children":30307},{"emptyLinePlaceholder":13},[30308],{"type":34,"value":136},{"type":29,"tag":117,"props":30310,"children":30311},{"class":119,"line":181},[30312,30316,30320,30324,30328,30332,30336,30340,30344,30348],{"type":29,"tag":117,"props":30313,"children":30314},{"style":143},[30315],{"type":34,"value":7641},{"type":29,"tag":117,"props":30317,"children":30318},{"style":372},[30319],{"type":34,"value":18634},{"type":29,"tag":117,"props":30321,"children":30322},{"style":384},[30323],{"type":34,"value":1108},{"type":29,"tag":117,"props":30325,"children":30326},{"style":143},[30327],{"type":34,"value":5560},{"type":29,"tag":117,"props":30329,"children":30330},{"style":7657},[30331],{"type":34,"value":28885},{"type":29,"tag":117,"props":30333,"children":30334},{"style":384},[30335],{"type":34,"value":1118},{"type":29,"tag":117,"props":30337,"children":30338},{"style":143},[30339],{"type":34,"value":5546},{"type":29,"tag":117,"props":30341,"children":30342},{"style":7657},[30343],{"type":34,"value":12937},{"type":29,"tag":117,"props":30345,"children":30346},{"style":384},[30347],{"type":34,"value":2803},{"type":29,"tag":117,"props":30349,"children":30350},{"style":384},[30351],{"type":34,"value":3461},{"type":29,"tag":117,"props":30353,"children":30354},{"class":119,"line":189},[30355,30359,30363,30367,30371,30375],{"type":29,"tag":117,"props":30356,"children":30357},{"style":6700},[30358],{"type":34,"value":7687},{"type":29,"tag":117,"props":30360,"children":30361},{"style":384},[30362],{"type":34,"value":369},{"type":29,"tag":117,"props":30364,"children":30365},{"style":378},[30366],{"type":34,"value":28974},{"type":29,"tag":117,"props":30368,"children":30369},{"style":160},[30370],{"type":34,"value":6061},{"type":29,"tag":117,"props":30372,"children":30373},{"style":378},[30374],{"type":34,"value":28885},{"type":29,"tag":117,"props":30376,"children":30377},{"style":384},[30378],{"type":34,"value":387},{"type":29,"tag":117,"props":30380,"children":30381},{"class":119,"line":198},[30382,30386,30390,30394,30398,30402],{"type":29,"tag":117,"props":30383,"children":30384},{"style":6700},[30385],{"type":34,"value":7687},{"type":29,"tag":117,"props":30387,"children":30388},{"style":384},[30389],{"type":34,"value":369},{"type":29,"tag":117,"props":30391,"children":30392},{"style":378},[30393],{"type":34,"value":29002},{"type":29,"tag":117,"props":30395,"children":30396},{"style":160},[30397],{"type":34,"value":6061},{"type":29,"tag":117,"props":30399,"children":30400},{"style":378},[30401],{"type":34,"value":12937},{"type":29,"tag":117,"props":30403,"children":30404},{"style":384},[30405],{"type":34,"value":387},{"type":29,"tag":117,"props":30407,"children":30408},{"class":119,"line":207},[30409],{"type":29,"tag":117,"props":30410,"children":30411},{"style":384},[30412],{"type":34,"value":5632},{"type":29,"tag":117,"props":30414,"children":30415},{"class":119,"line":215},[30416],{"type":29,"tag":117,"props":30417,"children":30418},{"emptyLinePlaceholder":13},[30419],{"type":34,"value":136},{"type":29,"tag":117,"props":30421,"children":30422},{"class":119,"line":224},[30423,30427,30431,30435,30439,30443,30447,30451],{"type":29,"tag":117,"props":30424,"children":30425},{"style":143},[30426],{"type":34,"value":7641},{"type":29,"tag":117,"props":30428,"children":30429},{"style":143},[30430],{"type":34,"value":7762},{"type":29,"tag":117,"props":30432,"children":30433},{"style":372},[30434],{"type":34,"value":29044},{"type":29,"tag":117,"props":30436,"children":30437},{"style":384},[30438],{"type":34,"value":1108},{"type":29,"tag":117,"props":30440,"children":30441},{"style":143},[30442],{"type":34,"value":5560},{"type":29,"tag":117,"props":30444,"children":30445},{"style":7657},[30446],{"type":34,"value":28885},{"type":29,"tag":117,"props":30448,"children":30449},{"style":384},[30450],{"type":34,"value":2803},{"type":29,"tag":117,"props":30452,"children":30453},{"style":384},[30454],{"type":34,"value":3461},{"type":29,"tag":117,"props":30456,"children":30457},{"class":119,"line":233},[30458,30462,30466,30470,30474,30478],{"type":29,"tag":117,"props":30459,"children":30460},{"style":6700},[30461],{"type":34,"value":7687},{"type":29,"tag":117,"props":30463,"children":30464},{"style":384},[30465],{"type":34,"value":369},{"type":29,"tag":117,"props":30467,"children":30468},{"style":378},[30469],{"type":34,"value":28974},{"type":29,"tag":117,"props":30471,"children":30472},{"style":160},[30473],{"type":34,"value":6061},{"type":29,"tag":117,"props":30475,"children":30476},{"style":378},[30477],{"type":34,"value":28885},{"type":29,"tag":117,"props":30479,"children":30480},{"style":384},[30481],{"type":34,"value":387},{"type":29,"tag":117,"props":30483,"children":30484},{"class":119,"line":242},[30485],{"type":29,"tag":117,"props":30486,"children":30487},{"style":384},[30488],{"type":34,"value":5632},{"type":29,"tag":117,"props":30490,"children":30491},{"class":119,"line":251},[30492],{"type":29,"tag":117,"props":30493,"children":30494},{"emptyLinePlaceholder":13},[30495],{"type":34,"value":136},{"type":29,"tag":117,"props":30497,"children":30498},{"class":119,"line":260},[30499,30503,30507,30511,30515,30519,30523,30527],{"type":29,"tag":117,"props":30500,"children":30501},{"style":143},[30502],{"type":34,"value":7641},{"type":29,"tag":117,"props":30504,"children":30505},{"style":143},[30506],{"type":34,"value":7762},{"type":29,"tag":117,"props":30508,"children":30509},{"style":372},[30510],{"type":34,"value":29121},{"type":29,"tag":117,"props":30512,"children":30513},{"style":384},[30514],{"type":34,"value":1108},{"type":29,"tag":117,"props":30516,"children":30517},{"style":143},[30518],{"type":34,"value":5560},{"type":29,"tag":117,"props":30520,"children":30521},{"style":7657},[30522],{"type":34,"value":12937},{"type":29,"tag":117,"props":30524,"children":30525},{"style":384},[30526],{"type":34,"value":2803},{"type":29,"tag":117,"props":30528,"children":30529},{"style":384},[30530],{"type":34,"value":3461},{"type":29,"tag":117,"props":30532,"children":30533},{"class":119,"line":269},[30534,30538,30542,30546,30550,30554],{"type":29,"tag":117,"props":30535,"children":30536},{"style":6700},[30537],{"type":34,"value":7687},{"type":29,"tag":117,"props":30539,"children":30540},{"style":384},[30541],{"type":34,"value":369},{"type":29,"tag":117,"props":30543,"children":30544},{"style":378},[30545],{"type":34,"value":29002},{"type":29,"tag":117,"props":30547,"children":30548},{"style":160},[30549],{"type":34,"value":6061},{"type":29,"tag":117,"props":30551,"children":30552},{"style":378},[30553],{"type":34,"value":12937},{"type":29,"tag":117,"props":30555,"children":30556},{"style":384},[30557],{"type":34,"value":387},{"type":29,"tag":117,"props":30559,"children":30560},{"class":119,"line":278},[30561],{"type":29,"tag":117,"props":30562,"children":30563},{"style":384},[30564],{"type":34,"value":5632},{"type":29,"tag":117,"props":30566,"children":30567},{"class":119,"line":286},[30568],{"type":29,"tag":117,"props":30569,"children":30570},{"emptyLinePlaceholder":13},[30571],{"type":34,"value":136},{"type":29,"tag":117,"props":30573,"children":30574},{"class":119,"line":295},[30575,30579,30583,30587,30591],{"type":29,"tag":117,"props":30576,"children":30577},{"style":143},[30578],{"type":34,"value":7641},{"type":29,"tag":117,"props":30580,"children":30581},{"style":143},[30582],{"type":34,"value":5546},{"type":29,"tag":117,"props":30584,"children":30585},{"style":372},[30586],{"type":34,"value":29198},{"type":29,"tag":117,"props":30588,"children":30589},{"style":384},[30590],{"type":34,"value":381},{"type":29,"tag":117,"props":30592,"children":30593},{"style":384},[30594],{"type":34,"value":3461},{"type":29,"tag":117,"props":30596,"children":30597},{"class":119,"line":304},[30598,30602,30606,30610,30614,30618,30622,30626,30630],{"type":29,"tag":117,"props":30599,"children":30600},{"style":143},[30601],{"type":34,"value":5616},{"type":29,"tag":117,"props":30603,"children":30604},{"style":6700},[30605],{"type":34,"value":29218},{"type":29,"tag":117,"props":30607,"children":30608},{"style":384},[30609],{"type":34,"value":369},{"type":29,"tag":117,"props":30611,"children":30612},{"style":378},[30613],{"type":34,"value":28974},{"type":29,"tag":117,"props":30615,"children":30616},{"style":160},[30617],{"type":34,"value":5649},{"type":29,"tag":117,"props":30619,"children":30620},{"style":6700},[30621],{"type":34,"value":29218},{"type":29,"tag":117,"props":30623,"children":30624},{"style":384},[30625],{"type":34,"value":369},{"type":29,"tag":117,"props":30627,"children":30628},{"style":378},[30629],{"type":34,"value":29243},{"type":29,"tag":117,"props":30631,"children":30632},{"style":384},[30633],{"type":34,"value":387},{"type":29,"tag":117,"props":30635,"children":30636},{"class":119,"line":313},[30637],{"type":29,"tag":117,"props":30638,"children":30639},{"style":384},[30640],{"type":34,"value":5632},{"type":29,"tag":117,"props":30642,"children":30643},{"class":119,"line":322},[30644],{"type":29,"tag":117,"props":30645,"children":30646},{"style":384},[30647],{"type":34,"value":2903},{"type":29,"tag":30,"props":30649,"children":30650},{},[30651,30653,30658],{"type":34,"value":30652},"La classe ",{"type":29,"tag":113,"props":30654,"children":30656},{"className":30655},[],[30657],{"type":34,"value":18577},{"type":34,"value":30659}," reste inchangée.",{"type":29,"tag":7528,"props":30661,"children":30663},{"id":30662},"classe-carre-indépendante",[30664,30665,30670],{"type":34,"value":28837},{"type":29,"tag":113,"props":30666,"children":30668},{"className":30667},[],[30669],{"type":34,"value":29285},{"type":34,"value":30671}," (indépendante) :",{"type":29,"tag":106,"props":30673,"children":30675},{"className":5519,"code":30674,"language":5521,"meta":8,"style":8},"public class Carre {\n    private int taille;\n\n    public Carre(int taille) {\n        this.taille = taille;\n    }\n\n    public void setTaille(int taille) {\n        this.taille = taille;\n    }\n\n    public int calculerAire() {\n        return this.taille * this.taille;\n    }\n}\n",[30676],{"type":29,"tag":113,"props":30677,"children":30678},{"__ignoreMap":8},[30679,30698,30717,30724,30755,30783,30790,30797,30833,30860,30867,30874,30897,30936,30943],{"type":29,"tag":117,"props":30680,"children":30681},{"class":119,"line":120},[30682,30686,30690,30694],{"type":29,"tag":117,"props":30683,"children":30684},{"style":143},[30685],{"type":34,"value":5541},{"type":29,"tag":117,"props":30687,"children":30688},{"style":143},[30689],{"type":34,"value":7575},{"type":29,"tag":117,"props":30691,"children":30692},{"style":2863},[30693],{"type":34,"value":29309},{"type":29,"tag":117,"props":30695,"children":30696},{"style":384},[30697],{"type":34,"value":3461},{"type":29,"tag":117,"props":30699,"children":30700},{"class":119,"line":130},[30701,30705,30709,30713],{"type":29,"tag":117,"props":30702,"children":30703},{"style":143},[30704],{"type":34,"value":7592},{"type":29,"tag":117,"props":30706,"children":30707},{"style":143},[30708],{"type":34,"value":5546},{"type":29,"tag":117,"props":30710,"children":30711},{"style":378},[30712],{"type":34,"value":29352},{"type":29,"tag":117,"props":30714,"children":30715},{"style":384},[30716],{"type":34,"value":387},{"type":29,"tag":117,"props":30718,"children":30719},{"class":119,"line":139},[30720],{"type":29,"tag":117,"props":30721,"children":30722},{"emptyLinePlaceholder":13},[30723],{"type":34,"value":136},{"type":29,"tag":117,"props":30725,"children":30726},{"class":119,"line":172},[30727,30731,30735,30739,30743,30747,30751],{"type":29,"tag":117,"props":30728,"children":30729},{"style":143},[30730],{"type":34,"value":7641},{"type":29,"tag":117,"props":30732,"children":30733},{"style":372},[30734],{"type":34,"value":29309},{"type":29,"tag":117,"props":30736,"children":30737},{"style":384},[30738],{"type":34,"value":1108},{"type":29,"tag":117,"props":30740,"children":30741},{"style":143},[30742],{"type":34,"value":5560},{"type":29,"tag":117,"props":30744,"children":30745},{"style":7657},[30746],{"type":34,"value":29352},{"type":29,"tag":117,"props":30748,"children":30749},{"style":384},[30750],{"type":34,"value":2803},{"type":29,"tag":117,"props":30752,"children":30753},{"style":384},[30754],{"type":34,"value":3461},{"type":29,"tag":117,"props":30756,"children":30757},{"class":119,"line":181},[30758,30762,30766,30771,30775,30779],{"type":29,"tag":117,"props":30759,"children":30760},{"style":6700},[30761],{"type":34,"value":7687},{"type":29,"tag":117,"props":30763,"children":30764},{"style":384},[30765],{"type":34,"value":369},{"type":29,"tag":117,"props":30767,"children":30768},{"style":378},[30769],{"type":34,"value":30770},"taille ",{"type":29,"tag":117,"props":30772,"children":30773},{"style":160},[30774],{"type":34,"value":6061},{"type":29,"tag":117,"props":30776,"children":30777},{"style":378},[30778],{"type":34,"value":29352},{"type":29,"tag":117,"props":30780,"children":30781},{"style":384},[30782],{"type":34,"value":387},{"type":29,"tag":117,"props":30784,"children":30785},{"class":119,"line":189},[30786],{"type":29,"tag":117,"props":30787,"children":30788},{"style":384},[30789],{"type":34,"value":5632},{"type":29,"tag":117,"props":30791,"children":30792},{"class":119,"line":198},[30793],{"type":29,"tag":117,"props":30794,"children":30795},{"emptyLinePlaceholder":13},[30796],{"type":34,"value":136},{"type":29,"tag":117,"props":30798,"children":30799},{"class":119,"line":207},[30800,30804,30808,30813,30817,30821,30825,30829],{"type":29,"tag":117,"props":30801,"children":30802},{"style":143},[30803],{"type":34,"value":7641},{"type":29,"tag":117,"props":30805,"children":30806},{"style":143},[30807],{"type":34,"value":7762},{"type":29,"tag":117,"props":30809,"children":30810},{"style":372},[30811],{"type":34,"value":30812}," setTaille",{"type":29,"tag":117,"props":30814,"children":30815},{"style":384},[30816],{"type":34,"value":1108},{"type":29,"tag":117,"props":30818,"children":30819},{"style":143},[30820],{"type":34,"value":5560},{"type":29,"tag":117,"props":30822,"children":30823},{"style":7657},[30824],{"type":34,"value":29352},{"type":29,"tag":117,"props":30826,"children":30827},{"style":384},[30828],{"type":34,"value":2803},{"type":29,"tag":117,"props":30830,"children":30831},{"style":384},[30832],{"type":34,"value":3461},{"type":29,"tag":117,"props":30834,"children":30835},{"class":119,"line":215},[30836,30840,30844,30848,30852,30856],{"type":29,"tag":117,"props":30837,"children":30838},{"style":6700},[30839],{"type":34,"value":7687},{"type":29,"tag":117,"props":30841,"children":30842},{"style":384},[30843],{"type":34,"value":369},{"type":29,"tag":117,"props":30845,"children":30846},{"style":378},[30847],{"type":34,"value":30770},{"type":29,"tag":117,"props":30849,"children":30850},{"style":160},[30851],{"type":34,"value":6061},{"type":29,"tag":117,"props":30853,"children":30854},{"style":378},[30855],{"type":34,"value":29352},{"type":29,"tag":117,"props":30857,"children":30858},{"style":384},[30859],{"type":34,"value":387},{"type":29,"tag":117,"props":30861,"children":30862},{"class":119,"line":224},[30863],{"type":29,"tag":117,"props":30864,"children":30865},{"style":384},[30866],{"type":34,"value":5632},{"type":29,"tag":117,"props":30868,"children":30869},{"class":119,"line":233},[30870],{"type":29,"tag":117,"props":30871,"children":30872},{"emptyLinePlaceholder":13},[30873],{"type":34,"value":136},{"type":29,"tag":117,"props":30875,"children":30876},{"class":119,"line":242},[30877,30881,30885,30889,30893],{"type":29,"tag":117,"props":30878,"children":30879},{"style":143},[30880],{"type":34,"value":7641},{"type":29,"tag":117,"props":30882,"children":30883},{"style":143},[30884],{"type":34,"value":5546},{"type":29,"tag":117,"props":30886,"children":30887},{"style":372},[30888],{"type":34,"value":29198},{"type":29,"tag":117,"props":30890,"children":30891},{"style":384},[30892],{"type":34,"value":381},{"type":29,"tag":117,"props":30894,"children":30895},{"style":384},[30896],{"type":34,"value":3461},{"type":29,"tag":117,"props":30898,"children":30899},{"class":119,"line":251},[30900,30904,30908,30912,30916,30920,30924,30928,30932],{"type":29,"tag":117,"props":30901,"children":30902},{"style":143},[30903],{"type":34,"value":5616},{"type":29,"tag":117,"props":30905,"children":30906},{"style":6700},[30907],{"type":34,"value":29218},{"type":29,"tag":117,"props":30909,"children":30910},{"style":384},[30911],{"type":34,"value":369},{"type":29,"tag":117,"props":30913,"children":30914},{"style":378},[30915],{"type":34,"value":30770},{"type":29,"tag":117,"props":30917,"children":30918},{"style":160},[30919],{"type":34,"value":5649},{"type":29,"tag":117,"props":30921,"children":30922},{"style":6700},[30923],{"type":34,"value":29218},{"type":29,"tag":117,"props":30925,"children":30926},{"style":384},[30927],{"type":34,"value":369},{"type":29,"tag":117,"props":30929,"children":30930},{"style":378},[30931],{"type":34,"value":29377},{"type":29,"tag":117,"props":30933,"children":30934},{"style":384},[30935],{"type":34,"value":387},{"type":29,"tag":117,"props":30937,"children":30938},{"class":119,"line":260},[30939],{"type":29,"tag":117,"props":30940,"children":30941},{"style":384},[30942],{"type":34,"value":5632},{"type":29,"tag":117,"props":30944,"children":30945},{"class":119,"line":269},[30946],{"type":29,"tag":117,"props":30947,"children":30948},{"style":384},[30949],{"type":34,"value":2903},{"type":29,"tag":30,"props":30951,"children":30952},{},[30953,30955,30960,30962,30967,30969,30974,30976,30981,30983,30988,30990,30995],{"type":34,"value":30954},"Dans cette version, ",{"type":29,"tag":113,"props":30956,"children":30958},{"className":30957},[],[30959],{"type":34,"value":29285},{"type":34,"value":30961}," n’hérite plus de ",{"type":29,"tag":113,"props":30963,"children":30965},{"className":30964},[],[30966],{"type":34,"value":18577},{"type":34,"value":30968},". Nous avons ainsi une classe ",{"type":29,"tag":113,"props":30970,"children":30972},{"className":30971},[],[30973],{"type":34,"value":29285},{"type":34,"value":30975}," totalement indépendante qui suit ses propres règles et n'interfère pas avec les attentes définies pour un ",{"type":29,"tag":113,"props":30977,"children":30979},{"className":30978},[],[30980],{"type":34,"value":18577},{"type":34,"value":30982},". Le carré a une seule dimension (",{"type":29,"tag":113,"props":30984,"children":30986},{"className":30985},[],[30987],{"type":34,"value":29377},{"type":34,"value":30989},"), et son comportement est cohérent avec son concept sans violer les principes de la classe ",{"type":29,"tag":113,"props":30991,"children":30993},{"className":30992},[],[30994],{"type":34,"value":18577},{"type":34,"value":369},{"type":29,"tag":7528,"props":30997,"children":30999},{"id":30998},"modification-du-programme-de-test",[31000],{"type":34,"value":31001},"Modification du programme de test :",{"type":29,"tag":30,"props":31003,"children":31004},{},[31005,31007,31012,31014,31019],{"type":34,"value":31006},"Puisque ",{"type":29,"tag":113,"props":31008,"children":31010},{"className":31009},[],[31011],{"type":34,"value":29285},{"type":34,"value":31013}," n’est plus une sous-classe de ",{"type":29,"tag":113,"props":31015,"children":31017},{"className":31016},[],[31018],{"type":34,"value":18577},{"type":34,"value":31020},", nous devons légèrement modifier notre méthode de test pour respecter cette nouvelle structure.",{"type":29,"tag":106,"props":31022,"children":31024},{"className":5519,"code":31023,"language":5521,"meta":8,"style":8},"public class Main {\n\n    public static void testerRectangle(Rectangle rect) {\n        rect.setLargeur(5);\n        rect.setHauteur(10);\n        int aire = rect.calculerAire();\n        System.out.println(\"Aire attendue (Rectangle) : 50, Aire calculée : \" + aire);\n    }\n\n    public static void testerCarre(Carre carre) {\n        carre.setTaille(5);\n        int aire = carre.calculerAire();\n        System.out.println(\"Aire attendue (Carre) : 25, Aire calculée : \" + aire);\n    }\n\n    public static void main(String[] args) {\n        \u002F\u002F Test avec un Rectangle\n        Rectangle rect = new Rectangle(2, 3);\n        testerRectangle(rect);\n\n        \u002F\u002F Test avec un Carre\n        Carre carre = new Carre(5);\n\n\n        testerCarre(carre);\n    }\n}\n",[31025],{"type":29,"tag":113,"props":31026,"children":31027},{"__ignoreMap":8},[31028,31047,31054,31093,31120,31147,31178,31222,31229,31236,31277,31306,31337,31381,31388,31395,31438,31445,31488,31507,31514,31521,31556,31563,31570,31590,31597],{"type":29,"tag":117,"props":31029,"children":31030},{"class":119,"line":120},[31031,31035,31039,31043],{"type":29,"tag":117,"props":31032,"children":31033},{"style":143},[31034],{"type":34,"value":5541},{"type":29,"tag":117,"props":31036,"children":31037},{"style":143},[31038],{"type":34,"value":7575},{"type":29,"tag":117,"props":31040,"children":31041},{"style":2863},[31042],{"type":34,"value":18217},{"type":29,"tag":117,"props":31044,"children":31045},{"style":384},[31046],{"type":34,"value":3461},{"type":29,"tag":117,"props":31048,"children":31049},{"class":119,"line":130},[31050],{"type":29,"tag":117,"props":31051,"children":31052},{"emptyLinePlaceholder":13},[31053],{"type":34,"value":136},{"type":29,"tag":117,"props":31055,"children":31056},{"class":119,"line":139},[31057,31061,31065,31069,31073,31077,31081,31085,31089],{"type":29,"tag":117,"props":31058,"children":31059},{"style":143},[31060],{"type":34,"value":7641},{"type":29,"tag":117,"props":31062,"children":31063},{"style":143},[31064],{"type":34,"value":9213},{"type":29,"tag":117,"props":31066,"children":31067},{"style":143},[31068],{"type":34,"value":7762},{"type":29,"tag":117,"props":31070,"children":31071},{"style":372},[31072],{"type":34,"value":29713},{"type":29,"tag":117,"props":31074,"children":31075},{"style":384},[31076],{"type":34,"value":1108},{"type":29,"tag":117,"props":31078,"children":31079},{"style":5976},[31080],{"type":34,"value":18577},{"type":29,"tag":117,"props":31082,"children":31083},{"style":7657},[31084],{"type":34,"value":29726},{"type":29,"tag":117,"props":31086,"children":31087},{"style":384},[31088],{"type":34,"value":2803},{"type":29,"tag":117,"props":31090,"children":31091},{"style":384},[31092],{"type":34,"value":3461},{"type":29,"tag":117,"props":31094,"children":31095},{"class":119,"line":172},[31096,31100,31104,31108,31112,31116],{"type":29,"tag":117,"props":31097,"children":31098},{"style":378},[31099],{"type":34,"value":29742},{"type":29,"tag":117,"props":31101,"children":31102},{"style":384},[31103],{"type":34,"value":369},{"type":29,"tag":117,"props":31105,"children":31106},{"style":372},[31107],{"type":34,"value":29634},{"type":29,"tag":117,"props":31109,"children":31110},{"style":384},[31111],{"type":34,"value":1108},{"type":29,"tag":117,"props":31113,"children":31114},{"style":3476},[31115],{"type":34,"value":29759},{"type":29,"tag":117,"props":31117,"children":31118},{"style":384},[31119],{"type":34,"value":5675},{"type":29,"tag":117,"props":31121,"children":31122},{"class":119,"line":181},[31123,31127,31131,31135,31139,31143],{"type":29,"tag":117,"props":31124,"children":31125},{"style":378},[31126],{"type":34,"value":29742},{"type":29,"tag":117,"props":31128,"children":31129},{"style":384},[31130],{"type":34,"value":369},{"type":29,"tag":117,"props":31132,"children":31133},{"style":372},[31134],{"type":34,"value":29641},{"type":29,"tag":117,"props":31136,"children":31137},{"style":384},[31138],{"type":34,"value":1108},{"type":29,"tag":117,"props":31140,"children":31141},{"style":3476},[31142],{"type":34,"value":29787},{"type":29,"tag":117,"props":31144,"children":31145},{"style":384},[31146],{"type":34,"value":5675},{"type":29,"tag":117,"props":31148,"children":31149},{"class":119,"line":189},[31150,31154,31158,31162,31166,31170,31174],{"type":29,"tag":117,"props":31151,"children":31152},{"style":143},[31153],{"type":34,"value":29799},{"type":29,"tag":117,"props":31155,"children":31156},{"style":378},[31157],{"type":34,"value":29804},{"type":29,"tag":117,"props":31159,"children":31160},{"style":160},[31161],{"type":34,"value":6061},{"type":29,"tag":117,"props":31163,"children":31164},{"style":378},[31165],{"type":34,"value":29726},{"type":29,"tag":117,"props":31167,"children":31168},{"style":384},[31169],{"type":34,"value":369},{"type":29,"tag":117,"props":31171,"children":31172},{"style":372},[31173],{"type":34,"value":29821},{"type":29,"tag":117,"props":31175,"children":31176},{"style":384},[31177],{"type":34,"value":9375},{"type":29,"tag":117,"props":31179,"children":31180},{"class":119,"line":198},[31181,31185,31189,31193,31197,31201,31205,31210,31214,31218],{"type":29,"tag":117,"props":31182,"children":31183},{"style":378},[31184],{"type":34,"value":16717},{"type":29,"tag":117,"props":31186,"children":31187},{"style":384},[31188],{"type":34,"value":369},{"type":29,"tag":117,"props":31190,"children":31191},{"style":378},[31192],{"type":34,"value":15075},{"type":29,"tag":117,"props":31194,"children":31195},{"style":384},[31196],{"type":34,"value":369},{"type":29,"tag":117,"props":31198,"children":31199},{"style":372},[31200],{"type":34,"value":15084},{"type":29,"tag":117,"props":31202,"children":31203},{"style":384},[31204],{"type":34,"value":1108},{"type":29,"tag":117,"props":31206,"children":31207},{"style":166},[31208],{"type":34,"value":31209},"\"Aire attendue (Rectangle) : 50, Aire calculée : \"",{"type":29,"tag":117,"props":31211,"children":31212},{"style":160},[31213],{"type":34,"value":15098},{"type":29,"tag":117,"props":31215,"children":31216},{"style":378},[31217],{"type":34,"value":29866},{"type":29,"tag":117,"props":31219,"children":31220},{"style":384},[31221],{"type":34,"value":5675},{"type":29,"tag":117,"props":31223,"children":31224},{"class":119,"line":207},[31225],{"type":29,"tag":117,"props":31226,"children":31227},{"style":384},[31228],{"type":34,"value":5632},{"type":29,"tag":117,"props":31230,"children":31231},{"class":119,"line":215},[31232],{"type":29,"tag":117,"props":31233,"children":31234},{"emptyLinePlaceholder":13},[31235],{"type":34,"value":136},{"type":29,"tag":117,"props":31237,"children":31238},{"class":119,"line":224},[31239,31243,31247,31251,31256,31260,31264,31269,31273],{"type":29,"tag":117,"props":31240,"children":31241},{"style":143},[31242],{"type":34,"value":7641},{"type":29,"tag":117,"props":31244,"children":31245},{"style":143},[31246],{"type":34,"value":9213},{"type":29,"tag":117,"props":31248,"children":31249},{"style":143},[31250],{"type":34,"value":7762},{"type":29,"tag":117,"props":31252,"children":31253},{"style":372},[31254],{"type":34,"value":31255}," testerCarre",{"type":29,"tag":117,"props":31257,"children":31258},{"style":384},[31259],{"type":34,"value":1108},{"type":29,"tag":117,"props":31261,"children":31262},{"style":5976},[31263],{"type":34,"value":29285},{"type":29,"tag":117,"props":31265,"children":31266},{"style":7657},[31267],{"type":34,"value":31268}," carre",{"type":29,"tag":117,"props":31270,"children":31271},{"style":384},[31272],{"type":34,"value":2803},{"type":29,"tag":117,"props":31274,"children":31275},{"style":384},[31276],{"type":34,"value":3461},{"type":29,"tag":117,"props":31278,"children":31279},{"class":119,"line":233},[31280,31285,31289,31294,31298,31302],{"type":29,"tag":117,"props":31281,"children":31282},{"style":378},[31283],{"type":34,"value":31284},"        carre",{"type":29,"tag":117,"props":31286,"children":31287},{"style":384},[31288],{"type":34,"value":369},{"type":29,"tag":117,"props":31290,"children":31291},{"style":372},[31292],{"type":34,"value":31293},"setTaille",{"type":29,"tag":117,"props":31295,"children":31296},{"style":384},[31297],{"type":34,"value":1108},{"type":29,"tag":117,"props":31299,"children":31300},{"style":3476},[31301],{"type":34,"value":29759},{"type":29,"tag":117,"props":31303,"children":31304},{"style":384},[31305],{"type":34,"value":5675},{"type":29,"tag":117,"props":31307,"children":31308},{"class":119,"line":242},[31309,31313,31317,31321,31325,31329,31333],{"type":29,"tag":117,"props":31310,"children":31311},{"style":143},[31312],{"type":34,"value":29799},{"type":29,"tag":117,"props":31314,"children":31315},{"style":378},[31316],{"type":34,"value":29804},{"type":29,"tag":117,"props":31318,"children":31319},{"style":160},[31320],{"type":34,"value":6061},{"type":29,"tag":117,"props":31322,"children":31323},{"style":378},[31324],{"type":34,"value":31268},{"type":29,"tag":117,"props":31326,"children":31327},{"style":384},[31328],{"type":34,"value":369},{"type":29,"tag":117,"props":31330,"children":31331},{"style":372},[31332],{"type":34,"value":29821},{"type":29,"tag":117,"props":31334,"children":31335},{"style":384},[31336],{"type":34,"value":9375},{"type":29,"tag":117,"props":31338,"children":31339},{"class":119,"line":251},[31340,31344,31348,31352,31356,31360,31364,31369,31373,31377],{"type":29,"tag":117,"props":31341,"children":31342},{"style":378},[31343],{"type":34,"value":16717},{"type":29,"tag":117,"props":31345,"children":31346},{"style":384},[31347],{"type":34,"value":369},{"type":29,"tag":117,"props":31349,"children":31350},{"style":378},[31351],{"type":34,"value":15075},{"type":29,"tag":117,"props":31353,"children":31354},{"style":384},[31355],{"type":34,"value":369},{"type":29,"tag":117,"props":31357,"children":31358},{"style":372},[31359],{"type":34,"value":15084},{"type":29,"tag":117,"props":31361,"children":31362},{"style":384},[31363],{"type":34,"value":1108},{"type":29,"tag":117,"props":31365,"children":31366},{"style":166},[31367],{"type":34,"value":31368},"\"Aire attendue (Carre) : 25, Aire calculée : \"",{"type":29,"tag":117,"props":31370,"children":31371},{"style":160},[31372],{"type":34,"value":15098},{"type":29,"tag":117,"props":31374,"children":31375},{"style":378},[31376],{"type":34,"value":29866},{"type":29,"tag":117,"props":31378,"children":31379},{"style":384},[31380],{"type":34,"value":5675},{"type":29,"tag":117,"props":31382,"children":31383},{"class":119,"line":260},[31384],{"type":29,"tag":117,"props":31385,"children":31386},{"style":384},[31387],{"type":34,"value":5632},{"type":29,"tag":117,"props":31389,"children":31390},{"class":119,"line":269},[31391],{"type":29,"tag":117,"props":31392,"children":31393},{"emptyLinePlaceholder":13},[31394],{"type":34,"value":136},{"type":29,"tag":117,"props":31396,"children":31397},{"class":119,"line":278},[31398,31402,31406,31410,31414,31418,31422,31426,31430,31434],{"type":29,"tag":117,"props":31399,"children":31400},{"style":143},[31401],{"type":34,"value":7641},{"type":29,"tag":117,"props":31403,"children":31404},{"style":143},[31405],{"type":34,"value":9213},{"type":29,"tag":117,"props":31407,"children":31408},{"style":143},[31409],{"type":34,"value":7762},{"type":29,"tag":117,"props":31411,"children":31412},{"style":372},[31413],{"type":34,"value":18241},{"type":29,"tag":117,"props":31415,"children":31416},{"style":384},[31417],{"type":34,"value":1108},{"type":29,"tag":117,"props":31419,"children":31420},{"style":143},[31421],{"type":34,"value":7654},{"type":29,"tag":117,"props":31423,"children":31424},{"style":384},[31425],{"type":34,"value":2872},{"type":29,"tag":117,"props":31427,"children":31428},{"style":7657},[31429],{"type":34,"value":18258},{"type":29,"tag":117,"props":31431,"children":31432},{"style":384},[31433],{"type":34,"value":2803},{"type":29,"tag":117,"props":31435,"children":31436},{"style":384},[31437],{"type":34,"value":3461},{"type":29,"tag":117,"props":31439,"children":31440},{"class":119,"line":286},[31441],{"type":29,"tag":117,"props":31442,"children":31443},{"style":124},[31444],{"type":34,"value":29935},{"type":29,"tag":117,"props":31446,"children":31447},{"class":119,"line":295},[31448,31452,31456,31460,31464,31468,31472,31476,31480,31484],{"type":29,"tag":117,"props":31449,"children":31450},{"style":5976},[31451],{"type":34,"value":29943},{"type":29,"tag":117,"props":31453,"children":31454},{"style":378},[31455],{"type":34,"value":29948},{"type":29,"tag":117,"props":31457,"children":31458},{"style":160},[31459],{"type":34,"value":6061},{"type":29,"tag":117,"props":31461,"children":31462},{"style":143},[31463],{"type":34,"value":6066},{"type":29,"tag":117,"props":31465,"children":31466},{"style":372},[31467],{"type":34,"value":18634},{"type":29,"tag":117,"props":31469,"children":31470},{"style":384},[31471],{"type":34,"value":1108},{"type":29,"tag":117,"props":31473,"children":31474},{"style":3476},[31475],{"type":34,"value":2233},{"type":29,"tag":117,"props":31477,"children":31478},{"style":384},[31479],{"type":34,"value":1118},{"type":29,"tag":117,"props":31481,"children":31482},{"style":3476},[31483],{"type":34,"value":12770},{"type":29,"tag":117,"props":31485,"children":31486},{"style":384},[31487],{"type":34,"value":5675},{"type":29,"tag":117,"props":31489,"children":31490},{"class":119,"line":304},[31491,31495,31499,31503],{"type":29,"tag":117,"props":31492,"children":31493},{"style":372},[31494],{"type":34,"value":29988},{"type":29,"tag":117,"props":31496,"children":31497},{"style":384},[31498],{"type":34,"value":1108},{"type":29,"tag":117,"props":31500,"children":31501},{"style":378},[31502],{"type":34,"value":29997},{"type":29,"tag":117,"props":31504,"children":31505},{"style":384},[31506],{"type":34,"value":5675},{"type":29,"tag":117,"props":31508,"children":31509},{"class":119,"line":313},[31510],{"type":29,"tag":117,"props":31511,"children":31512},{"emptyLinePlaceholder":13},[31513],{"type":34,"value":136},{"type":29,"tag":117,"props":31515,"children":31516},{"class":119,"line":322},[31517],{"type":29,"tag":117,"props":31518,"children":31519},{"style":124},[31520],{"type":34,"value":30016},{"type":29,"tag":117,"props":31522,"children":31523},{"class":119,"line":331},[31524,31528,31532,31536,31540,31544,31548,31552],{"type":29,"tag":117,"props":31525,"children":31526},{"style":5976},[31527],{"type":34,"value":30024},{"type":29,"tag":117,"props":31529,"children":31530},{"style":378},[31531],{"type":34,"value":30029},{"type":29,"tag":117,"props":31533,"children":31534},{"style":160},[31535],{"type":34,"value":6061},{"type":29,"tag":117,"props":31537,"children":31538},{"style":143},[31539],{"type":34,"value":6066},{"type":29,"tag":117,"props":31541,"children":31542},{"style":372},[31543],{"type":34,"value":29309},{"type":29,"tag":117,"props":31545,"children":31546},{"style":384},[31547],{"type":34,"value":1108},{"type":29,"tag":117,"props":31549,"children":31550},{"style":3476},[31551],{"type":34,"value":29759},{"type":29,"tag":117,"props":31553,"children":31554},{"style":384},[31555],{"type":34,"value":5675},{"type":29,"tag":117,"props":31557,"children":31558},{"class":119,"line":340},[31559],{"type":29,"tag":117,"props":31560,"children":31561},{"emptyLinePlaceholder":13},[31562],{"type":34,"value":136},{"type":29,"tag":117,"props":31564,"children":31565},{"class":119,"line":348},[31566],{"type":29,"tag":117,"props":31567,"children":31568},{"emptyLinePlaceholder":13},[31569],{"type":34,"value":136},{"type":29,"tag":117,"props":31571,"children":31572},{"class":119,"line":357},[31573,31578,31582,31586],{"type":29,"tag":117,"props":31574,"children":31575},{"style":372},[31576],{"type":34,"value":31577},"        testerCarre",{"type":29,"tag":117,"props":31579,"children":31580},{"style":384},[31581],{"type":34,"value":1108},{"type":29,"tag":117,"props":31583,"children":31584},{"style":378},[31585],{"type":34,"value":30069},{"type":29,"tag":117,"props":31587,"children":31588},{"style":384},[31589],{"type":34,"value":5675},{"type":29,"tag":117,"props":31591,"children":31592},{"class":119,"line":1768},[31593],{"type":29,"tag":117,"props":31594,"children":31595},{"style":384},[31596],{"type":34,"value":5632},{"type":29,"tag":117,"props":31598,"children":31599},{"class":119,"line":953},[31600],{"type":29,"tag":117,"props":31601,"children":31602},{"style":384},[31603],{"type":34,"value":2903},{"type":29,"tag":7528,"props":31605,"children":31607},{"id":31606},"résultat-1",[31608],{"type":34,"value":30093},{"type":29,"tag":1585,"props":31610,"children":31611},{},[31612,31623],{"type":29,"tag":1589,"props":31613,"children":31614},{},[31615,31616,31621],{"type":34,"value":7167},{"type":29,"tag":113,"props":31617,"children":31619},{"className":31618},[],[31620],{"type":34,"value":18577},{"type":34,"value":31622}," fonctionne comme prévu : l'aire est de 50.",{"type":29,"tag":1589,"props":31624,"children":31625},{},[31626,31627,31632],{"type":34,"value":7167},{"type":29,"tag":113,"props":31628,"children":31630},{"className":31629},[],[31631],{"type":34,"value":29285},{"type":34,"value":31633}," fonctionne également correctement : l'aire est de 25 (5 * 5), et le comportement est bien conforme aux attentes.",{"type":29,"tag":4530,"props":31635,"children":31637},{"id":31636},"pourquoi-cela-respecte-t-il-le-lsp",[31638],{"type":34,"value":31639},"Pourquoi cela respecte-t-il le LSP ?",{"type":29,"tag":30,"props":31641,"children":31642},{},[31643,31645,31650,31651,31656,31658,31663,31664,31669],{"type":34,"value":31644},"Dans cette solution, nous avons séparé les deux concepts (",{"type":29,"tag":113,"props":31646,"children":31648},{"className":31647},[],[31649],{"type":34,"value":18577},{"type":34,"value":5923},{"type":29,"tag":113,"props":31652,"children":31654},{"className":31653},[],[31655],{"type":34,"value":29285},{"type":34,"value":31657},") afin que chaque classe respecte ses propres contraintes. Le LSP est respecté car les objets ",{"type":29,"tag":113,"props":31659,"children":31661},{"className":31660},[],[31662],{"type":34,"value":18577},{"type":34,"value":5923},{"type":29,"tag":113,"props":31665,"children":31667},{"className":31666},[],[31668],{"type":34,"value":29285},{"type":34,"value":31670}," ne sont plus liés par une relation d’héritage qui pourrait potentiellement briser les attentes du programme.",{"type":29,"tag":4530,"props":31672,"children":31674},{"id":31673},"autre-approche-utiliser-une-interface-commune",[31675],{"type":34,"value":31676},"Autre approche : utiliser une interface commune",{"type":29,"tag":30,"props":31678,"children":31679},{},[31680,31682,31687],{"type":34,"value":31681},"Si vous souhaitez toujours utiliser l’héritage ou l’interchangeabilité, une meilleure approche serait d’introduire une interface commune ",{"type":29,"tag":113,"props":31683,"children":31685},{"className":31684},[],[31686],{"type":34,"value":28740},{"type":34,"value":31688}," que les deux classes pourraient implémenter. Ainsi, elles partageraient des comportements communs tout en ayant leurs propres implémentations spécifiques.",{"type":29,"tag":7528,"props":31690,"children":31692},{"id":31691},"exemple-avec-une-interface-commune",[31693],{"type":34,"value":31694},"Exemple avec une interface commune",{"type":29,"tag":106,"props":31696,"children":31698},{"className":5519,"code":31697,"language":5521,"meta":8,"style":8},"public interface Forme {\n    int calculerAire();\n}\n\npublic class Rectangle implements Forme {\n    private int largeur;\n    private int hauteur;\n\n    public Rectangle(int largeur, int hauteur) {\n        this.largeur = largeur;\n        this.hauteur = hauteur;\n    }\n\n    @Override\n    public int calculerAire() {\n        return largeur * hauteur;\n    }\n}\n\npublic class Carre implements Forme {\n    private int taille;\n\n    public Carre(int taille) {\n        this.taille = taille;\n    }\n\n    @Override\n    public int calculerAire() {\n        return taille * taille;\n    }\n}\n",[31699],{"type":29,"tag":113,"props":31700,"children":31701},{"__ignoreMap":8},[31702,31722,31738,31745,31752,31779,31798,31817,31824,31867,31894,31921,31928,31935,31946,31969,31992,31999,32006,32013,32040,32059,32066,32097,32124,32131,32138,32149,32172,32196,32203],{"type":29,"tag":117,"props":31703,"children":31704},{"class":119,"line":120},[31705,31709,31713,31718],{"type":29,"tag":117,"props":31706,"children":31707},{"style":143},[31708],{"type":34,"value":5541},{"type":29,"tag":117,"props":31710,"children":31711},{"style":143},[31712],{"type":34,"value":8561},{"type":29,"tag":117,"props":31714,"children":31715},{"style":2863},[31716],{"type":34,"value":31717}," Forme",{"type":29,"tag":117,"props":31719,"children":31720},{"style":384},[31721],{"type":34,"value":3461},{"type":29,"tag":117,"props":31723,"children":31724},{"class":119,"line":130},[31725,31730,31734],{"type":29,"tag":117,"props":31726,"children":31727},{"style":143},[31728],{"type":34,"value":31729},"    int",{"type":29,"tag":117,"props":31731,"children":31732},{"style":372},[31733],{"type":34,"value":29198},{"type":29,"tag":117,"props":31735,"children":31736},{"style":384},[31737],{"type":34,"value":9375},{"type":29,"tag":117,"props":31739,"children":31740},{"class":119,"line":139},[31741],{"type":29,"tag":117,"props":31742,"children":31743},{"style":384},[31744],{"type":34,"value":2903},{"type":29,"tag":117,"props":31746,"children":31747},{"class":119,"line":172},[31748],{"type":29,"tag":117,"props":31749,"children":31750},{"emptyLinePlaceholder":13},[31751],{"type":34,"value":136},{"type":29,"tag":117,"props":31753,"children":31754},{"class":119,"line":181},[31755,31759,31763,31767,31771,31775],{"type":29,"tag":117,"props":31756,"children":31757},{"style":143},[31758],{"type":34,"value":5541},{"type":29,"tag":117,"props":31760,"children":31761},{"style":143},[31762],{"type":34,"value":7575},{"type":29,"tag":117,"props":31764,"children":31765},{"style":2863},[31766],{"type":34,"value":18634},{"type":29,"tag":117,"props":31768,"children":31769},{"style":143},[31770],{"type":34,"value":8636},{"type":29,"tag":117,"props":31772,"children":31773},{"style":2863},[31774],{"type":34,"value":31717},{"type":29,"tag":117,"props":31776,"children":31777},{"style":384},[31778],{"type":34,"value":3461},{"type":29,"tag":117,"props":31780,"children":31781},{"class":119,"line":189},[31782,31786,31790,31794],{"type":29,"tag":117,"props":31783,"children":31784},{"style":143},[31785],{"type":34,"value":7592},{"type":29,"tag":117,"props":31787,"children":31788},{"style":143},[31789],{"type":34,"value":5546},{"type":29,"tag":117,"props":31791,"children":31792},{"style":378},[31793],{"type":34,"value":28885},{"type":29,"tag":117,"props":31795,"children":31796},{"style":384},[31797],{"type":34,"value":387},{"type":29,"tag":117,"props":31799,"children":31800},{"class":119,"line":198},[31801,31805,31809,31813],{"type":29,"tag":117,"props":31802,"children":31803},{"style":143},[31804],{"type":34,"value":7592},{"type":29,"tag":117,"props":31806,"children":31807},{"style":143},[31808],{"type":34,"value":5546},{"type":29,"tag":117,"props":31810,"children":31811},{"style":378},[31812],{"type":34,"value":12937},{"type":29,"tag":117,"props":31814,"children":31815},{"style":384},[31816],{"type":34,"value":387},{"type":29,"tag":117,"props":31818,"children":31819},{"class":119,"line":207},[31820],{"type":29,"tag":117,"props":31821,"children":31822},{"emptyLinePlaceholder":13},[31823],{"type":34,"value":136},{"type":29,"tag":117,"props":31825,"children":31826},{"class":119,"line":215},[31827,31831,31835,31839,31843,31847,31851,31855,31859,31863],{"type":29,"tag":117,"props":31828,"children":31829},{"style":143},[31830],{"type":34,"value":7641},{"type":29,"tag":117,"props":31832,"children":31833},{"style":372},[31834],{"type":34,"value":18634},{"type":29,"tag":117,"props":31836,"children":31837},{"style":384},[31838],{"type":34,"value":1108},{"type":29,"tag":117,"props":31840,"children":31841},{"style":143},[31842],{"type":34,"value":5560},{"type":29,"tag":117,"props":31844,"children":31845},{"style":7657},[31846],{"type":34,"value":28885},{"type":29,"tag":117,"props":31848,"children":31849},{"style":384},[31850],{"type":34,"value":1118},{"type":29,"tag":117,"props":31852,"children":31853},{"style":143},[31854],{"type":34,"value":5546},{"type":29,"tag":117,"props":31856,"children":31857},{"style":7657},[31858],{"type":34,"value":12937},{"type":29,"tag":117,"props":31860,"children":31861},{"style":384},[31862],{"type":34,"value":2803},{"type":29,"tag":117,"props":31864,"children":31865},{"style":384},[31866],{"type":34,"value":3461},{"type":29,"tag":117,"props":31868,"children":31869},{"class":119,"line":224},[31870,31874,31878,31882,31886,31890],{"type":29,"tag":117,"props":31871,"children":31872},{"style":6700},[31873],{"type":34,"value":7687},{"type":29,"tag":117,"props":31875,"children":31876},{"style":384},[31877],{"type":34,"value":369},{"type":29,"tag":117,"props":31879,"children":31880},{"style":378},[31881],{"type":34,"value":28974},{"type":29,"tag":117,"props":31883,"children":31884},{"style":160},[31885],{"type":34,"value":6061},{"type":29,"tag":117,"props":31887,"children":31888},{"style":378},[31889],{"type":34,"value":28885},{"type":29,"tag":117,"props":31891,"children":31892},{"style":384},[31893],{"type":34,"value":387},{"type":29,"tag":117,"props":31895,"children":31896},{"class":119,"line":233},[31897,31901,31905,31909,31913,31917],{"type":29,"tag":117,"props":31898,"children":31899},{"style":6700},[31900],{"type":34,"value":7687},{"type":29,"tag":117,"props":31902,"children":31903},{"style":384},[31904],{"type":34,"value":369},{"type":29,"tag":117,"props":31906,"children":31907},{"style":378},[31908],{"type":34,"value":29002},{"type":29,"tag":117,"props":31910,"children":31911},{"style":160},[31912],{"type":34,"value":6061},{"type":29,"tag":117,"props":31914,"children":31915},{"style":378},[31916],{"type":34,"value":12937},{"type":29,"tag":117,"props":31918,"children":31919},{"style":384},[31920],{"type":34,"value":387},{"type":29,"tag":117,"props":31922,"children":31923},{"class":119,"line":242},[31924],{"type":29,"tag":117,"props":31925,"children":31926},{"style":384},[31927],{"type":34,"value":5632},{"type":29,"tag":117,"props":31929,"children":31930},{"class":119,"line":251},[31931],{"type":29,"tag":117,"props":31932,"children":31933},{"emptyLinePlaceholder":13},[31934],{"type":34,"value":136},{"type":29,"tag":117,"props":31936,"children":31937},{"class":119,"line":260},[31938,31942],{"type":29,"tag":117,"props":31939,"children":31940},{"style":10083},[31941],{"type":34,"value":10086},{"type":29,"tag":117,"props":31943,"children":31944},{"style":10089},[31945],{"type":34,"value":17746},{"type":29,"tag":117,"props":31947,"children":31948},{"class":119,"line":269},[31949,31953,31957,31961,31965],{"type":29,"tag":117,"props":31950,"children":31951},{"style":143},[31952],{"type":34,"value":7641},{"type":29,"tag":117,"props":31954,"children":31955},{"style":143},[31956],{"type":34,"value":5546},{"type":29,"tag":117,"props":31958,"children":31959},{"style":372},[31960],{"type":34,"value":29198},{"type":29,"tag":117,"props":31962,"children":31963},{"style":384},[31964],{"type":34,"value":381},{"type":29,"tag":117,"props":31966,"children":31967},{"style":384},[31968],{"type":34,"value":3461},{"type":29,"tag":117,"props":31970,"children":31971},{"class":119,"line":278},[31972,31976,31980,31984,31988],{"type":29,"tag":117,"props":31973,"children":31974},{"style":143},[31975],{"type":34,"value":5616},{"type":29,"tag":117,"props":31977,"children":31978},{"style":378},[31979],{"type":34,"value":12864},{"type":29,"tag":117,"props":31981,"children":31982},{"style":160},[31983],{"type":34,"value":5649},{"type":29,"tag":117,"props":31985,"children":31986},{"style":378},[31987],{"type":34,"value":12937},{"type":29,"tag":117,"props":31989,"children":31990},{"style":384},[31991],{"type":34,"value":387},{"type":29,"tag":117,"props":31993,"children":31994},{"class":119,"line":286},[31995],{"type":29,"tag":117,"props":31996,"children":31997},{"style":384},[31998],{"type":34,"value":5632},{"type":29,"tag":117,"props":32000,"children":32001},{"class":119,"line":295},[32002],{"type":29,"tag":117,"props":32003,"children":32004},{"style":384},[32005],{"type":34,"value":2903},{"type":29,"tag":117,"props":32007,"children":32008},{"class":119,"line":304},[32009],{"type":29,"tag":117,"props":32010,"children":32011},{"emptyLinePlaceholder":13},[32012],{"type":34,"value":136},{"type":29,"tag":117,"props":32014,"children":32015},{"class":119,"line":313},[32016,32020,32024,32028,32032,32036],{"type":29,"tag":117,"props":32017,"children":32018},{"style":143},[32019],{"type":34,"value":5541},{"type":29,"tag":117,"props":32021,"children":32022},{"style":143},[32023],{"type":34,"value":7575},{"type":29,"tag":117,"props":32025,"children":32026},{"style":2863},[32027],{"type":34,"value":29309},{"type":29,"tag":117,"props":32029,"children":32030},{"style":143},[32031],{"type":34,"value":8636},{"type":29,"tag":117,"props":32033,"children":32034},{"style":2863},[32035],{"type":34,"value":31717},{"type":29,"tag":117,"props":32037,"children":32038},{"style":384},[32039],{"type":34,"value":3461},{"type":29,"tag":117,"props":32041,"children":32042},{"class":119,"line":322},[32043,32047,32051,32055],{"type":29,"tag":117,"props":32044,"children":32045},{"style":143},[32046],{"type":34,"value":7592},{"type":29,"tag":117,"props":32048,"children":32049},{"style":143},[32050],{"type":34,"value":5546},{"type":29,"tag":117,"props":32052,"children":32053},{"style":378},[32054],{"type":34,"value":29352},{"type":29,"tag":117,"props":32056,"children":32057},{"style":384},[32058],{"type":34,"value":387},{"type":29,"tag":117,"props":32060,"children":32061},{"class":119,"line":331},[32062],{"type":29,"tag":117,"props":32063,"children":32064},{"emptyLinePlaceholder":13},[32065],{"type":34,"value":136},{"type":29,"tag":117,"props":32067,"children":32068},{"class":119,"line":340},[32069,32073,32077,32081,32085,32089,32093],{"type":29,"tag":117,"props":32070,"children":32071},{"style":143},[32072],{"type":34,"value":7641},{"type":29,"tag":117,"props":32074,"children":32075},{"style":372},[32076],{"type":34,"value":29309},{"type":29,"tag":117,"props":32078,"children":32079},{"style":384},[32080],{"type":34,"value":1108},{"type":29,"tag":117,"props":32082,"children":32083},{"style":143},[32084],{"type":34,"value":5560},{"type":29,"tag":117,"props":32086,"children":32087},{"style":7657},[32088],{"type":34,"value":29352},{"type":29,"tag":117,"props":32090,"children":32091},{"style":384},[32092],{"type":34,"value":2803},{"type":29,"tag":117,"props":32094,"children":32095},{"style":384},[32096],{"type":34,"value":3461},{"type":29,"tag":117,"props":32098,"children":32099},{"class":119,"line":348},[32100,32104,32108,32112,32116,32120],{"type":29,"tag":117,"props":32101,"children":32102},{"style":6700},[32103],{"type":34,"value":7687},{"type":29,"tag":117,"props":32105,"children":32106},{"style":384},[32107],{"type":34,"value":369},{"type":29,"tag":117,"props":32109,"children":32110},{"style":378},[32111],{"type":34,"value":30770},{"type":29,"tag":117,"props":32113,"children":32114},{"style":160},[32115],{"type":34,"value":6061},{"type":29,"tag":117,"props":32117,"children":32118},{"style":378},[32119],{"type":34,"value":29352},{"type":29,"tag":117,"props":32121,"children":32122},{"style":384},[32123],{"type":34,"value":387},{"type":29,"tag":117,"props":32125,"children":32126},{"class":119,"line":357},[32127],{"type":29,"tag":117,"props":32128,"children":32129},{"style":384},[32130],{"type":34,"value":5632},{"type":29,"tag":117,"props":32132,"children":32133},{"class":119,"line":1768},[32134],{"type":29,"tag":117,"props":32135,"children":32136},{"emptyLinePlaceholder":13},[32137],{"type":34,"value":136},{"type":29,"tag":117,"props":32139,"children":32140},{"class":119,"line":953},[32141,32145],{"type":29,"tag":117,"props":32142,"children":32143},{"style":10083},[32144],{"type":34,"value":10086},{"type":29,"tag":117,"props":32146,"children":32147},{"style":10089},[32148],{"type":34,"value":17746},{"type":29,"tag":117,"props":32150,"children":32151},{"class":119,"line":9833},[32152,32156,32160,32164,32168],{"type":29,"tag":117,"props":32153,"children":32154},{"style":143},[32155],{"type":34,"value":7641},{"type":29,"tag":117,"props":32157,"children":32158},{"style":143},[32159],{"type":34,"value":5546},{"type":29,"tag":117,"props":32161,"children":32162},{"style":372},[32163],{"type":34,"value":29198},{"type":29,"tag":117,"props":32165,"children":32166},{"style":384},[32167],{"type":34,"value":381},{"type":29,"tag":117,"props":32169,"children":32170},{"style":384},[32171],{"type":34,"value":3461},{"type":29,"tag":117,"props":32173,"children":32174},{"class":119,"line":9870},[32175,32179,32184,32188,32192],{"type":29,"tag":117,"props":32176,"children":32177},{"style":143},[32178],{"type":34,"value":5616},{"type":29,"tag":117,"props":32180,"children":32181},{"style":378},[32182],{"type":34,"value":32183}," taille ",{"type":29,"tag":117,"props":32185,"children":32186},{"style":160},[32187],{"type":34,"value":5649},{"type":29,"tag":117,"props":32189,"children":32190},{"style":378},[32191],{"type":34,"value":29352},{"type":29,"tag":117,"props":32193,"children":32194},{"style":384},[32195],{"type":34,"value":387},{"type":29,"tag":117,"props":32197,"children":32198},{"class":119,"line":9901},[32199],{"type":29,"tag":117,"props":32200,"children":32201},{"style":384},[32202],{"type":34,"value":5632},{"type":29,"tag":117,"props":32204,"children":32205},{"class":119,"line":9909},[32206],{"type":29,"tag":117,"props":32207,"children":32208},{"style":384},[32209],{"type":34,"value":2903},{"type":29,"tag":7528,"props":32211,"children":32213},{"id":32212},"exemple-dutilisation",[32214],{"type":34,"value":32215},"Exemple d'utilisation :",{"type":29,"tag":106,"props":32217,"children":32219},{"className":5519,"code":32218,"language":5521,"meta":8,"style":8},"public class Main {\n\n    public static void afficherAire(Forme forme) {\n        System.out.println(\"Aire calculée : \" + forme.calculerAire());\n    }\n\n    public static void main(String[] args) {\n        Forme rectangle = new Rectangle(5, 10);\n        Forme carre = new Carre(5);\n\n        afficherAire(rectangle);  \u002F\u002F Aire calculée : 50\n        afficherAire(carre);      \u002F\u002F Aire calculée : 25\n    }\n}\n",[32220],{"type":29,"tag":113,"props":32221,"children":32222},{"__ignoreMap":8},[32223,32242,32249,32290,32342,32349,32356,32399,32444,32479,32486,32512,32536,32543],{"type":29,"tag":117,"props":32224,"children":32225},{"class":119,"line":120},[32226,32230,32234,32238],{"type":29,"tag":117,"props":32227,"children":32228},{"style":143},[32229],{"type":34,"value":5541},{"type":29,"tag":117,"props":32231,"children":32232},{"style":143},[32233],{"type":34,"value":7575},{"type":29,"tag":117,"props":32235,"children":32236},{"style":2863},[32237],{"type":34,"value":18217},{"type":29,"tag":117,"props":32239,"children":32240},{"style":384},[32241],{"type":34,"value":3461},{"type":29,"tag":117,"props":32243,"children":32244},{"class":119,"line":130},[32245],{"type":29,"tag":117,"props":32246,"children":32247},{"emptyLinePlaceholder":13},[32248],{"type":34,"value":136},{"type":29,"tag":117,"props":32250,"children":32251},{"class":119,"line":139},[32252,32256,32260,32264,32269,32273,32277,32282,32286],{"type":29,"tag":117,"props":32253,"children":32254},{"style":143},[32255],{"type":34,"value":7641},{"type":29,"tag":117,"props":32257,"children":32258},{"style":143},[32259],{"type":34,"value":9213},{"type":29,"tag":117,"props":32261,"children":32262},{"style":143},[32263],{"type":34,"value":7762},{"type":29,"tag":117,"props":32265,"children":32266},{"style":372},[32267],{"type":34,"value":32268}," afficherAire",{"type":29,"tag":117,"props":32270,"children":32271},{"style":384},[32272],{"type":34,"value":1108},{"type":29,"tag":117,"props":32274,"children":32275},{"style":5976},[32276],{"type":34,"value":28740},{"type":29,"tag":117,"props":32278,"children":32279},{"style":7657},[32280],{"type":34,"value":32281}," forme",{"type":29,"tag":117,"props":32283,"children":32284},{"style":384},[32285],{"type":34,"value":2803},{"type":29,"tag":117,"props":32287,"children":32288},{"style":384},[32289],{"type":34,"value":3461},{"type":29,"tag":117,"props":32291,"children":32292},{"class":119,"line":172},[32293,32297,32301,32305,32309,32313,32317,32322,32326,32330,32334,32338],{"type":29,"tag":117,"props":32294,"children":32295},{"style":378},[32296],{"type":34,"value":16717},{"type":29,"tag":117,"props":32298,"children":32299},{"style":384},[32300],{"type":34,"value":369},{"type":29,"tag":117,"props":32302,"children":32303},{"style":378},[32304],{"type":34,"value":15075},{"type":29,"tag":117,"props":32306,"children":32307},{"style":384},[32308],{"type":34,"value":369},{"type":29,"tag":117,"props":32310,"children":32311},{"style":372},[32312],{"type":34,"value":15084},{"type":29,"tag":117,"props":32314,"children":32315},{"style":384},[32316],{"type":34,"value":1108},{"type":29,"tag":117,"props":32318,"children":32319},{"style":166},[32320],{"type":34,"value":32321},"\"Aire calculée : \"",{"type":29,"tag":117,"props":32323,"children":32324},{"style":160},[32325],{"type":34,"value":15098},{"type":29,"tag":117,"props":32327,"children":32328},{"style":378},[32329],{"type":34,"value":32281},{"type":29,"tag":117,"props":32331,"children":32332},{"style":384},[32333],{"type":34,"value":369},{"type":29,"tag":117,"props":32335,"children":32336},{"style":372},[32337],{"type":34,"value":29821},{"type":29,"tag":117,"props":32339,"children":32340},{"style":384},[32341],{"type":34,"value":6430},{"type":29,"tag":117,"props":32343,"children":32344},{"class":119,"line":181},[32345],{"type":29,"tag":117,"props":32346,"children":32347},{"style":384},[32348],{"type":34,"value":5632},{"type":29,"tag":117,"props":32350,"children":32351},{"class":119,"line":189},[32352],{"type":29,"tag":117,"props":32353,"children":32354},{"emptyLinePlaceholder":13},[32355],{"type":34,"value":136},{"type":29,"tag":117,"props":32357,"children":32358},{"class":119,"line":198},[32359,32363,32367,32371,32375,32379,32383,32387,32391,32395],{"type":29,"tag":117,"props":32360,"children":32361},{"style":143},[32362],{"type":34,"value":7641},{"type":29,"tag":117,"props":32364,"children":32365},{"style":143},[32366],{"type":34,"value":9213},{"type":29,"tag":117,"props":32368,"children":32369},{"style":143},[32370],{"type":34,"value":7762},{"type":29,"tag":117,"props":32372,"children":32373},{"style":372},[32374],{"type":34,"value":18241},{"type":29,"tag":117,"props":32376,"children":32377},{"style":384},[32378],{"type":34,"value":1108},{"type":29,"tag":117,"props":32380,"children":32381},{"style":143},[32382],{"type":34,"value":7654},{"type":29,"tag":117,"props":32384,"children":32385},{"style":384},[32386],{"type":34,"value":2872},{"type":29,"tag":117,"props":32388,"children":32389},{"style":7657},[32390],{"type":34,"value":18258},{"type":29,"tag":117,"props":32392,"children":32393},{"style":384},[32394],{"type":34,"value":2803},{"type":29,"tag":117,"props":32396,"children":32397},{"style":384},[32398],{"type":34,"value":3461},{"type":29,"tag":117,"props":32400,"children":32401},{"class":119,"line":207},[32402,32407,32412,32416,32420,32424,32428,32432,32436,32440],{"type":29,"tag":117,"props":32403,"children":32404},{"style":5976},[32405],{"type":34,"value":32406},"        Forme",{"type":29,"tag":117,"props":32408,"children":32409},{"style":378},[32410],{"type":34,"value":32411}," rectangle ",{"type":29,"tag":117,"props":32413,"children":32414},{"style":160},[32415],{"type":34,"value":6061},{"type":29,"tag":117,"props":32417,"children":32418},{"style":143},[32419],{"type":34,"value":6066},{"type":29,"tag":117,"props":32421,"children":32422},{"style":372},[32423],{"type":34,"value":18634},{"type":29,"tag":117,"props":32425,"children":32426},{"style":384},[32427],{"type":34,"value":1108},{"type":29,"tag":117,"props":32429,"children":32430},{"style":3476},[32431],{"type":34,"value":29759},{"type":29,"tag":117,"props":32433,"children":32434},{"style":384},[32435],{"type":34,"value":1118},{"type":29,"tag":117,"props":32437,"children":32438},{"style":3476},[32439],{"type":34,"value":13119},{"type":29,"tag":117,"props":32441,"children":32442},{"style":384},[32443],{"type":34,"value":5675},{"type":29,"tag":117,"props":32445,"children":32446},{"class":119,"line":215},[32447,32451,32455,32459,32463,32467,32471,32475],{"type":29,"tag":117,"props":32448,"children":32449},{"style":5976},[32450],{"type":34,"value":32406},{"type":29,"tag":117,"props":32452,"children":32453},{"style":378},[32454],{"type":34,"value":30029},{"type":29,"tag":117,"props":32456,"children":32457},{"style":160},[32458],{"type":34,"value":6061},{"type":29,"tag":117,"props":32460,"children":32461},{"style":143},[32462],{"type":34,"value":6066},{"type":29,"tag":117,"props":32464,"children":32465},{"style":372},[32466],{"type":34,"value":29309},{"type":29,"tag":117,"props":32468,"children":32469},{"style":384},[32470],{"type":34,"value":1108},{"type":29,"tag":117,"props":32472,"children":32473},{"style":3476},[32474],{"type":34,"value":29759},{"type":29,"tag":117,"props":32476,"children":32477},{"style":384},[32478],{"type":34,"value":5675},{"type":29,"tag":117,"props":32480,"children":32481},{"class":119,"line":224},[32482],{"type":29,"tag":117,"props":32483,"children":32484},{"emptyLinePlaceholder":13},[32485],{"type":34,"value":136},{"type":29,"tag":117,"props":32487,"children":32488},{"class":119,"line":233},[32489,32494,32498,32503,32507],{"type":29,"tag":117,"props":32490,"children":32491},{"style":372},[32492],{"type":34,"value":32493},"        afficherAire",{"type":29,"tag":117,"props":32495,"children":32496},{"style":384},[32497],{"type":34,"value":1108},{"type":29,"tag":117,"props":32499,"children":32500},{"style":378},[32501],{"type":34,"value":32502},"rectangle",{"type":29,"tag":117,"props":32504,"children":32505},{"style":384},[32506],{"type":34,"value":10282},{"type":29,"tag":117,"props":32508,"children":32509},{"style":124},[32510],{"type":34,"value":32511},"  \u002F\u002F Aire calculée : 50\n",{"type":29,"tag":117,"props":32513,"children":32514},{"class":119,"line":242},[32515,32519,32523,32527,32531],{"type":29,"tag":117,"props":32516,"children":32517},{"style":372},[32518],{"type":34,"value":32493},{"type":29,"tag":117,"props":32520,"children":32521},{"style":384},[32522],{"type":34,"value":1108},{"type":29,"tag":117,"props":32524,"children":32525},{"style":378},[32526],{"type":34,"value":30069},{"type":29,"tag":117,"props":32528,"children":32529},{"style":384},[32530],{"type":34,"value":10282},{"type":29,"tag":117,"props":32532,"children":32533},{"style":124},[32534],{"type":34,"value":32535},"      \u002F\u002F Aire calculée : 25\n",{"type":29,"tag":117,"props":32537,"children":32538},{"class":119,"line":251},[32539],{"type":29,"tag":117,"props":32540,"children":32541},{"style":384},[32542],{"type":34,"value":5632},{"type":29,"tag":117,"props":32544,"children":32545},{"class":119,"line":260},[32546],{"type":29,"tag":117,"props":32547,"children":32548},{"style":384},[32549],{"type":34,"value":2903},{"type":29,"tag":51,"props":32551,"children":32552},{},[],{"type":29,"tag":55,"props":32554,"children":32556},{"id":32555},"conclusion-et-conseils-pratiques",[32557],{"type":34,"value":32558},"Conclusion et conseils pratiques",{"type":29,"tag":30,"props":32560,"children":32561},{},[32562],{"type":34,"value":32563},"Le principe de substitution de Liskov est fondamental pour qu'une hiérarchie d'objets se comporte comme prévu. Le respecter rend votre code extensible et prévient les erreurs liées aux comportements inattendus des sous-classes.",{"type":29,"tag":4530,"props":32565,"children":32567},{"id":32566},"récapitulatif-des-points-clés",[32568],{"type":34,"value":32569},"Récapitulatif des points clés :",{"type":29,"tag":1585,"props":32571,"children":32572},{},[32573,32578,32583],{"type":29,"tag":1589,"props":32574,"children":32575},{},[32576],{"type":34,"value":32577},"Le LSP exige que les sous-classes puissent être utilisées de manière interchangeable avec les classes parentes sans modifier le comportement attendu.",{"type":29,"tag":1589,"props":32579,"children":32580},{},[32581],{"type":34,"value":32582},"Une sous-classe qui modifie les règles d'une classe parente brise le LSP.",{"type":29,"tag":1589,"props":32584,"children":32585},{},[32586],{"type":34,"value":32587},"Il est parfois préférable d’utiliser des interfaces ou la composition pour éviter les problèmes d’héritage tout en respectant le LSP.",{"type":29,"tag":4530,"props":32589,"children":32591},{"id":32590},"conseils-pratiques",[32592],{"type":34,"value":32593},"Conseils pratiques :",{"type":29,"tag":1585,"props":32595,"children":32596},{},[32597,32602,32607],{"type":29,"tag":1589,"props":32598,"children":32599},{},[32600],{"type":34,"value":32601},"Testez régulièrement votre code pour vérifier que les sous-classes respectent bien le comportement des classes parentes.",{"type":29,"tag":1589,"props":32603,"children":32604},{},[32605],{"type":34,"value":32606},"Utilisez des interfaces ou la composition lorsque cela est possible, surtout si vous constatez que l’héritage ne correspond pas bien à votre modèle d’objet.",{"type":29,"tag":1589,"props":32608,"children":32609},{},[32610],{"type":34,"value":32611},"Appliquez le LSP avec souplesse, en l’adaptant à vos besoins de conception, mais gardez en tête son importance pour éviter des bugs difficiles à identifier.",{"type":29,"tag":51,"props":32613,"children":32614},{},[],{"type":29,"tag":567,"props":32616,"children":32618},{"cta":805,"href":806,"title":32617,"type":808},"Le LSP n'est qu'une pratique parmi 100 pour concevoir une hiérarchie qui tient",[32619],{"type":29,"tag":30,"props":32620,"children":32621},{},[32622],{"type":34,"value":32623},"Cet article décortique une seule règle de conception : qu'une sous-classe respecte le contrat de sa parente. Le Craft Bundle réunit les 100 pratiques que j'applique au quotidien pour modéliser des objets propres, du choix entre héritage et composition jusqu'aux tests qui attrapent une violation de contrat. Ce sont les réflexes que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vus tenir en production.",{"type":29,"tag":51,"props":32625,"children":32626},{},[],{"type":29,"tag":55,"props":32628,"children":32630},{"id":32629},"faq-sur-le-principe-de-substitution-de-liskov-lsp",[32631],{"type":34,"value":32632},"FAQ sur le principe de substitution de Liskov (LSP)",{"type":29,"tag":825,"props":32634,"children":32635},{},[32636,32641],{"type":29,"tag":829,"props":32637,"children":32638},{},[32639],{"type":34,"value":32640},"1. Qu’est-ce que le LSP exactement ?",{"type":29,"tag":30,"props":32642,"children":32643},{},[32644],{"type":34,"value":32645},"Le principe de substitution de Liskov (LSP) stipule qu’une sous-classe doit pouvoir remplacer sa classe parente sans altérer le comportement du programme. Si vous utilisez une instance d’une sous-classe à la place d’une classe de base, le programme ne doit pas avoir de comportements inattendus ou incorrects.",{"type":29,"tag":825,"props":32647,"children":32648},{},[32649,32654],{"type":29,"tag":829,"props":32650,"children":32651},{},[32652],{"type":34,"value":32653},"2. Pourquoi est-ce que je dois respecter le LSP ?",{"type":29,"tag":30,"props":32655,"children":32656},{},[32657],{"type":34,"value":32658},"Le LSP garantit l'extensibilité et la maintenabilité de votre code. Sans lui, les sous-classes introduisent des comportements indésirables ou imprévisibles, ce qui complique la détection des bugs et alourdit la maintenance.",{"type":29,"tag":825,"props":32660,"children":32661},{},[32662,32667,32672],{"type":29,"tag":829,"props":32663,"children":32664},{},[32665],{"type":34,"value":32666},"3. Quels sont les signes indiquant que mon code ne respecte pas le LSP ?",{"type":29,"tag":30,"props":32668,"children":32669},{},[32670],{"type":34,"value":32671},"Voici quelques indices de violation du LSP :",{"type":29,"tag":1585,"props":32673,"children":32674},{},[32675,32680,32685],{"type":29,"tag":1589,"props":32676,"children":32677},{},[32678],{"type":34,"value":32679},"Ta sous-classe modifie ou redéfinit des méthodes de la classe parente de manière inattendue.",{"type":29,"tag":1589,"props":32681,"children":32682},{},[32683],{"type":34,"value":32684},"Vous devez modifier le code existant lorsque vous ajoutez une nouvelle sous-classe.",{"type":29,"tag":1589,"props":32686,"children":32687},{},[32688],{"type":34,"value":32689},"La sous-classe ne respecte pas les propriétés définies par la classe parente.",{"type":29,"tag":825,"props":32691,"children":32692},{},[32693,32698],{"type":29,"tag":829,"props":32694,"children":32695},{},[32696],{"type":34,"value":32697},"4. Quelle est la différence entre l’héritage classique et l’application du LSP ?",{"type":29,"tag":30,"props":32699,"children":32700},{},[32701],{"type":34,"value":32702},"L'héritage donne à une classe la capacité de réutiliser le code d'une autre. Le LSP va plus loin : il impose que la sous-classe maintienne le comportement logique attendu de la classe parente, sans en modifier les règles.",{"type":29,"tag":825,"props":32704,"children":32705},{},[32706,32711],{"type":29,"tag":829,"props":32707,"children":32708},{},[32709],{"type":34,"value":32710},"5. Est-ce que le LSP est toujours applicable ?",{"type":29,"tag":30,"props":32712,"children":32713},{},[32714],{"type":34,"value":32715},"Non, le LSP est un principe de conception qui doit être appliqué lorsqu’il est pertinent. Dans certains cas, éviter des hiérarchies complexes en utilisant la composition ou des interfaces peut être une meilleure approche.",{"type":29,"tag":825,"props":32717,"children":32718},{},[32719,32724],{"type":29,"tag":829,"props":32720,"children":32721},{},[32722],{"type":34,"value":32723},"6. Comment tester si mon code respecte le LSP ?",{"type":29,"tag":30,"props":32725,"children":32726},{},[32727],{"type":34,"value":32728},"Une manière de tester est de vérifier que vous pouvez utiliser une instance de la sous-classe à la place de la classe parente sans modifier le comportement du programme. Si des ajustements sont nécessaires, il est probable que le LSP soit violé.",{"type":29,"tag":825,"props":32730,"children":32731},{},[32732,32737],{"type":29,"tag":829,"props":32733,"children":32734},{},[32735],{"type":34,"value":32736},"7. Quelles sont les alternatives si je n’arrive pas à respecter le LSP dans mon code ?",{"type":29,"tag":30,"props":32738,"children":32739},{},[32740],{"type":34,"value":32741},"Si vous avez des difficultés à respecter le LSP, il peut être préférable de repenser la conception. Utiliser des interfaces, la composition plutôt que l’héritage, ou des classes abstraites peut aider à structurer votre code sans violer ce principe.",{"type":29,"tag":51,"props":32743,"children":32744},{},[],{"type":29,"tag":567,"props":32746,"children":32747},{"cta":28617,"href":918,"title":28618,"type":920},[32748],{"type":29,"tag":30,"props":32749,"children":32750},{},[32751],{"type":34,"value":28624},{"type":29,"tag":928,"props":32753,"children":32754},{},[32755],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":32757},[32758,32759,32762,32763,32767,32771],{"id":28669,"depth":130,"text":28672},{"id":28704,"depth":130,"text":28707,"children":32760},[32761],{"id":28780,"depth":139,"text":28783},{"id":28809,"depth":130,"text":28812},{"id":30159,"depth":130,"text":30162,"children":32764},[32765,32766],{"id":31636,"depth":139,"text":31639},{"id":31673,"depth":139,"text":31676},{"id":32555,"depth":130,"text":32558,"children":32768},[32769,32770],{"id":32566,"depth":139,"text":32569},{"id":32590,"depth":139,"text":32593},{"id":32629,"depth":130,"text":32632},"content:fr:architecture-craft:principe-substitution-liskov-lsp-java.md","fr\u002Farchitecture-craft\u002Fprincipe-substitution-liskov-lsp-java.md","fr\u002Farchitecture-craft\u002Fprincipe-substitution-liskov-lsp-java",{"_path":16439,"_dir":16372,"_draft":7,"_partial":7,"_locale":8,"title":32776,"description":32777,"id":32778,"date":32779,"listed":13,"nocomments":7,"hidden":7,"categories":32780,"tags":32781,"cover":32782,"readingTime":32783,"body":32787,"_type":942,"_id":34887,"_source":944,"_file":34888,"_stem":34889,"_extension":947},"Principe OCP en Software Craftsmanship, Guide Complet et Exemples Java","Découvrez comment appliquer le principe OCP (Open\u002FClosed Principle) en Software Craftsmanship. Apprenez avec des exemples concrets en Java à rendre...",42,"2024-01-31",[16372],[5391,18],"covers\u002Farticles\u002Fprincipe-ocp.jpg",{"text":960,"minutes":32784,"time":32785,"words":32786},8.565,513900,1713,{"type":26,"children":32788,"toc":34873},[32789,32795,32800,32812,32823,32826,32832,32855,32860,32873,32878,32884,32904,33296,33308,33330,33335,33341,33346,33880,33899,34014,34019,34027,34030,34039,34045,34072,34105,34113,34131,34134,34140,34145,34151,34156,34161,34656,34668,34676,34679,34685,34690,34734,34747,34760,34763,34769,34774,34791,34800,34803,34807,34820,34833,34846,34859,34862,34869],{"type":29,"tag":55,"props":32790,"children":32792},{"id":32791},"introduction",[32793],{"type":34,"value":32794},"Introduction",{"type":29,"tag":30,"props":32796,"children":32797},{},[32798],{"type":34,"value":32799},"Modifier un morceau de code et casser au passage une fonctionnalité qui marchait : la scène se répète dans toutes les équipes que j'audite. Chaque changement déclenche une cascade de régressions imprévues. La cause profonde est presque toujours la même : le code n'a pas été conçu pour être étendu sans être modifié.",{"type":29,"tag":30,"props":32801,"children":32802},{},[32803,32805,32810],{"type":34,"value":32804},"Le principe OCP (Open\u002FClosed Principle) attaque ce problème de front. Sur des dizaines de missions, j'ai vu le même pattern : à chaque nouvelle règle métier, on retouche du code existant, on casse des tests, la vélocité s'effondre. OCP coupe ce cycle. Le principe, formulé par Bertrand Meyer dans ",{"type":29,"tag":5410,"props":32806,"children":32807},{},[32808],{"type":34,"value":32809},"Object-Oriented Software Construction",{"type":34,"value":32811}," (1988) puis repris par Robert C. Martin parmi les SOLID, pose qu'une fois écrit, un module doit être ouvert aux extensions mais fermé aux modifications.",{"type":29,"tag":30,"props":32813,"children":32814},{},[32815,32817,32821],{"type":34,"value":32816},"Cet article explique ce que recouvre vraiment OCP, son rôle en ",{"type":29,"tag":453,"props":32818,"children":32819},{"href":7134},[32820],{"type":34,"value":13956},{"type":34,"value":32822},", et comment l'appliquer dans des projets Java. Exemples de code à l'appui, avec les pièges classiques à éviter.",{"type":29,"tag":51,"props":32824,"children":32825},{},[],{"type":29,"tag":55,"props":32827,"children":32829},{"id":32828},"quest-ce-que-le-principe-ocp-openclosed-principle",[32830],{"type":34,"value":32831},"Qu’est-ce que le Principe OCP (Open\u002FClosed Principle) ?",{"type":29,"tag":30,"props":32833,"children":32834},{},[32835,32837,32841,32843,32848,32849,32854],{"type":34,"value":32836},"Le principe OCP fait partie des cinq ",{"type":29,"tag":453,"props":32838,"children":32839},{"href":6919},[32840],{"type":34,"value":6922},{"type":34,"value":32842},", qui sont des règles fondamentales pour concevoir du code propre, maintenable et évolutif. OCP signifie \"Ouvert\u002FFermé\", en référence à l'idée que les entités (classes, modules, fonctions) doivent être ",{"type":29,"tag":45,"props":32844,"children":32845},{},[32846],{"type":34,"value":32847},"ouvertes à l’extension",{"type":34,"value":17288},{"type":29,"tag":45,"props":32850,"children":32851},{},[32852],{"type":34,"value":32853},"fermées à la modification",{"type":34,"value":369},{"type":29,"tag":30,"props":32856,"children":32857},{},[32858],{"type":34,"value":32859},"En d’autres termes, une fois qu’une classe ou un module est en production, vous ne devriez pas avoir à le modifier pour ajouter de nouvelles fonctionnalités. Cela peut sembler contradictoire au début : comment peut-on ajouter de nouvelles fonctionnalités sans toucher au code existant ? La réponse réside dans la conception du code dès le départ. Au lieu de modifier le comportement d'une classe, vous devez la rendre extensible via des interfaces, des abstractions ou des classes dérivées.",{"type":29,"tag":5462,"props":32861,"children":32862},{"type":5464},[32863],{"type":29,"tag":30,"props":32864,"children":32865},{},[32866,32871],{"type":29,"tag":45,"props":32867,"children":32868},{},[32869],{"type":34,"value":32870},"Anticipez les axes d'extension qui ont déjà été identifiés",{"type":34,"value":32872}," par le métier (nouveaux types, nouvelles règles connues). Inutile d'abstraire à l'aveugle, c'est du YAGNI. OCP s'applique là où le changement est probable, pas partout.",{"type":29,"tag":30,"props":32874,"children":32875},{},[32876],{"type":34,"value":32877},"Prenons un exemple concret pour illustrer cela.",{"type":29,"tag":4530,"props":32879,"children":32881},{"id":32880},"exemple-1-cas-classique-sans-ocp",[32882],{"type":34,"value":32883},"Exemple 1 : Cas classique sans OCP",{"type":29,"tag":30,"props":32885,"children":32886},{},[32887,32889,32894,32896,32902],{"type":34,"value":32888},"Imaginons que vous développez une application qui calcule les salaires d'employés. Vous avez une classe ",{"type":29,"tag":113,"props":32890,"children":32892},{"className":32891},[],[32893],{"type":34,"value":6491},{"type":34,"value":32895}," avec une méthode ",{"type":29,"tag":113,"props":32897,"children":32899},{"className":32898},[],[32900],{"type":34,"value":32901},"calculateSalary()",{"type":34,"value":32903}," qui calcule le salaire en fonction du type d'employé.",{"type":29,"tag":106,"props":32905,"children":32907},{"className":5519,"code":32906,"language":5521,"meta":8,"style":8},"class Employee {\n    private String type;\n    private double baseSalary;\n\n    public Employee(String type, double baseSalary) {\n        this.type = type;\n        this.baseSalary = baseSalary;\n    }\n\n    public double calculateSalary() {\n        if (type.equals(\"Manager\")) {\n            return baseSalary * 2;\n        } else if (type.equals(\"Developer\")) {\n            return baseSalary * 1.5;\n        } else {\n            return baseSalary;\n        }\n    }\n}\n",[32908],{"type":29,"tag":113,"props":32909,"children":32910},{"__ignoreMap":8},[32911,32926,32945,32965,32972,33015,33043,33071,33078,33085,33108,33148,33173,33221,33245,33260,33275,33282,33289],{"type":29,"tag":117,"props":32912,"children":32913},{"class":119,"line":120},[32914,32918,32922],{"type":29,"tag":117,"props":32915,"children":32916},{"style":143},[32917],{"type":34,"value":16091},{"type":29,"tag":117,"props":32919,"children":32920},{"style":2863},[32921],{"type":34,"value":7580},{"type":29,"tag":117,"props":32923,"children":32924},{"style":384},[32925],{"type":34,"value":3461},{"type":29,"tag":117,"props":32927,"children":32928},{"class":119,"line":130},[32929,32933,32937,32941],{"type":29,"tag":117,"props":32930,"children":32931},{"style":143},[32932],{"type":34,"value":7592},{"type":29,"tag":117,"props":32934,"children":32935},{"style":5976},[32936],{"type":34,"value":6477},{"type":29,"tag":117,"props":32938,"children":32939},{"style":378},[32940],{"type":34,"value":17389},{"type":29,"tag":117,"props":32942,"children":32943},{"style":384},[32944],{"type":34,"value":387},{"type":29,"tag":117,"props":32946,"children":32947},{"class":119,"line":139},[32948,32952,32956,32961],{"type":29,"tag":117,"props":32949,"children":32950},{"style":143},[32951],{"type":34,"value":7592},{"type":29,"tag":117,"props":32953,"children":32954},{"style":143},[32955],{"type":34,"value":7617},{"type":29,"tag":117,"props":32957,"children":32958},{"style":378},[32959],{"type":34,"value":32960}," baseSalary",{"type":29,"tag":117,"props":32962,"children":32963},{"style":384},[32964],{"type":34,"value":387},{"type":29,"tag":117,"props":32966,"children":32967},{"class":119,"line":172},[32968],{"type":29,"tag":117,"props":32969,"children":32970},{"emptyLinePlaceholder":13},[32971],{"type":34,"value":136},{"type":29,"tag":117,"props":32973,"children":32974},{"class":119,"line":181},[32975,32979,32983,32987,32991,32995,32999,33003,33007,33011],{"type":29,"tag":117,"props":32976,"children":32977},{"style":143},[32978],{"type":34,"value":7641},{"type":29,"tag":117,"props":32980,"children":32981},{"style":372},[32982],{"type":34,"value":7580},{"type":29,"tag":117,"props":32984,"children":32985},{"style":384},[32986],{"type":34,"value":1108},{"type":29,"tag":117,"props":32988,"children":32989},{"style":5976},[32990],{"type":34,"value":7654},{"type":29,"tag":117,"props":32992,"children":32993},{"style":7657},[32994],{"type":34,"value":17389},{"type":29,"tag":117,"props":32996,"children":32997},{"style":384},[32998],{"type":34,"value":1118},{"type":29,"tag":117,"props":33000,"children":33001},{"style":143},[33002],{"type":34,"value":7617},{"type":29,"tag":117,"props":33004,"children":33005},{"style":7657},[33006],{"type":34,"value":32960},{"type":29,"tag":117,"props":33008,"children":33009},{"style":384},[33010],{"type":34,"value":2803},{"type":29,"tag":117,"props":33012,"children":33013},{"style":384},[33014],{"type":34,"value":3461},{"type":29,"tag":117,"props":33016,"children":33017},{"class":119,"line":189},[33018,33022,33026,33031,33035,33039],{"type":29,"tag":117,"props":33019,"children":33020},{"style":6700},[33021],{"type":34,"value":7687},{"type":29,"tag":117,"props":33023,"children":33024},{"style":384},[33025],{"type":34,"value":369},{"type":29,"tag":117,"props":33027,"children":33028},{"style":378},[33029],{"type":34,"value":33030},"type ",{"type":29,"tag":117,"props":33032,"children":33033},{"style":160},[33034],{"type":34,"value":6061},{"type":29,"tag":117,"props":33036,"children":33037},{"style":378},[33038],{"type":34,"value":17389},{"type":29,"tag":117,"props":33040,"children":33041},{"style":384},[33042],{"type":34,"value":387},{"type":29,"tag":117,"props":33044,"children":33045},{"class":119,"line":198},[33046,33050,33054,33059,33063,33067],{"type":29,"tag":117,"props":33047,"children":33048},{"style":6700},[33049],{"type":34,"value":7687},{"type":29,"tag":117,"props":33051,"children":33052},{"style":384},[33053],{"type":34,"value":369},{"type":29,"tag":117,"props":33055,"children":33056},{"style":378},[33057],{"type":34,"value":33058},"baseSalary ",{"type":29,"tag":117,"props":33060,"children":33061},{"style":160},[33062],{"type":34,"value":6061},{"type":29,"tag":117,"props":33064,"children":33065},{"style":378},[33066],{"type":34,"value":32960},{"type":29,"tag":117,"props":33068,"children":33069},{"style":384},[33070],{"type":34,"value":387},{"type":29,"tag":117,"props":33072,"children":33073},{"class":119,"line":207},[33074],{"type":29,"tag":117,"props":33075,"children":33076},{"style":384},[33077],{"type":34,"value":5632},{"type":29,"tag":117,"props":33079,"children":33080},{"class":119,"line":215},[33081],{"type":29,"tag":117,"props":33082,"children":33083},{"emptyLinePlaceholder":13},[33084],{"type":34,"value":136},{"type":29,"tag":117,"props":33086,"children":33087},{"class":119,"line":224},[33088,33092,33096,33100,33104],{"type":29,"tag":117,"props":33089,"children":33090},{"style":143},[33091],{"type":34,"value":7641},{"type":29,"tag":117,"props":33093,"children":33094},{"style":143},[33095],{"type":34,"value":7617},{"type":29,"tag":117,"props":33097,"children":33098},{"style":372},[33099],{"type":34,"value":8982},{"type":29,"tag":117,"props":33101,"children":33102},{"style":384},[33103],{"type":34,"value":381},{"type":29,"tag":117,"props":33105,"children":33106},{"style":384},[33107],{"type":34,"value":3461},{"type":29,"tag":117,"props":33109,"children":33110},{"class":119,"line":233},[33111,33115,33119,33123,33127,33131,33135,33140,33144],{"type":29,"tag":117,"props":33112,"children":33113},{"style":143},[33114],{"type":34,"value":6121},{"type":29,"tag":117,"props":33116,"children":33117},{"style":384},[33118],{"type":34,"value":3181},{"type":29,"tag":117,"props":33120,"children":33121},{"style":378},[33122],{"type":34,"value":17413},{"type":29,"tag":117,"props":33124,"children":33125},{"style":384},[33126],{"type":34,"value":369},{"type":29,"tag":117,"props":33128,"children":33129},{"style":372},[33130],{"type":34,"value":17422},{"type":29,"tag":117,"props":33132,"children":33133},{"style":384},[33134],{"type":34,"value":1108},{"type":29,"tag":117,"props":33136,"children":33137},{"style":166},[33138],{"type":34,"value":33139},"\"Manager\"",{"type":29,"tag":117,"props":33141,"children":33142},{"style":384},[33143],{"type":34,"value":13176},{"type":29,"tag":117,"props":33145,"children":33146},{"style":384},[33147],{"type":34,"value":3461},{"type":29,"tag":117,"props":33149,"children":33150},{"class":119,"line":242},[33151,33156,33161,33165,33169],{"type":29,"tag":117,"props":33152,"children":33153},{"style":143},[33154],{"type":34,"value":33155},"            return",{"type":29,"tag":117,"props":33157,"children":33158},{"style":378},[33159],{"type":34,"value":33160}," baseSalary ",{"type":29,"tag":117,"props":33162,"children":33163},{"style":160},[33164],{"type":34,"value":5649},{"type":29,"tag":117,"props":33166,"children":33167},{"style":3476},[33168],{"type":34,"value":6140},{"type":29,"tag":117,"props":33170,"children":33171},{"style":384},[33172],{"type":34,"value":387},{"type":29,"tag":117,"props":33174,"children":33175},{"class":119,"line":251},[33176,33180,33184,33188,33192,33196,33200,33204,33208,33213,33217],{"type":29,"tag":117,"props":33177,"children":33178},{"style":384},[33179],{"type":34,"value":17491},{"type":29,"tag":117,"props":33181,"children":33182},{"style":143},[33183],{"type":34,"value":13526},{"type":29,"tag":117,"props":33185,"children":33186},{"style":143},[33187],{"type":34,"value":17500},{"type":29,"tag":117,"props":33189,"children":33190},{"style":384},[33191],{"type":34,"value":3181},{"type":29,"tag":117,"props":33193,"children":33194},{"style":378},[33195],{"type":34,"value":17413},{"type":29,"tag":117,"props":33197,"children":33198},{"style":384},[33199],{"type":34,"value":369},{"type":29,"tag":117,"props":33201,"children":33202},{"style":372},[33203],{"type":34,"value":17422},{"type":29,"tag":117,"props":33205,"children":33206},{"style":384},[33207],{"type":34,"value":1108},{"type":29,"tag":117,"props":33209,"children":33210},{"style":166},[33211],{"type":34,"value":33212},"\"Developer\"",{"type":29,"tag":117,"props":33214,"children":33215},{"style":384},[33216],{"type":34,"value":13176},{"type":29,"tag":117,"props":33218,"children":33219},{"style":384},[33220],{"type":34,"value":3461},{"type":29,"tag":117,"props":33222,"children":33223},{"class":119,"line":260},[33224,33228,33232,33236,33241],{"type":29,"tag":117,"props":33225,"children":33226},{"style":143},[33227],{"type":34,"value":33155},{"type":29,"tag":117,"props":33229,"children":33230},{"style":378},[33231],{"type":34,"value":33160},{"type":29,"tag":117,"props":33233,"children":33234},{"style":160},[33235],{"type":34,"value":5649},{"type":29,"tag":117,"props":33237,"children":33238},{"style":3476},[33239],{"type":34,"value":33240}," 1.5",{"type":29,"tag":117,"props":33242,"children":33243},{"style":384},[33244],{"type":34,"value":387},{"type":29,"tag":117,"props":33246,"children":33247},{"class":119,"line":269},[33248,33252,33256],{"type":29,"tag":117,"props":33249,"children":33250},{"style":384},[33251],{"type":34,"value":17491},{"type":29,"tag":117,"props":33253,"children":33254},{"style":143},[33255],{"type":34,"value":13526},{"type":29,"tag":117,"props":33257,"children":33258},{"style":384},[33259],{"type":34,"value":3461},{"type":29,"tag":117,"props":33261,"children":33262},{"class":119,"line":278},[33263,33267,33271],{"type":29,"tag":117,"props":33264,"children":33265},{"style":143},[33266],{"type":34,"value":33155},{"type":29,"tag":117,"props":33268,"children":33269},{"style":378},[33270],{"type":34,"value":32960},{"type":29,"tag":117,"props":33272,"children":33273},{"style":384},[33274],{"type":34,"value":387},{"type":29,"tag":117,"props":33276,"children":33277},{"class":119,"line":286},[33278],{"type":29,"tag":117,"props":33279,"children":33280},{"style":384},[33281],{"type":34,"value":6196},{"type":29,"tag":117,"props":33283,"children":33284},{"class":119,"line":295},[33285],{"type":29,"tag":117,"props":33286,"children":33287},{"style":384},[33288],{"type":34,"value":5632},{"type":29,"tag":117,"props":33290,"children":33291},{"class":119,"line":304},[33292],{"type":29,"tag":117,"props":33293,"children":33294},{"style":384},[33295],{"type":34,"value":2903},{"type":29,"tag":30,"props":33297,"children":33298},{},[33299,33301,33306],{"type":34,"value":33300},"À première vue, ce code semble fonctionnel. Mais que se passe-t-il si vous devez ajouter un nouveau type d'employé, par exemple, un \"Designer\" avec un salaire différent ? Vous devrez modifier la méthode ",{"type":29,"tag":113,"props":33302,"children":33304},{"className":33303},[],[33305],{"type":34,"value":32901},{"type":34,"value":33307}," et ajouter une nouvelle condition. Plus le nombre de types d'employés augmente, plus la méthode devient complexe et sujette aux erreurs.",{"type":29,"tag":5462,"props":33309,"children":33311},{"type":33310},"WARNING",[33312],{"type":29,"tag":30,"props":33313,"children":33314},{},[33315,33317,33322,33323,33328],{"type":34,"value":33316},"** Plus votre code est rempli de conditions (comme les ",{"type":29,"tag":113,"props":33318,"children":33320},{"className":33319},[],[33321],{"type":34,"value":1088},{"type":34,"value":5923},{"type":29,"tag":113,"props":33324,"children":33326},{"className":33325},[],[33327],{"type":34,"value":1163},{"type":34,"value":33329}," ici), plus il devient fragile. Chaque modification future peut casser une partie existante.",{"type":29,"tag":30,"props":33331,"children":33332},{},[33333],{"type":34,"value":33334},"Ce design viole le principe OCP car à chaque nouvelle fonctionnalité (nouveau type d'employé), vous devez modifier la classe existante. Cela rend le code plus difficile à maintenir et à tester.",{"type":29,"tag":4530,"props":33336,"children":33338},{"id":33337},"exemple-2-application-du-principe-ocp-avec-des-interfaces",[33339],{"type":34,"value":33340},"Exemple 2 : Application du principe OCP avec des interfaces",{"type":29,"tag":30,"props":33342,"children":33343},{},[33344],{"type":34,"value":33345},"Voyons maintenant comment nous pourrions refactorer ce code pour respecter le principe OCP. La clé ici est de rendre le comportement de calcul extensible, sans avoir à modifier la classe existante. Nous pouvons utiliser des interfaces ou des classes abstraites pour séparer le calcul des salaires en fonction des types d’employés.",{"type":29,"tag":106,"props":33347,"children":33349},{"className":5519,"code":33348,"language":5521,"meta":8,"style":8},"interface SalaryCalculator {\n    double calculateSalary(double baseSalary);\n}\n\nclass ManagerSalaryCalculator implements SalaryCalculator {\n    @Override\n    public double calculateSalary(double baseSalary) {\n        return baseSalary * 2;\n    }\n}\n\nclass DeveloperSalaryCalculator implements SalaryCalculator {\n    @Override\n    public double calculateSalary(double baseSalary) {\n        return baseSalary * 1.5;\n    }\n}\n\nclass Employee {\n    private double baseSalary;\n    private SalaryCalculator salaryCalculator;\n\n    public Employee(double baseSalary, SalaryCalculator salaryCalculator) {\n        this.baseSalary = baseSalary;\n        this.salaryCalculator = salaryCalculator;\n    }\n\n    public double calculateSalary() {\n        return salaryCalculator.calculateSalary(baseSalary);\n    }\n}\n",[33350],{"type":29,"tag":113,"props":33351,"children":33352},{"__ignoreMap":8},[33353,33369,33396,33403,33410,33434,33445,33480,33503,33510,33517,33524,33548,33559,33594,33617,33624,33631,33638,33653,33672,33692,33699,33742,33769,33797,33804,33811,33834,33866,33873],{"type":29,"tag":117,"props":33354,"children":33355},{"class":119,"line":120},[33356,33360,33365],{"type":29,"tag":117,"props":33357,"children":33358},{"style":143},[33359],{"type":34,"value":23153},{"type":29,"tag":117,"props":33361,"children":33362},{"style":2863},[33363],{"type":34,"value":33364}," SalaryCalculator",{"type":29,"tag":117,"props":33366,"children":33367},{"style":384},[33368],{"type":34,"value":3461},{"type":29,"tag":117,"props":33370,"children":33371},{"class":119,"line":130},[33372,33376,33380,33384,33388,33392],{"type":29,"tag":117,"props":33373,"children":33374},{"style":143},[33375],{"type":34,"value":14609},{"type":29,"tag":117,"props":33377,"children":33378},{"style":372},[33379],{"type":34,"value":8982},{"type":29,"tag":117,"props":33381,"children":33382},{"style":384},[33383],{"type":34,"value":1108},{"type":29,"tag":117,"props":33385,"children":33386},{"style":143},[33387],{"type":34,"value":8592},{"type":29,"tag":117,"props":33389,"children":33390},{"style":7657},[33391],{"type":34,"value":32960},{"type":29,"tag":117,"props":33393,"children":33394},{"style":384},[33395],{"type":34,"value":5675},{"type":29,"tag":117,"props":33397,"children":33398},{"class":119,"line":139},[33399],{"type":29,"tag":117,"props":33400,"children":33401},{"style":384},[33402],{"type":34,"value":2903},{"type":29,"tag":117,"props":33404,"children":33405},{"class":119,"line":172},[33406],{"type":29,"tag":117,"props":33407,"children":33408},{"emptyLinePlaceholder":13},[33409],{"type":34,"value":136},{"type":29,"tag":117,"props":33411,"children":33412},{"class":119,"line":181},[33413,33417,33422,33426,33430],{"type":29,"tag":117,"props":33414,"children":33415},{"style":143},[33416],{"type":34,"value":16091},{"type":29,"tag":117,"props":33418,"children":33419},{"style":2863},[33420],{"type":34,"value":33421}," ManagerSalaryCalculator",{"type":29,"tag":117,"props":33423,"children":33424},{"style":143},[33425],{"type":34,"value":8636},{"type":29,"tag":117,"props":33427,"children":33428},{"style":2863},[33429],{"type":34,"value":33364},{"type":29,"tag":117,"props":33431,"children":33432},{"style":384},[33433],{"type":34,"value":3461},{"type":29,"tag":117,"props":33435,"children":33436},{"class":119,"line":189},[33437,33441],{"type":29,"tag":117,"props":33438,"children":33439},{"style":10083},[33440],{"type":34,"value":10086},{"type":29,"tag":117,"props":33442,"children":33443},{"style":10089},[33444],{"type":34,"value":17746},{"type":29,"tag":117,"props":33446,"children":33447},{"class":119,"line":198},[33448,33452,33456,33460,33464,33468,33472,33476],{"type":29,"tag":117,"props":33449,"children":33450},{"style":143},[33451],{"type":34,"value":7641},{"type":29,"tag":117,"props":33453,"children":33454},{"style":143},[33455],{"type":34,"value":7617},{"type":29,"tag":117,"props":33457,"children":33458},{"style":372},[33459],{"type":34,"value":8982},{"type":29,"tag":117,"props":33461,"children":33462},{"style":384},[33463],{"type":34,"value":1108},{"type":29,"tag":117,"props":33465,"children":33466},{"style":143},[33467],{"type":34,"value":8592},{"type":29,"tag":117,"props":33469,"children":33470},{"style":7657},[33471],{"type":34,"value":32960},{"type":29,"tag":117,"props":33473,"children":33474},{"style":384},[33475],{"type":34,"value":2803},{"type":29,"tag":117,"props":33477,"children":33478},{"style":384},[33479],{"type":34,"value":3461},{"type":29,"tag":117,"props":33481,"children":33482},{"class":119,"line":207},[33483,33487,33491,33495,33499],{"type":29,"tag":117,"props":33484,"children":33485},{"style":143},[33486],{"type":34,"value":5616},{"type":29,"tag":117,"props":33488,"children":33489},{"style":378},[33490],{"type":34,"value":33160},{"type":29,"tag":117,"props":33492,"children":33493},{"style":160},[33494],{"type":34,"value":5649},{"type":29,"tag":117,"props":33496,"children":33497},{"style":3476},[33498],{"type":34,"value":6140},{"type":29,"tag":117,"props":33500,"children":33501},{"style":384},[33502],{"type":34,"value":387},{"type":29,"tag":117,"props":33504,"children":33505},{"class":119,"line":215},[33506],{"type":29,"tag":117,"props":33507,"children":33508},{"style":384},[33509],{"type":34,"value":5632},{"type":29,"tag":117,"props":33511,"children":33512},{"class":119,"line":224},[33513],{"type":29,"tag":117,"props":33514,"children":33515},{"style":384},[33516],{"type":34,"value":2903},{"type":29,"tag":117,"props":33518,"children":33519},{"class":119,"line":233},[33520],{"type":29,"tag":117,"props":33521,"children":33522},{"emptyLinePlaceholder":13},[33523],{"type":34,"value":136},{"type":29,"tag":117,"props":33525,"children":33526},{"class":119,"line":242},[33527,33531,33536,33540,33544],{"type":29,"tag":117,"props":33528,"children":33529},{"style":143},[33530],{"type":34,"value":16091},{"type":29,"tag":117,"props":33532,"children":33533},{"style":2863},[33534],{"type":34,"value":33535}," DeveloperSalaryCalculator",{"type":29,"tag":117,"props":33537,"children":33538},{"style":143},[33539],{"type":34,"value":8636},{"type":29,"tag":117,"props":33541,"children":33542},{"style":2863},[33543],{"type":34,"value":33364},{"type":29,"tag":117,"props":33545,"children":33546},{"style":384},[33547],{"type":34,"value":3461},{"type":29,"tag":117,"props":33549,"children":33550},{"class":119,"line":251},[33551,33555],{"type":29,"tag":117,"props":33552,"children":33553},{"style":10083},[33554],{"type":34,"value":10086},{"type":29,"tag":117,"props":33556,"children":33557},{"style":10089},[33558],{"type":34,"value":17746},{"type":29,"tag":117,"props":33560,"children":33561},{"class":119,"line":260},[33562,33566,33570,33574,33578,33582,33586,33590],{"type":29,"tag":117,"props":33563,"children":33564},{"style":143},[33565],{"type":34,"value":7641},{"type":29,"tag":117,"props":33567,"children":33568},{"style":143},[33569],{"type":34,"value":7617},{"type":29,"tag":117,"props":33571,"children":33572},{"style":372},[33573],{"type":34,"value":8982},{"type":29,"tag":117,"props":33575,"children":33576},{"style":384},[33577],{"type":34,"value":1108},{"type":29,"tag":117,"props":33579,"children":33580},{"style":143},[33581],{"type":34,"value":8592},{"type":29,"tag":117,"props":33583,"children":33584},{"style":7657},[33585],{"type":34,"value":32960},{"type":29,"tag":117,"props":33587,"children":33588},{"style":384},[33589],{"type":34,"value":2803},{"type":29,"tag":117,"props":33591,"children":33592},{"style":384},[33593],{"type":34,"value":3461},{"type":29,"tag":117,"props":33595,"children":33596},{"class":119,"line":269},[33597,33601,33605,33609,33613],{"type":29,"tag":117,"props":33598,"children":33599},{"style":143},[33600],{"type":34,"value":5616},{"type":29,"tag":117,"props":33602,"children":33603},{"style":378},[33604],{"type":34,"value":33160},{"type":29,"tag":117,"props":33606,"children":33607},{"style":160},[33608],{"type":34,"value":5649},{"type":29,"tag":117,"props":33610,"children":33611},{"style":3476},[33612],{"type":34,"value":33240},{"type":29,"tag":117,"props":33614,"children":33615},{"style":384},[33616],{"type":34,"value":387},{"type":29,"tag":117,"props":33618,"children":33619},{"class":119,"line":278},[33620],{"type":29,"tag":117,"props":33621,"children":33622},{"style":384},[33623],{"type":34,"value":5632},{"type":29,"tag":117,"props":33625,"children":33626},{"class":119,"line":286},[33627],{"type":29,"tag":117,"props":33628,"children":33629},{"style":384},[33630],{"type":34,"value":2903},{"type":29,"tag":117,"props":33632,"children":33633},{"class":119,"line":295},[33634],{"type":29,"tag":117,"props":33635,"children":33636},{"emptyLinePlaceholder":13},[33637],{"type":34,"value":136},{"type":29,"tag":117,"props":33639,"children":33640},{"class":119,"line":304},[33641,33645,33649],{"type":29,"tag":117,"props":33642,"children":33643},{"style":143},[33644],{"type":34,"value":16091},{"type":29,"tag":117,"props":33646,"children":33647},{"style":2863},[33648],{"type":34,"value":7580},{"type":29,"tag":117,"props":33650,"children":33651},{"style":384},[33652],{"type":34,"value":3461},{"type":29,"tag":117,"props":33654,"children":33655},{"class":119,"line":313},[33656,33660,33664,33668],{"type":29,"tag":117,"props":33657,"children":33658},{"style":143},[33659],{"type":34,"value":7592},{"type":29,"tag":117,"props":33661,"children":33662},{"style":143},[33663],{"type":34,"value":7617},{"type":29,"tag":117,"props":33665,"children":33666},{"style":378},[33667],{"type":34,"value":32960},{"type":29,"tag":117,"props":33669,"children":33670},{"style":384},[33671],{"type":34,"value":387},{"type":29,"tag":117,"props":33673,"children":33674},{"class":119,"line":322},[33675,33679,33683,33688],{"type":29,"tag":117,"props":33676,"children":33677},{"style":143},[33678],{"type":34,"value":7592},{"type":29,"tag":117,"props":33680,"children":33681},{"style":5976},[33682],{"type":34,"value":33364},{"type":29,"tag":117,"props":33684,"children":33685},{"style":378},[33686],{"type":34,"value":33687}," salaryCalculator",{"type":29,"tag":117,"props":33689,"children":33690},{"style":384},[33691],{"type":34,"value":387},{"type":29,"tag":117,"props":33693,"children":33694},{"class":119,"line":331},[33695],{"type":29,"tag":117,"props":33696,"children":33697},{"emptyLinePlaceholder":13},[33698],{"type":34,"value":136},{"type":29,"tag":117,"props":33700,"children":33701},{"class":119,"line":340},[33702,33706,33710,33714,33718,33722,33726,33730,33734,33738],{"type":29,"tag":117,"props":33703,"children":33704},{"style":143},[33705],{"type":34,"value":7641},{"type":29,"tag":117,"props":33707,"children":33708},{"style":372},[33709],{"type":34,"value":7580},{"type":29,"tag":117,"props":33711,"children":33712},{"style":384},[33713],{"type":34,"value":1108},{"type":29,"tag":117,"props":33715,"children":33716},{"style":143},[33717],{"type":34,"value":8592},{"type":29,"tag":117,"props":33719,"children":33720},{"style":7657},[33721],{"type":34,"value":32960},{"type":29,"tag":117,"props":33723,"children":33724},{"style":384},[33725],{"type":34,"value":1118},{"type":29,"tag":117,"props":33727,"children":33728},{"style":5976},[33729],{"type":34,"value":33364},{"type":29,"tag":117,"props":33731,"children":33732},{"style":7657},[33733],{"type":34,"value":33687},{"type":29,"tag":117,"props":33735,"children":33736},{"style":384},[33737],{"type":34,"value":2803},{"type":29,"tag":117,"props":33739,"children":33740},{"style":384},[33741],{"type":34,"value":3461},{"type":29,"tag":117,"props":33743,"children":33744},{"class":119,"line":348},[33745,33749,33753,33757,33761,33765],{"type":29,"tag":117,"props":33746,"children":33747},{"style":6700},[33748],{"type":34,"value":7687},{"type":29,"tag":117,"props":33750,"children":33751},{"style":384},[33752],{"type":34,"value":369},{"type":29,"tag":117,"props":33754,"children":33755},{"style":378},[33756],{"type":34,"value":33058},{"type":29,"tag":117,"props":33758,"children":33759},{"style":160},[33760],{"type":34,"value":6061},{"type":29,"tag":117,"props":33762,"children":33763},{"style":378},[33764],{"type":34,"value":32960},{"type":29,"tag":117,"props":33766,"children":33767},{"style":384},[33768],{"type":34,"value":387},{"type":29,"tag":117,"props":33770,"children":33771},{"class":119,"line":357},[33772,33776,33780,33785,33789,33793],{"type":29,"tag":117,"props":33773,"children":33774},{"style":6700},[33775],{"type":34,"value":7687},{"type":29,"tag":117,"props":33777,"children":33778},{"style":384},[33779],{"type":34,"value":369},{"type":29,"tag":117,"props":33781,"children":33782},{"style":378},[33783],{"type":34,"value":33784},"salaryCalculator ",{"type":29,"tag":117,"props":33786,"children":33787},{"style":160},[33788],{"type":34,"value":6061},{"type":29,"tag":117,"props":33790,"children":33791},{"style":378},[33792],{"type":34,"value":33687},{"type":29,"tag":117,"props":33794,"children":33795},{"style":384},[33796],{"type":34,"value":387},{"type":29,"tag":117,"props":33798,"children":33799},{"class":119,"line":1768},[33800],{"type":29,"tag":117,"props":33801,"children":33802},{"style":384},[33803],{"type":34,"value":5632},{"type":29,"tag":117,"props":33805,"children":33806},{"class":119,"line":953},[33807],{"type":29,"tag":117,"props":33808,"children":33809},{"emptyLinePlaceholder":13},[33810],{"type":34,"value":136},{"type":29,"tag":117,"props":33812,"children":33813},{"class":119,"line":9833},[33814,33818,33822,33826,33830],{"type":29,"tag":117,"props":33815,"children":33816},{"style":143},[33817],{"type":34,"value":7641},{"type":29,"tag":117,"props":33819,"children":33820},{"style":143},[33821],{"type":34,"value":7617},{"type":29,"tag":117,"props":33823,"children":33824},{"style":372},[33825],{"type":34,"value":8982},{"type":29,"tag":117,"props":33827,"children":33828},{"style":384},[33829],{"type":34,"value":381},{"type":29,"tag":117,"props":33831,"children":33832},{"style":384},[33833],{"type":34,"value":3461},{"type":29,"tag":117,"props":33835,"children":33836},{"class":119,"line":9870},[33837,33841,33845,33849,33853,33857,33862],{"type":29,"tag":117,"props":33838,"children":33839},{"style":143},[33840],{"type":34,"value":5616},{"type":29,"tag":117,"props":33842,"children":33843},{"style":378},[33844],{"type":34,"value":33687},{"type":29,"tag":117,"props":33846,"children":33847},{"style":384},[33848],{"type":34,"value":369},{"type":29,"tag":117,"props":33850,"children":33851},{"style":372},[33852],{"type":34,"value":10223},{"type":29,"tag":117,"props":33854,"children":33855},{"style":384},[33856],{"type":34,"value":1108},{"type":29,"tag":117,"props":33858,"children":33859},{"style":378},[33860],{"type":34,"value":33861},"baseSalary",{"type":29,"tag":117,"props":33863,"children":33864},{"style":384},[33865],{"type":34,"value":5675},{"type":29,"tag":117,"props":33867,"children":33868},{"class":119,"line":9901},[33869],{"type":29,"tag":117,"props":33870,"children":33871},{"style":384},[33872],{"type":34,"value":5632},{"type":29,"tag":117,"props":33874,"children":33875},{"class":119,"line":9909},[33876],{"type":29,"tag":117,"props":33877,"children":33878},{"style":384},[33879],{"type":34,"value":2903},{"type":29,"tag":30,"props":33881,"children":33882},{},[33883,33885,33890,33892,33898],{"type":34,"value":33884},"Avec ce design, si vous avez besoin d’ajouter un nouveau type d’employé, par exemple un \"Designer\", vous n’avez plus à toucher à la classe ",{"type":29,"tag":113,"props":33886,"children":33888},{"className":33887},[],[33889],{"type":34,"value":6491},{"type":34,"value":33891},". Vous créez simplement une nouvelle classe qui implémente ",{"type":29,"tag":113,"props":33893,"children":33895},{"className":33894},[],[33896],{"type":34,"value":33897},"SalaryCalculator",{"type":34,"value":1866},{"type":29,"tag":106,"props":33900,"children":33902},{"className":5519,"code":33901,"language":5521,"meta":8,"style":8},"class DesignerSalaryCalculator implements SalaryCalculator {\n    @Override\n    public double calculateSalary(double baseSalary) {\n        return baseSalary * 1.8;\n    }\n}\n",[33903],{"type":29,"tag":113,"props":33904,"children":33905},{"__ignoreMap":8},[33906,33930,33941,33976,34000,34007],{"type":29,"tag":117,"props":33907,"children":33908},{"class":119,"line":120},[33909,33913,33918,33922,33926],{"type":29,"tag":117,"props":33910,"children":33911},{"style":143},[33912],{"type":34,"value":16091},{"type":29,"tag":117,"props":33914,"children":33915},{"style":2863},[33916],{"type":34,"value":33917}," DesignerSalaryCalculator",{"type":29,"tag":117,"props":33919,"children":33920},{"style":143},[33921],{"type":34,"value":8636},{"type":29,"tag":117,"props":33923,"children":33924},{"style":2863},[33925],{"type":34,"value":33364},{"type":29,"tag":117,"props":33927,"children":33928},{"style":384},[33929],{"type":34,"value":3461},{"type":29,"tag":117,"props":33931,"children":33932},{"class":119,"line":130},[33933,33937],{"type":29,"tag":117,"props":33934,"children":33935},{"style":10083},[33936],{"type":34,"value":10086},{"type":29,"tag":117,"props":33938,"children":33939},{"style":10089},[33940],{"type":34,"value":17746},{"type":29,"tag":117,"props":33942,"children":33943},{"class":119,"line":139},[33944,33948,33952,33956,33960,33964,33968,33972],{"type":29,"tag":117,"props":33945,"children":33946},{"style":143},[33947],{"type":34,"value":7641},{"type":29,"tag":117,"props":33949,"children":33950},{"style":143},[33951],{"type":34,"value":7617},{"type":29,"tag":117,"props":33953,"children":33954},{"style":372},[33955],{"type":34,"value":8982},{"type":29,"tag":117,"props":33957,"children":33958},{"style":384},[33959],{"type":34,"value":1108},{"type":29,"tag":117,"props":33961,"children":33962},{"style":143},[33963],{"type":34,"value":8592},{"type":29,"tag":117,"props":33965,"children":33966},{"style":7657},[33967],{"type":34,"value":32960},{"type":29,"tag":117,"props":33969,"children":33970},{"style":384},[33971],{"type":34,"value":2803},{"type":29,"tag":117,"props":33973,"children":33974},{"style":384},[33975],{"type":34,"value":3461},{"type":29,"tag":117,"props":33977,"children":33978},{"class":119,"line":172},[33979,33983,33987,33991,33996],{"type":29,"tag":117,"props":33980,"children":33981},{"style":143},[33982],{"type":34,"value":5616},{"type":29,"tag":117,"props":33984,"children":33985},{"style":378},[33986],{"type":34,"value":33160},{"type":29,"tag":117,"props":33988,"children":33989},{"style":160},[33990],{"type":34,"value":5649},{"type":29,"tag":117,"props":33992,"children":33993},{"style":3476},[33994],{"type":34,"value":33995}," 1.8",{"type":29,"tag":117,"props":33997,"children":33998},{"style":384},[33999],{"type":34,"value":387},{"type":29,"tag":117,"props":34001,"children":34002},{"class":119,"line":181},[34003],{"type":29,"tag":117,"props":34004,"children":34005},{"style":384},[34006],{"type":34,"value":5632},{"type":29,"tag":117,"props":34008,"children":34009},{"class":119,"line":189},[34010],{"type":29,"tag":117,"props":34011,"children":34012},{"style":384},[34013],{"type":34,"value":2903},{"type":29,"tag":30,"props":34015,"children":34016},{},[34017],{"type":34,"value":34018},"L'ajout d'un nouveau type d'employé devient alors une extension naturelle, sans modification du code existant. C'est exactement ce que vise OCP : un code flexible et modulaire qui évite les modifications sources de bugs.",{"type":29,"tag":5462,"props":34020,"children":34021},{"type":5464},[34022],{"type":29,"tag":30,"props":34023,"children":34024},{},[34025],{"type":34,"value":34026},"** Quand vous concevez votre code avec OCP, réfléchissez toujours en termes d'extension future. Posez-vous la question : \"Si je devais ajouter une nouvelle fonctionnalité, est-ce que je serais obligé de modifier le code existant ?\"",{"type":29,"tag":51,"props":34028,"children":34029},{},[],{"type":29,"tag":567,"props":34031,"children":34033},{"cta":569,"href":570,"title":34032,"type":572},"Vous voulez concevoir vos classes pour les étendre sans jamais les rouvrir ?",[34034],{"type":29,"tag":30,"props":34035,"children":34036},{},[34037],{"type":34,"value":34038},"Choisir le bon axe d'abstraction, savoir quand une interface vaut mieux qu'un if, sentir quand l'extension dérape en sur-ingénierie : ça ne s'apprend pas dans un article, ça se travaille. En mentoring 1:1, je relis votre code avec vous et on retravaille vos points d'extension ensemble, jusqu'à ce que le réflexe devienne le vôtre.",{"type":29,"tag":55,"props":34040,"children":34042},{"id":34041},"pourquoi-ocp-est-essentiel-dans-le-software-craftsmanship",[34043],{"type":34,"value":34044},"Pourquoi OCP est essentiel dans le Software Craftsmanship",{"type":29,"tag":30,"props":34046,"children":34047},{},[34048,34050,34057,34059,34064,34065,34070],{"type":34,"value":34049},"Le principe OCP ne se limite pas seulement à écrire du code plus propre. Il est au cœur de ce qu'on appelle le ",{"type":29,"tag":45,"props":34051,"children":34052},{},[34053],{"type":29,"tag":453,"props":34054,"children":34055},{"href":7134},[34056],{"type":34,"value":13956},{"type":34,"value":34058},", un mouvement qui prône l’écriture de code non seulement fonctionnel, mais aussi ",{"type":29,"tag":45,"props":34060,"children":34061},{},[34062],{"type":34,"value":34063},"élégant",{"type":34,"value":5923},{"type":29,"tag":45,"props":34066,"children":34067},{},[34068],{"type":34,"value":34069},"maintenable",{"type":34,"value":34071},". Respecter le principe OCP vous aide à :",{"type":29,"tag":4212,"props":34073,"children":34074},{},[34075,34085,34095],{"type":29,"tag":1589,"props":34076,"children":34077},{},[34078,34083],{"type":29,"tag":45,"props":34079,"children":34080},{},[34081],{"type":34,"value":34082},"Réduire les risques de régressions",{"type":34,"value":34084}," : ne pas toucher au code existant signifie ne pas casser ce qui est déjà testé. Sur mes missions en grandes DSI, ce point se traduit directement par moins d'incidents de production et des releases plus fréquentes.",{"type":29,"tag":1589,"props":34086,"children":34087},{},[34088,34093],{"type":29,"tag":45,"props":34089,"children":34090},{},[34091],{"type":34,"value":34092},"Faciliter les extensions",{"type":34,"value":34094}," : ajouter une nouvelle fonctionnalité devient une opération chirurgicale, sans avoir à plonger dans des classes complexes pour y greffer une modification.",{"type":29,"tag":1589,"props":34096,"children":34097},{},[34098,34103],{"type":29,"tag":45,"props":34099,"children":34100},{},[34101],{"type":34,"value":34102},"Améliorer la collaboration en équipe",{"type":34,"value":34104}," : un code modulaire et bien structuré se laisse étendre par d'autres développeurs sans qu'ils craignent de casser des fonctionnalités voisines.",{"type":29,"tag":5462,"props":34106,"children":34107},{"type":33310},[34108],{"type":29,"tag":30,"props":34109,"children":34110},{},[34111],{"type":34,"value":34112},"** Un code qui ne suit pas OCP est souvent source de conflits lors du travail en équipe. Si plusieurs développeurs doivent modifier la même classe, des erreurs sont inévitables.",{"type":29,"tag":30,"props":34114,"children":34115},{},[34116,34118,34122,34124,34129],{"type":34,"value":34117},"Dans le contexte du ",{"type":29,"tag":453,"props":34119,"children":34120},{"href":7134},[34121],{"type":34,"value":13956},{"type":34,"value":34123},", suivre OCP revient à ",{"type":29,"tag":45,"props":34125,"children":34126},{},[34127],{"type":34,"value":34128},"prendre soin de son code",{"type":34,"value":34130}," sur le long terme. Vous étendez plutôt que de patcher, et vous arrêtez de courir après les bugs nés des modifications du code existant.",{"type":29,"tag":51,"props":34132,"children":34133},{},[],{"type":29,"tag":55,"props":34135,"children":34137},{"id":34136},"comment-appliquer-ocp-dans-vos-projets-java",[34138],{"type":34,"value":34139},"Comment appliquer OCP dans vos projets Java",{"type":29,"tag":30,"props":34141,"children":34142},{},[34143],{"type":34,"value":34144},"Au-delà des interfaces déjà vues, deux autres mécanismes Java permettent d'appliquer OCP en pratique : les classes abstraites et le pattern Strategy.",{"type":29,"tag":4530,"props":34146,"children":34148},{"id":34147},"exemple-3-utilisation-de-classes-abstraites-pour-respecter-ocp",[34149],{"type":34,"value":34150},"Exemple 3 : Utilisation de classes abstraites pour respecter OCP",{"type":29,"tag":30,"props":34152,"children":34153},{},[34154],{"type":34,"value":34155},"Une autre manière courante de respecter OCP consiste à passer par des classes abstraites. Elles définissent un comportement commun partagé entre plusieurs sous-classes, tout en laissant à ces dernières la liberté de redéfinir certains points.",{"type":29,"tag":30,"props":34157,"children":34158},{},[34159],{"type":34,"value":34160},"Prenons l'exemple précédent de calcul des salaires. Voici comment vous pourriez utiliser des classes abstraites pour atteindre un résultat similaire tout en respectant OCP :",{"type":29,"tag":106,"props":34162,"children":34164},{"className":5519,"code":34163,"language":5521,"meta":8,"style":8},"abstract class Employee {\n    protected double baseSalary;\n\n    public Employee(double baseSalary) {\n        this.baseSalary = baseSalary;\n    }\n\n    \u002F\u002F Méthode abstraite que chaque sous-classe implémentera\n    public abstract double calculateSalary();\n}\n\nclass Manager extends Employee {\n    public Manager(double baseSalary) {\n        super(baseSalary);\n    }\n\n    @Override\n    public double calculateSalary() {\n        return baseSalary * 2;\n    }\n}\n\nclass Developer extends Employee {\n    public Developer(double baseSalary) {\n        super(baseSalary);\n    }\n\n    @Override\n    public double calculateSalary() {\n        return baseSalary * 1.5;\n    }\n}\n",[34165],{"type":29,"tag":113,"props":34166,"children":34167},{"__ignoreMap":8},[34168,34188,34207,34214,34245,34272,34279,34286,34294,34318,34325,34332,34355,34386,34405,34412,34419,34430,34453,34476,34483,34490,34497,34521,34552,34571,34578,34585,34596,34619,34642,34649],{"type":29,"tag":117,"props":34169,"children":34170},{"class":119,"line":120},[34171,34176,34180,34184],{"type":29,"tag":117,"props":34172,"children":34173},{"style":143},[34174],{"type":34,"value":34175},"abstract",{"type":29,"tag":117,"props":34177,"children":34178},{"style":143},[34179],{"type":34,"value":7575},{"type":29,"tag":117,"props":34181,"children":34182},{"style":2863},[34183],{"type":34,"value":7580},{"type":29,"tag":117,"props":34185,"children":34186},{"style":384},[34187],{"type":34,"value":3461},{"type":29,"tag":117,"props":34189,"children":34190},{"class":119,"line":130},[34191,34195,34199,34203],{"type":29,"tag":117,"props":34192,"children":34193},{"style":143},[34194],{"type":34,"value":18646},{"type":29,"tag":117,"props":34196,"children":34197},{"style":143},[34198],{"type":34,"value":7617},{"type":29,"tag":117,"props":34200,"children":34201},{"style":378},[34202],{"type":34,"value":32960},{"type":29,"tag":117,"props":34204,"children":34205},{"style":384},[34206],{"type":34,"value":387},{"type":29,"tag":117,"props":34208,"children":34209},{"class":119,"line":139},[34210],{"type":29,"tag":117,"props":34211,"children":34212},{"emptyLinePlaceholder":13},[34213],{"type":34,"value":136},{"type":29,"tag":117,"props":34215,"children":34216},{"class":119,"line":172},[34217,34221,34225,34229,34233,34237,34241],{"type":29,"tag":117,"props":34218,"children":34219},{"style":143},[34220],{"type":34,"value":7641},{"type":29,"tag":117,"props":34222,"children":34223},{"style":372},[34224],{"type":34,"value":7580},{"type":29,"tag":117,"props":34226,"children":34227},{"style":384},[34228],{"type":34,"value":1108},{"type":29,"tag":117,"props":34230,"children":34231},{"style":143},[34232],{"type":34,"value":8592},{"type":29,"tag":117,"props":34234,"children":34235},{"style":7657},[34236],{"type":34,"value":32960},{"type":29,"tag":117,"props":34238,"children":34239},{"style":384},[34240],{"type":34,"value":2803},{"type":29,"tag":117,"props":34242,"children":34243},{"style":384},[34244],{"type":34,"value":3461},{"type":29,"tag":117,"props":34246,"children":34247},{"class":119,"line":181},[34248,34252,34256,34260,34264,34268],{"type":29,"tag":117,"props":34249,"children":34250},{"style":6700},[34251],{"type":34,"value":7687},{"type":29,"tag":117,"props":34253,"children":34254},{"style":384},[34255],{"type":34,"value":369},{"type":29,"tag":117,"props":34257,"children":34258},{"style":378},[34259],{"type":34,"value":33058},{"type":29,"tag":117,"props":34261,"children":34262},{"style":160},[34263],{"type":34,"value":6061},{"type":29,"tag":117,"props":34265,"children":34266},{"style":378},[34267],{"type":34,"value":32960},{"type":29,"tag":117,"props":34269,"children":34270},{"style":384},[34271],{"type":34,"value":387},{"type":29,"tag":117,"props":34273,"children":34274},{"class":119,"line":189},[34275],{"type":29,"tag":117,"props":34276,"children":34277},{"style":384},[34278],{"type":34,"value":5632},{"type":29,"tag":117,"props":34280,"children":34281},{"class":119,"line":198},[34282],{"type":29,"tag":117,"props":34283,"children":34284},{"emptyLinePlaceholder":13},[34285],{"type":34,"value":136},{"type":29,"tag":117,"props":34287,"children":34288},{"class":119,"line":207},[34289],{"type":29,"tag":117,"props":34290,"children":34291},{"style":124},[34292],{"type":34,"value":34293},"    \u002F\u002F Méthode abstraite que chaque sous-classe implémentera\n",{"type":29,"tag":117,"props":34295,"children":34296},{"class":119,"line":215},[34297,34301,34306,34310,34314],{"type":29,"tag":117,"props":34298,"children":34299},{"style":143},[34300],{"type":34,"value":7641},{"type":29,"tag":117,"props":34302,"children":34303},{"style":143},[34304],{"type":34,"value":34305}," abstract",{"type":29,"tag":117,"props":34307,"children":34308},{"style":143},[34309],{"type":34,"value":7617},{"type":29,"tag":117,"props":34311,"children":34312},{"style":372},[34313],{"type":34,"value":8982},{"type":29,"tag":117,"props":34315,"children":34316},{"style":384},[34317],{"type":34,"value":9375},{"type":29,"tag":117,"props":34319,"children":34320},{"class":119,"line":224},[34321],{"type":29,"tag":117,"props":34322,"children":34323},{"style":384},[34324],{"type":34,"value":2903},{"type":29,"tag":117,"props":34326,"children":34327},{"class":119,"line":233},[34328],{"type":29,"tag":117,"props":34329,"children":34330},{"emptyLinePlaceholder":13},[34331],{"type":34,"value":136},{"type":29,"tag":117,"props":34333,"children":34334},{"class":119,"line":242},[34335,34339,34343,34347,34351],{"type":29,"tag":117,"props":34336,"children":34337},{"style":143},[34338],{"type":34,"value":16091},{"type":29,"tag":117,"props":34340,"children":34341},{"style":2863},[34342],{"type":34,"value":26488},{"type":29,"tag":117,"props":34344,"children":34345},{"style":143},[34346],{"type":34,"value":18946},{"type":29,"tag":117,"props":34348,"children":34349},{"style":2863},[34350],{"type":34,"value":7580},{"type":29,"tag":117,"props":34352,"children":34353},{"style":384},[34354],{"type":34,"value":3461},{"type":29,"tag":117,"props":34356,"children":34357},{"class":119,"line":251},[34358,34362,34366,34370,34374,34378,34382],{"type":29,"tag":117,"props":34359,"children":34360},{"style":143},[34361],{"type":34,"value":7641},{"type":29,"tag":117,"props":34363,"children":34364},{"style":372},[34365],{"type":34,"value":26488},{"type":29,"tag":117,"props":34367,"children":34368},{"style":384},[34369],{"type":34,"value":1108},{"type":29,"tag":117,"props":34371,"children":34372},{"style":143},[34373],{"type":34,"value":8592},{"type":29,"tag":117,"props":34375,"children":34376},{"style":7657},[34377],{"type":34,"value":32960},{"type":29,"tag":117,"props":34379,"children":34380},{"style":384},[34381],{"type":34,"value":2803},{"type":29,"tag":117,"props":34383,"children":34384},{"style":384},[34385],{"type":34,"value":3461},{"type":29,"tag":117,"props":34387,"children":34388},{"class":119,"line":260},[34389,34393,34397,34401],{"type":29,"tag":117,"props":34390,"children":34391},{"style":154},[34392],{"type":34,"value":29368},{"type":29,"tag":117,"props":34394,"children":34395},{"style":384},[34396],{"type":34,"value":1108},{"type":29,"tag":117,"props":34398,"children":34399},{"style":378},[34400],{"type":34,"value":33861},{"type":29,"tag":117,"props":34402,"children":34403},{"style":384},[34404],{"type":34,"value":5675},{"type":29,"tag":117,"props":34406,"children":34407},{"class":119,"line":269},[34408],{"type":29,"tag":117,"props":34409,"children":34410},{"style":384},[34411],{"type":34,"value":5632},{"type":29,"tag":117,"props":34413,"children":34414},{"class":119,"line":278},[34415],{"type":29,"tag":117,"props":34416,"children":34417},{"emptyLinePlaceholder":13},[34418],{"type":34,"value":136},{"type":29,"tag":117,"props":34420,"children":34421},{"class":119,"line":286},[34422,34426],{"type":29,"tag":117,"props":34423,"children":34424},{"style":10083},[34425],{"type":34,"value":10086},{"type":29,"tag":117,"props":34427,"children":34428},{"style":10089},[34429],{"type":34,"value":17746},{"type":29,"tag":117,"props":34431,"children":34432},{"class":119,"line":295},[34433,34437,34441,34445,34449],{"type":29,"tag":117,"props":34434,"children":34435},{"style":143},[34436],{"type":34,"value":7641},{"type":29,"tag":117,"props":34438,"children":34439},{"style":143},[34440],{"type":34,"value":7617},{"type":29,"tag":117,"props":34442,"children":34443},{"style":372},[34444],{"type":34,"value":8982},{"type":29,"tag":117,"props":34446,"children":34447},{"style":384},[34448],{"type":34,"value":381},{"type":29,"tag":117,"props":34450,"children":34451},{"style":384},[34452],{"type":34,"value":3461},{"type":29,"tag":117,"props":34454,"children":34455},{"class":119,"line":304},[34456,34460,34464,34468,34472],{"type":29,"tag":117,"props":34457,"children":34458},{"style":143},[34459],{"type":34,"value":5616},{"type":29,"tag":117,"props":34461,"children":34462},{"style":378},[34463],{"type":34,"value":33160},{"type":29,"tag":117,"props":34465,"children":34466},{"style":160},[34467],{"type":34,"value":5649},{"type":29,"tag":117,"props":34469,"children":34470},{"style":3476},[34471],{"type":34,"value":6140},{"type":29,"tag":117,"props":34473,"children":34474},{"style":384},[34475],{"type":34,"value":387},{"type":29,"tag":117,"props":34477,"children":34478},{"class":119,"line":313},[34479],{"type":29,"tag":117,"props":34480,"children":34481},{"style":384},[34482],{"type":34,"value":5632},{"type":29,"tag":117,"props":34484,"children":34485},{"class":119,"line":322},[34486],{"type":29,"tag":117,"props":34487,"children":34488},{"style":384},[34489],{"type":34,"value":2903},{"type":29,"tag":117,"props":34491,"children":34492},{"class":119,"line":331},[34493],{"type":29,"tag":117,"props":34494,"children":34495},{"emptyLinePlaceholder":13},[34496],{"type":34,"value":136},{"type":29,"tag":117,"props":34498,"children":34499},{"class":119,"line":340},[34500,34504,34509,34513,34517],{"type":29,"tag":117,"props":34501,"children":34502},{"style":143},[34503],{"type":34,"value":16091},{"type":29,"tag":117,"props":34505,"children":34506},{"style":2863},[34507],{"type":34,"value":34508}," Developer",{"type":29,"tag":117,"props":34510,"children":34511},{"style":143},[34512],{"type":34,"value":18946},{"type":29,"tag":117,"props":34514,"children":34515},{"style":2863},[34516],{"type":34,"value":7580},{"type":29,"tag":117,"props":34518,"children":34519},{"style":384},[34520],{"type":34,"value":3461},{"type":29,"tag":117,"props":34522,"children":34523},{"class":119,"line":348},[34524,34528,34532,34536,34540,34544,34548],{"type":29,"tag":117,"props":34525,"children":34526},{"style":143},[34527],{"type":34,"value":7641},{"type":29,"tag":117,"props":34529,"children":34530},{"style":372},[34531],{"type":34,"value":34508},{"type":29,"tag":117,"props":34533,"children":34534},{"style":384},[34535],{"type":34,"value":1108},{"type":29,"tag":117,"props":34537,"children":34538},{"style":143},[34539],{"type":34,"value":8592},{"type":29,"tag":117,"props":34541,"children":34542},{"style":7657},[34543],{"type":34,"value":32960},{"type":29,"tag":117,"props":34545,"children":34546},{"style":384},[34547],{"type":34,"value":2803},{"type":29,"tag":117,"props":34549,"children":34550},{"style":384},[34551],{"type":34,"value":3461},{"type":29,"tag":117,"props":34553,"children":34554},{"class":119,"line":357},[34555,34559,34563,34567],{"type":29,"tag":117,"props":34556,"children":34557},{"style":154},[34558],{"type":34,"value":29368},{"type":29,"tag":117,"props":34560,"children":34561},{"style":384},[34562],{"type":34,"value":1108},{"type":29,"tag":117,"props":34564,"children":34565},{"style":378},[34566],{"type":34,"value":33861},{"type":29,"tag":117,"props":34568,"children":34569},{"style":384},[34570],{"type":34,"value":5675},{"type":29,"tag":117,"props":34572,"children":34573},{"class":119,"line":1768},[34574],{"type":29,"tag":117,"props":34575,"children":34576},{"style":384},[34577],{"type":34,"value":5632},{"type":29,"tag":117,"props":34579,"children":34580},{"class":119,"line":953},[34581],{"type":29,"tag":117,"props":34582,"children":34583},{"emptyLinePlaceholder":13},[34584],{"type":34,"value":136},{"type":29,"tag":117,"props":34586,"children":34587},{"class":119,"line":9833},[34588,34592],{"type":29,"tag":117,"props":34589,"children":34590},{"style":10083},[34591],{"type":34,"value":10086},{"type":29,"tag":117,"props":34593,"children":34594},{"style":10089},[34595],{"type":34,"value":17746},{"type":29,"tag":117,"props":34597,"children":34598},{"class":119,"line":9870},[34599,34603,34607,34611,34615],{"type":29,"tag":117,"props":34600,"children":34601},{"style":143},[34602],{"type":34,"value":7641},{"type":29,"tag":117,"props":34604,"children":34605},{"style":143},[34606],{"type":34,"value":7617},{"type":29,"tag":117,"props":34608,"children":34609},{"style":372},[34610],{"type":34,"value":8982},{"type":29,"tag":117,"props":34612,"children":34613},{"style":384},[34614],{"type":34,"value":381},{"type":29,"tag":117,"props":34616,"children":34617},{"style":384},[34618],{"type":34,"value":3461},{"type":29,"tag":117,"props":34620,"children":34621},{"class":119,"line":9901},[34622,34626,34630,34634,34638],{"type":29,"tag":117,"props":34623,"children":34624},{"style":143},[34625],{"type":34,"value":5616},{"type":29,"tag":117,"props":34627,"children":34628},{"style":378},[34629],{"type":34,"value":33160},{"type":29,"tag":117,"props":34631,"children":34632},{"style":160},[34633],{"type":34,"value":5649},{"type":29,"tag":117,"props":34635,"children":34636},{"style":3476},[34637],{"type":34,"value":33240},{"type":29,"tag":117,"props":34639,"children":34640},{"style":384},[34641],{"type":34,"value":387},{"type":29,"tag":117,"props":34643,"children":34644},{"class":119,"line":9909},[34645],{"type":29,"tag":117,"props":34646,"children":34647},{"style":384},[34648],{"type":34,"value":5632},{"type":29,"tag":117,"props":34650,"children":34651},{"class":119,"line":19187},[34652],{"type":29,"tag":117,"props":34653,"children":34654},{"style":384},[34655],{"type":34,"value":2903},{"type":29,"tag":30,"props":34657,"children":34658},{},[34659,34661,34666],{"type":34,"value":34660},"Avec cette approche, la classe ",{"type":29,"tag":113,"props":34662,"children":34664},{"className":34663},[],[34665],{"type":34,"value":6491},{"type":34,"value":34667}," pose un cadre général pour tous les types d'employés ; chaque sous-classe prend en charge l'implémentation spécifique du calcul des salaires. Étendre le système revient à ajouter une nouvelle sous-classe : le code existant reste intact.",{"type":29,"tag":5462,"props":34669,"children":34670},{"type":5464},[34671],{"type":29,"tag":30,"props":34672,"children":34673},{},[34674],{"type":34,"value":34675},"** Les classes abstraites sont très utiles pour éviter la duplication de code commun tout en respectant OCP.",{"type":29,"tag":51,"props":34677,"children":34678},{},[],{"type":29,"tag":55,"props":34680,"children":34682},{"id":34681},"les-pièges-courants-et-comment-les-éviter",[34683],{"type":34,"value":34684},"Les pièges courants et comment les éviter",{"type":29,"tag":30,"props":34686,"children":34687},{},[34688],{"type":34,"value":34689},"OCP a l'air simple sur le papier. L'appliquer sans déraper l'est moins. Trois erreurs reviennent constamment :",{"type":29,"tag":4212,"props":34691,"children":34692},{},[34693,34717],{"type":29,"tag":1589,"props":34694,"children":34695},{},[34696,34701,34703,34708,34710,34715],{"type":29,"tag":45,"props":34697,"children":34698},{},[34699],{"type":34,"value":34700},"Complexité inutile",{"type":34,"value":34702}," : OCP doit rendre le code ",{"type":29,"tag":45,"props":34704,"children":34705},{},[34706],{"type":34,"value":34707},"extensible",{"type":34,"value":34709},", pas ",{"type":29,"tag":45,"props":34711,"children":34712},{},[34713],{"type":34,"value":34714},"complexe",{"type":34,"value":34716},". Empiler des couches d'abstraction ou des hiérarchies d'héritage juste pour cocher la case OCP alourdit le code sans bénéfice. Appliquez le principe là où il a un sens, pas partout.",{"type":29,"tag":1589,"props":34718,"children":34719},{},[34720,34725,34727,34732],{"type":29,"tag":45,"props":34721,"children":34722},{},[34723],{"type":34,"value":34724},"Abus d'héritage",{"type":34,"value":34726}," : créer de longues chaînes d'héritage au nom d'OCP est un classique. L'héritage rend pourtant le code rigide. Dans la plupart des cas, ",{"type":29,"tag":45,"props":34728,"children":34729},{},[34730],{"type":34,"value":34731},"la composition",{"type":34,"value":34733}," (utiliser des objets plutôt que des sous-classes) donne un résultat plus flexible.",{"type":29,"tag":5462,"props":34735,"children":34736},{"type":5464},[34737],{"type":29,"tag":30,"props":34738,"children":34739},{},[34740,34745],{"type":29,"tag":45,"props":34741,"children":34742},{},[34743],{"type":34,"value":34744},"Entre héritage et composition, préférez la composition.",{"type":34,"value":34746}," Vous obtenez des modules plus flexibles et plus réutilisables.",{"type":29,"tag":4212,"props":34748,"children":34749},{"start":139},[34750],{"type":29,"tag":1589,"props":34751,"children":34752},{},[34753,34758],{"type":29,"tag":45,"props":34754,"children":34755},{},[34756],{"type":34,"value":34757},"Modifier le code existant alors qu'on pourrait l'éviter",{"type":34,"value":34759}," : la tentation d'aller patcher une classe pour répondre à un nouveau besoin est forte. Si vous le faites souvent, le design initial manque de flexibilité, c'est lui qu'il faut revoir.",{"type":29,"tag":51,"props":34761,"children":34762},{},[],{"type":29,"tag":55,"props":34764,"children":34766},{"id":34765},"conclusion-rendre-votre-code-plus-flexible-avec-ocp",[34767],{"type":34,"value":34768},"Conclusion : Rendre votre code plus flexible avec OCP",{"type":29,"tag":30,"props":34770,"children":34771},{},[34772],{"type":34,"value":34773},"OCP est un levier puissant pour concevoir un code extensible, robuste et maintenable. Limiter les modifications du code existant réduit le risque d'erreur et fluidifie l'ajout de fonctionnalités.",{"type":29,"tag":30,"props":34775,"children":34776},{},[34777,34779,34783,34785,34789],{"type":34,"value":34778},"Interfaces, classes abstraites ou composition : peu importe l'outil, OCP donne à vos applications la marge d'adaptation aux changements futurs. En ",{"type":29,"tag":453,"props":34780,"children":34781},{"href":7134},[34782],{"type":34,"value":13956},{"type":34,"value":34784},", respecter ce principe signale un engagement clair : écrire du code qui fonctionne ",{"type":29,"tag":5410,"props":34786,"children":34787},{},[34788],{"type":34,"value":6884},{"type":34,"value":34790}," qui évolue avec élégance.",{"type":29,"tag":567,"props":34792,"children":34794},{"cta":805,"href":806,"title":34793,"type":808},"OCP n'est qu'une pratique parmi les 100 que j'applique pour coder propre",[34795],{"type":29,"tag":30,"props":34796,"children":34797},{},[34798],{"type":34,"value":34799},"Cet article détaille une seule pratique : concevoir pour l'extension plutôt que pour la modification. Le Craft Bundle réunit les 100 pratiques craft que j'applique au quotidien pour écrire du code maintenable, du choix de l'abstraction au découpage des responsabilités. Ce sont celles que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues tenir en production sur le long terme.",{"type":29,"tag":51,"props":34801,"children":34802},{},[],{"type":29,"tag":55,"props":34804,"children":34805},{"id":12496},[34806],{"type":34,"value":12499},{"type":29,"tag":825,"props":34808,"children":34809},{},[34810,34815],{"type":29,"tag":829,"props":34811,"children":34812},{},[34813],{"type":34,"value":34814},"1. Comment savoir si j’applique correctement le principe OCP ?",{"type":29,"tag":30,"props":34816,"children":34817},{},[34818],{"type":34,"value":34819},"Si vous pouvez ajouter de nouvelles fonctionnalités à votre code sans toucher au code existant, vous êtes probablement sur la bonne voie. Utilisez des abstractions comme les interfaces et les classes abstraites pour séparer les comportements.",{"type":29,"tag":825,"props":34821,"children":34822},{},[34823,34828],{"type":29,"tag":829,"props":34824,"children":34825},{},[34826],{"type":34,"value":34827},"2. Est-ce que suivre OCP rend le code plus compliqué ?",{"type":29,"tag":30,"props":34829,"children":34830},{},[34831],{"type":34,"value":34832},"Cela dépend de la manière dont vous l’implémentez. Si vous ajoutez trop de couches d’abstraction, cela peut effectivement compliquer les choses. L’objectif est de trouver un équilibre où votre code reste compréhensible tout en étant extensible.",{"type":29,"tag":825,"props":34834,"children":34835},{},[34836,34841],{"type":29,"tag":829,"props":34837,"children":34838},{},[34839],{"type":34,"value":34840},"3. Que faire si j’ai déjà du code qui ne respecte pas OCP ?",{"type":29,"tag":30,"props":34842,"children":34843},{},[34844],{"type":34,"value":34845},"Vous pouvez refactorer progressivement votre code en identifiant les parties les plus susceptibles de changer, puis en les isolant à l’aide d’abstractions. Refactoriser petit à petit permet d’améliorer le code sans introduire trop de risques.",{"type":29,"tag":825,"props":34847,"children":34848},{},[34849,34854],{"type":29,"tag":829,"props":34850,"children":34851},{},[34852],{"type":34,"value":34853},"4. OCP est-il toujours applicable ?",{"type":29,"tag":30,"props":34855,"children":34856},{},[34857],{"type":34,"value":34858},"Non, parfois, il n’est pas nécessaire d’appliquer OCP, surtout si vous travaillez sur une petite partie du code qui ne changera probablement jamais. Le principe doit être appliqué là où il est pertinent, c’est-à-dire là où il y a un potentiel de changement ou d’extension.",{"type":29,"tag":51,"props":34860,"children":34861},{},[],{"type":29,"tag":567,"props":34863,"children":34864},{"cta":28617,"href":918,"title":28618,"type":920},[34865],{"type":29,"tag":30,"props":34866,"children":34867},{},[34868],{"type":34,"value":28624},{"type":29,"tag":928,"props":34870,"children":34871},{},[34872],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":34874},[34875,34876,34880,34881,34884,34885,34886],{"id":32791,"depth":130,"text":32794},{"id":32828,"depth":130,"text":32831,"children":34877},[34878,34879],{"id":32880,"depth":139,"text":32883},{"id":33337,"depth":139,"text":33340},{"id":34041,"depth":130,"text":34044},{"id":34136,"depth":130,"text":34139,"children":34882},[34883],{"id":34147,"depth":139,"text":34150},{"id":34681,"depth":130,"text":34684},{"id":34765,"depth":130,"text":34768},{"id":12496,"depth":130,"text":12499},"content:fr:architecture-craft:principe-ocp-software-craftsmanship-exemples-java.md","fr\u002Farchitecture-craft\u002Fprincipe-ocp-software-craftsmanship-exemples-java.md","fr\u002Farchitecture-craft\u002Fprincipe-ocp-software-craftsmanship-exemples-java",{"_path":16428,"_dir":16372,"_draft":7,"_partial":7,"_locale":8,"title":34891,"description":34892,"id":34893,"date":34894,"listed":13,"nocomments":7,"hidden":7,"categories":34895,"tags":34896,"cover":34897,"readingTime":34898,"body":34902,"_type":942,"_id":37319,"_source":944,"_file":37320,"_stem":37321,"_extension":947},"Principe SRP en Software Craftsmanship, Comprendre et Appliquer le Single Responsibility Principle en Java","Découvrez comment appliquer le principe de responsabilité unique (SRP) en Java pour améliorer la lisibilité, la maintenabilité et la testabilité de...",47,"2024-01-16",[16372],[5391,18],"covers\u002Farticles\u002Fprincipe-srp.jpg",{"text":1775,"minutes":34899,"time":34900,"words":34901},7.345,440700,1469,{"type":26,"children":34903,"toc":37304},[34904,34910,34928,34948,34953,34959,34976,34981,34986,35213,35233,35238,35509,35536,35545,35551,35564,35570,35575,35581,35586,35592,35597,35603,35609,35622,35892,35897,36292,36298,36310,36633,36638,37090,37093,37099,37104,37157,37163,37169,37174,37180,37185,37191,37196,37202,37207,37216,37219,37225,37238,37251,37264,37277,37290,37293,37300],{"type":29,"tag":55,"props":34905,"children":34907},{"id":34906},"principe-srp-en-software-craftsmanship-explications-et-exemples-en-java",[34908],{"type":34,"value":34909},"Principe SRP en Software Craftsmanship : Explications et Exemples en Java",{"type":29,"tag":30,"props":34911,"children":34912},{},[34913,34915,34920,34922,34926],{"type":34,"value":34914},"Une classe qui fait tellement de choses qu'on ne sait plus par où l'attaquer pour la modifier : chaque équipe que j'accompagne en a au moins une. Ajouter une fonctionnalité ou corriger un bug devient un pari : on touche un endroit, on casse autre chose. Cette situation porte un nom : violation du ",{"type":29,"tag":45,"props":34916,"children":34917},{},[34918],{"type":34,"value":34919},"principe SRP (Single Responsibility Principle)",{"type":34,"value":34921},". Robert C. Martin, qui l'a formalisé dans ",{"type":29,"tag":5410,"props":34923,"children":34924},{},[34925],{"type":34,"value":5414},{"type":34,"value":34927},", le résume ainsi : une classe ne devrait avoir qu'une seule raison de changer.",{"type":29,"tag":30,"props":34929,"children":34930},{},[34931,34933,34937,34939,34946],{"type":34,"value":34932},"Le SRP est l'un des cinq ",{"type":29,"tag":453,"props":34934,"children":34935},{"href":6919},[34936],{"type":34,"value":6922},{"type":34,"value":34938},", piliers du ",{"type":29,"tag":45,"props":34940,"children":34941},{},[34942],{"type":29,"tag":453,"props":34943,"children":34944},{"href":7134},[34945],{"type":34,"value":7137},{"type":34,"value":34947},". Comprendre le concept est trivial. L'appliquer sans tomber dans la sur-fragmentation l'est beaucoup moins. La plupart des équipes oscillent entre des classes monolithiques et un éclatement excessif où plus rien n'a de cohérence.",{"type":29,"tag":30,"props":34949,"children":34950},{},[34951],{"type":34,"value":34952},"Cet article montre comment appliquer le SRP de manière pragmatique dans des projets Java, avec des exemples concrets tirés de cas réels.",{"type":29,"tag":55,"props":34954,"children":34956},{"id":34955},"introduction-au-principe-srp",[34957],{"type":34,"value":34958},"Introduction au principe SRP",{"type":29,"tag":30,"props":34960,"children":34961},{},[34962,34963,34967,34969,34974],{"type":34,"value":7167},{"type":29,"tag":45,"props":34964,"children":34965},{},[34966],{"type":34,"value":22218},{"type":34,"value":34968},", ou principe de responsabilité unique, est souvent résumé ainsi : ",{"type":29,"tag":45,"props":34970,"children":34971},{},[34972],{"type":34,"value":34973},"\"Une classe ne devrait avoir qu'une seule raison de changer.\"",{"type":34,"value":34975}," Autrement dit, une classe doit se concentrer sur une seule tâche ou responsabilité.",{"type":29,"tag":30,"props":34977,"children":34978},{},[34979],{"type":34,"value":34980},"L'idée derrière le SRP est simple, mais puissante. Lorsque vous suivez ce principe, chaque classe dans votre code est responsable d'un aspect spécifique du système, ce qui la rend plus facile à comprendre, à modifier et à tester. Si une classe a plusieurs responsabilités, elle devient complexe, et chaque modification pour une responsabilité peut avoir des impacts imprévus sur une autre.",{"type":29,"tag":30,"props":34982,"children":34983},{},[34984],{"type":34,"value":34985},"Prenons un exemple simple :",{"type":29,"tag":106,"props":34987,"children":34989},{"className":5519,"code":34988,"language":5521,"meta":8,"style":8},"public class UserManager {\n    public void createUser(String username, String password) {\n        \u002F\u002F Logique pour créer un utilisateur\n    }\n\n    public void log(String message) {\n        \u002F\u002F Logique pour enregistrer un log\n    }\n\n    public void sendEmail(String email, String message) {\n        \u002F\u002F Logique pour envoyer un email\n    }\n}\n",[34990],{"type":29,"tag":113,"props":34991,"children":34992},{"__ignoreMap":8},[34993,35013,35063,35071,35078,35085,35121,35129,35136,35143,35191,35199,35206],{"type":29,"tag":117,"props":34994,"children":34995},{"class":119,"line":120},[34996,35000,35004,35009],{"type":29,"tag":117,"props":34997,"children":34998},{"style":143},[34999],{"type":34,"value":5541},{"type":29,"tag":117,"props":35001,"children":35002},{"style":143},[35003],{"type":34,"value":7575},{"type":29,"tag":117,"props":35005,"children":35006},{"style":2863},[35007],{"type":34,"value":35008}," UserManager",{"type":29,"tag":117,"props":35010,"children":35011},{"style":384},[35012],{"type":34,"value":3461},{"type":29,"tag":117,"props":35014,"children":35015},{"class":119,"line":130},[35016,35020,35024,35029,35033,35037,35042,35046,35050,35055,35059],{"type":29,"tag":117,"props":35017,"children":35018},{"style":143},[35019],{"type":34,"value":7641},{"type":29,"tag":117,"props":35021,"children":35022},{"style":143},[35023],{"type":34,"value":7762},{"type":29,"tag":117,"props":35025,"children":35026},{"style":372},[35027],{"type":34,"value":35028}," createUser",{"type":29,"tag":117,"props":35030,"children":35031},{"style":384},[35032],{"type":34,"value":1108},{"type":29,"tag":117,"props":35034,"children":35035},{"style":5976},[35036],{"type":34,"value":7654},{"type":29,"tag":117,"props":35038,"children":35039},{"style":7657},[35040],{"type":34,"value":35041}," username",{"type":29,"tag":117,"props":35043,"children":35044},{"style":384},[35045],{"type":34,"value":1118},{"type":29,"tag":117,"props":35047,"children":35048},{"style":5976},[35049],{"type":34,"value":6477},{"type":29,"tag":117,"props":35051,"children":35052},{"style":7657},[35053],{"type":34,"value":35054}," password",{"type":29,"tag":117,"props":35056,"children":35057},{"style":384},[35058],{"type":34,"value":2803},{"type":29,"tag":117,"props":35060,"children":35061},{"style":384},[35062],{"type":34,"value":3461},{"type":29,"tag":117,"props":35064,"children":35065},{"class":119,"line":139},[35066],{"type":29,"tag":117,"props":35067,"children":35068},{"style":124},[35069],{"type":34,"value":35070},"        \u002F\u002F Logique pour créer un utilisateur\n",{"type":29,"tag":117,"props":35072,"children":35073},{"class":119,"line":172},[35074],{"type":29,"tag":117,"props":35075,"children":35076},{"style":384},[35077],{"type":34,"value":5632},{"type":29,"tag":117,"props":35079,"children":35080},{"class":119,"line":181},[35081],{"type":29,"tag":117,"props":35082,"children":35083},{"emptyLinePlaceholder":13},[35084],{"type":34,"value":136},{"type":29,"tag":117,"props":35086,"children":35087},{"class":119,"line":189},[35088,35092,35096,35101,35105,35109,35113,35117],{"type":29,"tag":117,"props":35089,"children":35090},{"style":143},[35091],{"type":34,"value":7641},{"type":29,"tag":117,"props":35093,"children":35094},{"style":143},[35095],{"type":34,"value":7762},{"type":29,"tag":117,"props":35097,"children":35098},{"style":372},[35099],{"type":34,"value":35100}," log",{"type":29,"tag":117,"props":35102,"children":35103},{"style":384},[35104],{"type":34,"value":1108},{"type":29,"tag":117,"props":35106,"children":35107},{"style":5976},[35108],{"type":34,"value":7654},{"type":29,"tag":117,"props":35110,"children":35111},{"style":7657},[35112],{"type":34,"value":20943},{"type":29,"tag":117,"props":35114,"children":35115},{"style":384},[35116],{"type":34,"value":2803},{"type":29,"tag":117,"props":35118,"children":35119},{"style":384},[35120],{"type":34,"value":3461},{"type":29,"tag":117,"props":35122,"children":35123},{"class":119,"line":198},[35124],{"type":29,"tag":117,"props":35125,"children":35126},{"style":124},[35127],{"type":34,"value":35128},"        \u002F\u002F Logique pour enregistrer un log\n",{"type":29,"tag":117,"props":35130,"children":35131},{"class":119,"line":207},[35132],{"type":29,"tag":117,"props":35133,"children":35134},{"style":384},[35135],{"type":34,"value":5632},{"type":29,"tag":117,"props":35137,"children":35138},{"class":119,"line":215},[35139],{"type":29,"tag":117,"props":35140,"children":35141},{"emptyLinePlaceholder":13},[35142],{"type":34,"value":136},{"type":29,"tag":117,"props":35144,"children":35145},{"class":119,"line":224},[35146,35150,35154,35158,35162,35166,35171,35175,35179,35183,35187],{"type":29,"tag":117,"props":35147,"children":35148},{"style":143},[35149],{"type":34,"value":7641},{"type":29,"tag":117,"props":35151,"children":35152},{"style":143},[35153],{"type":34,"value":7762},{"type":29,"tag":117,"props":35155,"children":35156},{"style":372},[35157],{"type":34,"value":20930},{"type":29,"tag":117,"props":35159,"children":35160},{"style":384},[35161],{"type":34,"value":1108},{"type":29,"tag":117,"props":35163,"children":35164},{"style":5976},[35165],{"type":34,"value":7654},{"type":29,"tag":117,"props":35167,"children":35168},{"style":7657},[35169],{"type":34,"value":35170}," email",{"type":29,"tag":117,"props":35172,"children":35173},{"style":384},[35174],{"type":34,"value":1118},{"type":29,"tag":117,"props":35176,"children":35177},{"style":5976},[35178],{"type":34,"value":6477},{"type":29,"tag":117,"props":35180,"children":35181},{"style":7657},[35182],{"type":34,"value":20943},{"type":29,"tag":117,"props":35184,"children":35185},{"style":384},[35186],{"type":34,"value":2803},{"type":29,"tag":117,"props":35188,"children":35189},{"style":384},[35190],{"type":34,"value":3461},{"type":29,"tag":117,"props":35192,"children":35193},{"class":119,"line":233},[35194],{"type":29,"tag":117,"props":35195,"children":35196},{"style":124},[35197],{"type":34,"value":35198},"        \u002F\u002F Logique pour envoyer un email\n",{"type":29,"tag":117,"props":35200,"children":35201},{"class":119,"line":242},[35202],{"type":29,"tag":117,"props":35203,"children":35204},{"style":384},[35205],{"type":34,"value":5632},{"type":29,"tag":117,"props":35207,"children":35208},{"class":119,"line":251},[35209],{"type":29,"tag":117,"props":35210,"children":35211},{"style":384},[35212],{"type":34,"value":2903},{"type":29,"tag":30,"props":35214,"children":35215},{},[35216,35217,35223,35225,35231],{"type":34,"value":29266},{"type":29,"tag":113,"props":35218,"children":35220},{"className":35219},[],[35221],{"type":34,"value":35222},"UserManager",{"type":34,"value":35224}," gère plusieurs responsabilités : la création d'utilisateur, la gestion des logs, et l'envoi d'emails. Si vous devez modifier la méthode ",{"type":29,"tag":113,"props":35226,"children":35228},{"className":35227},[],[35229],{"type":34,"value":35230},"createUser",{"type":34,"value":35232},", vous risquez de casser des fonctionnalités de logging ou d'emailing, car tout est couplé dans une seule classe.",{"type":29,"tag":30,"props":35234,"children":35235},{},[35236],{"type":34,"value":35237},"Pour appliquer le SRP, vous devez découper cette classe en plusieurs classes, chacune ayant une responsabilité bien définie :",{"type":29,"tag":106,"props":35239,"children":35241},{"className":5519,"code":35240,"language":5521,"meta":8,"style":8},"public class UserManager {\n    public void createUser(String username, String password) {\n        \u002F\u002F Logique pour créer un utilisateur\n    }\n}\n\npublic class Logger {\n    public void log(String message) {\n        \u002F\u002F Logique pour enregistrer un log\n    }\n}\n\npublic class EmailService {\n    public void sendEmail(String email, String message) {\n        \u002F\u002F Logique pour envoyer un email\n    }\n}\n",[35242],{"type":29,"tag":113,"props":35243,"children":35244},{"__ignoreMap":8},[35245,35264,35311,35318,35325,35332,35339,35359,35394,35401,35408,35415,35422,35441,35488,35495,35502],{"type":29,"tag":117,"props":35246,"children":35247},{"class":119,"line":120},[35248,35252,35256,35260],{"type":29,"tag":117,"props":35249,"children":35250},{"style":143},[35251],{"type":34,"value":5541},{"type":29,"tag":117,"props":35253,"children":35254},{"style":143},[35255],{"type":34,"value":7575},{"type":29,"tag":117,"props":35257,"children":35258},{"style":2863},[35259],{"type":34,"value":35008},{"type":29,"tag":117,"props":35261,"children":35262},{"style":384},[35263],{"type":34,"value":3461},{"type":29,"tag":117,"props":35265,"children":35266},{"class":119,"line":130},[35267,35271,35275,35279,35283,35287,35291,35295,35299,35303,35307],{"type":29,"tag":117,"props":35268,"children":35269},{"style":143},[35270],{"type":34,"value":7641},{"type":29,"tag":117,"props":35272,"children":35273},{"style":143},[35274],{"type":34,"value":7762},{"type":29,"tag":117,"props":35276,"children":35277},{"style":372},[35278],{"type":34,"value":35028},{"type":29,"tag":117,"props":35280,"children":35281},{"style":384},[35282],{"type":34,"value":1108},{"type":29,"tag":117,"props":35284,"children":35285},{"style":5976},[35286],{"type":34,"value":7654},{"type":29,"tag":117,"props":35288,"children":35289},{"style":7657},[35290],{"type":34,"value":35041},{"type":29,"tag":117,"props":35292,"children":35293},{"style":384},[35294],{"type":34,"value":1118},{"type":29,"tag":117,"props":35296,"children":35297},{"style":5976},[35298],{"type":34,"value":6477},{"type":29,"tag":117,"props":35300,"children":35301},{"style":7657},[35302],{"type":34,"value":35054},{"type":29,"tag":117,"props":35304,"children":35305},{"style":384},[35306],{"type":34,"value":2803},{"type":29,"tag":117,"props":35308,"children":35309},{"style":384},[35310],{"type":34,"value":3461},{"type":29,"tag":117,"props":35312,"children":35313},{"class":119,"line":139},[35314],{"type":29,"tag":117,"props":35315,"children":35316},{"style":124},[35317],{"type":34,"value":35070},{"type":29,"tag":117,"props":35319,"children":35320},{"class":119,"line":172},[35321],{"type":29,"tag":117,"props":35322,"children":35323},{"style":384},[35324],{"type":34,"value":5632},{"type":29,"tag":117,"props":35326,"children":35327},{"class":119,"line":181},[35328],{"type":29,"tag":117,"props":35329,"children":35330},{"style":384},[35331],{"type":34,"value":2903},{"type":29,"tag":117,"props":35333,"children":35334},{"class":119,"line":189},[35335],{"type":29,"tag":117,"props":35336,"children":35337},{"emptyLinePlaceholder":13},[35338],{"type":34,"value":136},{"type":29,"tag":117,"props":35340,"children":35341},{"class":119,"line":198},[35342,35346,35350,35355],{"type":29,"tag":117,"props":35343,"children":35344},{"style":143},[35345],{"type":34,"value":5541},{"type":29,"tag":117,"props":35347,"children":35348},{"style":143},[35349],{"type":34,"value":7575},{"type":29,"tag":117,"props":35351,"children":35352},{"style":2863},[35353],{"type":34,"value":35354}," Logger",{"type":29,"tag":117,"props":35356,"children":35357},{"style":384},[35358],{"type":34,"value":3461},{"type":29,"tag":117,"props":35360,"children":35361},{"class":119,"line":207},[35362,35366,35370,35374,35378,35382,35386,35390],{"type":29,"tag":117,"props":35363,"children":35364},{"style":143},[35365],{"type":34,"value":7641},{"type":29,"tag":117,"props":35367,"children":35368},{"style":143},[35369],{"type":34,"value":7762},{"type":29,"tag":117,"props":35371,"children":35372},{"style":372},[35373],{"type":34,"value":35100},{"type":29,"tag":117,"props":35375,"children":35376},{"style":384},[35377],{"type":34,"value":1108},{"type":29,"tag":117,"props":35379,"children":35380},{"style":5976},[35381],{"type":34,"value":7654},{"type":29,"tag":117,"props":35383,"children":35384},{"style":7657},[35385],{"type":34,"value":20943},{"type":29,"tag":117,"props":35387,"children":35388},{"style":384},[35389],{"type":34,"value":2803},{"type":29,"tag":117,"props":35391,"children":35392},{"style":384},[35393],{"type":34,"value":3461},{"type":29,"tag":117,"props":35395,"children":35396},{"class":119,"line":215},[35397],{"type":29,"tag":117,"props":35398,"children":35399},{"style":124},[35400],{"type":34,"value":35128},{"type":29,"tag":117,"props":35402,"children":35403},{"class":119,"line":224},[35404],{"type":29,"tag":117,"props":35405,"children":35406},{"style":384},[35407],{"type":34,"value":5632},{"type":29,"tag":117,"props":35409,"children":35410},{"class":119,"line":233},[35411],{"type":29,"tag":117,"props":35412,"children":35413},{"style":384},[35414],{"type":34,"value":2903},{"type":29,"tag":117,"props":35416,"children":35417},{"class":119,"line":242},[35418],{"type":29,"tag":117,"props":35419,"children":35420},{"emptyLinePlaceholder":13},[35421],{"type":34,"value":136},{"type":29,"tag":117,"props":35423,"children":35424},{"class":119,"line":251},[35425,35429,35433,35437],{"type":29,"tag":117,"props":35426,"children":35427},{"style":143},[35428],{"type":34,"value":5541},{"type":29,"tag":117,"props":35430,"children":35431},{"style":143},[35432],{"type":34,"value":7575},{"type":29,"tag":117,"props":35434,"children":35435},{"style":2863},[35436],{"type":34,"value":20910},{"type":29,"tag":117,"props":35438,"children":35439},{"style":384},[35440],{"type":34,"value":3461},{"type":29,"tag":117,"props":35442,"children":35443},{"class":119,"line":260},[35444,35448,35452,35456,35460,35464,35468,35472,35476,35480,35484],{"type":29,"tag":117,"props":35445,"children":35446},{"style":143},[35447],{"type":34,"value":7641},{"type":29,"tag":117,"props":35449,"children":35450},{"style":143},[35451],{"type":34,"value":7762},{"type":29,"tag":117,"props":35453,"children":35454},{"style":372},[35455],{"type":34,"value":20930},{"type":29,"tag":117,"props":35457,"children":35458},{"style":384},[35459],{"type":34,"value":1108},{"type":29,"tag":117,"props":35461,"children":35462},{"style":5976},[35463],{"type":34,"value":7654},{"type":29,"tag":117,"props":35465,"children":35466},{"style":7657},[35467],{"type":34,"value":35170},{"type":29,"tag":117,"props":35469,"children":35470},{"style":384},[35471],{"type":34,"value":1118},{"type":29,"tag":117,"props":35473,"children":35474},{"style":5976},[35475],{"type":34,"value":6477},{"type":29,"tag":117,"props":35477,"children":35478},{"style":7657},[35479],{"type":34,"value":20943},{"type":29,"tag":117,"props":35481,"children":35482},{"style":384},[35483],{"type":34,"value":2803},{"type":29,"tag":117,"props":35485,"children":35486},{"style":384},[35487],{"type":34,"value":3461},{"type":29,"tag":117,"props":35489,"children":35490},{"class":119,"line":269},[35491],{"type":29,"tag":117,"props":35492,"children":35493},{"style":124},[35494],{"type":34,"value":35198},{"type":29,"tag":117,"props":35496,"children":35497},{"class":119,"line":278},[35498],{"type":29,"tag":117,"props":35499,"children":35500},{"style":384},[35501],{"type":34,"value":5632},{"type":29,"tag":117,"props":35503,"children":35504},{"class":119,"line":286},[35505],{"type":29,"tag":117,"props":35506,"children":35507},{"style":384},[35508],{"type":34,"value":2903},{"type":29,"tag":30,"props":35510,"children":35511},{},[35512,35514,35519,35521,35527,35529,35534],{"type":34,"value":35513},"Maintenant, chaque classe a une seule responsabilité : ",{"type":29,"tag":113,"props":35515,"children":35517},{"className":35516},[],[35518],{"type":34,"value":35222},{"type":34,"value":35520}," s'occupe de la création d'utilisateur, ",{"type":29,"tag":113,"props":35522,"children":35524},{"className":35523},[],[35525],{"type":34,"value":35526},"Logger",{"type":34,"value":35528}," gère les logs, et ",{"type":29,"tag":113,"props":35530,"children":35532},{"className":35531},[],[35533],{"type":34,"value":20886},{"type":34,"value":35535}," est responsable de l'envoi des emails. Cela rend le code plus propre et plus facile à maintenir.",{"type":29,"tag":567,"props":35537,"children":35539},{"cta":569,"href":570,"title":35538,"type":572},"Vous voulez sentir où découper une classe sans tomber dans la sur-fragmentation ?",[35540],{"type":29,"tag":30,"props":35541,"children":35542},{},[35543],{"type":34,"value":35544},"Identifier les responsabilités d'une classe, c'est un jugement qui se travaille, pas une règle qu'on récite. En mentoring 1:1, je relis votre code avec vous et on découpe vos vraies classes ensemble, jusqu'à ce que vous repériez les bonnes frontières d'instinct. Vous arrêtez d'osciller entre le monolithe et la poussière de mini-classes.",{"type":29,"tag":55,"props":35546,"children":35548},{"id":35547},"pourquoi-le-srp-est-il-important-dans-le-software-craftsmanship",[35549],{"type":34,"value":35550},"Pourquoi le SRP est-il important dans le Software Craftsmanship ?",{"type":29,"tag":30,"props":35552,"children":35553},{},[35554,35555,35562],{"type":34,"value":7167},{"type":29,"tag":45,"props":35556,"children":35557},{},[35558],{"type":29,"tag":453,"props":35559,"children":35560},{"href":7134},[35561],{"type":34,"value":7137},{"type":34,"value":35563}," se concentre sur l’écriture d’un code de qualité, maintenable et évolutif. C’est un mouvement qui valorise les bonnes pratiques de développement et la création de logiciels avec soin et précision. Dans cette optique, le principe de responsabilité unique (SRP) joue un rôle clé.",{"type":29,"tag":7528,"props":35565,"children":35567},{"id":35566},"simplification-et-maintenabilité",[35568],{"type":34,"value":35569},"Simplification et maintenabilité",{"type":29,"tag":30,"props":35571,"children":35572},{},[35573],{"type":34,"value":35574},"Le SRP réduit la complexité du code. Une classe qui fait une seule chose se comprend et se modifie sans effort comparé à une classe qui en porte plusieurs : moins d'erreurs, plus de productivité d'équipe.",{"type":29,"tag":7528,"props":35576,"children":35578},{"id":35577},"facilite-les-tests-unitaires",[35579],{"type":34,"value":35580},"Facilite les tests unitaires",{"type":29,"tag":30,"props":35582,"children":35583},{},[35584],{"type":34,"value":35585},"Le SRP rend aussi les tests unitaires plus simples. Une classe à responsabilité unique a généralement peu de dépendances, et chaque fonctionnalité se teste isolément sans avoir à simuler des comportements parasites.",{"type":29,"tag":7528,"props":35587,"children":35589},{"id":35588},"favorise-lévolutivité",[35590],{"type":34,"value":35591},"Favorise l’évolutivité",{"type":29,"tag":30,"props":35593,"children":35594},{},[35595],{"type":34,"value":35596},"Avec le SRP, étendre les fonctionnalités d'une application devient prévisible. Quand chaque classe a une responsabilité clairement définie, ajouter une fonctionnalité n'oblige pas à refactoriser une grande partie du code : on ajoute une nouvelle classe ou on modifie une classe existante sans risque de régression ailleurs. Dans une équipe que j'accompagnais dans l'assurance, les cycles de release sont passés de 6 semaines à 2 semaines après l'application du SRP sur les services métier les plus chargés.",{"type":29,"tag":4530,"props":35598,"children":35600},{"id":35599},"_3-comment-appliquer-le-srp-en-java-exemples-concrets",[35601],{"type":34,"value":35602},"3. Comment appliquer le SRP en Java : exemples concrets",{"type":29,"tag":7528,"props":35604,"children":35606},{"id":35605},"exemple-1-gestion-des-utilisateurs",[35607],{"type":34,"value":35608},"Exemple 1 : Gestion des utilisateurs",{"type":29,"tag":30,"props":35610,"children":35611},{},[35612,35614,35620],{"type":34,"value":35613},"Voici un exemple de violation du SRP avec une classe ",{"type":29,"tag":113,"props":35615,"children":35617},{"className":35616},[],[35618],{"type":34,"value":35619},"UserService",{"type":34,"value":35621}," qui gère à la fois la création d'utilisateurs et l'envoi d'emails.",{"type":29,"tag":106,"props":35623,"children":35625},{"className":5519,"code":35624,"language":5521,"meta":8,"style":8},"public class UserService {\n    public void createUser(String username, String password) {\n        \u002F\u002F Logique pour créer un utilisateur\n        System.out.println(\"Utilisateur créé avec succès !\");\n        \n        \u002F\u002F Envoyer un email de bienvenue\n        sendWelcomeEmail(username);\n    }\n\n    public void sendWelcomeEmail(String username) {\n        \u002F\u002F Logique pour envoyer un email de bienvenue\n        System.out.println(\"Email envoyé à \" + username);\n    }\n}\n",[35626],{"type":29,"tag":113,"props":35627,"children":35628},{"__ignoreMap":8},[35629,35649,35696,35703,35739,35747,35755,35776,35783,35790,35826,35834,35878,35885],{"type":29,"tag":117,"props":35630,"children":35631},{"class":119,"line":120},[35632,35636,35640,35645],{"type":29,"tag":117,"props":35633,"children":35634},{"style":143},[35635],{"type":34,"value":5541},{"type":29,"tag":117,"props":35637,"children":35638},{"style":143},[35639],{"type":34,"value":7575},{"type":29,"tag":117,"props":35641,"children":35642},{"style":2863},[35643],{"type":34,"value":35644}," UserService",{"type":29,"tag":117,"props":35646,"children":35647},{"style":384},[35648],{"type":34,"value":3461},{"type":29,"tag":117,"props":35650,"children":35651},{"class":119,"line":130},[35652,35656,35660,35664,35668,35672,35676,35680,35684,35688,35692],{"type":29,"tag":117,"props":35653,"children":35654},{"style":143},[35655],{"type":34,"value":7641},{"type":29,"tag":117,"props":35657,"children":35658},{"style":143},[35659],{"type":34,"value":7762},{"type":29,"tag":117,"props":35661,"children":35662},{"style":372},[35663],{"type":34,"value":35028},{"type":29,"tag":117,"props":35665,"children":35666},{"style":384},[35667],{"type":34,"value":1108},{"type":29,"tag":117,"props":35669,"children":35670},{"style":5976},[35671],{"type":34,"value":7654},{"type":29,"tag":117,"props":35673,"children":35674},{"style":7657},[35675],{"type":34,"value":35041},{"type":29,"tag":117,"props":35677,"children":35678},{"style":384},[35679],{"type":34,"value":1118},{"type":29,"tag":117,"props":35681,"children":35682},{"style":5976},[35683],{"type":34,"value":6477},{"type":29,"tag":117,"props":35685,"children":35686},{"style":7657},[35687],{"type":34,"value":35054},{"type":29,"tag":117,"props":35689,"children":35690},{"style":384},[35691],{"type":34,"value":2803},{"type":29,"tag":117,"props":35693,"children":35694},{"style":384},[35695],{"type":34,"value":3461},{"type":29,"tag":117,"props":35697,"children":35698},{"class":119,"line":139},[35699],{"type":29,"tag":117,"props":35700,"children":35701},{"style":124},[35702],{"type":34,"value":35070},{"type":29,"tag":117,"props":35704,"children":35705},{"class":119,"line":172},[35706,35710,35714,35718,35722,35726,35730,35735],{"type":29,"tag":117,"props":35707,"children":35708},{"style":378},[35709],{"type":34,"value":16717},{"type":29,"tag":117,"props":35711,"children":35712},{"style":384},[35713],{"type":34,"value":369},{"type":29,"tag":117,"props":35715,"children":35716},{"style":378},[35717],{"type":34,"value":15075},{"type":29,"tag":117,"props":35719,"children":35720},{"style":384},[35721],{"type":34,"value":369},{"type":29,"tag":117,"props":35723,"children":35724},{"style":372},[35725],{"type":34,"value":15084},{"type":29,"tag":117,"props":35727,"children":35728},{"style":384},[35729],{"type":34,"value":1108},{"type":29,"tag":117,"props":35731,"children":35732},{"style":166},[35733],{"type":34,"value":35734},"\"Utilisateur créé avec succès !\"",{"type":29,"tag":117,"props":35736,"children":35737},{"style":384},[35738],{"type":34,"value":5675},{"type":29,"tag":117,"props":35740,"children":35741},{"class":119,"line":181},[35742],{"type":29,"tag":117,"props":35743,"children":35744},{"style":378},[35745],{"type":34,"value":35746},"        \n",{"type":29,"tag":117,"props":35748,"children":35749},{"class":119,"line":189},[35750],{"type":29,"tag":117,"props":35751,"children":35752},{"style":124},[35753],{"type":34,"value":35754},"        \u002F\u002F Envoyer un email de bienvenue\n",{"type":29,"tag":117,"props":35756,"children":35757},{"class":119,"line":198},[35758,35763,35767,35772],{"type":29,"tag":117,"props":35759,"children":35760},{"style":372},[35761],{"type":34,"value":35762},"        sendWelcomeEmail",{"type":29,"tag":117,"props":35764,"children":35765},{"style":384},[35766],{"type":34,"value":1108},{"type":29,"tag":117,"props":35768,"children":35769},{"style":378},[35770],{"type":34,"value":35771},"username",{"type":29,"tag":117,"props":35773,"children":35774},{"style":384},[35775],{"type":34,"value":5675},{"type":29,"tag":117,"props":35777,"children":35778},{"class":119,"line":207},[35779],{"type":29,"tag":117,"props":35780,"children":35781},{"style":384},[35782],{"type":34,"value":5632},{"type":29,"tag":117,"props":35784,"children":35785},{"class":119,"line":215},[35786],{"type":29,"tag":117,"props":35787,"children":35788},{"emptyLinePlaceholder":13},[35789],{"type":34,"value":136},{"type":29,"tag":117,"props":35791,"children":35792},{"class":119,"line":224},[35793,35797,35801,35806,35810,35814,35818,35822],{"type":29,"tag":117,"props":35794,"children":35795},{"style":143},[35796],{"type":34,"value":7641},{"type":29,"tag":117,"props":35798,"children":35799},{"style":143},[35800],{"type":34,"value":7762},{"type":29,"tag":117,"props":35802,"children":35803},{"style":372},[35804],{"type":34,"value":35805}," sendWelcomeEmail",{"type":29,"tag":117,"props":35807,"children":35808},{"style":384},[35809],{"type":34,"value":1108},{"type":29,"tag":117,"props":35811,"children":35812},{"style":5976},[35813],{"type":34,"value":7654},{"type":29,"tag":117,"props":35815,"children":35816},{"style":7657},[35817],{"type":34,"value":35041},{"type":29,"tag":117,"props":35819,"children":35820},{"style":384},[35821],{"type":34,"value":2803},{"type":29,"tag":117,"props":35823,"children":35824},{"style":384},[35825],{"type":34,"value":3461},{"type":29,"tag":117,"props":35827,"children":35828},{"class":119,"line":233},[35829],{"type":29,"tag":117,"props":35830,"children":35831},{"style":124},[35832],{"type":34,"value":35833},"        \u002F\u002F Logique pour envoyer un email de bienvenue\n",{"type":29,"tag":117,"props":35835,"children":35836},{"class":119,"line":242},[35837,35841,35845,35849,35853,35857,35861,35866,35870,35874],{"type":29,"tag":117,"props":35838,"children":35839},{"style":378},[35840],{"type":34,"value":16717},{"type":29,"tag":117,"props":35842,"children":35843},{"style":384},[35844],{"type":34,"value":369},{"type":29,"tag":117,"props":35846,"children":35847},{"style":378},[35848],{"type":34,"value":15075},{"type":29,"tag":117,"props":35850,"children":35851},{"style":384},[35852],{"type":34,"value":369},{"type":29,"tag":117,"props":35854,"children":35855},{"style":372},[35856],{"type":34,"value":15084},{"type":29,"tag":117,"props":35858,"children":35859},{"style":384},[35860],{"type":34,"value":1108},{"type":29,"tag":117,"props":35862,"children":35863},{"style":166},[35864],{"type":34,"value":35865},"\"Email envoyé à \"",{"type":29,"tag":117,"props":35867,"children":35868},{"style":160},[35869],{"type":34,"value":15098},{"type":29,"tag":117,"props":35871,"children":35872},{"style":378},[35873],{"type":34,"value":35041},{"type":29,"tag":117,"props":35875,"children":35876},{"style":384},[35877],{"type":34,"value":5675},{"type":29,"tag":117,"props":35879,"children":35880},{"class":119,"line":251},[35881],{"type":29,"tag":117,"props":35882,"children":35883},{"style":384},[35884],{"type":34,"value":5632},{"type":29,"tag":117,"props":35886,"children":35887},{"class":119,"line":260},[35888],{"type":29,"tag":117,"props":35889,"children":35890},{"style":384},[35891],{"type":34,"value":2903},{"type":29,"tag":30,"props":35893,"children":35894},{},[35895],{"type":34,"value":35896},"Cette classe gère deux responsabilités : la création d'utilisateur et l'envoi d'emails. En suivant le SRP, nous devrions séparer ces responsabilités dans deux classes distinctes.",{"type":29,"tag":106,"props":35898,"children":35900},{"className":5519,"code":35899,"language":5521,"meta":8,"style":8},"public class UserService {\n    private EmailService emailService;\n\n    public UserService(EmailService emailService) {\n        this.emailService = emailService;\n    }\n\n    public void createUser(String username, String password) {\n        \u002F\u002F Logique pour créer un utilisateur\n        System.out.println(\"Utilisateur créé avec succès !\");\n        \n        \u002F\u002F Utilisation de l'EmailService pour envoyer l'email\n        emailService.sendWelcomeEmail(username);\n    }\n}\n\npublic class EmailService {\n    public void sendWelcomeEmail(String username) {\n        \u002F\u002F Logique pour envoyer un email de bienvenue\n        System.out.println(\"Email envoyé à \" + username);\n    }\n}\n",[35901],{"type":29,"tag":113,"props":35902,"children":35903},{"__ignoreMap":8},[35904,35923,35942,35949,35980,36007,36014,36021,36068,36075,36110,36117,36125,36153,36160,36167,36174,36193,36228,36235,36278,36285],{"type":29,"tag":117,"props":35905,"children":35906},{"class":119,"line":120},[35907,35911,35915,35919],{"type":29,"tag":117,"props":35908,"children":35909},{"style":143},[35910],{"type":34,"value":5541},{"type":29,"tag":117,"props":35912,"children":35913},{"style":143},[35914],{"type":34,"value":7575},{"type":29,"tag":117,"props":35916,"children":35917},{"style":2863},[35918],{"type":34,"value":35644},{"type":29,"tag":117,"props":35920,"children":35921},{"style":384},[35922],{"type":34,"value":3461},{"type":29,"tag":117,"props":35924,"children":35925},{"class":119,"line":130},[35926,35930,35934,35938],{"type":29,"tag":117,"props":35927,"children":35928},{"style":143},[35929],{"type":34,"value":7592},{"type":29,"tag":117,"props":35931,"children":35932},{"style":5976},[35933],{"type":34,"value":20910},{"type":29,"tag":117,"props":35935,"children":35936},{"style":378},[35937],{"type":34,"value":21052},{"type":29,"tag":117,"props":35939,"children":35940},{"style":384},[35941],{"type":34,"value":387},{"type":29,"tag":117,"props":35943,"children":35944},{"class":119,"line":139},[35945],{"type":29,"tag":117,"props":35946,"children":35947},{"emptyLinePlaceholder":13},[35948],{"type":34,"value":136},{"type":29,"tag":117,"props":35950,"children":35951},{"class":119,"line":172},[35952,35956,35960,35964,35968,35972,35976],{"type":29,"tag":117,"props":35953,"children":35954},{"style":143},[35955],{"type":34,"value":7641},{"type":29,"tag":117,"props":35957,"children":35958},{"style":372},[35959],{"type":34,"value":35644},{"type":29,"tag":117,"props":35961,"children":35962},{"style":384},[35963],{"type":34,"value":1108},{"type":29,"tag":117,"props":35965,"children":35966},{"style":5976},[35967],{"type":34,"value":20886},{"type":29,"tag":117,"props":35969,"children":35970},{"style":7657},[35971],{"type":34,"value":21052},{"type":29,"tag":117,"props":35973,"children":35974},{"style":384},[35975],{"type":34,"value":2803},{"type":29,"tag":117,"props":35977,"children":35978},{"style":384},[35979],{"type":34,"value":3461},{"type":29,"tag":117,"props":35981,"children":35982},{"class":119,"line":181},[35983,35987,35991,35995,35999,36003],{"type":29,"tag":117,"props":35984,"children":35985},{"style":6700},[35986],{"type":34,"value":7687},{"type":29,"tag":117,"props":35988,"children":35989},{"style":384},[35990],{"type":34,"value":369},{"type":29,"tag":117,"props":35992,"children":35993},{"style":378},[35994],{"type":34,"value":21098},{"type":29,"tag":117,"props":35996,"children":35997},{"style":160},[35998],{"type":34,"value":6061},{"type":29,"tag":117,"props":36000,"children":36001},{"style":378},[36002],{"type":34,"value":21052},{"type":29,"tag":117,"props":36004,"children":36005},{"style":384},[36006],{"type":34,"value":387},{"type":29,"tag":117,"props":36008,"children":36009},{"class":119,"line":189},[36010],{"type":29,"tag":117,"props":36011,"children":36012},{"style":384},[36013],{"type":34,"value":5632},{"type":29,"tag":117,"props":36015,"children":36016},{"class":119,"line":198},[36017],{"type":29,"tag":117,"props":36018,"children":36019},{"emptyLinePlaceholder":13},[36020],{"type":34,"value":136},{"type":29,"tag":117,"props":36022,"children":36023},{"class":119,"line":207},[36024,36028,36032,36036,36040,36044,36048,36052,36056,36060,36064],{"type":29,"tag":117,"props":36025,"children":36026},{"style":143},[36027],{"type":34,"value":7641},{"type":29,"tag":117,"props":36029,"children":36030},{"style":143},[36031],{"type":34,"value":7762},{"type":29,"tag":117,"props":36033,"children":36034},{"style":372},[36035],{"type":34,"value":35028},{"type":29,"tag":117,"props":36037,"children":36038},{"style":384},[36039],{"type":34,"value":1108},{"type":29,"tag":117,"props":36041,"children":36042},{"style":5976},[36043],{"type":34,"value":7654},{"type":29,"tag":117,"props":36045,"children":36046},{"style":7657},[36047],{"type":34,"value":35041},{"type":29,"tag":117,"props":36049,"children":36050},{"style":384},[36051],{"type":34,"value":1118},{"type":29,"tag":117,"props":36053,"children":36054},{"style":5976},[36055],{"type":34,"value":6477},{"type":29,"tag":117,"props":36057,"children":36058},{"style":7657},[36059],{"type":34,"value":35054},{"type":29,"tag":117,"props":36061,"children":36062},{"style":384},[36063],{"type":34,"value":2803},{"type":29,"tag":117,"props":36065,"children":36066},{"style":384},[36067],{"type":34,"value":3461},{"type":29,"tag":117,"props":36069,"children":36070},{"class":119,"line":215},[36071],{"type":29,"tag":117,"props":36072,"children":36073},{"style":124},[36074],{"type":34,"value":35070},{"type":29,"tag":117,"props":36076,"children":36077},{"class":119,"line":224},[36078,36082,36086,36090,36094,36098,36102,36106],{"type":29,"tag":117,"props":36079,"children":36080},{"style":378},[36081],{"type":34,"value":16717},{"type":29,"tag":117,"props":36083,"children":36084},{"style":384},[36085],{"type":34,"value":369},{"type":29,"tag":117,"props":36087,"children":36088},{"style":378},[36089],{"type":34,"value":15075},{"type":29,"tag":117,"props":36091,"children":36092},{"style":384},[36093],{"type":34,"value":369},{"type":29,"tag":117,"props":36095,"children":36096},{"style":372},[36097],{"type":34,"value":15084},{"type":29,"tag":117,"props":36099,"children":36100},{"style":384},[36101],{"type":34,"value":1108},{"type":29,"tag":117,"props":36103,"children":36104},{"style":166},[36105],{"type":34,"value":35734},{"type":29,"tag":117,"props":36107,"children":36108},{"style":384},[36109],{"type":34,"value":5675},{"type":29,"tag":117,"props":36111,"children":36112},{"class":119,"line":233},[36113],{"type":29,"tag":117,"props":36114,"children":36115},{"style":378},[36116],{"type":34,"value":35746},{"type":29,"tag":117,"props":36118,"children":36119},{"class":119,"line":242},[36120],{"type":29,"tag":117,"props":36121,"children":36122},{"style":124},[36123],{"type":34,"value":36124},"        \u002F\u002F Utilisation de l'EmailService pour envoyer l'email\n",{"type":29,"tag":117,"props":36126,"children":36127},{"class":119,"line":251},[36128,36132,36136,36141,36145,36149],{"type":29,"tag":117,"props":36129,"children":36130},{"style":378},[36131],{"type":34,"value":21172},{"type":29,"tag":117,"props":36133,"children":36134},{"style":384},[36135],{"type":34,"value":369},{"type":29,"tag":117,"props":36137,"children":36138},{"style":372},[36139],{"type":34,"value":36140},"sendWelcomeEmail",{"type":29,"tag":117,"props":36142,"children":36143},{"style":384},[36144],{"type":34,"value":1108},{"type":29,"tag":117,"props":36146,"children":36147},{"style":378},[36148],{"type":34,"value":35771},{"type":29,"tag":117,"props":36150,"children":36151},{"style":384},[36152],{"type":34,"value":5675},{"type":29,"tag":117,"props":36154,"children":36155},{"class":119,"line":260},[36156],{"type":29,"tag":117,"props":36157,"children":36158},{"style":384},[36159],{"type":34,"value":5632},{"type":29,"tag":117,"props":36161,"children":36162},{"class":119,"line":269},[36163],{"type":29,"tag":117,"props":36164,"children":36165},{"style":384},[36166],{"type":34,"value":2903},{"type":29,"tag":117,"props":36168,"children":36169},{"class":119,"line":278},[36170],{"type":29,"tag":117,"props":36171,"children":36172},{"emptyLinePlaceholder":13},[36173],{"type":34,"value":136},{"type":29,"tag":117,"props":36175,"children":36176},{"class":119,"line":286},[36177,36181,36185,36189],{"type":29,"tag":117,"props":36178,"children":36179},{"style":143},[36180],{"type":34,"value":5541},{"type":29,"tag":117,"props":36182,"children":36183},{"style":143},[36184],{"type":34,"value":7575},{"type":29,"tag":117,"props":36186,"children":36187},{"style":2863},[36188],{"type":34,"value":20910},{"type":29,"tag":117,"props":36190,"children":36191},{"style":384},[36192],{"type":34,"value":3461},{"type":29,"tag":117,"props":36194,"children":36195},{"class":119,"line":295},[36196,36200,36204,36208,36212,36216,36220,36224],{"type":29,"tag":117,"props":36197,"children":36198},{"style":143},[36199],{"type":34,"value":7641},{"type":29,"tag":117,"props":36201,"children":36202},{"style":143},[36203],{"type":34,"value":7762},{"type":29,"tag":117,"props":36205,"children":36206},{"style":372},[36207],{"type":34,"value":35805},{"type":29,"tag":117,"props":36209,"children":36210},{"style":384},[36211],{"type":34,"value":1108},{"type":29,"tag":117,"props":36213,"children":36214},{"style":5976},[36215],{"type":34,"value":7654},{"type":29,"tag":117,"props":36217,"children":36218},{"style":7657},[36219],{"type":34,"value":35041},{"type":29,"tag":117,"props":36221,"children":36222},{"style":384},[36223],{"type":34,"value":2803},{"type":29,"tag":117,"props":36225,"children":36226},{"style":384},[36227],{"type":34,"value":3461},{"type":29,"tag":117,"props":36229,"children":36230},{"class":119,"line":304},[36231],{"type":29,"tag":117,"props":36232,"children":36233},{"style":124},[36234],{"type":34,"value":35833},{"type":29,"tag":117,"props":36236,"children":36237},{"class":119,"line":313},[36238,36242,36246,36250,36254,36258,36262,36266,36270,36274],{"type":29,"tag":117,"props":36239,"children":36240},{"style":378},[36241],{"type":34,"value":16717},{"type":29,"tag":117,"props":36243,"children":36244},{"style":384},[36245],{"type":34,"value":369},{"type":29,"tag":117,"props":36247,"children":36248},{"style":378},[36249],{"type":34,"value":15075},{"type":29,"tag":117,"props":36251,"children":36252},{"style":384},[36253],{"type":34,"value":369},{"type":29,"tag":117,"props":36255,"children":36256},{"style":372},[36257],{"type":34,"value":15084},{"type":29,"tag":117,"props":36259,"children":36260},{"style":384},[36261],{"type":34,"value":1108},{"type":29,"tag":117,"props":36263,"children":36264},{"style":166},[36265],{"type":34,"value":35865},{"type":29,"tag":117,"props":36267,"children":36268},{"style":160},[36269],{"type":34,"value":15098},{"type":29,"tag":117,"props":36271,"children":36272},{"style":378},[36273],{"type":34,"value":35041},{"type":29,"tag":117,"props":36275,"children":36276},{"style":384},[36277],{"type":34,"value":5675},{"type":29,"tag":117,"props":36279,"children":36280},{"class":119,"line":322},[36281],{"type":29,"tag":117,"props":36282,"children":36283},{"style":384},[36284],{"type":34,"value":5632},{"type":29,"tag":117,"props":36286,"children":36287},{"class":119,"line":331},[36288],{"type":29,"tag":117,"props":36289,"children":36290},{"style":384},[36291],{"type":34,"value":2903},{"type":29,"tag":7528,"props":36293,"children":36295},{"id":36294},"exemple-2-traitement-des-paiements",[36296],{"type":34,"value":36297},"Exemple 2 : Traitement des paiements",{"type":29,"tag":30,"props":36299,"children":36300},{},[36301,36303,36308],{"type":34,"value":36302},"Prenons l’exemple d’une classe ",{"type":29,"tag":113,"props":36304,"children":36306},{"className":36305},[],[36307],{"type":34,"value":17332},{"type":34,"value":36309}," qui viole le SRP en gérant à la fois le traitement des paiements et l’envoi des reçus.",{"type":29,"tag":106,"props":36311,"children":36313},{"className":5519,"code":36312,"language":5521,"meta":8,"style":8},"public class PaymentProcessor {\n    public void processPayment(String creditCard, double amount) {\n        \u002F\u002F Logique pour traiter le paiement\n        System.out.println(\"Paiement de \" + amount + \"€ traité avec la carte \" + creditCard);\n\n        \u002F\u002F Envoyer un reçu par email\n        sendReceipt(creditCard, amount);\n    }\n\n    private void sendReceipt(String creditCard, double amount) {\n        \u002F\u002F Logique pour envoyer un reçu\n        System.out.println(\"Reçu envoyé pour un paiement de \" + amount + \"€.\");\n    }\n}\n",[36314],{"type":29,"tag":113,"props":36315,"children":36316},{"__ignoreMap":8},[36317,36336,36384,36391,36453,36460,36468,36496,36503,36510,36558,36566,36619,36626],{"type":29,"tag":117,"props":36318,"children":36319},{"class":119,"line":120},[36320,36324,36328,36332],{"type":29,"tag":117,"props":36321,"children":36322},{"style":143},[36323],{"type":34,"value":5541},{"type":29,"tag":117,"props":36325,"children":36326},{"style":143},[36327],{"type":34,"value":7575},{"type":29,"tag":117,"props":36329,"children":36330},{"style":2863},[36331],{"type":34,"value":17357},{"type":29,"tag":117,"props":36333,"children":36334},{"style":384},[36335],{"type":34,"value":3461},{"type":29,"tag":117,"props":36337,"children":36338},{"class":119,"line":130},[36339,36343,36347,36351,36355,36359,36364,36368,36372,36376,36380],{"type":29,"tag":117,"props":36340,"children":36341},{"style":143},[36342],{"type":34,"value":7641},{"type":29,"tag":117,"props":36344,"children":36345},{"style":143},[36346],{"type":34,"value":7762},{"type":29,"tag":117,"props":36348,"children":36349},{"style":372},[36350],{"type":34,"value":9474},{"type":29,"tag":117,"props":36352,"children":36353},{"style":384},[36354],{"type":34,"value":1108},{"type":29,"tag":117,"props":36356,"children":36357},{"style":5976},[36358],{"type":34,"value":7654},{"type":29,"tag":117,"props":36360,"children":36361},{"style":7657},[36362],{"type":34,"value":36363}," creditCard",{"type":29,"tag":117,"props":36365,"children":36366},{"style":384},[36367],{"type":34,"value":1118},{"type":29,"tag":117,"props":36369,"children":36370},{"style":143},[36371],{"type":34,"value":7617},{"type":29,"tag":117,"props":36373,"children":36374},{"style":7657},[36375],{"type":34,"value":8597},{"type":29,"tag":117,"props":36377,"children":36378},{"style":384},[36379],{"type":34,"value":2803},{"type":29,"tag":117,"props":36381,"children":36382},{"style":384},[36383],{"type":34,"value":3461},{"type":29,"tag":117,"props":36385,"children":36386},{"class":119,"line":139},[36387],{"type":29,"tag":117,"props":36388,"children":36389},{"style":124},[36390],{"type":34,"value":10717},{"type":29,"tag":117,"props":36392,"children":36393},{"class":119,"line":172},[36394,36398,36402,36406,36410,36414,36418,36423,36427,36432,36436,36441,36445,36449],{"type":29,"tag":117,"props":36395,"children":36396},{"style":378},[36397],{"type":34,"value":16717},{"type":29,"tag":117,"props":36399,"children":36400},{"style":384},[36401],{"type":34,"value":369},{"type":29,"tag":117,"props":36403,"children":36404},{"style":378},[36405],{"type":34,"value":15075},{"type":29,"tag":117,"props":36407,"children":36408},{"style":384},[36409],{"type":34,"value":369},{"type":29,"tag":117,"props":36411,"children":36412},{"style":372},[36413],{"type":34,"value":15084},{"type":29,"tag":117,"props":36415,"children":36416},{"style":384},[36417],{"type":34,"value":1108},{"type":29,"tag":117,"props":36419,"children":36420},{"style":166},[36421],{"type":34,"value":36422},"\"Paiement de \"",{"type":29,"tag":117,"props":36424,"children":36425},{"style":160},[36426],{"type":34,"value":15098},{"type":29,"tag":117,"props":36428,"children":36429},{"style":378},[36430],{"type":34,"value":36431}," amount ",{"type":29,"tag":117,"props":36433,"children":36434},{"style":160},[36435],{"type":34,"value":5870},{"type":29,"tag":117,"props":36437,"children":36438},{"style":166},[36439],{"type":34,"value":36440}," \"€ traité avec la carte \"",{"type":29,"tag":117,"props":36442,"children":36443},{"style":160},[36444],{"type":34,"value":15098},{"type":29,"tag":117,"props":36446,"children":36447},{"style":378},[36448],{"type":34,"value":36363},{"type":29,"tag":117,"props":36450,"children":36451},{"style":384},[36452],{"type":34,"value":5675},{"type":29,"tag":117,"props":36454,"children":36455},{"class":119,"line":181},[36456],{"type":29,"tag":117,"props":36457,"children":36458},{"emptyLinePlaceholder":13},[36459],{"type":34,"value":136},{"type":29,"tag":117,"props":36461,"children":36462},{"class":119,"line":189},[36463],{"type":29,"tag":117,"props":36464,"children":36465},{"style":124},[36466],{"type":34,"value":36467},"        \u002F\u002F Envoyer un reçu par email\n",{"type":29,"tag":117,"props":36469,"children":36470},{"class":119,"line":198},[36471,36476,36480,36484,36488,36492],{"type":29,"tag":117,"props":36472,"children":36473},{"style":372},[36474],{"type":34,"value":36475},"        sendReceipt",{"type":29,"tag":117,"props":36477,"children":36478},{"style":384},[36479],{"type":34,"value":1108},{"type":29,"tag":117,"props":36481,"children":36482},{"style":378},[36483],{"type":34,"value":18364},{"type":29,"tag":117,"props":36485,"children":36486},{"style":384},[36487],{"type":34,"value":1118},{"type":29,"tag":117,"props":36489,"children":36490},{"style":378},[36491],{"type":34,"value":8597},{"type":29,"tag":117,"props":36493,"children":36494},{"style":384},[36495],{"type":34,"value":5675},{"type":29,"tag":117,"props":36497,"children":36498},{"class":119,"line":207},[36499],{"type":29,"tag":117,"props":36500,"children":36501},{"style":384},[36502],{"type":34,"value":5632},{"type":29,"tag":117,"props":36504,"children":36505},{"class":119,"line":215},[36506],{"type":29,"tag":117,"props":36507,"children":36508},{"emptyLinePlaceholder":13},[36509],{"type":34,"value":136},{"type":29,"tag":117,"props":36511,"children":36512},{"class":119,"line":224},[36513,36517,36521,36526,36530,36534,36538,36542,36546,36550,36554],{"type":29,"tag":117,"props":36514,"children":36515},{"style":143},[36516],{"type":34,"value":7592},{"type":29,"tag":117,"props":36518,"children":36519},{"style":143},[36520],{"type":34,"value":7762},{"type":29,"tag":117,"props":36522,"children":36523},{"style":372},[36524],{"type":34,"value":36525}," sendReceipt",{"type":29,"tag":117,"props":36527,"children":36528},{"style":384},[36529],{"type":34,"value":1108},{"type":29,"tag":117,"props":36531,"children":36532},{"style":5976},[36533],{"type":34,"value":7654},{"type":29,"tag":117,"props":36535,"children":36536},{"style":7657},[36537],{"type":34,"value":36363},{"type":29,"tag":117,"props":36539,"children":36540},{"style":384},[36541],{"type":34,"value":1118},{"type":29,"tag":117,"props":36543,"children":36544},{"style":143},[36545],{"type":34,"value":7617},{"type":29,"tag":117,"props":36547,"children":36548},{"style":7657},[36549],{"type":34,"value":8597},{"type":29,"tag":117,"props":36551,"children":36552},{"style":384},[36553],{"type":34,"value":2803},{"type":29,"tag":117,"props":36555,"children":36556},{"style":384},[36557],{"type":34,"value":3461},{"type":29,"tag":117,"props":36559,"children":36560},{"class":119,"line":233},[36561],{"type":29,"tag":117,"props":36562,"children":36563},{"style":124},[36564],{"type":34,"value":36565},"        \u002F\u002F Logique pour envoyer un reçu\n",{"type":29,"tag":117,"props":36567,"children":36568},{"class":119,"line":242},[36569,36573,36577,36581,36585,36589,36593,36598,36602,36606,36610,36615],{"type":29,"tag":117,"props":36570,"children":36571},{"style":378},[36572],{"type":34,"value":16717},{"type":29,"tag":117,"props":36574,"children":36575},{"style":384},[36576],{"type":34,"value":369},{"type":29,"tag":117,"props":36578,"children":36579},{"style":378},[36580],{"type":34,"value":15075},{"type":29,"tag":117,"props":36582,"children":36583},{"style":384},[36584],{"type":34,"value":369},{"type":29,"tag":117,"props":36586,"children":36587},{"style":372},[36588],{"type":34,"value":15084},{"type":29,"tag":117,"props":36590,"children":36591},{"style":384},[36592],{"type":34,"value":1108},{"type":29,"tag":117,"props":36594,"children":36595},{"style":166},[36596],{"type":34,"value":36597},"\"Reçu envoyé pour un paiement de \"",{"type":29,"tag":117,"props":36599,"children":36600},{"style":160},[36601],{"type":34,"value":15098},{"type":29,"tag":117,"props":36603,"children":36604},{"style":378},[36605],{"type":34,"value":36431},{"type":29,"tag":117,"props":36607,"children":36608},{"style":160},[36609],{"type":34,"value":5870},{"type":29,"tag":117,"props":36611,"children":36612},{"style":166},[36613],{"type":34,"value":36614}," \"€.\"",{"type":29,"tag":117,"props":36616,"children":36617},{"style":384},[36618],{"type":34,"value":5675},{"type":29,"tag":117,"props":36620,"children":36621},{"class":119,"line":251},[36622],{"type":29,"tag":117,"props":36623,"children":36624},{"style":384},[36625],{"type":34,"value":5632},{"type":29,"tag":117,"props":36627,"children":36628},{"class":119,"line":260},[36629],{"type":29,"tag":117,"props":36630,"children":36631},{"style":384},[36632],{"type":34,"value":2903},{"type":29,"tag":30,"props":36634,"children":36635},{},[36636],{"type":34,"value":36637},"Ici, la classe gère deux responsabilités. En appliquant le SRP, on peut diviser cela en deux classes distinctes.",{"type":29,"tag":106,"props":36639,"children":36641},{"className":5519,"code":36640,"language":5521,"meta":8,"style":8},"public class PaymentProcessor {\n    private ReceiptSender receiptSender;\n\n    public PaymentProcessor(ReceiptSender receiptSender) {\n        this.receiptSender = receiptSender;\n    }\n\n    public void processPayment(String creditCard, double amount) {\n        \u002F\u002F Logique pour traiter le paiement\n        System.out.println(\"Paiement de \" + amount + \"€ traité avec la carte \" + creditCard);\n\n        \u002F\u002F Utilisation de ReceiptSender pour envoyer le reçu\n        receiptSender.sendReceipt(creditCard, amount);\n    }\n}\n\npublic class ReceiptSender {\n    public void sendReceipt(String creditCard, double amount) {\n        \u002F\u002F Logique pour envoyer un reçu\n        System.out.println(\"Reçu envoyé pour un paiement de \" + amount + \"€.\");\n    }\n}\n",[36642],{"type":29,"tag":113,"props":36643,"children":36644},{"__ignoreMap":8},[36645,36664,36685,36692,36724,36752,36759,36766,36813,36820,36879,36886,36894,36931,36938,36945,36952,36971,37018,37025,37076,37083],{"type":29,"tag":117,"props":36646,"children":36647},{"class":119,"line":120},[36648,36652,36656,36660],{"type":29,"tag":117,"props":36649,"children":36650},{"style":143},[36651],{"type":34,"value":5541},{"type":29,"tag":117,"props":36653,"children":36654},{"style":143},[36655],{"type":34,"value":7575},{"type":29,"tag":117,"props":36657,"children":36658},{"style":2863},[36659],{"type":34,"value":17357},{"type":29,"tag":117,"props":36661,"children":36662},{"style":384},[36663],{"type":34,"value":3461},{"type":29,"tag":117,"props":36665,"children":36666},{"class":119,"line":130},[36667,36671,36676,36681],{"type":29,"tag":117,"props":36668,"children":36669},{"style":143},[36670],{"type":34,"value":7592},{"type":29,"tag":117,"props":36672,"children":36673},{"style":5976},[36674],{"type":34,"value":36675}," ReceiptSender",{"type":29,"tag":117,"props":36677,"children":36678},{"style":378},[36679],{"type":34,"value":36680}," receiptSender",{"type":29,"tag":117,"props":36682,"children":36683},{"style":384},[36684],{"type":34,"value":387},{"type":29,"tag":117,"props":36686,"children":36687},{"class":119,"line":139},[36688],{"type":29,"tag":117,"props":36689,"children":36690},{"emptyLinePlaceholder":13},[36691],{"type":34,"value":136},{"type":29,"tag":117,"props":36693,"children":36694},{"class":119,"line":172},[36695,36699,36703,36707,36712,36716,36720],{"type":29,"tag":117,"props":36696,"children":36697},{"style":143},[36698],{"type":34,"value":7641},{"type":29,"tag":117,"props":36700,"children":36701},{"style":372},[36702],{"type":34,"value":17357},{"type":29,"tag":117,"props":36704,"children":36705},{"style":384},[36706],{"type":34,"value":1108},{"type":29,"tag":117,"props":36708,"children":36709},{"style":5976},[36710],{"type":34,"value":36711},"ReceiptSender",{"type":29,"tag":117,"props":36713,"children":36714},{"style":7657},[36715],{"type":34,"value":36680},{"type":29,"tag":117,"props":36717,"children":36718},{"style":384},[36719],{"type":34,"value":2803},{"type":29,"tag":117,"props":36721,"children":36722},{"style":384},[36723],{"type":34,"value":3461},{"type":29,"tag":117,"props":36725,"children":36726},{"class":119,"line":181},[36727,36731,36735,36740,36744,36748],{"type":29,"tag":117,"props":36728,"children":36729},{"style":6700},[36730],{"type":34,"value":7687},{"type":29,"tag":117,"props":36732,"children":36733},{"style":384},[36734],{"type":34,"value":369},{"type":29,"tag":117,"props":36736,"children":36737},{"style":378},[36738],{"type":34,"value":36739},"receiptSender ",{"type":29,"tag":117,"props":36741,"children":36742},{"style":160},[36743],{"type":34,"value":6061},{"type":29,"tag":117,"props":36745,"children":36746},{"style":378},[36747],{"type":34,"value":36680},{"type":29,"tag":117,"props":36749,"children":36750},{"style":384},[36751],{"type":34,"value":387},{"type":29,"tag":117,"props":36753,"children":36754},{"class":119,"line":189},[36755],{"type":29,"tag":117,"props":36756,"children":36757},{"style":384},[36758],{"type":34,"value":5632},{"type":29,"tag":117,"props":36760,"children":36761},{"class":119,"line":198},[36762],{"type":29,"tag":117,"props":36763,"children":36764},{"emptyLinePlaceholder":13},[36765],{"type":34,"value":136},{"type":29,"tag":117,"props":36767,"children":36768},{"class":119,"line":207},[36769,36773,36777,36781,36785,36789,36793,36797,36801,36805,36809],{"type":29,"tag":117,"props":36770,"children":36771},{"style":143},[36772],{"type":34,"value":7641},{"type":29,"tag":117,"props":36774,"children":36775},{"style":143},[36776],{"type":34,"value":7762},{"type":29,"tag":117,"props":36778,"children":36779},{"style":372},[36780],{"type":34,"value":9474},{"type":29,"tag":117,"props":36782,"children":36783},{"style":384},[36784],{"type":34,"value":1108},{"type":29,"tag":117,"props":36786,"children":36787},{"style":5976},[36788],{"type":34,"value":7654},{"type":29,"tag":117,"props":36790,"children":36791},{"style":7657},[36792],{"type":34,"value":36363},{"type":29,"tag":117,"props":36794,"children":36795},{"style":384},[36796],{"type":34,"value":1118},{"type":29,"tag":117,"props":36798,"children":36799},{"style":143},[36800],{"type":34,"value":7617},{"type":29,"tag":117,"props":36802,"children":36803},{"style":7657},[36804],{"type":34,"value":8597},{"type":29,"tag":117,"props":36806,"children":36807},{"style":384},[36808],{"type":34,"value":2803},{"type":29,"tag":117,"props":36810,"children":36811},{"style":384},[36812],{"type":34,"value":3461},{"type":29,"tag":117,"props":36814,"children":36815},{"class":119,"line":215},[36816],{"type":29,"tag":117,"props":36817,"children":36818},{"style":124},[36819],{"type":34,"value":10717},{"type":29,"tag":117,"props":36821,"children":36822},{"class":119,"line":224},[36823,36827,36831,36835,36839,36843,36847,36851,36855,36859,36863,36867,36871,36875],{"type":29,"tag":117,"props":36824,"children":36825},{"style":378},[36826],{"type":34,"value":16717},{"type":29,"tag":117,"props":36828,"children":36829},{"style":384},[36830],{"type":34,"value":369},{"type":29,"tag":117,"props":36832,"children":36833},{"style":378},[36834],{"type":34,"value":15075},{"type":29,"tag":117,"props":36836,"children":36837},{"style":384},[36838],{"type":34,"value":369},{"type":29,"tag":117,"props":36840,"children":36841},{"style":372},[36842],{"type":34,"value":15084},{"type":29,"tag":117,"props":36844,"children":36845},{"style":384},[36846],{"type":34,"value":1108},{"type":29,"tag":117,"props":36848,"children":36849},{"style":166},[36850],{"type":34,"value":36422},{"type":29,"tag":117,"props":36852,"children":36853},{"style":160},[36854],{"type":34,"value":15098},{"type":29,"tag":117,"props":36856,"children":36857},{"style":378},[36858],{"type":34,"value":36431},{"type":29,"tag":117,"props":36860,"children":36861},{"style":160},[36862],{"type":34,"value":5870},{"type":29,"tag":117,"props":36864,"children":36865},{"style":166},[36866],{"type":34,"value":36440},{"type":29,"tag":117,"props":36868,"children":36869},{"style":160},[36870],{"type":34,"value":15098},{"type":29,"tag":117,"props":36872,"children":36873},{"style":378},[36874],{"type":34,"value":36363},{"type":29,"tag":117,"props":36876,"children":36877},{"style":384},[36878],{"type":34,"value":5675},{"type":29,"tag":117,"props":36880,"children":36881},{"class":119,"line":233},[36882],{"type":29,"tag":117,"props":36883,"children":36884},{"emptyLinePlaceholder":13},[36885],{"type":34,"value":136},{"type":29,"tag":117,"props":36887,"children":36888},{"class":119,"line":242},[36889],{"type":29,"tag":117,"props":36890,"children":36891},{"style":124},[36892],{"type":34,"value":36893},"        \u002F\u002F Utilisation de ReceiptSender pour envoyer le reçu\n",{"type":29,"tag":117,"props":36895,"children":36896},{"class":119,"line":251},[36897,36902,36906,36911,36915,36919,36923,36927],{"type":29,"tag":117,"props":36898,"children":36899},{"style":378},[36900],{"type":34,"value":36901},"        receiptSender",{"type":29,"tag":117,"props":36903,"children":36904},{"style":384},[36905],{"type":34,"value":369},{"type":29,"tag":117,"props":36907,"children":36908},{"style":372},[36909],{"type":34,"value":36910},"sendReceipt",{"type":29,"tag":117,"props":36912,"children":36913},{"style":384},[36914],{"type":34,"value":1108},{"type":29,"tag":117,"props":36916,"children":36917},{"style":378},[36918],{"type":34,"value":18364},{"type":29,"tag":117,"props":36920,"children":36921},{"style":384},[36922],{"type":34,"value":1118},{"type":29,"tag":117,"props":36924,"children":36925},{"style":378},[36926],{"type":34,"value":8597},{"type":29,"tag":117,"props":36928,"children":36929},{"style":384},[36930],{"type":34,"value":5675},{"type":29,"tag":117,"props":36932,"children":36933},{"class":119,"line":260},[36934],{"type":29,"tag":117,"props":36935,"children":36936},{"style":384},[36937],{"type":34,"value":5632},{"type":29,"tag":117,"props":36939,"children":36940},{"class":119,"line":269},[36941],{"type":29,"tag":117,"props":36942,"children":36943},{"style":384},[36944],{"type":34,"value":2903},{"type":29,"tag":117,"props":36946,"children":36947},{"class":119,"line":278},[36948],{"type":29,"tag":117,"props":36949,"children":36950},{"emptyLinePlaceholder":13},[36951],{"type":34,"value":136},{"type":29,"tag":117,"props":36953,"children":36954},{"class":119,"line":286},[36955,36959,36963,36967],{"type":29,"tag":117,"props":36956,"children":36957},{"style":143},[36958],{"type":34,"value":5541},{"type":29,"tag":117,"props":36960,"children":36961},{"style":143},[36962],{"type":34,"value":7575},{"type":29,"tag":117,"props":36964,"children":36965},{"style":2863},[36966],{"type":34,"value":36675},{"type":29,"tag":117,"props":36968,"children":36969},{"style":384},[36970],{"type":34,"value":3461},{"type":29,"tag":117,"props":36972,"children":36973},{"class":119,"line":295},[36974,36978,36982,36986,36990,36994,36998,37002,37006,37010,37014],{"type":29,"tag":117,"props":36975,"children":36976},{"style":143},[36977],{"type":34,"value":7641},{"type":29,"tag":117,"props":36979,"children":36980},{"style":143},[36981],{"type":34,"value":7762},{"type":29,"tag":117,"props":36983,"children":36984},{"style":372},[36985],{"type":34,"value":36525},{"type":29,"tag":117,"props":36987,"children":36988},{"style":384},[36989],{"type":34,"value":1108},{"type":29,"tag":117,"props":36991,"children":36992},{"style":5976},[36993],{"type":34,"value":7654},{"type":29,"tag":117,"props":36995,"children":36996},{"style":7657},[36997],{"type":34,"value":36363},{"type":29,"tag":117,"props":36999,"children":37000},{"style":384},[37001],{"type":34,"value":1118},{"type":29,"tag":117,"props":37003,"children":37004},{"style":143},[37005],{"type":34,"value":7617},{"type":29,"tag":117,"props":37007,"children":37008},{"style":7657},[37009],{"type":34,"value":8597},{"type":29,"tag":117,"props":37011,"children":37012},{"style":384},[37013],{"type":34,"value":2803},{"type":29,"tag":117,"props":37015,"children":37016},{"style":384},[37017],{"type":34,"value":3461},{"type":29,"tag":117,"props":37019,"children":37020},{"class":119,"line":304},[37021],{"type":29,"tag":117,"props":37022,"children":37023},{"style":124},[37024],{"type":34,"value":36565},{"type":29,"tag":117,"props":37026,"children":37027},{"class":119,"line":313},[37028,37032,37036,37040,37044,37048,37052,37056,37060,37064,37068,37072],{"type":29,"tag":117,"props":37029,"children":37030},{"style":378},[37031],{"type":34,"value":16717},{"type":29,"tag":117,"props":37033,"children":37034},{"style":384},[37035],{"type":34,"value":369},{"type":29,"tag":117,"props":37037,"children":37038},{"style":378},[37039],{"type":34,"value":15075},{"type":29,"tag":117,"props":37041,"children":37042},{"style":384},[37043],{"type":34,"value":369},{"type":29,"tag":117,"props":37045,"children":37046},{"style":372},[37047],{"type":34,"value":15084},{"type":29,"tag":117,"props":37049,"children":37050},{"style":384},[37051],{"type":34,"value":1108},{"type":29,"tag":117,"props":37053,"children":37054},{"style":166},[37055],{"type":34,"value":36597},{"type":29,"tag":117,"props":37057,"children":37058},{"style":160},[37059],{"type":34,"value":15098},{"type":29,"tag":117,"props":37061,"children":37062},{"style":378},[37063],{"type":34,"value":36431},{"type":29,"tag":117,"props":37065,"children":37066},{"style":160},[37067],{"type":34,"value":5870},{"type":29,"tag":117,"props":37069,"children":37070},{"style":166},[37071],{"type":34,"value":36614},{"type":29,"tag":117,"props":37073,"children":37074},{"style":384},[37075],{"type":34,"value":5675},{"type":29,"tag":117,"props":37077,"children":37078},{"class":119,"line":322},[37079],{"type":29,"tag":117,"props":37080,"children":37081},{"style":384},[37082],{"type":34,"value":5632},{"type":29,"tag":117,"props":37084,"children":37085},{"class":119,"line":331},[37086],{"type":29,"tag":117,"props":37087,"children":37088},{"style":384},[37089],{"type":34,"value":2903},{"type":29,"tag":51,"props":37091,"children":37092},{},[],{"type":29,"tag":55,"props":37094,"children":37096},{"id":37095},"les-avantages-pratiques-du-srp",[37097],{"type":34,"value":37098},"Les avantages pratiques du SRP",{"type":29,"tag":30,"props":37100,"children":37101},{},[37102],{"type":34,"value":37103},"Appliquer le SRP apporte plusieurs avantages concrets :",{"type":29,"tag":1585,"props":37105,"children":37106},{},[37107,37117,37127,37137,37147],{"type":29,"tag":1589,"props":37108,"children":37109},{},[37110,37115],{"type":29,"tag":45,"props":37111,"children":37112},{},[37113],{"type":34,"value":37114},"Lisibilité accrue",{"type":34,"value":37116}," : chaque classe porte une seule tâche, la compréhension du code est immédiate.",{"type":29,"tag":1589,"props":37118,"children":37119},{},[37120,37125],{"type":29,"tag":45,"props":37121,"children":37122},{},[37123],{"type":34,"value":37124},"Maintenance et évolutions",{"type":34,"value":37126}," : modifier une fonctionnalité n'impacte plus le reste du système.",{"type":29,"tag":1589,"props":37128,"children":37129},{},[37130,37135],{"type":29,"tag":45,"props":37131,"children":37132},{},[37133],{"type":34,"value":37134},"Tests unitaires plus simples",{"type":34,"value":37136}," : responsabilité unique = peu de dépendances à mocker.",{"type":29,"tag":1589,"props":37138,"children":37139},{},[37140,37145],{"type":29,"tag":45,"props":37141,"children":37142},{},[37143],{"type":34,"value":37144},"Couplage réduit",{"type":34,"value":37146}," : le découpage des responsabilités casse les dépendances entre composants.",{"type":29,"tag":1589,"props":37148,"children":37149},{},[37150,37155],{"type":29,"tag":45,"props":37151,"children":37152},{},[37153],{"type":34,"value":37154},"Réutilisabilité accrue",{"type":34,"value":37156}," : les classes spécialisées trouvent leur place dans d'autres projets.",{"type":29,"tag":55,"props":37158,"children":37160},{"id":37159},"quand-et-pourquoi-le-srp-peut-poser-des-défis",[37161],{"type":34,"value":37162},"Quand et pourquoi le SRP peut poser des défis",{"type":29,"tag":4530,"props":37164,"children":37166},{"id":37165},"risque-de-sur-fragmentation",[37167],{"type":34,"value":37168},"Risque de sur-fragmentation",{"type":29,"tag":30,"props":37170,"children":37171},{},[37172],{"type":34,"value":37173},"Un SRP appliqué de manière dogmatique éclate le code en trop de classes et rend la navigation pénible. Cherchez l'équilibre : un cluster cohérent vaut mieux qu'une poussière de mini-classes.",{"type":29,"tag":4530,"props":37175,"children":37177},{"id":37176},"complexité-dans-les-petites-applications",[37178],{"type":34,"value":37179},"Complexité dans les petites applications",{"type":29,"tag":30,"props":37181,"children":37182},{},[37183],{"type":34,"value":37184},"Sur un prototype ou un petit projet, suivre rigoureusement le SRP ralentit le développement. C'est parfois acceptable de ne pas l'appliquer strictement quand le code restera simple ou temporaire.",{"type":29,"tag":4530,"props":37186,"children":37188},{"id":37187},"difficulté-à-identifier-les-responsabilités",[37189],{"type":34,"value":37190},"Difficulté à identifier les responsabilités",{"type":29,"tag":30,"props":37192,"children":37193},{},[37194],{"type":34,"value":37195},"Les frontières entre responsabilités sont parfois floues. Posez-vous la question : \"Pourquoi cette classe pourrait-elle changer ?\" Si la réponse contient plusieurs axes, vous tenez probablement une violation du SRP.",{"type":29,"tag":4530,"props":37197,"children":37199},{"id":37198},"refactorisation-dans-les-projets-existants",[37200],{"type":34,"value":37201},"Refactorisation dans les projets existants",{"type":29,"tag":30,"props":37203,"children":37204},{},[37205],{"type":34,"value":37206},"Appliquer le SRP à un projet existant chargé de dette technique demande une refactorisation lourde. Procédez par paliers : chaque classe découpée est un gain isolé, n'essayez pas de tout corriger d'un coup.",{"type":29,"tag":567,"props":37208,"children":37210},{"cta":805,"href":806,"title":37209,"type":808},"Le SRP n'est qu'une pratique parmi 100 pour coder propre",[37211],{"type":29,"tag":30,"props":37212,"children":37213},{},[37214],{"type":34,"value":37215},"Savoir découper une classe selon ses responsabilités, c'est une des pratiques craft que j'applique au quotidien. Le Craft Bundle réunit les 100 que j'utilise pour écrire un code propre et maintenable, du SRP au reste. Ce sont les pratiques que l'IA ne vous apprendra jamais, parce qu'elle ne les a jamais vues tenir un projet sur la durée.",{"type":29,"tag":51,"props":37217,"children":37218},{},[],{"type":29,"tag":55,"props":37220,"children":37222},{"id":37221},"faq-questions-fréquemment-posées-sur-le-srp",[37223],{"type":34,"value":37224},"FAQ : Questions fréquemment posées sur le SRP",{"type":29,"tag":825,"props":37226,"children":37227},{},[37228,37233],{"type":29,"tag":829,"props":37229,"children":37230},{},[37231],{"type":34,"value":37232},"1. Qu’est-ce que le principe de responsabilité unique (SRP) ?",{"type":29,"tag":30,"props":37234,"children":37235},{},[37236],{"type":34,"value":37237},"Le SRP stipule qu’une classe ne doit avoir qu’une seule responsabilité, c’est-à-dire qu’elle ne devrait avoir qu’une seule raison de changer.",{"type":29,"tag":825,"props":37239,"children":37240},{},[37241,37246],{"type":29,"tag":829,"props":37242,"children":37243},{},[37244],{"type":34,"value":37245},"2. Pourquoi est-il important de suivre le SRP ?",{"type":29,"tag":30,"props":37247,"children":37248},{},[37249],{"type":34,"value":37250},"Le SRP améliore la lisibilité, la maintenabilité et la testabilité du code, et réduit le couplage entre composants.",{"type":29,"tag":825,"props":37252,"children":37253},{},[37254,37259],{"type":29,"tag":829,"props":37255,"children":37256},{},[37257],{"type":34,"value":37258},"3. Comment savoir si une classe viole le SRP ?",{"type":29,"tag":30,"props":37260,"children":37261},{},[37262],{"type":34,"value":37263},"Si une classe a plusieurs responsabilités ou plusieurs raisons de changer, elle viole probablement le SRP.",{"type":29,"tag":825,"props":37265,"children":37266},{},[37267,37272],{"type":29,"tag":829,"props":37268,"children":37269},{},[37270],{"type":34,"value":37271},"4. Le SRP n’augmente-t-il pas le nombre de classes et la complexité du projet ?",{"type":29,"tag":30,"props":37273,"children":37274},{},[37275],{"type":34,"value":37276},"Le SRP augmente effectivement le nombre de classes, mais chaque classe devient triviale à comprendre, et le projet, plus simple à maintenir.",{"type":29,"tag":825,"props":37278,"children":37279},{},[37280,37285],{"type":29,"tag":829,"props":37281,"children":37282},{},[37283],{"type":34,"value":37284},"5. Dois-je toujours appliquer le SRP, même dans les petits projets ?",{"type":29,"tag":30,"props":37286,"children":37287},{},[37288],{"type":34,"value":37289},"Dans de petits projets ou prototypes, il est acceptable de ne pas appliquer strictement le SRP dès le début, mais le principe devient crucial à mesure que le projet évolue.",{"type":29,"tag":51,"props":37291,"children":37292},{},[],{"type":29,"tag":567,"props":37294,"children":37295},{"cta":2379,"href":918,"title":16346,"type":920},[37296],{"type":29,"tag":30,"props":37297,"children":37298},{},[37299],{"type":34,"value":22433},{"type":29,"tag":928,"props":37301,"children":37302},{},[37303],{"type":34,"value":932},{"title":8,"searchDepth":130,"depth":130,"links":37305},[37306,37307,37308,37311,37312,37318],{"id":34906,"depth":130,"text":34909},{"id":34955,"depth":130,"text":34958},{"id":35547,"depth":130,"text":35550,"children":37309},[37310],{"id":35599,"depth":139,"text":35602},{"id":37095,"depth":130,"text":37098},{"id":37159,"depth":130,"text":37162,"children":37313},[37314,37315,37316,37317],{"id":37165,"depth":139,"text":37168},{"id":37176,"depth":139,"text":37179},{"id":37187,"depth":139,"text":37190},{"id":37198,"depth":139,"text":37201},{"id":37221,"depth":130,"text":37224},"content:fr:architecture-craft:principe-srp-software-craftsmanship-exemples-java.md","fr\u002Farchitecture-craft\u002Fprincipe-srp-software-craftsmanship-exemples-java.md","fr\u002Farchitecture-craft\u002Fprincipe-srp-software-craftsmanship-exemples-java",1784113924656]