[{"data":1,"prerenderedAt":5784},["ShallowReactive",2],{"search-api":-1,"listing-tag-Clean Code-page-1":3},[4],{"_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":20,"readingTime":21,"body":26,"_type":5778,"_id":5779,"_source":5780,"_file":5781,"_stem":5782,"_extension":5783},"\u002Ffr\u002Farchitecture-craft\u002Fdependency-inversion-pratique","architecture-craft",false,"","Dependency Inversion Principle : 3 exemples concrets","Le DIP est le principe SOLID le plus mal compris. Pas un pattern de conception, mais une règle sur la direction des dépendances. Trois implémentations Java concrètes.",30,"2026-03-13",true,[6],[16,17,18,19],"SOLID","Dependency Inversion","Architecture","Clean Code","covers\u002Farticles\u002Fdependency-inversion-principe.jpg",{"text":22,"minutes":23,"time":24,"words":25},"9 min read",8.44,506400,1688,{"type":27,"children":28,"toc":5769},"root",[29,37,42,47,51,58,72,77,444,453,501,504,510,554,562,567,570,576,1618,1626,2288,2301,2304,2310,4591,4624,4627,4633,5528,5546,5549,5555,5563,5581,5589,5607,5625,5628,5640,5643,5649,5664,5677,5690,5711,5748,5751,5763],{"type":30,"tag":31,"props":32,"children":33},"element","p",{},[34],{"type":35,"value":36},"text","Chez un client dans le secteur de l'assurance que j'accompagnais (20 développeurs, 8 services backend), la suite de tests prenait 18 minutes à s'exécuter. Pas parce que les tests étaient lents. Parce que chaque test unitaire démarrait une vraie base de données PostgreSQL, un vrai serveur Redis, et appelait le vrai Sendgrid.",{"type":30,"tag":31,"props":38,"children":39},{},[40],{"type":35,"value":41},"Ce n'était pas un problème de tests. C'était un problème d'architecture : les modules métier dépendaient directement des implémentations concrètes d'infrastructure.",{"type":30,"tag":31,"props":43,"children":44},{},[45],{"type":35,"value":46},"Après avoir introduit le Dependency Inversion Principle sur les 8 services les plus critiques, la suite de tests est passée à 3 minutes. La couverture de tests a augmenté de 35% à 72% en 3 mois. Pas parce que les développeurs avaient soudain envie d'écrire des tests, mais parce que les tests étaient devenus faciles à écrire.",{"type":30,"tag":48,"props":49,"children":50},"hr",{},[],{"type":30,"tag":52,"props":53,"children":55},"h2",{"id":54},"le-problème-la-dépendance-directe",[56],{"type":35,"value":57},"Le problème : la dépendance directe",{"type":30,"tag":31,"props":59,"children":60},{},[61,63,70],{"type":35,"value":62},"Robert C. Martin (Uncle Bob) a formulé le DIP en 1996 dans ses travaux sur les principes SOLID : \"Les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Les deux doivent dépendre d'abstractions.\" C'est la règle de dépendance au cœur de la ",{"type":30,"tag":64,"props":65,"children":67},"a",{"href":66},"\u002Ffr\u002Farchitecture-craft\u002Fclean-architecture-3-regles",[68],{"type":35,"value":69},"Clean Architecture",{"type":35,"value":71}," : les flèches de dépendance doivent toujours pointer vers l'intérieur, vers le domaine métier.",{"type":30,"tag":31,"props":73,"children":74},{},[75],{"type":35,"value":76},"En pratique, la quasi-totalité des codebases sans discipline architecturale viole ce principe :",{"type":30,"tag":78,"props":79,"children":83},"pre",{"code":80,"language":81,"meta":8,"className":82,"style":8},"\u002F\u002F Violation du DIP : le module de haut niveau dépend des implémentations concrètes\npublic class OrderService {\n\n    private final PostgresDatabase db = new PostgresDatabase(\"localhost\", 5432); \u002F\u002F dépendance directe\n    private final SendgridEmailClient email = new SendgridEmailClient(\"api-key\"); \u002F\u002F dépendance directe\n\n    public String createOrder(OrderData orderData) {\n        String orderId = db.save(orderData);\n        email.sendConfirmation(orderData.getEmail(), orderId);\n        return orderId;\n    }\n}\n","java","language-java shiki shiki-themes catppuccin-frappe github-dark",[84],{"type":30,"tag":85,"props":86,"children":87},"code",{"__ignoreMap":8},[88,100,127,136,210,261,269,312,359,408,426,435],{"type":30,"tag":89,"props":90,"children":93},"span",{"class":91,"line":92},"line",1,[94],{"type":30,"tag":89,"props":95,"children":97},{"style":96},"--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit",[98],{"type":35,"value":99},"\u002F\u002F Violation du DIP : le module de haut niveau dépend des implémentations concrètes\n",{"type":30,"tag":89,"props":101,"children":103},{"class":91,"line":102},2,[104,110,115,121],{"type":30,"tag":89,"props":105,"children":107},{"style":106},"--shiki-default:#CA9EE6;--shiki-dark:#F97583",[108],{"type":35,"value":109},"public",{"type":30,"tag":89,"props":111,"children":112},{"style":106},[113],{"type":35,"value":114}," class",{"type":30,"tag":89,"props":116,"children":118},{"style":117},"--shiki-default:#E5C890;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit",[119],{"type":35,"value":120}," OrderService",{"type":30,"tag":89,"props":122,"children":124},{"style":123},"--shiki-default:#949CBB;--shiki-dark:#E1E4E8",[125],{"type":35,"value":126}," {\n",{"type":30,"tag":89,"props":128,"children":130},{"class":91,"line":129},3,[131],{"type":30,"tag":89,"props":132,"children":133},{"emptyLinePlaceholder":13},[134],{"type":35,"value":135},"\n",{"type":30,"tag":89,"props":137,"children":139},{"class":91,"line":138},4,[140,145,150,156,162,168,173,178,183,189,194,200,205],{"type":30,"tag":89,"props":141,"children":142},{"style":106},[143],{"type":35,"value":144},"    private",{"type":30,"tag":89,"props":146,"children":147},{"style":106},[148],{"type":35,"value":149}," final",{"type":30,"tag":89,"props":151,"children":153},{"style":152},"--shiki-default:#CA9EE6;--shiki-dark:#E1E4E8",[154],{"type":35,"value":155}," PostgresDatabase",{"type":30,"tag":89,"props":157,"children":159},{"style":158},"--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8",[160],{"type":35,"value":161}," db ",{"type":30,"tag":89,"props":163,"children":165},{"style":164},"--shiki-default:#81C8BE;--shiki-dark:#F97583",[166],{"type":35,"value":167},"=",{"type":30,"tag":89,"props":169,"children":170},{"style":106},[171],{"type":35,"value":172}," new",{"type":30,"tag":89,"props":174,"children":176},{"style":175},"--shiki-default:#8CAAEE;--shiki-default-font-style:italic;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit",[177],{"type":35,"value":155},{"type":30,"tag":89,"props":179,"children":180},{"style":123},[181],{"type":35,"value":182},"(",{"type":30,"tag":89,"props":184,"children":186},{"style":185},"--shiki-default:#A6D189;--shiki-dark:#9ECBFF",[187],{"type":35,"value":188},"\"localhost\"",{"type":30,"tag":89,"props":190,"children":191},{"style":123},[192],{"type":35,"value":193},",",{"type":30,"tag":89,"props":195,"children":197},{"style":196},"--shiki-default:#EF9F76;--shiki-dark:#79B8FF",[198],{"type":35,"value":199}," 5432",{"type":30,"tag":89,"props":201,"children":202},{"style":123},[203],{"type":35,"value":204},");",{"type":30,"tag":89,"props":206,"children":207},{"style":96},[208],{"type":35,"value":209}," \u002F\u002F dépendance directe\n",{"type":30,"tag":89,"props":211,"children":213},{"class":91,"line":212},5,[214,218,222,227,232,236,240,244,248,253,257],{"type":30,"tag":89,"props":215,"children":216},{"style":106},[217],{"type":35,"value":144},{"type":30,"tag":89,"props":219,"children":220},{"style":106},[221],{"type":35,"value":149},{"type":30,"tag":89,"props":223,"children":224},{"style":152},[225],{"type":35,"value":226}," SendgridEmailClient",{"type":30,"tag":89,"props":228,"children":229},{"style":158},[230],{"type":35,"value":231}," email ",{"type":30,"tag":89,"props":233,"children":234},{"style":164},[235],{"type":35,"value":167},{"type":30,"tag":89,"props":237,"children":238},{"style":106},[239],{"type":35,"value":172},{"type":30,"tag":89,"props":241,"children":242},{"style":175},[243],{"type":35,"value":226},{"type":30,"tag":89,"props":245,"children":246},{"style":123},[247],{"type":35,"value":182},{"type":30,"tag":89,"props":249,"children":250},{"style":185},[251],{"type":35,"value":252},"\"api-key\"",{"type":30,"tag":89,"props":254,"children":255},{"style":123},[256],{"type":35,"value":204},{"type":30,"tag":89,"props":258,"children":259},{"style":96},[260],{"type":35,"value":209},{"type":30,"tag":89,"props":262,"children":264},{"class":91,"line":263},6,[265],{"type":30,"tag":89,"props":266,"children":267},{"emptyLinePlaceholder":13},[268],{"type":35,"value":135},{"type":30,"tag":89,"props":270,"children":272},{"class":91,"line":271},7,[273,278,283,288,292,297,303,308],{"type":30,"tag":89,"props":274,"children":275},{"style":106},[276],{"type":35,"value":277},"    public",{"type":30,"tag":89,"props":279,"children":280},{"style":152},[281],{"type":35,"value":282}," String",{"type":30,"tag":89,"props":284,"children":285},{"style":175},[286],{"type":35,"value":287}," createOrder",{"type":30,"tag":89,"props":289,"children":290},{"style":123},[291],{"type":35,"value":182},{"type":30,"tag":89,"props":293,"children":294},{"style":152},[295],{"type":35,"value":296},"OrderData",{"type":30,"tag":89,"props":298,"children":300},{"style":299},"--shiki-default:#EA999C;--shiki-default-font-style:italic;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit",[301],{"type":35,"value":302}," orderData",{"type":30,"tag":89,"props":304,"children":305},{"style":123},[306],{"type":35,"value":307},")",{"type":30,"tag":89,"props":309,"children":310},{"style":123},[311],{"type":35,"value":126},{"type":30,"tag":89,"props":313,"children":315},{"class":91,"line":314},8,[316,321,326,330,335,340,345,349,354],{"type":30,"tag":89,"props":317,"children":318},{"style":152},[319],{"type":35,"value":320},"        String",{"type":30,"tag":89,"props":322,"children":323},{"style":158},[324],{"type":35,"value":325}," orderId ",{"type":30,"tag":89,"props":327,"children":328},{"style":164},[329],{"type":35,"value":167},{"type":30,"tag":89,"props":331,"children":332},{"style":158},[333],{"type":35,"value":334}," db",{"type":30,"tag":89,"props":336,"children":337},{"style":123},[338],{"type":35,"value":339},".",{"type":30,"tag":89,"props":341,"children":342},{"style":175},[343],{"type":35,"value":344},"save",{"type":30,"tag":89,"props":346,"children":347},{"style":123},[348],{"type":35,"value":182},{"type":30,"tag":89,"props":350,"children":351},{"style":158},[352],{"type":35,"value":353},"orderData",{"type":30,"tag":89,"props":355,"children":356},{"style":123},[357],{"type":35,"value":358},");\n",{"type":30,"tag":89,"props":360,"children":362},{"class":91,"line":361},9,[363,368,372,377,381,385,389,394,399,404],{"type":30,"tag":89,"props":364,"children":365},{"style":158},[366],{"type":35,"value":367},"        email",{"type":30,"tag":89,"props":369,"children":370},{"style":123},[371],{"type":35,"value":339},{"type":30,"tag":89,"props":373,"children":374},{"style":175},[375],{"type":35,"value":376},"sendConfirmation",{"type":30,"tag":89,"props":378,"children":379},{"style":123},[380],{"type":35,"value":182},{"type":30,"tag":89,"props":382,"children":383},{"style":158},[384],{"type":35,"value":353},{"type":30,"tag":89,"props":386,"children":387},{"style":123},[388],{"type":35,"value":339},{"type":30,"tag":89,"props":390,"children":391},{"style":175},[392],{"type":35,"value":393},"getEmail",{"type":30,"tag":89,"props":395,"children":396},{"style":123},[397],{"type":35,"value":398},"(),",{"type":30,"tag":89,"props":400,"children":401},{"style":158},[402],{"type":35,"value":403}," orderId",{"type":30,"tag":89,"props":405,"children":406},{"style":123},[407],{"type":35,"value":358},{"type":30,"tag":89,"props":409,"children":411},{"class":91,"line":410},10,[412,417,421],{"type":30,"tag":89,"props":413,"children":414},{"style":106},[415],{"type":35,"value":416},"        return",{"type":30,"tag":89,"props":418,"children":419},{"style":158},[420],{"type":35,"value":403},{"type":30,"tag":89,"props":422,"children":423},{"style":123},[424],{"type":35,"value":425},";\n",{"type":30,"tag":89,"props":427,"children":429},{"class":91,"line":428},11,[430],{"type":30,"tag":89,"props":431,"children":432},{"style":123},[433],{"type":35,"value":434},"    }\n",{"type":30,"tag":89,"props":436,"children":438},{"class":91,"line":437},12,[439],{"type":30,"tag":89,"props":440,"children":441},{"style":123},[442],{"type":35,"value":443},"}\n",{"type":30,"tag":31,"props":445,"children":446},{},[447],{"type":30,"tag":448,"props":449,"children":450},"strong",{},[451],{"type":35,"value":452},"Ce que ça coûte concrètement :",{"type":30,"tag":454,"props":455,"children":456},"ul",{},[457,471,481,491],{"type":30,"tag":458,"props":459,"children":460},"li",{},[461,463,469],{"type":35,"value":462},"Impossible de tester ",{"type":30,"tag":85,"props":464,"children":466},{"className":465},[],[467],{"type":35,"value":468},"OrderService",{"type":35,"value":470}," sans une vraie base de données PostgreSQL et un compte Sendgrid",{"type":30,"tag":458,"props":472,"children":473},{},[474,476],{"type":35,"value":475},"Changer de base de données oblige à modifier ",{"type":30,"tag":85,"props":477,"children":479},{"className":478},[],[480],{"type":35,"value":468},{"type":30,"tag":458,"props":482,"children":483},{},[484,486],{"type":35,"value":485},"Changer d'email provider oblige à modifier ",{"type":30,"tag":85,"props":487,"children":489},{"className":488},[],[490],{"type":35,"value":468},{"type":30,"tag":458,"props":492,"children":493},{},[494,499],{"type":30,"tag":85,"props":495,"children":497},{"className":496},[],[498],{"type":35,"value":468},{"type":35,"value":500}," connaît des détails d'implémentation (host, port, api_key) qui n'ont rien à voir avec la logique métier de commande",{"type":30,"tag":48,"props":502,"children":503},{},[],{"type":30,"tag":52,"props":505,"children":507},{"id":506},"le-principe-inverser-la-direction-des-dépendances",[508],{"type":35,"value":509},"Le principe : inverser la direction des dépendances",{"type":30,"tag":31,"props":511,"children":512},{},[513,515,520,522,528,530,536,538,544,546,552],{"type":35,"value":514},"La solution DIP : ",{"type":30,"tag":85,"props":516,"children":518},{"className":517},[],[519],{"type":35,"value":468},{"type":35,"value":521}," ne dépend pas de ",{"type":30,"tag":85,"props":523,"children":525},{"className":524},[],[526],{"type":35,"value":527},"PostgreSQLDatabase",{"type":35,"value":529}," ni de ",{"type":30,"tag":85,"props":531,"children":533},{"className":532},[],[534],{"type":35,"value":535},"SendgridEmailClient",{"type":35,"value":537},". Il dépend d'abstractions (",{"type":30,"tag":85,"props":539,"children":541},{"className":540},[],[542],{"type":35,"value":543},"OrderRepository",{"type":35,"value":545},", ",{"type":30,"tag":85,"props":547,"children":549},{"className":548},[],[550],{"type":35,"value":551},"EmailNotifier",{"type":35,"value":553},") que les implémentations concrètes respectent.",{"type":30,"tag":78,"props":555,"children":557},{"code":556},"Sans DIP :\nOrderService → PostgreSQLDatabase\nOrderService → SendgridEmailClient\n\nAvec DIP :\nOrderService → OrderRepository (abstraction) ← PostgreSQLOrderRepository (implémentation)\nOrderService → EmailNotifier (abstraction)   ← SendgridEmailNotifier (implémentation)\n",[558],{"type":30,"tag":85,"props":559,"children":560},{"__ignoreMap":8},[561],{"type":35,"value":556},{"type":30,"tag":31,"props":563,"children":564},{},[565],{"type":35,"value":566},"La flèche s'inverse : l'implémentation concrète dépend de l'abstraction, pas l'inverse.",{"type":30,"tag":48,"props":568,"children":569},{},[],{"type":30,"tag":52,"props":571,"children":573},{"id":572},"exemple-1-java-injection-par-constructeur",[574],{"type":35,"value":575},"Exemple 1 : Java, injection par constructeur",{"type":30,"tag":78,"props":577,"children":579},{"code":578,"language":81,"meta":8,"className":82,"style":8},"\u002F\u002F Les abstractions\npublic interface OrderRepository {\n    String save(OrderData orderData);\n}\n\npublic interface EmailNotifier {\n    void sendConfirmation(String email, String orderId);\n}\n\n\u002F\u002F Le module de haut niveau : dépend uniquement des abstractions\npublic class OrderService {\n\n    private final OrderRepository repository;\n    private final EmailNotifier notifier;\n\n    public OrderService(OrderRepository repository, EmailNotifier notifier) {\n        this.repository = repository;\n        this.notifier = notifier;\n    }\n\n    public String createOrder(OrderData orderData) {\n        String orderId = repository.save(orderData);\n        notifier.sendConfirmation(orderData.getEmail(), orderId);\n        return orderId;\n    }\n}\n\n\u002F\u002F Les implémentations concrètes\npublic class PostgresOrderRepository implements OrderRepository {\n    public String save(OrderData orderData) {\n        return jdbcTemplate.queryForObject(\"INSERT INTO orders ... RETURNING id\", String.class, orderData);\n    }\n}\n\npublic class SendgridEmailNotifier implements EmailNotifier {\n    public void sendConfirmation(String email, String orderId) {\n        client.send(email, \"order_confirmation\", Map.of(\"orderId\", orderId));\n    }\n}\n\n\u002F\u002F Composition à la racine de l'application\npublic OrderService createOrderService() {\n    OrderRepository repository = new PostgresOrderRepository(dataSource);\n    EmailNotifier notifier = new SendgridEmailNotifier(System.getenv(\"SENDGRID_KEY\"));\n    return new OrderService(repository, notifier);\n}\n",[580],{"type":30,"tag":85,"props":581,"children":582},{"__ignoreMap":8},[583,591,612,641,648,655,675,718,725,732,740,759,766,791,816,824,868,899,928,936,944,980,1020,1065,1081,1089,1097,1105,1114,1144,1179,1239,1247,1255,1263,1292,1341,1417,1425,1433,1441,1450,1476,1515,1572,1610],{"type":30,"tag":89,"props":584,"children":585},{"class":91,"line":92},[586],{"type":30,"tag":89,"props":587,"children":588},{"style":96},[589],{"type":35,"value":590},"\u002F\u002F Les abstractions\n",{"type":30,"tag":89,"props":592,"children":593},{"class":91,"line":102},[594,598,603,608],{"type":30,"tag":89,"props":595,"children":596},{"style":106},[597],{"type":35,"value":109},{"type":30,"tag":89,"props":599,"children":600},{"style":106},[601],{"type":35,"value":602}," interface",{"type":30,"tag":89,"props":604,"children":605},{"style":117},[606],{"type":35,"value":607}," OrderRepository",{"type":30,"tag":89,"props":609,"children":610},{"style":123},[611],{"type":35,"value":126},{"type":30,"tag":89,"props":613,"children":614},{"class":91,"line":129},[615,620,625,629,633,637],{"type":30,"tag":89,"props":616,"children":617},{"style":152},[618],{"type":35,"value":619},"    String",{"type":30,"tag":89,"props":621,"children":622},{"style":175},[623],{"type":35,"value":624}," save",{"type":30,"tag":89,"props":626,"children":627},{"style":123},[628],{"type":35,"value":182},{"type":30,"tag":89,"props":630,"children":631},{"style":152},[632],{"type":35,"value":296},{"type":30,"tag":89,"props":634,"children":635},{"style":299},[636],{"type":35,"value":302},{"type":30,"tag":89,"props":638,"children":639},{"style":123},[640],{"type":35,"value":358},{"type":30,"tag":89,"props":642,"children":643},{"class":91,"line":138},[644],{"type":30,"tag":89,"props":645,"children":646},{"style":123},[647],{"type":35,"value":443},{"type":30,"tag":89,"props":649,"children":650},{"class":91,"line":212},[651],{"type":30,"tag":89,"props":652,"children":653},{"emptyLinePlaceholder":13},[654],{"type":35,"value":135},{"type":30,"tag":89,"props":656,"children":657},{"class":91,"line":263},[658,662,666,671],{"type":30,"tag":89,"props":659,"children":660},{"style":106},[661],{"type":35,"value":109},{"type":30,"tag":89,"props":663,"children":664},{"style":106},[665],{"type":35,"value":602},{"type":30,"tag":89,"props":667,"children":668},{"style":117},[669],{"type":35,"value":670}," EmailNotifier",{"type":30,"tag":89,"props":672,"children":673},{"style":123},[674],{"type":35,"value":126},{"type":30,"tag":89,"props":676,"children":677},{"class":91,"line":271},[678,683,688,692,697,702,706,710,714],{"type":30,"tag":89,"props":679,"children":680},{"style":106},[681],{"type":35,"value":682},"    void",{"type":30,"tag":89,"props":684,"children":685},{"style":175},[686],{"type":35,"value":687}," sendConfirmation",{"type":30,"tag":89,"props":689,"children":690},{"style":123},[691],{"type":35,"value":182},{"type":30,"tag":89,"props":693,"children":694},{"style":152},[695],{"type":35,"value":696},"String",{"type":30,"tag":89,"props":698,"children":699},{"style":299},[700],{"type":35,"value":701}," email",{"type":30,"tag":89,"props":703,"children":704},{"style":123},[705],{"type":35,"value":193},{"type":30,"tag":89,"props":707,"children":708},{"style":152},[709],{"type":35,"value":282},{"type":30,"tag":89,"props":711,"children":712},{"style":299},[713],{"type":35,"value":403},{"type":30,"tag":89,"props":715,"children":716},{"style":123},[717],{"type":35,"value":358},{"type":30,"tag":89,"props":719,"children":720},{"class":91,"line":314},[721],{"type":30,"tag":89,"props":722,"children":723},{"style":123},[724],{"type":35,"value":443},{"type":30,"tag":89,"props":726,"children":727},{"class":91,"line":361},[728],{"type":30,"tag":89,"props":729,"children":730},{"emptyLinePlaceholder":13},[731],{"type":35,"value":135},{"type":30,"tag":89,"props":733,"children":734},{"class":91,"line":410},[735],{"type":30,"tag":89,"props":736,"children":737},{"style":96},[738],{"type":35,"value":739},"\u002F\u002F Le module de haut niveau : dépend uniquement des abstractions\n",{"type":30,"tag":89,"props":741,"children":742},{"class":91,"line":428},[743,747,751,755],{"type":30,"tag":89,"props":744,"children":745},{"style":106},[746],{"type":35,"value":109},{"type":30,"tag":89,"props":748,"children":749},{"style":106},[750],{"type":35,"value":114},{"type":30,"tag":89,"props":752,"children":753},{"style":117},[754],{"type":35,"value":120},{"type":30,"tag":89,"props":756,"children":757},{"style":123},[758],{"type":35,"value":126},{"type":30,"tag":89,"props":760,"children":761},{"class":91,"line":437},[762],{"type":30,"tag":89,"props":763,"children":764},{"emptyLinePlaceholder":13},[765],{"type":35,"value":135},{"type":30,"tag":89,"props":767,"children":769},{"class":91,"line":768},13,[770,774,778,782,787],{"type":30,"tag":89,"props":771,"children":772},{"style":106},[773],{"type":35,"value":144},{"type":30,"tag":89,"props":775,"children":776},{"style":106},[777],{"type":35,"value":149},{"type":30,"tag":89,"props":779,"children":780},{"style":152},[781],{"type":35,"value":607},{"type":30,"tag":89,"props":783,"children":784},{"style":158},[785],{"type":35,"value":786}," repository",{"type":30,"tag":89,"props":788,"children":789},{"style":123},[790],{"type":35,"value":425},{"type":30,"tag":89,"props":792,"children":794},{"class":91,"line":793},14,[795,799,803,807,812],{"type":30,"tag":89,"props":796,"children":797},{"style":106},[798],{"type":35,"value":144},{"type":30,"tag":89,"props":800,"children":801},{"style":106},[802],{"type":35,"value":149},{"type":30,"tag":89,"props":804,"children":805},{"style":152},[806],{"type":35,"value":670},{"type":30,"tag":89,"props":808,"children":809},{"style":158},[810],{"type":35,"value":811}," notifier",{"type":30,"tag":89,"props":813,"children":814},{"style":123},[815],{"type":35,"value":425},{"type":30,"tag":89,"props":817,"children":819},{"class":91,"line":818},15,[820],{"type":30,"tag":89,"props":821,"children":822},{"emptyLinePlaceholder":13},[823],{"type":35,"value":135},{"type":30,"tag":89,"props":825,"children":827},{"class":91,"line":826},16,[828,832,836,840,844,848,852,856,860,864],{"type":30,"tag":89,"props":829,"children":830},{"style":106},[831],{"type":35,"value":277},{"type":30,"tag":89,"props":833,"children":834},{"style":175},[835],{"type":35,"value":120},{"type":30,"tag":89,"props":837,"children":838},{"style":123},[839],{"type":35,"value":182},{"type":30,"tag":89,"props":841,"children":842},{"style":152},[843],{"type":35,"value":543},{"type":30,"tag":89,"props":845,"children":846},{"style":299},[847],{"type":35,"value":786},{"type":30,"tag":89,"props":849,"children":850},{"style":123},[851],{"type":35,"value":193},{"type":30,"tag":89,"props":853,"children":854},{"style":152},[855],{"type":35,"value":670},{"type":30,"tag":89,"props":857,"children":858},{"style":299},[859],{"type":35,"value":811},{"type":30,"tag":89,"props":861,"children":862},{"style":123},[863],{"type":35,"value":307},{"type":30,"tag":89,"props":865,"children":866},{"style":123},[867],{"type":35,"value":126},{"type":30,"tag":89,"props":869,"children":871},{"class":91,"line":870},17,[872,878,882,887,891,895],{"type":30,"tag":89,"props":873,"children":875},{"style":874},"--shiki-default:#E78284;--shiki-dark:#79B8FF",[876],{"type":35,"value":877},"        this",{"type":30,"tag":89,"props":879,"children":880},{"style":123},[881],{"type":35,"value":339},{"type":30,"tag":89,"props":883,"children":884},{"style":158},[885],{"type":35,"value":886},"repository ",{"type":30,"tag":89,"props":888,"children":889},{"style":164},[890],{"type":35,"value":167},{"type":30,"tag":89,"props":892,"children":893},{"style":158},[894],{"type":35,"value":786},{"type":30,"tag":89,"props":896,"children":897},{"style":123},[898],{"type":35,"value":425},{"type":30,"tag":89,"props":900,"children":902},{"class":91,"line":901},18,[903,907,911,916,920,924],{"type":30,"tag":89,"props":904,"children":905},{"style":874},[906],{"type":35,"value":877},{"type":30,"tag":89,"props":908,"children":909},{"style":123},[910],{"type":35,"value":339},{"type":30,"tag":89,"props":912,"children":913},{"style":158},[914],{"type":35,"value":915},"notifier ",{"type":30,"tag":89,"props":917,"children":918},{"style":164},[919],{"type":35,"value":167},{"type":30,"tag":89,"props":921,"children":922},{"style":158},[923],{"type":35,"value":811},{"type":30,"tag":89,"props":925,"children":926},{"style":123},[927],{"type":35,"value":425},{"type":30,"tag":89,"props":929,"children":931},{"class":91,"line":930},19,[932],{"type":30,"tag":89,"props":933,"children":934},{"style":123},[935],{"type":35,"value":434},{"type":30,"tag":89,"props":937,"children":939},{"class":91,"line":938},20,[940],{"type":30,"tag":89,"props":941,"children":942},{"emptyLinePlaceholder":13},[943],{"type":35,"value":135},{"type":30,"tag":89,"props":945,"children":947},{"class":91,"line":946},21,[948,952,956,960,964,968,972,976],{"type":30,"tag":89,"props":949,"children":950},{"style":106},[951],{"type":35,"value":277},{"type":30,"tag":89,"props":953,"children":954},{"style":152},[955],{"type":35,"value":282},{"type":30,"tag":89,"props":957,"children":958},{"style":175},[959],{"type":35,"value":287},{"type":30,"tag":89,"props":961,"children":962},{"style":123},[963],{"type":35,"value":182},{"type":30,"tag":89,"props":965,"children":966},{"style":152},[967],{"type":35,"value":296},{"type":30,"tag":89,"props":969,"children":970},{"style":299},[971],{"type":35,"value":302},{"type":30,"tag":89,"props":973,"children":974},{"style":123},[975],{"type":35,"value":307},{"type":30,"tag":89,"props":977,"children":978},{"style":123},[979],{"type":35,"value":126},{"type":30,"tag":89,"props":981,"children":983},{"class":91,"line":982},22,[984,988,992,996,1000,1004,1008,1012,1016],{"type":30,"tag":89,"props":985,"children":986},{"style":152},[987],{"type":35,"value":320},{"type":30,"tag":89,"props":989,"children":990},{"style":158},[991],{"type":35,"value":325},{"type":30,"tag":89,"props":993,"children":994},{"style":164},[995],{"type":35,"value":167},{"type":30,"tag":89,"props":997,"children":998},{"style":158},[999],{"type":35,"value":786},{"type":30,"tag":89,"props":1001,"children":1002},{"style":123},[1003],{"type":35,"value":339},{"type":30,"tag":89,"props":1005,"children":1006},{"style":175},[1007],{"type":35,"value":344},{"type":30,"tag":89,"props":1009,"children":1010},{"style":123},[1011],{"type":35,"value":182},{"type":30,"tag":89,"props":1013,"children":1014},{"style":158},[1015],{"type":35,"value":353},{"type":30,"tag":89,"props":1017,"children":1018},{"style":123},[1019],{"type":35,"value":358},{"type":30,"tag":89,"props":1021,"children":1023},{"class":91,"line":1022},23,[1024,1029,1033,1037,1041,1045,1049,1053,1057,1061],{"type":30,"tag":89,"props":1025,"children":1026},{"style":158},[1027],{"type":35,"value":1028},"        notifier",{"type":30,"tag":89,"props":1030,"children":1031},{"style":123},[1032],{"type":35,"value":339},{"type":30,"tag":89,"props":1034,"children":1035},{"style":175},[1036],{"type":35,"value":376},{"type":30,"tag":89,"props":1038,"children":1039},{"style":123},[1040],{"type":35,"value":182},{"type":30,"tag":89,"props":1042,"children":1043},{"style":158},[1044],{"type":35,"value":353},{"type":30,"tag":89,"props":1046,"children":1047},{"style":123},[1048],{"type":35,"value":339},{"type":30,"tag":89,"props":1050,"children":1051},{"style":175},[1052],{"type":35,"value":393},{"type":30,"tag":89,"props":1054,"children":1055},{"style":123},[1056],{"type":35,"value":398},{"type":30,"tag":89,"props":1058,"children":1059},{"style":158},[1060],{"type":35,"value":403},{"type":30,"tag":89,"props":1062,"children":1063},{"style":123},[1064],{"type":35,"value":358},{"type":30,"tag":89,"props":1066,"children":1068},{"class":91,"line":1067},24,[1069,1073,1077],{"type":30,"tag":89,"props":1070,"children":1071},{"style":106},[1072],{"type":35,"value":416},{"type":30,"tag":89,"props":1074,"children":1075},{"style":158},[1076],{"type":35,"value":403},{"type":30,"tag":89,"props":1078,"children":1079},{"style":123},[1080],{"type":35,"value":425},{"type":30,"tag":89,"props":1082,"children":1084},{"class":91,"line":1083},25,[1085],{"type":30,"tag":89,"props":1086,"children":1087},{"style":123},[1088],{"type":35,"value":434},{"type":30,"tag":89,"props":1090,"children":1092},{"class":91,"line":1091},26,[1093],{"type":30,"tag":89,"props":1094,"children":1095},{"style":123},[1096],{"type":35,"value":443},{"type":30,"tag":89,"props":1098,"children":1100},{"class":91,"line":1099},27,[1101],{"type":30,"tag":89,"props":1102,"children":1103},{"emptyLinePlaceholder":13},[1104],{"type":35,"value":135},{"type":30,"tag":89,"props":1106,"children":1108},{"class":91,"line":1107},28,[1109],{"type":30,"tag":89,"props":1110,"children":1111},{"style":96},[1112],{"type":35,"value":1113},"\u002F\u002F Les implémentations concrètes\n",{"type":30,"tag":89,"props":1115,"children":1117},{"class":91,"line":1116},29,[1118,1122,1126,1131,1136,1140],{"type":30,"tag":89,"props":1119,"children":1120},{"style":106},[1121],{"type":35,"value":109},{"type":30,"tag":89,"props":1123,"children":1124},{"style":106},[1125],{"type":35,"value":114},{"type":30,"tag":89,"props":1127,"children":1128},{"style":117},[1129],{"type":35,"value":1130}," PostgresOrderRepository",{"type":30,"tag":89,"props":1132,"children":1133},{"style":106},[1134],{"type":35,"value":1135}," implements",{"type":30,"tag":89,"props":1137,"children":1138},{"style":117},[1139],{"type":35,"value":607},{"type":30,"tag":89,"props":1141,"children":1142},{"style":123},[1143],{"type":35,"value":126},{"type":30,"tag":89,"props":1145,"children":1146},{"class":91,"line":11},[1147,1151,1155,1159,1163,1167,1171,1175],{"type":30,"tag":89,"props":1148,"children":1149},{"style":106},[1150],{"type":35,"value":277},{"type":30,"tag":89,"props":1152,"children":1153},{"style":152},[1154],{"type":35,"value":282},{"type":30,"tag":89,"props":1156,"children":1157},{"style":175},[1158],{"type":35,"value":624},{"type":30,"tag":89,"props":1160,"children":1161},{"style":123},[1162],{"type":35,"value":182},{"type":30,"tag":89,"props":1164,"children":1165},{"style":152},[1166],{"type":35,"value":296},{"type":30,"tag":89,"props":1168,"children":1169},{"style":299},[1170],{"type":35,"value":302},{"type":30,"tag":89,"props":1172,"children":1173},{"style":123},[1174],{"type":35,"value":307},{"type":30,"tag":89,"props":1176,"children":1177},{"style":123},[1178],{"type":35,"value":126},{"type":30,"tag":89,"props":1180,"children":1182},{"class":91,"line":1181},31,[1183,1187,1192,1196,1201,1205,1210,1214,1218,1222,1227,1231,1235],{"type":30,"tag":89,"props":1184,"children":1185},{"style":106},[1186],{"type":35,"value":416},{"type":30,"tag":89,"props":1188,"children":1189},{"style":158},[1190],{"type":35,"value":1191}," jdbcTemplate",{"type":30,"tag":89,"props":1193,"children":1194},{"style":123},[1195],{"type":35,"value":339},{"type":30,"tag":89,"props":1197,"children":1198},{"style":175},[1199],{"type":35,"value":1200},"queryForObject",{"type":30,"tag":89,"props":1202,"children":1203},{"style":123},[1204],{"type":35,"value":182},{"type":30,"tag":89,"props":1206,"children":1207},{"style":185},[1208],{"type":35,"value":1209},"\"INSERT INTO orders ... RETURNING id\"",{"type":30,"tag":89,"props":1211,"children":1212},{"style":123},[1213],{"type":35,"value":193},{"type":30,"tag":89,"props":1215,"children":1216},{"style":158},[1217],{"type":35,"value":282},{"type":30,"tag":89,"props":1219,"children":1220},{"style":123},[1221],{"type":35,"value":339},{"type":30,"tag":89,"props":1223,"children":1224},{"style":158},[1225],{"type":35,"value":1226},"class",{"type":30,"tag":89,"props":1228,"children":1229},{"style":123},[1230],{"type":35,"value":193},{"type":30,"tag":89,"props":1232,"children":1233},{"style":158},[1234],{"type":35,"value":302},{"type":30,"tag":89,"props":1236,"children":1237},{"style":123},[1238],{"type":35,"value":358},{"type":30,"tag":89,"props":1240,"children":1242},{"class":91,"line":1241},32,[1243],{"type":30,"tag":89,"props":1244,"children":1245},{"style":123},[1246],{"type":35,"value":434},{"type":30,"tag":89,"props":1248,"children":1250},{"class":91,"line":1249},33,[1251],{"type":30,"tag":89,"props":1252,"children":1253},{"style":123},[1254],{"type":35,"value":443},{"type":30,"tag":89,"props":1256,"children":1258},{"class":91,"line":1257},34,[1259],{"type":30,"tag":89,"props":1260,"children":1261},{"emptyLinePlaceholder":13},[1262],{"type":35,"value":135},{"type":30,"tag":89,"props":1264,"children":1266},{"class":91,"line":1265},35,[1267,1271,1275,1280,1284,1288],{"type":30,"tag":89,"props":1268,"children":1269},{"style":106},[1270],{"type":35,"value":109},{"type":30,"tag":89,"props":1272,"children":1273},{"style":106},[1274],{"type":35,"value":114},{"type":30,"tag":89,"props":1276,"children":1277},{"style":117},[1278],{"type":35,"value":1279}," SendgridEmailNotifier",{"type":30,"tag":89,"props":1281,"children":1282},{"style":106},[1283],{"type":35,"value":1135},{"type":30,"tag":89,"props":1285,"children":1286},{"style":117},[1287],{"type":35,"value":670},{"type":30,"tag":89,"props":1289,"children":1290},{"style":123},[1291],{"type":35,"value":126},{"type":30,"tag":89,"props":1293,"children":1295},{"class":91,"line":1294},36,[1296,1300,1305,1309,1313,1317,1321,1325,1329,1333,1337],{"type":30,"tag":89,"props":1297,"children":1298},{"style":106},[1299],{"type":35,"value":277},{"type":30,"tag":89,"props":1301,"children":1302},{"style":106},[1303],{"type":35,"value":1304}," void",{"type":30,"tag":89,"props":1306,"children":1307},{"style":175},[1308],{"type":35,"value":687},{"type":30,"tag":89,"props":1310,"children":1311},{"style":123},[1312],{"type":35,"value":182},{"type":30,"tag":89,"props":1314,"children":1315},{"style":152},[1316],{"type":35,"value":696},{"type":30,"tag":89,"props":1318,"children":1319},{"style":299},[1320],{"type":35,"value":701},{"type":30,"tag":89,"props":1322,"children":1323},{"style":123},[1324],{"type":35,"value":193},{"type":30,"tag":89,"props":1326,"children":1327},{"style":152},[1328],{"type":35,"value":282},{"type":30,"tag":89,"props":1330,"children":1331},{"style":299},[1332],{"type":35,"value":403},{"type":30,"tag":89,"props":1334,"children":1335},{"style":123},[1336],{"type":35,"value":307},{"type":30,"tag":89,"props":1338,"children":1339},{"style":123},[1340],{"type":35,"value":126},{"type":30,"tag":89,"props":1342,"children":1344},{"class":91,"line":1343},37,[1345,1350,1354,1359,1363,1368,1372,1377,1381,1386,1390,1395,1399,1404,1408,1412],{"type":30,"tag":89,"props":1346,"children":1347},{"style":158},[1348],{"type":35,"value":1349},"        client",{"type":30,"tag":89,"props":1351,"children":1352},{"style":123},[1353],{"type":35,"value":339},{"type":30,"tag":89,"props":1355,"children":1356},{"style":175},[1357],{"type":35,"value":1358},"send",{"type":30,"tag":89,"props":1360,"children":1361},{"style":123},[1362],{"type":35,"value":182},{"type":30,"tag":89,"props":1364,"children":1365},{"style":158},[1366],{"type":35,"value":1367},"email",{"type":30,"tag":89,"props":1369,"children":1370},{"style":123},[1371],{"type":35,"value":193},{"type":30,"tag":89,"props":1373,"children":1374},{"style":185},[1375],{"type":35,"value":1376}," \"order_confirmation\"",{"type":30,"tag":89,"props":1378,"children":1379},{"style":123},[1380],{"type":35,"value":193},{"type":30,"tag":89,"props":1382,"children":1383},{"style":158},[1384],{"type":35,"value":1385}," Map",{"type":30,"tag":89,"props":1387,"children":1388},{"style":123},[1389],{"type":35,"value":339},{"type":30,"tag":89,"props":1391,"children":1392},{"style":175},[1393],{"type":35,"value":1394},"of",{"type":30,"tag":89,"props":1396,"children":1397},{"style":123},[1398],{"type":35,"value":182},{"type":30,"tag":89,"props":1400,"children":1401},{"style":185},[1402],{"type":35,"value":1403},"\"orderId\"",{"type":30,"tag":89,"props":1405,"children":1406},{"style":123},[1407],{"type":35,"value":193},{"type":30,"tag":89,"props":1409,"children":1410},{"style":158},[1411],{"type":35,"value":403},{"type":30,"tag":89,"props":1413,"children":1414},{"style":123},[1415],{"type":35,"value":1416},"));\n",{"type":30,"tag":89,"props":1418,"children":1420},{"class":91,"line":1419},38,[1421],{"type":30,"tag":89,"props":1422,"children":1423},{"style":123},[1424],{"type":35,"value":434},{"type":30,"tag":89,"props":1426,"children":1428},{"class":91,"line":1427},39,[1429],{"type":30,"tag":89,"props":1430,"children":1431},{"style":123},[1432],{"type":35,"value":443},{"type":30,"tag":89,"props":1434,"children":1436},{"class":91,"line":1435},40,[1437],{"type":30,"tag":89,"props":1438,"children":1439},{"emptyLinePlaceholder":13},[1440],{"type":35,"value":135},{"type":30,"tag":89,"props":1442,"children":1444},{"class":91,"line":1443},41,[1445],{"type":30,"tag":89,"props":1446,"children":1447},{"style":96},[1448],{"type":35,"value":1449},"\u002F\u002F Composition à la racine de l'application\n",{"type":30,"tag":89,"props":1451,"children":1453},{"class":91,"line":1452},42,[1454,1458,1462,1467,1472],{"type":30,"tag":89,"props":1455,"children":1456},{"style":106},[1457],{"type":35,"value":109},{"type":30,"tag":89,"props":1459,"children":1460},{"style":152},[1461],{"type":35,"value":120},{"type":30,"tag":89,"props":1463,"children":1464},{"style":175},[1465],{"type":35,"value":1466}," createOrderService",{"type":30,"tag":89,"props":1468,"children":1469},{"style":123},[1470],{"type":35,"value":1471},"()",{"type":30,"tag":89,"props":1473,"children":1474},{"style":123},[1475],{"type":35,"value":126},{"type":30,"tag":89,"props":1477,"children":1479},{"class":91,"line":1478},43,[1480,1485,1490,1494,1498,1502,1506,1511],{"type":30,"tag":89,"props":1481,"children":1482},{"style":152},[1483],{"type":35,"value":1484},"    OrderRepository",{"type":30,"tag":89,"props":1486,"children":1487},{"style":158},[1488],{"type":35,"value":1489}," repository ",{"type":30,"tag":89,"props":1491,"children":1492},{"style":164},[1493],{"type":35,"value":167},{"type":30,"tag":89,"props":1495,"children":1496},{"style":106},[1497],{"type":35,"value":172},{"type":30,"tag":89,"props":1499,"children":1500},{"style":175},[1501],{"type":35,"value":1130},{"type":30,"tag":89,"props":1503,"children":1504},{"style":123},[1505],{"type":35,"value":182},{"type":30,"tag":89,"props":1507,"children":1508},{"style":158},[1509],{"type":35,"value":1510},"dataSource",{"type":30,"tag":89,"props":1512,"children":1513},{"style":123},[1514],{"type":35,"value":358},{"type":30,"tag":89,"props":1516,"children":1518},{"class":91,"line":1517},44,[1519,1524,1529,1533,1537,1541,1545,1550,1554,1559,1563,1568],{"type":30,"tag":89,"props":1520,"children":1521},{"style":152},[1522],{"type":35,"value":1523},"    EmailNotifier",{"type":30,"tag":89,"props":1525,"children":1526},{"style":158},[1527],{"type":35,"value":1528}," notifier ",{"type":30,"tag":89,"props":1530,"children":1531},{"style":164},[1532],{"type":35,"value":167},{"type":30,"tag":89,"props":1534,"children":1535},{"style":106},[1536],{"type":35,"value":172},{"type":30,"tag":89,"props":1538,"children":1539},{"style":175},[1540],{"type":35,"value":1279},{"type":30,"tag":89,"props":1542,"children":1543},{"style":123},[1544],{"type":35,"value":182},{"type":30,"tag":89,"props":1546,"children":1547},{"style":158},[1548],{"type":35,"value":1549},"System",{"type":30,"tag":89,"props":1551,"children":1552},{"style":123},[1553],{"type":35,"value":339},{"type":30,"tag":89,"props":1555,"children":1556},{"style":175},[1557],{"type":35,"value":1558},"getenv",{"type":30,"tag":89,"props":1560,"children":1561},{"style":123},[1562],{"type":35,"value":182},{"type":30,"tag":89,"props":1564,"children":1565},{"style":185},[1566],{"type":35,"value":1567},"\"SENDGRID_KEY\"",{"type":30,"tag":89,"props":1569,"children":1570},{"style":123},[1571],{"type":35,"value":1416},{"type":30,"tag":89,"props":1573,"children":1575},{"class":91,"line":1574},45,[1576,1581,1585,1589,1593,1598,1602,1606],{"type":30,"tag":89,"props":1577,"children":1578},{"style":106},[1579],{"type":35,"value":1580},"    return",{"type":30,"tag":89,"props":1582,"children":1583},{"style":106},[1584],{"type":35,"value":172},{"type":30,"tag":89,"props":1586,"children":1587},{"style":175},[1588],{"type":35,"value":120},{"type":30,"tag":89,"props":1590,"children":1591},{"style":123},[1592],{"type":35,"value":182},{"type":30,"tag":89,"props":1594,"children":1595},{"style":158},[1596],{"type":35,"value":1597},"repository",{"type":30,"tag":89,"props":1599,"children":1600},{"style":123},[1601],{"type":35,"value":193},{"type":30,"tag":89,"props":1603,"children":1604},{"style":158},[1605],{"type":35,"value":811},{"type":30,"tag":89,"props":1607,"children":1608},{"style":123},[1609],{"type":35,"value":358},{"type":30,"tag":89,"props":1611,"children":1613},{"class":91,"line":1612},46,[1614],{"type":30,"tag":89,"props":1615,"children":1616},{"style":123},[1617],{"type":35,"value":443},{"type":30,"tag":31,"props":1619,"children":1620},{},[1621],{"type":30,"tag":448,"props":1622,"children":1623},{},[1624],{"type":35,"value":1625},"Le gain pour les tests :",{"type":30,"tag":78,"props":1627,"children":1629},{"code":1628,"language":81,"meta":8,"className":82,"style":8},"\u002F\u002F Test sans base de données ni Sendgrid : s'exécute en millisecondes\nclass InMemoryOrderRepository implements OrderRepository {\n    private final Map\u003CString, OrderData> orders = new HashMap\u003C>();\n\n    public String save(OrderData orderData) {\n        String orderId = UUID.randomUUID().toString();\n        orders.put(orderId, orderData);\n        return orderId;\n    }\n\n    public boolean contains(String orderId) {\n        return orders.containsKey(orderId);\n    }\n}\n\n@Test\nvoid createOrder_persiste_et_notifie() {\n    InMemoryOrderRepository repository = new InMemoryOrderRepository();\n    FakeEmailNotifier notifier = new FakeEmailNotifier();\n    OrderService service = new OrderService(repository, notifier);\n\n    String orderId = service.createOrder(new OrderData(\"user@example.com\", items));\n\n    assertThat(repository.contains(orderId)).isTrue();\n    assertThat(notifier.getSentConfirmations()).hasSize(1);\n}\n",[1630],{"type":30,"tag":85,"props":1631,"children":1632},{"__ignoreMap":8},[1633,1641,1665,1726,1733,1768,1812,1850,1865,1872,1879,1916,1949,1956,1963,1970,1985,2006,2034,2063,2108,2115,2179,2186,2233,2281],{"type":30,"tag":89,"props":1634,"children":1635},{"class":91,"line":92},[1636],{"type":30,"tag":89,"props":1637,"children":1638},{"style":96},[1639],{"type":35,"value":1640},"\u002F\u002F Test sans base de données ni Sendgrid : s'exécute en millisecondes\n",{"type":30,"tag":89,"props":1642,"children":1643},{"class":91,"line":102},[1644,1648,1653,1657,1661],{"type":30,"tag":89,"props":1645,"children":1646},{"style":106},[1647],{"type":35,"value":1226},{"type":30,"tag":89,"props":1649,"children":1650},{"style":117},[1651],{"type":35,"value":1652}," InMemoryOrderRepository",{"type":30,"tag":89,"props":1654,"children":1655},{"style":106},[1656],{"type":35,"value":1135},{"type":30,"tag":89,"props":1658,"children":1659},{"style":117},[1660],{"type":35,"value":607},{"type":30,"tag":89,"props":1662,"children":1663},{"style":123},[1664],{"type":35,"value":126},{"type":30,"tag":89,"props":1666,"children":1667},{"class":91,"line":129},[1668,1672,1676,1680,1685,1689,1693,1698,1703,1708,1712,1716,1721],{"type":30,"tag":89,"props":1669,"children":1670},{"style":106},[1671],{"type":35,"value":144},{"type":30,"tag":89,"props":1673,"children":1674},{"style":106},[1675],{"type":35,"value":149},{"type":30,"tag":89,"props":1677,"children":1678},{"style":152},[1679],{"type":35,"value":1385},{"type":30,"tag":89,"props":1681,"children":1682},{"style":123},[1683],{"type":35,"value":1684},"\u003C",{"type":30,"tag":89,"props":1686,"children":1687},{"style":106},[1688],{"type":35,"value":696},{"type":30,"tag":89,"props":1690,"children":1691},{"style":123},[1692],{"type":35,"value":193},{"type":30,"tag":89,"props":1694,"children":1695},{"style":106},[1696],{"type":35,"value":1697}," OrderData",{"type":30,"tag":89,"props":1699,"children":1700},{"style":123},[1701],{"type":35,"value":1702},">",{"type":30,"tag":89,"props":1704,"children":1705},{"style":158},[1706],{"type":35,"value":1707}," orders ",{"type":30,"tag":89,"props":1709,"children":1710},{"style":164},[1711],{"type":35,"value":167},{"type":30,"tag":89,"props":1713,"children":1714},{"style":106},[1715],{"type":35,"value":172},{"type":30,"tag":89,"props":1717,"children":1718},{"style":152},[1719],{"type":35,"value":1720}," HashMap",{"type":30,"tag":89,"props":1722,"children":1723},{"style":123},[1724],{"type":35,"value":1725},"\u003C>();\n",{"type":30,"tag":89,"props":1727,"children":1728},{"class":91,"line":138},[1729],{"type":30,"tag":89,"props":1730,"children":1731},{"emptyLinePlaceholder":13},[1732],{"type":35,"value":135},{"type":30,"tag":89,"props":1734,"children":1735},{"class":91,"line":212},[1736,1740,1744,1748,1752,1756,1760,1764],{"type":30,"tag":89,"props":1737,"children":1738},{"style":106},[1739],{"type":35,"value":277},{"type":30,"tag":89,"props":1741,"children":1742},{"style":152},[1743],{"type":35,"value":282},{"type":30,"tag":89,"props":1745,"children":1746},{"style":175},[1747],{"type":35,"value":624},{"type":30,"tag":89,"props":1749,"children":1750},{"style":123},[1751],{"type":35,"value":182},{"type":30,"tag":89,"props":1753,"children":1754},{"style":152},[1755],{"type":35,"value":296},{"type":30,"tag":89,"props":1757,"children":1758},{"style":299},[1759],{"type":35,"value":302},{"type":30,"tag":89,"props":1761,"children":1762},{"style":123},[1763],{"type":35,"value":307},{"type":30,"tag":89,"props":1765,"children":1766},{"style":123},[1767],{"type":35,"value":126},{"type":30,"tag":89,"props":1769,"children":1770},{"class":91,"line":263},[1771,1775,1779,1783,1788,1792,1797,1802,1807],{"type":30,"tag":89,"props":1772,"children":1773},{"style":152},[1774],{"type":35,"value":320},{"type":30,"tag":89,"props":1776,"children":1777},{"style":158},[1778],{"type":35,"value":325},{"type":30,"tag":89,"props":1780,"children":1781},{"style":164},[1782],{"type":35,"value":167},{"type":30,"tag":89,"props":1784,"children":1785},{"style":158},[1786],{"type":35,"value":1787}," UUID",{"type":30,"tag":89,"props":1789,"children":1790},{"style":123},[1791],{"type":35,"value":339},{"type":30,"tag":89,"props":1793,"children":1794},{"style":175},[1795],{"type":35,"value":1796},"randomUUID",{"type":30,"tag":89,"props":1798,"children":1799},{"style":123},[1800],{"type":35,"value":1801},"().",{"type":30,"tag":89,"props":1803,"children":1804},{"style":175},[1805],{"type":35,"value":1806},"toString",{"type":30,"tag":89,"props":1808,"children":1809},{"style":123},[1810],{"type":35,"value":1811},"();\n",{"type":30,"tag":89,"props":1813,"children":1814},{"class":91,"line":271},[1815,1820,1824,1829,1833,1838,1842,1846],{"type":30,"tag":89,"props":1816,"children":1817},{"style":158},[1818],{"type":35,"value":1819},"        orders",{"type":30,"tag":89,"props":1821,"children":1822},{"style":123},[1823],{"type":35,"value":339},{"type":30,"tag":89,"props":1825,"children":1826},{"style":175},[1827],{"type":35,"value":1828},"put",{"type":30,"tag":89,"props":1830,"children":1831},{"style":123},[1832],{"type":35,"value":182},{"type":30,"tag":89,"props":1834,"children":1835},{"style":158},[1836],{"type":35,"value":1837},"orderId",{"type":30,"tag":89,"props":1839,"children":1840},{"style":123},[1841],{"type":35,"value":193},{"type":30,"tag":89,"props":1843,"children":1844},{"style":158},[1845],{"type":35,"value":302},{"type":30,"tag":89,"props":1847,"children":1848},{"style":123},[1849],{"type":35,"value":358},{"type":30,"tag":89,"props":1851,"children":1852},{"class":91,"line":314},[1853,1857,1861],{"type":30,"tag":89,"props":1854,"children":1855},{"style":106},[1856],{"type":35,"value":416},{"type":30,"tag":89,"props":1858,"children":1859},{"style":158},[1860],{"type":35,"value":403},{"type":30,"tag":89,"props":1862,"children":1863},{"style":123},[1864],{"type":35,"value":425},{"type":30,"tag":89,"props":1866,"children":1867},{"class":91,"line":361},[1868],{"type":30,"tag":89,"props":1869,"children":1870},{"style":123},[1871],{"type":35,"value":434},{"type":30,"tag":89,"props":1873,"children":1874},{"class":91,"line":410},[1875],{"type":30,"tag":89,"props":1876,"children":1877},{"emptyLinePlaceholder":13},[1878],{"type":35,"value":135},{"type":30,"tag":89,"props":1880,"children":1881},{"class":91,"line":428},[1882,1886,1891,1896,1900,1904,1908,1912],{"type":30,"tag":89,"props":1883,"children":1884},{"style":106},[1885],{"type":35,"value":277},{"type":30,"tag":89,"props":1887,"children":1888},{"style":106},[1889],{"type":35,"value":1890}," boolean",{"type":30,"tag":89,"props":1892,"children":1893},{"style":175},[1894],{"type":35,"value":1895}," contains",{"type":30,"tag":89,"props":1897,"children":1898},{"style":123},[1899],{"type":35,"value":182},{"type":30,"tag":89,"props":1901,"children":1902},{"style":152},[1903],{"type":35,"value":696},{"type":30,"tag":89,"props":1905,"children":1906},{"style":299},[1907],{"type":35,"value":403},{"type":30,"tag":89,"props":1909,"children":1910},{"style":123},[1911],{"type":35,"value":307},{"type":30,"tag":89,"props":1913,"children":1914},{"style":123},[1915],{"type":35,"value":126},{"type":30,"tag":89,"props":1917,"children":1918},{"class":91,"line":437},[1919,1923,1928,1932,1937,1941,1945],{"type":30,"tag":89,"props":1920,"children":1921},{"style":106},[1922],{"type":35,"value":416},{"type":30,"tag":89,"props":1924,"children":1925},{"style":158},[1926],{"type":35,"value":1927}," orders",{"type":30,"tag":89,"props":1929,"children":1930},{"style":123},[1931],{"type":35,"value":339},{"type":30,"tag":89,"props":1933,"children":1934},{"style":175},[1935],{"type":35,"value":1936},"containsKey",{"type":30,"tag":89,"props":1938,"children":1939},{"style":123},[1940],{"type":35,"value":182},{"type":30,"tag":89,"props":1942,"children":1943},{"style":158},[1944],{"type":35,"value":1837},{"type":30,"tag":89,"props":1946,"children":1947},{"style":123},[1948],{"type":35,"value":358},{"type":30,"tag":89,"props":1950,"children":1951},{"class":91,"line":768},[1952],{"type":30,"tag":89,"props":1953,"children":1954},{"style":123},[1955],{"type":35,"value":434},{"type":30,"tag":89,"props":1957,"children":1958},{"class":91,"line":793},[1959],{"type":30,"tag":89,"props":1960,"children":1961},{"style":123},[1962],{"type":35,"value":443},{"type":30,"tag":89,"props":1964,"children":1965},{"class":91,"line":818},[1966],{"type":30,"tag":89,"props":1967,"children":1968},{"emptyLinePlaceholder":13},[1969],{"type":35,"value":135},{"type":30,"tag":89,"props":1971,"children":1972},{"class":91,"line":826},[1973,1979],{"type":30,"tag":89,"props":1974,"children":1976},{"style":1975},"--shiki-default:#EF9F76;--shiki-dark:#E1E4E8",[1977],{"type":35,"value":1978},"@",{"type":30,"tag":89,"props":1980,"children":1982},{"style":1981},"--shiki-default:#EF9F76;--shiki-dark:#F97583",[1983],{"type":35,"value":1984},"Test\n",{"type":30,"tag":89,"props":1986,"children":1987},{"class":91,"line":870},[1988,1993,1998,2002],{"type":30,"tag":89,"props":1989,"children":1990},{"style":106},[1991],{"type":35,"value":1992},"void",{"type":30,"tag":89,"props":1994,"children":1995},{"style":175},[1996],{"type":35,"value":1997}," createOrder_persiste_et_notifie",{"type":30,"tag":89,"props":1999,"children":2000},{"style":123},[2001],{"type":35,"value":1471},{"type":30,"tag":89,"props":2003,"children":2004},{"style":123},[2005],{"type":35,"value":126},{"type":30,"tag":89,"props":2007,"children":2008},{"class":91,"line":901},[2009,2014,2018,2022,2026,2030],{"type":30,"tag":89,"props":2010,"children":2011},{"style":152},[2012],{"type":35,"value":2013},"    InMemoryOrderRepository",{"type":30,"tag":89,"props":2015,"children":2016},{"style":158},[2017],{"type":35,"value":1489},{"type":30,"tag":89,"props":2019,"children":2020},{"style":164},[2021],{"type":35,"value":167},{"type":30,"tag":89,"props":2023,"children":2024},{"style":106},[2025],{"type":35,"value":172},{"type":30,"tag":89,"props":2027,"children":2028},{"style":175},[2029],{"type":35,"value":1652},{"type":30,"tag":89,"props":2031,"children":2032},{"style":123},[2033],{"type":35,"value":1811},{"type":30,"tag":89,"props":2035,"children":2036},{"class":91,"line":930},[2037,2042,2046,2050,2054,2059],{"type":30,"tag":89,"props":2038,"children":2039},{"style":152},[2040],{"type":35,"value":2041},"    FakeEmailNotifier",{"type":30,"tag":89,"props":2043,"children":2044},{"style":158},[2045],{"type":35,"value":1528},{"type":30,"tag":89,"props":2047,"children":2048},{"style":164},[2049],{"type":35,"value":167},{"type":30,"tag":89,"props":2051,"children":2052},{"style":106},[2053],{"type":35,"value":172},{"type":30,"tag":89,"props":2055,"children":2056},{"style":175},[2057],{"type":35,"value":2058}," FakeEmailNotifier",{"type":30,"tag":89,"props":2060,"children":2061},{"style":123},[2062],{"type":35,"value":1811},{"type":30,"tag":89,"props":2064,"children":2065},{"class":91,"line":938},[2066,2071,2076,2080,2084,2088,2092,2096,2100,2104],{"type":30,"tag":89,"props":2067,"children":2068},{"style":152},[2069],{"type":35,"value":2070},"    OrderService",{"type":30,"tag":89,"props":2072,"children":2073},{"style":158},[2074],{"type":35,"value":2075}," service ",{"type":30,"tag":89,"props":2077,"children":2078},{"style":164},[2079],{"type":35,"value":167},{"type":30,"tag":89,"props":2081,"children":2082},{"style":106},[2083],{"type":35,"value":172},{"type":30,"tag":89,"props":2085,"children":2086},{"style":175},[2087],{"type":35,"value":120},{"type":30,"tag":89,"props":2089,"children":2090},{"style":123},[2091],{"type":35,"value":182},{"type":30,"tag":89,"props":2093,"children":2094},{"style":158},[2095],{"type":35,"value":1597},{"type":30,"tag":89,"props":2097,"children":2098},{"style":123},[2099],{"type":35,"value":193},{"type":30,"tag":89,"props":2101,"children":2102},{"style":158},[2103],{"type":35,"value":811},{"type":30,"tag":89,"props":2105,"children":2106},{"style":123},[2107],{"type":35,"value":358},{"type":30,"tag":89,"props":2109,"children":2110},{"class":91,"line":946},[2111],{"type":30,"tag":89,"props":2112,"children":2113},{"emptyLinePlaceholder":13},[2114],{"type":35,"value":135},{"type":30,"tag":89,"props":2116,"children":2117},{"class":91,"line":982},[2118,2122,2126,2130,2135,2139,2144,2148,2153,2157,2161,2166,2170,2175],{"type":30,"tag":89,"props":2119,"children":2120},{"style":152},[2121],{"type":35,"value":619},{"type":30,"tag":89,"props":2123,"children":2124},{"style":158},[2125],{"type":35,"value":325},{"type":30,"tag":89,"props":2127,"children":2128},{"style":164},[2129],{"type":35,"value":167},{"type":30,"tag":89,"props":2131,"children":2132},{"style":158},[2133],{"type":35,"value":2134}," service",{"type":30,"tag":89,"props":2136,"children":2137},{"style":123},[2138],{"type":35,"value":339},{"type":30,"tag":89,"props":2140,"children":2141},{"style":175},[2142],{"type":35,"value":2143},"createOrder",{"type":30,"tag":89,"props":2145,"children":2146},{"style":123},[2147],{"type":35,"value":182},{"type":30,"tag":89,"props":2149,"children":2150},{"style":106},[2151],{"type":35,"value":2152},"new",{"type":30,"tag":89,"props":2154,"children":2155},{"style":175},[2156],{"type":35,"value":1697},{"type":30,"tag":89,"props":2158,"children":2159},{"style":123},[2160],{"type":35,"value":182},{"type":30,"tag":89,"props":2162,"children":2163},{"style":185},[2164],{"type":35,"value":2165},"\"user@example.com\"",{"type":30,"tag":89,"props":2167,"children":2168},{"style":123},[2169],{"type":35,"value":193},{"type":30,"tag":89,"props":2171,"children":2172},{"style":158},[2173],{"type":35,"value":2174}," items",{"type":30,"tag":89,"props":2176,"children":2177},{"style":123},[2178],{"type":35,"value":1416},{"type":30,"tag":89,"props":2180,"children":2181},{"class":91,"line":1022},[2182],{"type":30,"tag":89,"props":2183,"children":2184},{"emptyLinePlaceholder":13},[2185],{"type":35,"value":135},{"type":30,"tag":89,"props":2187,"children":2188},{"class":91,"line":1067},[2189,2194,2198,2202,2206,2211,2215,2219,2224,2229],{"type":30,"tag":89,"props":2190,"children":2191},{"style":175},[2192],{"type":35,"value":2193},"    assertThat",{"type":30,"tag":89,"props":2195,"children":2196},{"style":123},[2197],{"type":35,"value":182},{"type":30,"tag":89,"props":2199,"children":2200},{"style":158},[2201],{"type":35,"value":1597},{"type":30,"tag":89,"props":2203,"children":2204},{"style":123},[2205],{"type":35,"value":339},{"type":30,"tag":89,"props":2207,"children":2208},{"style":175},[2209],{"type":35,"value":2210},"contains",{"type":30,"tag":89,"props":2212,"children":2213},{"style":123},[2214],{"type":35,"value":182},{"type":30,"tag":89,"props":2216,"children":2217},{"style":158},[2218],{"type":35,"value":1837},{"type":30,"tag":89,"props":2220,"children":2221},{"style":123},[2222],{"type":35,"value":2223},")).",{"type":30,"tag":89,"props":2225,"children":2226},{"style":175},[2227],{"type":35,"value":2228},"isTrue",{"type":30,"tag":89,"props":2230,"children":2231},{"style":123},[2232],{"type":35,"value":1811},{"type":30,"tag":89,"props":2234,"children":2235},{"class":91,"line":1083},[2236,2240,2244,2249,2253,2258,2263,2268,2272,2277],{"type":30,"tag":89,"props":2237,"children":2238},{"style":175},[2239],{"type":35,"value":2193},{"type":30,"tag":89,"props":2241,"children":2242},{"style":123},[2243],{"type":35,"value":182},{"type":30,"tag":89,"props":2245,"children":2246},{"style":158},[2247],{"type":35,"value":2248},"notifier",{"type":30,"tag":89,"props":2250,"children":2251},{"style":123},[2252],{"type":35,"value":339},{"type":30,"tag":89,"props":2254,"children":2255},{"style":175},[2256],{"type":35,"value":2257},"getSentConfirmations",{"type":30,"tag":89,"props":2259,"children":2260},{"style":123},[2261],{"type":35,"value":2262},"()).",{"type":30,"tag":89,"props":2264,"children":2265},{"style":175},[2266],{"type":35,"value":2267},"hasSize",{"type":30,"tag":89,"props":2269,"children":2270},{"style":123},[2271],{"type":35,"value":182},{"type":30,"tag":89,"props":2273,"children":2274},{"style":196},[2275],{"type":35,"value":2276},"1",{"type":30,"tag":89,"props":2278,"children":2279},{"style":123},[2280],{"type":35,"value":358},{"type":30,"tag":89,"props":2282,"children":2283},{"class":91,"line":1091},[2284],{"type":30,"tag":89,"props":2285,"children":2286},{"style":123},[2287],{"type":35,"value":443},{"type":30,"tag":2289,"props":2290,"children":2295},"cta",{"cta":2291,"href":2292,"title":2293,"type":2294},"Coder comme un senior →","https:\u002F\u002Fapp.kamanga.fr\u002Fforms\u002Fmentoring","Vous voulez savoir où placer l'abstraction et où vous arrêter ?","call",[2296],{"type":30,"tag":31,"props":2297,"children":2298},{},[2299],{"type":35,"value":2300},"Inverser une dépendance au bon endroit (et résister à l'envie d'abstraire le reste) ne s'apprend pas en lisant un exemple, ça se travaille sur votre propre code. En mentoring 1:1, je relis vos services avec vous, on extrait les ports ensemble et vous repartez avec le réflexe de sentir quand une dépendance mérite une interface. C'est du 1:1 pour monter en niveau, pas un audit d'équipe.",{"type":30,"tag":48,"props":2302,"children":2303},{},[],{"type":30,"tag":52,"props":2305,"children":2307},{"id":2306},"exemple-2-java-ports-hexagonaux-et-fakes-en-mémoire",[2308],{"type":35,"value":2309},"Exemple 2 : Java, ports hexagonaux et fakes en mémoire",{"type":30,"tag":78,"props":2311,"children":2313},{"code":2312,"language":81,"meta":8,"className":82,"style":8},"\u002F\u002F Les ports (abstractions hexagonales)\npublic interface OrderRepository {\n    String save(OrderData orderData);\n    Optional\u003COrder> findById(String orderId);\n}\n\npublic interface PaymentGateway {\n    PaymentResult charge(BigDecimal amount, String currency, String paymentMethodId);\n}\n\n\u002F\u002F Le module de haut niveau - dépend uniquement des ports\n@Service\npublic class OrderService {\n\n    private final OrderRepository repository;\n    private final PaymentGateway payment;\n\n    public OrderService(OrderRepository repository, PaymentGateway payment) {\n        this.repository = repository;\n        this.payment = payment;\n    }\n\n    public Order createPaidOrder(OrderData orderData) {\n        PaymentResult result = payment.charge(\n            orderData.getTotal(),\n            orderData.getCurrency(),\n            orderData.getPaymentMethodId()\n        );\n\n        if (!result.isSuccess()) {\n            throw new PaymentFailedException(result.getErrorCode());\n        }\n\n        String orderId = repository.save(\n            orderData.withPaymentId(result.getTransactionId())\n                     .withStatus(OrderStatus.PAID)\n        );\n\n        return repository.findById(orderId)\n            .orElseThrow(() -> new IllegalStateException(\"Order not found after save\"));\n    }\n}\n\n\u002F\u002F Fake en mémoire pour les tests - sans Stripe, sans base de données\nclass InMemoryOrderRepository implements OrderRepository {\n\n    private final Map\u003CString, OrderData> store = new HashMap\u003C>();\n\n    @Override\n    public String save(OrderData orderData) {\n        String id = UUID.randomUUID().toString();\n        store.put(id, orderData);\n        return id;\n    }\n\n    @Override\n    public Optional\u003COrder> findById(String orderId) {\n        return Optional.ofNullable(store.get(orderId))\n            .map(data -> new Order(orderId, data.getStatus()));\n    }\n}\n\nclass StubPaymentGateway implements PaymentGateway {\n\n    private final boolean shouldSucceed;\n\n    StubPaymentGateway(boolean shouldSucceed) {\n        this.shouldSucceed = shouldSucceed;\n    }\n\n    @Override\n    public PaymentResult charge(BigDecimal amount, String currency, String paymentMethodId) {\n        return shouldSucceed\n            ? PaymentResult.success(\"txn-456\")\n            : PaymentResult.failure(\"CARD_DECLINED\");\n    }\n}\n\n\u002F\u002F Test JUnit 5 - s'exécute en millisecondes, sans infra\nclass OrderServiceTest {\n\n    @Test\n    void shouldCreateOrderWithSuccessfulPayment() {\n        OrderRepository repository = new InMemoryOrderRepository();\n        PaymentGateway payment = new StubPaymentGateway(true);\n        OrderService service = new OrderService(repository, payment);\n\n        Order order = service.createPaidOrder(\n            new OrderData(new BigDecimal(\"1000\"), \"EUR\", \"pm-123\")\n        );\n\n        assertEquals(OrderStatus.PAID, order.getStatus());\n    }\n\n    @Test\n    void shouldThrowWhenPaymentFails() {\n        OrderService service = new OrderService(\n            new InMemoryOrderRepository(),\n            new StubPaymentGateway(false)\n        );\n\n        assertThrows(PaymentFailedException.class, () ->\n            service.createPaidOrder(new OrderData(new BigDecimal(\"1000\"), \"EUR\", \"pm-123\"))\n        );\n    }\n}\n",[2314],{"type":30,"tag":85,"props":2315,"children":2316},{"__ignoreMap":8},[2317,2325,2344,2371,2413,2420,2427,2447,2504,2511,2518,2526,2538,2557,2564,2587,2611,2618,2661,2688,2716,2723,2730,2767,2802,2824,2844,2865,2873,2880,2921,2960,2968,2975,3006,3044,3080,3087,3094,3126,3171,3178,3185,3192,3200,3223,3230,3287,3295,3309,3345,3386,3424,3441,3449,3457,3469,3518,3570,3636,3644,3652,3660,3685,3693,3718,3726,3756,3785,3793,3801,3813,3874,3887,3922,3957,3965,3973,3981,3990,4007,4015,4027,4048,4077,4116,4161,4169,4204,4262,4270,4278,4324,4332,4340,4352,4373,4401,4417,4442,4450,4458,4498,4567,4575,4583],{"type":30,"tag":89,"props":2318,"children":2319},{"class":91,"line":92},[2320],{"type":30,"tag":89,"props":2321,"children":2322},{"style":96},[2323],{"type":35,"value":2324},"\u002F\u002F Les ports (abstractions hexagonales)\n",{"type":30,"tag":89,"props":2326,"children":2327},{"class":91,"line":102},[2328,2332,2336,2340],{"type":30,"tag":89,"props":2329,"children":2330},{"style":106},[2331],{"type":35,"value":109},{"type":30,"tag":89,"props":2333,"children":2334},{"style":106},[2335],{"type":35,"value":602},{"type":30,"tag":89,"props":2337,"children":2338},{"style":117},[2339],{"type":35,"value":607},{"type":30,"tag":89,"props":2341,"children":2342},{"style":123},[2343],{"type":35,"value":126},{"type":30,"tag":89,"props":2345,"children":2346},{"class":91,"line":129},[2347,2351,2355,2359,2363,2367],{"type":30,"tag":89,"props":2348,"children":2349},{"style":152},[2350],{"type":35,"value":619},{"type":30,"tag":89,"props":2352,"children":2353},{"style":175},[2354],{"type":35,"value":624},{"type":30,"tag":89,"props":2356,"children":2357},{"style":123},[2358],{"type":35,"value":182},{"type":30,"tag":89,"props":2360,"children":2361},{"style":152},[2362],{"type":35,"value":296},{"type":30,"tag":89,"props":2364,"children":2365},{"style":299},[2366],{"type":35,"value":302},{"type":30,"tag":89,"props":2368,"children":2369},{"style":123},[2370],{"type":35,"value":358},{"type":30,"tag":89,"props":2372,"children":2373},{"class":91,"line":138},[2374,2379,2383,2388,2392,2397,2401,2405,2409],{"type":30,"tag":89,"props":2375,"children":2376},{"style":152},[2377],{"type":35,"value":2378},"    Optional",{"type":30,"tag":89,"props":2380,"children":2381},{"style":123},[2382],{"type":35,"value":1684},{"type":30,"tag":89,"props":2384,"children":2385},{"style":106},[2386],{"type":35,"value":2387},"Order",{"type":30,"tag":89,"props":2389,"children":2390},{"style":123},[2391],{"type":35,"value":1702},{"type":30,"tag":89,"props":2393,"children":2394},{"style":175},[2395],{"type":35,"value":2396}," findById",{"type":30,"tag":89,"props":2398,"children":2399},{"style":123},[2400],{"type":35,"value":182},{"type":30,"tag":89,"props":2402,"children":2403},{"style":152},[2404],{"type":35,"value":696},{"type":30,"tag":89,"props":2406,"children":2407},{"style":299},[2408],{"type":35,"value":403},{"type":30,"tag":89,"props":2410,"children":2411},{"style":123},[2412],{"type":35,"value":358},{"type":30,"tag":89,"props":2414,"children":2415},{"class":91,"line":212},[2416],{"type":30,"tag":89,"props":2417,"children":2418},{"style":123},[2419],{"type":35,"value":443},{"type":30,"tag":89,"props":2421,"children":2422},{"class":91,"line":263},[2423],{"type":30,"tag":89,"props":2424,"children":2425},{"emptyLinePlaceholder":13},[2426],{"type":35,"value":135},{"type":30,"tag":89,"props":2428,"children":2429},{"class":91,"line":271},[2430,2434,2438,2443],{"type":30,"tag":89,"props":2431,"children":2432},{"style":106},[2433],{"type":35,"value":109},{"type":30,"tag":89,"props":2435,"children":2436},{"style":106},[2437],{"type":35,"value":602},{"type":30,"tag":89,"props":2439,"children":2440},{"style":117},[2441],{"type":35,"value":2442}," PaymentGateway",{"type":30,"tag":89,"props":2444,"children":2445},{"style":123},[2446],{"type":35,"value":126},{"type":30,"tag":89,"props":2448,"children":2449},{"class":91,"line":314},[2450,2455,2460,2464,2469,2474,2478,2482,2487,2491,2495,2500],{"type":30,"tag":89,"props":2451,"children":2452},{"style":152},[2453],{"type":35,"value":2454},"    PaymentResult",{"type":30,"tag":89,"props":2456,"children":2457},{"style":175},[2458],{"type":35,"value":2459}," charge",{"type":30,"tag":89,"props":2461,"children":2462},{"style":123},[2463],{"type":35,"value":182},{"type":30,"tag":89,"props":2465,"children":2466},{"style":152},[2467],{"type":35,"value":2468},"BigDecimal",{"type":30,"tag":89,"props":2470,"children":2471},{"style":299},[2472],{"type":35,"value":2473}," amount",{"type":30,"tag":89,"props":2475,"children":2476},{"style":123},[2477],{"type":35,"value":193},{"type":30,"tag":89,"props":2479,"children":2480},{"style":152},[2481],{"type":35,"value":282},{"type":30,"tag":89,"props":2483,"children":2484},{"style":299},[2485],{"type":35,"value":2486}," currency",{"type":30,"tag":89,"props":2488,"children":2489},{"style":123},[2490],{"type":35,"value":193},{"type":30,"tag":89,"props":2492,"children":2493},{"style":152},[2494],{"type":35,"value":282},{"type":30,"tag":89,"props":2496,"children":2497},{"style":299},[2498],{"type":35,"value":2499}," paymentMethodId",{"type":30,"tag":89,"props":2501,"children":2502},{"style":123},[2503],{"type":35,"value":358},{"type":30,"tag":89,"props":2505,"children":2506},{"class":91,"line":361},[2507],{"type":30,"tag":89,"props":2508,"children":2509},{"style":123},[2510],{"type":35,"value":443},{"type":30,"tag":89,"props":2512,"children":2513},{"class":91,"line":410},[2514],{"type":30,"tag":89,"props":2515,"children":2516},{"emptyLinePlaceholder":13},[2517],{"type":35,"value":135},{"type":30,"tag":89,"props":2519,"children":2520},{"class":91,"line":428},[2521],{"type":30,"tag":89,"props":2522,"children":2523},{"style":96},[2524],{"type":35,"value":2525},"\u002F\u002F Le module de haut niveau - dépend uniquement des ports\n",{"type":30,"tag":89,"props":2527,"children":2528},{"class":91,"line":437},[2529,2533],{"type":30,"tag":89,"props":2530,"children":2531},{"style":1975},[2532],{"type":35,"value":1978},{"type":30,"tag":89,"props":2534,"children":2535},{"style":1981},[2536],{"type":35,"value":2537},"Service\n",{"type":30,"tag":89,"props":2539,"children":2540},{"class":91,"line":768},[2541,2545,2549,2553],{"type":30,"tag":89,"props":2542,"children":2543},{"style":106},[2544],{"type":35,"value":109},{"type":30,"tag":89,"props":2546,"children":2547},{"style":106},[2548],{"type":35,"value":114},{"type":30,"tag":89,"props":2550,"children":2551},{"style":117},[2552],{"type":35,"value":120},{"type":30,"tag":89,"props":2554,"children":2555},{"style":123},[2556],{"type":35,"value":126},{"type":30,"tag":89,"props":2558,"children":2559},{"class":91,"line":793},[2560],{"type":30,"tag":89,"props":2561,"children":2562},{"emptyLinePlaceholder":13},[2563],{"type":35,"value":135},{"type":30,"tag":89,"props":2565,"children":2566},{"class":91,"line":818},[2567,2571,2575,2579,2583],{"type":30,"tag":89,"props":2568,"children":2569},{"style":106},[2570],{"type":35,"value":144},{"type":30,"tag":89,"props":2572,"children":2573},{"style":106},[2574],{"type":35,"value":149},{"type":30,"tag":89,"props":2576,"children":2577},{"style":152},[2578],{"type":35,"value":607},{"type":30,"tag":89,"props":2580,"children":2581},{"style":158},[2582],{"type":35,"value":786},{"type":30,"tag":89,"props":2584,"children":2585},{"style":123},[2586],{"type":35,"value":425},{"type":30,"tag":89,"props":2588,"children":2589},{"class":91,"line":826},[2590,2594,2598,2602,2607],{"type":30,"tag":89,"props":2591,"children":2592},{"style":106},[2593],{"type":35,"value":144},{"type":30,"tag":89,"props":2595,"children":2596},{"style":106},[2597],{"type":35,"value":149},{"type":30,"tag":89,"props":2599,"children":2600},{"style":152},[2601],{"type":35,"value":2442},{"type":30,"tag":89,"props":2603,"children":2604},{"style":158},[2605],{"type":35,"value":2606}," payment",{"type":30,"tag":89,"props":2608,"children":2609},{"style":123},[2610],{"type":35,"value":425},{"type":30,"tag":89,"props":2612,"children":2613},{"class":91,"line":870},[2614],{"type":30,"tag":89,"props":2615,"children":2616},{"emptyLinePlaceholder":13},[2617],{"type":35,"value":135},{"type":30,"tag":89,"props":2619,"children":2620},{"class":91,"line":901},[2621,2625,2629,2633,2637,2641,2645,2649,2653,2657],{"type":30,"tag":89,"props":2622,"children":2623},{"style":106},[2624],{"type":35,"value":277},{"type":30,"tag":89,"props":2626,"children":2627},{"style":175},[2628],{"type":35,"value":120},{"type":30,"tag":89,"props":2630,"children":2631},{"style":123},[2632],{"type":35,"value":182},{"type":30,"tag":89,"props":2634,"children":2635},{"style":152},[2636],{"type":35,"value":543},{"type":30,"tag":89,"props":2638,"children":2639},{"style":299},[2640],{"type":35,"value":786},{"type":30,"tag":89,"props":2642,"children":2643},{"style":123},[2644],{"type":35,"value":193},{"type":30,"tag":89,"props":2646,"children":2647},{"style":152},[2648],{"type":35,"value":2442},{"type":30,"tag":89,"props":2650,"children":2651},{"style":299},[2652],{"type":35,"value":2606},{"type":30,"tag":89,"props":2654,"children":2655},{"style":123},[2656],{"type":35,"value":307},{"type":30,"tag":89,"props":2658,"children":2659},{"style":123},[2660],{"type":35,"value":126},{"type":30,"tag":89,"props":2662,"children":2663},{"class":91,"line":930},[2664,2668,2672,2676,2680,2684],{"type":30,"tag":89,"props":2665,"children":2666},{"style":874},[2667],{"type":35,"value":877},{"type":30,"tag":89,"props":2669,"children":2670},{"style":123},[2671],{"type":35,"value":339},{"type":30,"tag":89,"props":2673,"children":2674},{"style":158},[2675],{"type":35,"value":886},{"type":30,"tag":89,"props":2677,"children":2678},{"style":164},[2679],{"type":35,"value":167},{"type":30,"tag":89,"props":2681,"children":2682},{"style":158},[2683],{"type":35,"value":786},{"type":30,"tag":89,"props":2685,"children":2686},{"style":123},[2687],{"type":35,"value":425},{"type":30,"tag":89,"props":2689,"children":2690},{"class":91,"line":938},[2691,2695,2699,2704,2708,2712],{"type":30,"tag":89,"props":2692,"children":2693},{"style":874},[2694],{"type":35,"value":877},{"type":30,"tag":89,"props":2696,"children":2697},{"style":123},[2698],{"type":35,"value":339},{"type":30,"tag":89,"props":2700,"children":2701},{"style":158},[2702],{"type":35,"value":2703},"payment ",{"type":30,"tag":89,"props":2705,"children":2706},{"style":164},[2707],{"type":35,"value":167},{"type":30,"tag":89,"props":2709,"children":2710},{"style":158},[2711],{"type":35,"value":2606},{"type":30,"tag":89,"props":2713,"children":2714},{"style":123},[2715],{"type":35,"value":425},{"type":30,"tag":89,"props":2717,"children":2718},{"class":91,"line":946},[2719],{"type":30,"tag":89,"props":2720,"children":2721},{"style":123},[2722],{"type":35,"value":434},{"type":30,"tag":89,"props":2724,"children":2725},{"class":91,"line":982},[2726],{"type":30,"tag":89,"props":2727,"children":2728},{"emptyLinePlaceholder":13},[2729],{"type":35,"value":135},{"type":30,"tag":89,"props":2731,"children":2732},{"class":91,"line":1022},[2733,2737,2742,2747,2751,2755,2759,2763],{"type":30,"tag":89,"props":2734,"children":2735},{"style":106},[2736],{"type":35,"value":277},{"type":30,"tag":89,"props":2738,"children":2739},{"style":152},[2740],{"type":35,"value":2741}," Order",{"type":30,"tag":89,"props":2743,"children":2744},{"style":175},[2745],{"type":35,"value":2746}," createPaidOrder",{"type":30,"tag":89,"props":2748,"children":2749},{"style":123},[2750],{"type":35,"value":182},{"type":30,"tag":89,"props":2752,"children":2753},{"style":152},[2754],{"type":35,"value":296},{"type":30,"tag":89,"props":2756,"children":2757},{"style":299},[2758],{"type":35,"value":302},{"type":30,"tag":89,"props":2760,"children":2761},{"style":123},[2762],{"type":35,"value":307},{"type":30,"tag":89,"props":2764,"children":2765},{"style":123},[2766],{"type":35,"value":126},{"type":30,"tag":89,"props":2768,"children":2769},{"class":91,"line":1067},[2770,2775,2780,2784,2788,2792,2797],{"type":30,"tag":89,"props":2771,"children":2772},{"style":152},[2773],{"type":35,"value":2774},"        PaymentResult",{"type":30,"tag":89,"props":2776,"children":2777},{"style":158},[2778],{"type":35,"value":2779}," result ",{"type":30,"tag":89,"props":2781,"children":2782},{"style":164},[2783],{"type":35,"value":167},{"type":30,"tag":89,"props":2785,"children":2786},{"style":158},[2787],{"type":35,"value":2606},{"type":30,"tag":89,"props":2789,"children":2790},{"style":123},[2791],{"type":35,"value":339},{"type":30,"tag":89,"props":2793,"children":2794},{"style":175},[2795],{"type":35,"value":2796},"charge",{"type":30,"tag":89,"props":2798,"children":2799},{"style":123},[2800],{"type":35,"value":2801},"(\n",{"type":30,"tag":89,"props":2803,"children":2804},{"class":91,"line":1083},[2805,2810,2814,2819],{"type":30,"tag":89,"props":2806,"children":2807},{"style":158},[2808],{"type":35,"value":2809},"            orderData",{"type":30,"tag":89,"props":2811,"children":2812},{"style":123},[2813],{"type":35,"value":339},{"type":30,"tag":89,"props":2815,"children":2816},{"style":175},[2817],{"type":35,"value":2818},"getTotal",{"type":30,"tag":89,"props":2820,"children":2821},{"style":123},[2822],{"type":35,"value":2823},"(),\n",{"type":30,"tag":89,"props":2825,"children":2826},{"class":91,"line":1091},[2827,2831,2835,2840],{"type":30,"tag":89,"props":2828,"children":2829},{"style":158},[2830],{"type":35,"value":2809},{"type":30,"tag":89,"props":2832,"children":2833},{"style":123},[2834],{"type":35,"value":339},{"type":30,"tag":89,"props":2836,"children":2837},{"style":175},[2838],{"type":35,"value":2839},"getCurrency",{"type":30,"tag":89,"props":2841,"children":2842},{"style":123},[2843],{"type":35,"value":2823},{"type":30,"tag":89,"props":2845,"children":2846},{"class":91,"line":1099},[2847,2851,2855,2860],{"type":30,"tag":89,"props":2848,"children":2849},{"style":158},[2850],{"type":35,"value":2809},{"type":30,"tag":89,"props":2852,"children":2853},{"style":123},[2854],{"type":35,"value":339},{"type":30,"tag":89,"props":2856,"children":2857},{"style":175},[2858],{"type":35,"value":2859},"getPaymentMethodId",{"type":30,"tag":89,"props":2861,"children":2862},{"style":123},[2863],{"type":35,"value":2864},"()\n",{"type":30,"tag":89,"props":2866,"children":2867},{"class":91,"line":1107},[2868],{"type":30,"tag":89,"props":2869,"children":2870},{"style":123},[2871],{"type":35,"value":2872},"        );\n",{"type":30,"tag":89,"props":2874,"children":2875},{"class":91,"line":1116},[2876],{"type":30,"tag":89,"props":2877,"children":2878},{"emptyLinePlaceholder":13},[2879],{"type":35,"value":135},{"type":30,"tag":89,"props":2881,"children":2882},{"class":91,"line":11},[2883,2888,2893,2898,2903,2907,2912,2917],{"type":30,"tag":89,"props":2884,"children":2885},{"style":106},[2886],{"type":35,"value":2887},"        if",{"type":30,"tag":89,"props":2889,"children":2890},{"style":123},[2891],{"type":35,"value":2892}," (",{"type":30,"tag":89,"props":2894,"children":2895},{"style":164},[2896],{"type":35,"value":2897},"!",{"type":30,"tag":89,"props":2899,"children":2900},{"style":158},[2901],{"type":35,"value":2902},"result",{"type":30,"tag":89,"props":2904,"children":2905},{"style":123},[2906],{"type":35,"value":339},{"type":30,"tag":89,"props":2908,"children":2909},{"style":175},[2910],{"type":35,"value":2911},"isSuccess",{"type":30,"tag":89,"props":2913,"children":2914},{"style":123},[2915],{"type":35,"value":2916},"())",{"type":30,"tag":89,"props":2918,"children":2919},{"style":123},[2920],{"type":35,"value":126},{"type":30,"tag":89,"props":2922,"children":2923},{"class":91,"line":1181},[2924,2929,2933,2938,2942,2946,2950,2955],{"type":30,"tag":89,"props":2925,"children":2926},{"style":106},[2927],{"type":35,"value":2928},"            throw",{"type":30,"tag":89,"props":2930,"children":2931},{"style":106},[2932],{"type":35,"value":172},{"type":30,"tag":89,"props":2934,"children":2935},{"style":175},[2936],{"type":35,"value":2937}," PaymentFailedException",{"type":30,"tag":89,"props":2939,"children":2940},{"style":123},[2941],{"type":35,"value":182},{"type":30,"tag":89,"props":2943,"children":2944},{"style":158},[2945],{"type":35,"value":2902},{"type":30,"tag":89,"props":2947,"children":2948},{"style":123},[2949],{"type":35,"value":339},{"type":30,"tag":89,"props":2951,"children":2952},{"style":175},[2953],{"type":35,"value":2954},"getErrorCode",{"type":30,"tag":89,"props":2956,"children":2957},{"style":123},[2958],{"type":35,"value":2959},"());\n",{"type":30,"tag":89,"props":2961,"children":2962},{"class":91,"line":1241},[2963],{"type":30,"tag":89,"props":2964,"children":2965},{"style":123},[2966],{"type":35,"value":2967},"        }\n",{"type":30,"tag":89,"props":2969,"children":2970},{"class":91,"line":1249},[2971],{"type":30,"tag":89,"props":2972,"children":2973},{"emptyLinePlaceholder":13},[2974],{"type":35,"value":135},{"type":30,"tag":89,"props":2976,"children":2977},{"class":91,"line":1257},[2978,2982,2986,2990,2994,2998,3002],{"type":30,"tag":89,"props":2979,"children":2980},{"style":152},[2981],{"type":35,"value":320},{"type":30,"tag":89,"props":2983,"children":2984},{"style":158},[2985],{"type":35,"value":325},{"type":30,"tag":89,"props":2987,"children":2988},{"style":164},[2989],{"type":35,"value":167},{"type":30,"tag":89,"props":2991,"children":2992},{"style":158},[2993],{"type":35,"value":786},{"type":30,"tag":89,"props":2995,"children":2996},{"style":123},[2997],{"type":35,"value":339},{"type":30,"tag":89,"props":2999,"children":3000},{"style":175},[3001],{"type":35,"value":344},{"type":30,"tag":89,"props":3003,"children":3004},{"style":123},[3005],{"type":35,"value":2801},{"type":30,"tag":89,"props":3007,"children":3008},{"class":91,"line":1265},[3009,3013,3017,3022,3026,3030,3034,3039],{"type":30,"tag":89,"props":3010,"children":3011},{"style":158},[3012],{"type":35,"value":2809},{"type":30,"tag":89,"props":3014,"children":3015},{"style":123},[3016],{"type":35,"value":339},{"type":30,"tag":89,"props":3018,"children":3019},{"style":175},[3020],{"type":35,"value":3021},"withPaymentId",{"type":30,"tag":89,"props":3023,"children":3024},{"style":123},[3025],{"type":35,"value":182},{"type":30,"tag":89,"props":3027,"children":3028},{"style":158},[3029],{"type":35,"value":2902},{"type":30,"tag":89,"props":3031,"children":3032},{"style":123},[3033],{"type":35,"value":339},{"type":30,"tag":89,"props":3035,"children":3036},{"style":175},[3037],{"type":35,"value":3038},"getTransactionId",{"type":30,"tag":89,"props":3040,"children":3041},{"style":123},[3042],{"type":35,"value":3043},"())\n",{"type":30,"tag":89,"props":3045,"children":3046},{"class":91,"line":1294},[3047,3052,3057,3061,3066,3070,3075],{"type":30,"tag":89,"props":3048,"children":3049},{"style":123},[3050],{"type":35,"value":3051},"                     .",{"type":30,"tag":89,"props":3053,"children":3054},{"style":175},[3055],{"type":35,"value":3056},"withStatus",{"type":30,"tag":89,"props":3058,"children":3059},{"style":123},[3060],{"type":35,"value":182},{"type":30,"tag":89,"props":3062,"children":3063},{"style":158},[3064],{"type":35,"value":3065},"OrderStatus",{"type":30,"tag":89,"props":3067,"children":3068},{"style":123},[3069],{"type":35,"value":339},{"type":30,"tag":89,"props":3071,"children":3072},{"style":158},[3073],{"type":35,"value":3074},"PAID",{"type":30,"tag":89,"props":3076,"children":3077},{"style":123},[3078],{"type":35,"value":3079},")\n",{"type":30,"tag":89,"props":3081,"children":3082},{"class":91,"line":1343},[3083],{"type":30,"tag":89,"props":3084,"children":3085},{"style":123},[3086],{"type":35,"value":2872},{"type":30,"tag":89,"props":3088,"children":3089},{"class":91,"line":1419},[3090],{"type":30,"tag":89,"props":3091,"children":3092},{"emptyLinePlaceholder":13},[3093],{"type":35,"value":135},{"type":30,"tag":89,"props":3095,"children":3096},{"class":91,"line":1427},[3097,3101,3105,3109,3114,3118,3122],{"type":30,"tag":89,"props":3098,"children":3099},{"style":106},[3100],{"type":35,"value":416},{"type":30,"tag":89,"props":3102,"children":3103},{"style":158},[3104],{"type":35,"value":786},{"type":30,"tag":89,"props":3106,"children":3107},{"style":123},[3108],{"type":35,"value":339},{"type":30,"tag":89,"props":3110,"children":3111},{"style":175},[3112],{"type":35,"value":3113},"findById",{"type":30,"tag":89,"props":3115,"children":3116},{"style":123},[3117],{"type":35,"value":182},{"type":30,"tag":89,"props":3119,"children":3120},{"style":158},[3121],{"type":35,"value":1837},{"type":30,"tag":89,"props":3123,"children":3124},{"style":123},[3125],{"type":35,"value":3079},{"type":30,"tag":89,"props":3127,"children":3128},{"class":91,"line":1435},[3129,3134,3139,3144,3149,3153,3158,3162,3167],{"type":30,"tag":89,"props":3130,"children":3131},{"style":123},[3132],{"type":35,"value":3133},"            .",{"type":30,"tag":89,"props":3135,"children":3136},{"style":175},[3137],{"type":35,"value":3138},"orElseThrow",{"type":30,"tag":89,"props":3140,"children":3141},{"style":123},[3142],{"type":35,"value":3143},"(()",{"type":30,"tag":89,"props":3145,"children":3146},{"style":106},[3147],{"type":35,"value":3148}," ->",{"type":30,"tag":89,"props":3150,"children":3151},{"style":106},[3152],{"type":35,"value":172},{"type":30,"tag":89,"props":3154,"children":3155},{"style":175},[3156],{"type":35,"value":3157}," IllegalStateException",{"type":30,"tag":89,"props":3159,"children":3160},{"style":123},[3161],{"type":35,"value":182},{"type":30,"tag":89,"props":3163,"children":3164},{"style":185},[3165],{"type":35,"value":3166},"\"Order not found after save\"",{"type":30,"tag":89,"props":3168,"children":3169},{"style":123},[3170],{"type":35,"value":1416},{"type":30,"tag":89,"props":3172,"children":3173},{"class":91,"line":1443},[3174],{"type":30,"tag":89,"props":3175,"children":3176},{"style":123},[3177],{"type":35,"value":434},{"type":30,"tag":89,"props":3179,"children":3180},{"class":91,"line":1452},[3181],{"type":30,"tag":89,"props":3182,"children":3183},{"style":123},[3184],{"type":35,"value":443},{"type":30,"tag":89,"props":3186,"children":3187},{"class":91,"line":1478},[3188],{"type":30,"tag":89,"props":3189,"children":3190},{"emptyLinePlaceholder":13},[3191],{"type":35,"value":135},{"type":30,"tag":89,"props":3193,"children":3194},{"class":91,"line":1517},[3195],{"type":30,"tag":89,"props":3196,"children":3197},{"style":96},[3198],{"type":35,"value":3199},"\u002F\u002F Fake en mémoire pour les tests - sans Stripe, sans base de données\n",{"type":30,"tag":89,"props":3201,"children":3202},{"class":91,"line":1574},[3203,3207,3211,3215,3219],{"type":30,"tag":89,"props":3204,"children":3205},{"style":106},[3206],{"type":35,"value":1226},{"type":30,"tag":89,"props":3208,"children":3209},{"style":117},[3210],{"type":35,"value":1652},{"type":30,"tag":89,"props":3212,"children":3213},{"style":106},[3214],{"type":35,"value":1135},{"type":30,"tag":89,"props":3216,"children":3217},{"style":117},[3218],{"type":35,"value":607},{"type":30,"tag":89,"props":3220,"children":3221},{"style":123},[3222],{"type":35,"value":126},{"type":30,"tag":89,"props":3224,"children":3225},{"class":91,"line":1612},[3226],{"type":30,"tag":89,"props":3227,"children":3228},{"emptyLinePlaceholder":13},[3229],{"type":35,"value":135},{"type":30,"tag":89,"props":3231,"children":3233},{"class":91,"line":3232},47,[3234,3238,3242,3246,3250,3254,3258,3262,3266,3271,3275,3279,3283],{"type":30,"tag":89,"props":3235,"children":3236},{"style":106},[3237],{"type":35,"value":144},{"type":30,"tag":89,"props":3239,"children":3240},{"style":106},[3241],{"type":35,"value":149},{"type":30,"tag":89,"props":3243,"children":3244},{"style":152},[3245],{"type":35,"value":1385},{"type":30,"tag":89,"props":3247,"children":3248},{"style":123},[3249],{"type":35,"value":1684},{"type":30,"tag":89,"props":3251,"children":3252},{"style":106},[3253],{"type":35,"value":696},{"type":30,"tag":89,"props":3255,"children":3256},{"style":123},[3257],{"type":35,"value":193},{"type":30,"tag":89,"props":3259,"children":3260},{"style":106},[3261],{"type":35,"value":1697},{"type":30,"tag":89,"props":3263,"children":3264},{"style":123},[3265],{"type":35,"value":1702},{"type":30,"tag":89,"props":3267,"children":3268},{"style":158},[3269],{"type":35,"value":3270}," store ",{"type":30,"tag":89,"props":3272,"children":3273},{"style":164},[3274],{"type":35,"value":167},{"type":30,"tag":89,"props":3276,"children":3277},{"style":106},[3278],{"type":35,"value":172},{"type":30,"tag":89,"props":3280,"children":3281},{"style":152},[3282],{"type":35,"value":1720},{"type":30,"tag":89,"props":3284,"children":3285},{"style":123},[3286],{"type":35,"value":1725},{"type":30,"tag":89,"props":3288,"children":3290},{"class":91,"line":3289},48,[3291],{"type":30,"tag":89,"props":3292,"children":3293},{"emptyLinePlaceholder":13},[3294],{"type":35,"value":135},{"type":30,"tag":89,"props":3296,"children":3298},{"class":91,"line":3297},49,[3299,3304],{"type":30,"tag":89,"props":3300,"children":3301},{"style":1975},[3302],{"type":35,"value":3303},"    @",{"type":30,"tag":89,"props":3305,"children":3306},{"style":1981},[3307],{"type":35,"value":3308},"Override\n",{"type":30,"tag":89,"props":3310,"children":3312},{"class":91,"line":3311},50,[3313,3317,3321,3325,3329,3333,3337,3341],{"type":30,"tag":89,"props":3314,"children":3315},{"style":106},[3316],{"type":35,"value":277},{"type":30,"tag":89,"props":3318,"children":3319},{"style":152},[3320],{"type":35,"value":282},{"type":30,"tag":89,"props":3322,"children":3323},{"style":175},[3324],{"type":35,"value":624},{"type":30,"tag":89,"props":3326,"children":3327},{"style":123},[3328],{"type":35,"value":182},{"type":30,"tag":89,"props":3330,"children":3331},{"style":152},[3332],{"type":35,"value":296},{"type":30,"tag":89,"props":3334,"children":3335},{"style":299},[3336],{"type":35,"value":302},{"type":30,"tag":89,"props":3338,"children":3339},{"style":123},[3340],{"type":35,"value":307},{"type":30,"tag":89,"props":3342,"children":3343},{"style":123},[3344],{"type":35,"value":126},{"type":30,"tag":89,"props":3346,"children":3348},{"class":91,"line":3347},51,[3349,3353,3358,3362,3366,3370,3374,3378,3382],{"type":30,"tag":89,"props":3350,"children":3351},{"style":152},[3352],{"type":35,"value":320},{"type":30,"tag":89,"props":3354,"children":3355},{"style":158},[3356],{"type":35,"value":3357}," id ",{"type":30,"tag":89,"props":3359,"children":3360},{"style":164},[3361],{"type":35,"value":167},{"type":30,"tag":89,"props":3363,"children":3364},{"style":158},[3365],{"type":35,"value":1787},{"type":30,"tag":89,"props":3367,"children":3368},{"style":123},[3369],{"type":35,"value":339},{"type":30,"tag":89,"props":3371,"children":3372},{"style":175},[3373],{"type":35,"value":1796},{"type":30,"tag":89,"props":3375,"children":3376},{"style":123},[3377],{"type":35,"value":1801},{"type":30,"tag":89,"props":3379,"children":3380},{"style":175},[3381],{"type":35,"value":1806},{"type":30,"tag":89,"props":3383,"children":3384},{"style":123},[3385],{"type":35,"value":1811},{"type":30,"tag":89,"props":3387,"children":3389},{"class":91,"line":3388},52,[3390,3395,3399,3403,3407,3412,3416,3420],{"type":30,"tag":89,"props":3391,"children":3392},{"style":158},[3393],{"type":35,"value":3394},"        store",{"type":30,"tag":89,"props":3396,"children":3397},{"style":123},[3398],{"type":35,"value":339},{"type":30,"tag":89,"props":3400,"children":3401},{"style":175},[3402],{"type":35,"value":1828},{"type":30,"tag":89,"props":3404,"children":3405},{"style":123},[3406],{"type":35,"value":182},{"type":30,"tag":89,"props":3408,"children":3409},{"style":158},[3410],{"type":35,"value":3411},"id",{"type":30,"tag":89,"props":3413,"children":3414},{"style":123},[3415],{"type":35,"value":193},{"type":30,"tag":89,"props":3417,"children":3418},{"style":158},[3419],{"type":35,"value":302},{"type":30,"tag":89,"props":3421,"children":3422},{"style":123},[3423],{"type":35,"value":358},{"type":30,"tag":89,"props":3425,"children":3427},{"class":91,"line":3426},53,[3428,3432,3437],{"type":30,"tag":89,"props":3429,"children":3430},{"style":106},[3431],{"type":35,"value":416},{"type":30,"tag":89,"props":3433,"children":3434},{"style":158},[3435],{"type":35,"value":3436}," id",{"type":30,"tag":89,"props":3438,"children":3439},{"style":123},[3440],{"type":35,"value":425},{"type":30,"tag":89,"props":3442,"children":3444},{"class":91,"line":3443},54,[3445],{"type":30,"tag":89,"props":3446,"children":3447},{"style":123},[3448],{"type":35,"value":434},{"type":30,"tag":89,"props":3450,"children":3452},{"class":91,"line":3451},55,[3453],{"type":30,"tag":89,"props":3454,"children":3455},{"emptyLinePlaceholder":13},[3456],{"type":35,"value":135},{"type":30,"tag":89,"props":3458,"children":3460},{"class":91,"line":3459},56,[3461,3465],{"type":30,"tag":89,"props":3462,"children":3463},{"style":1975},[3464],{"type":35,"value":3303},{"type":30,"tag":89,"props":3466,"children":3467},{"style":1981},[3468],{"type":35,"value":3308},{"type":30,"tag":89,"props":3470,"children":3472},{"class":91,"line":3471},57,[3473,3477,3482,3486,3490,3494,3498,3502,3506,3510,3514],{"type":30,"tag":89,"props":3474,"children":3475},{"style":106},[3476],{"type":35,"value":277},{"type":30,"tag":89,"props":3478,"children":3479},{"style":152},[3480],{"type":35,"value":3481}," Optional",{"type":30,"tag":89,"props":3483,"children":3484},{"style":123},[3485],{"type":35,"value":1684},{"type":30,"tag":89,"props":3487,"children":3488},{"style":106},[3489],{"type":35,"value":2387},{"type":30,"tag":89,"props":3491,"children":3492},{"style":123},[3493],{"type":35,"value":1702},{"type":30,"tag":89,"props":3495,"children":3496},{"style":175},[3497],{"type":35,"value":2396},{"type":30,"tag":89,"props":3499,"children":3500},{"style":123},[3501],{"type":35,"value":182},{"type":30,"tag":89,"props":3503,"children":3504},{"style":152},[3505],{"type":35,"value":696},{"type":30,"tag":89,"props":3507,"children":3508},{"style":299},[3509],{"type":35,"value":403},{"type":30,"tag":89,"props":3511,"children":3512},{"style":123},[3513],{"type":35,"value":307},{"type":30,"tag":89,"props":3515,"children":3516},{"style":123},[3517],{"type":35,"value":126},{"type":30,"tag":89,"props":3519,"children":3521},{"class":91,"line":3520},58,[3522,3526,3530,3534,3539,3543,3548,3552,3557,3561,3565],{"type":30,"tag":89,"props":3523,"children":3524},{"style":106},[3525],{"type":35,"value":416},{"type":30,"tag":89,"props":3527,"children":3528},{"style":158},[3529],{"type":35,"value":3481},{"type":30,"tag":89,"props":3531,"children":3532},{"style":123},[3533],{"type":35,"value":339},{"type":30,"tag":89,"props":3535,"children":3536},{"style":175},[3537],{"type":35,"value":3538},"ofNullable",{"type":30,"tag":89,"props":3540,"children":3541},{"style":123},[3542],{"type":35,"value":182},{"type":30,"tag":89,"props":3544,"children":3545},{"style":158},[3546],{"type":35,"value":3547},"store",{"type":30,"tag":89,"props":3549,"children":3550},{"style":123},[3551],{"type":35,"value":339},{"type":30,"tag":89,"props":3553,"children":3554},{"style":175},[3555],{"type":35,"value":3556},"get",{"type":30,"tag":89,"props":3558,"children":3559},{"style":123},[3560],{"type":35,"value":182},{"type":30,"tag":89,"props":3562,"children":3563},{"style":158},[3564],{"type":35,"value":1837},{"type":30,"tag":89,"props":3566,"children":3567},{"style":123},[3568],{"type":35,"value":3569},"))\n",{"type":30,"tag":89,"props":3571,"children":3573},{"class":91,"line":3572},59,[3574,3578,3583,3587,3592,3597,3601,3605,3609,3613,3617,3622,3626,3631],{"type":30,"tag":89,"props":3575,"children":3576},{"style":123},[3577],{"type":35,"value":3133},{"type":30,"tag":89,"props":3579,"children":3580},{"style":175},[3581],{"type":35,"value":3582},"map",{"type":30,"tag":89,"props":3584,"children":3585},{"style":123},[3586],{"type":35,"value":182},{"type":30,"tag":89,"props":3588,"children":3589},{"style":158},[3590],{"type":35,"value":3591},"data ",{"type":30,"tag":89,"props":3593,"children":3594},{"style":106},[3595],{"type":35,"value":3596},"->",{"type":30,"tag":89,"props":3598,"children":3599},{"style":106},[3600],{"type":35,"value":172},{"type":30,"tag":89,"props":3602,"children":3603},{"style":175},[3604],{"type":35,"value":2741},{"type":30,"tag":89,"props":3606,"children":3607},{"style":123},[3608],{"type":35,"value":182},{"type":30,"tag":89,"props":3610,"children":3611},{"style":158},[3612],{"type":35,"value":1837},{"type":30,"tag":89,"props":3614,"children":3615},{"style":123},[3616],{"type":35,"value":193},{"type":30,"tag":89,"props":3618,"children":3619},{"style":158},[3620],{"type":35,"value":3621}," data",{"type":30,"tag":89,"props":3623,"children":3624},{"style":123},[3625],{"type":35,"value":339},{"type":30,"tag":89,"props":3627,"children":3628},{"style":175},[3629],{"type":35,"value":3630},"getStatus",{"type":30,"tag":89,"props":3632,"children":3633},{"style":123},[3634],{"type":35,"value":3635},"()));\n",{"type":30,"tag":89,"props":3637,"children":3639},{"class":91,"line":3638},60,[3640],{"type":30,"tag":89,"props":3641,"children":3642},{"style":123},[3643],{"type":35,"value":434},{"type":30,"tag":89,"props":3645,"children":3647},{"class":91,"line":3646},61,[3648],{"type":30,"tag":89,"props":3649,"children":3650},{"style":123},[3651],{"type":35,"value":443},{"type":30,"tag":89,"props":3653,"children":3655},{"class":91,"line":3654},62,[3656],{"type":30,"tag":89,"props":3657,"children":3658},{"emptyLinePlaceholder":13},[3659],{"type":35,"value":135},{"type":30,"tag":89,"props":3661,"children":3663},{"class":91,"line":3662},63,[3664,3668,3673,3677,3681],{"type":30,"tag":89,"props":3665,"children":3666},{"style":106},[3667],{"type":35,"value":1226},{"type":30,"tag":89,"props":3669,"children":3670},{"style":117},[3671],{"type":35,"value":3672}," StubPaymentGateway",{"type":30,"tag":89,"props":3674,"children":3675},{"style":106},[3676],{"type":35,"value":1135},{"type":30,"tag":89,"props":3678,"children":3679},{"style":117},[3680],{"type":35,"value":2442},{"type":30,"tag":89,"props":3682,"children":3683},{"style":123},[3684],{"type":35,"value":126},{"type":30,"tag":89,"props":3686,"children":3688},{"class":91,"line":3687},64,[3689],{"type":30,"tag":89,"props":3690,"children":3691},{"emptyLinePlaceholder":13},[3692],{"type":35,"value":135},{"type":30,"tag":89,"props":3694,"children":3696},{"class":91,"line":3695},65,[3697,3701,3705,3709,3714],{"type":30,"tag":89,"props":3698,"children":3699},{"style":106},[3700],{"type":35,"value":144},{"type":30,"tag":89,"props":3702,"children":3703},{"style":106},[3704],{"type":35,"value":149},{"type":30,"tag":89,"props":3706,"children":3707},{"style":106},[3708],{"type":35,"value":1890},{"type":30,"tag":89,"props":3710,"children":3711},{"style":158},[3712],{"type":35,"value":3713}," shouldSucceed",{"type":30,"tag":89,"props":3715,"children":3716},{"style":123},[3717],{"type":35,"value":425},{"type":30,"tag":89,"props":3719,"children":3721},{"class":91,"line":3720},66,[3722],{"type":30,"tag":89,"props":3723,"children":3724},{"emptyLinePlaceholder":13},[3725],{"type":35,"value":135},{"type":30,"tag":89,"props":3727,"children":3729},{"class":91,"line":3728},67,[3730,3735,3739,3744,3748,3752],{"type":30,"tag":89,"props":3731,"children":3732},{"style":175},[3733],{"type":35,"value":3734},"    StubPaymentGateway",{"type":30,"tag":89,"props":3736,"children":3737},{"style":123},[3738],{"type":35,"value":182},{"type":30,"tag":89,"props":3740,"children":3741},{"style":106},[3742],{"type":35,"value":3743},"boolean",{"type":30,"tag":89,"props":3745,"children":3746},{"style":299},[3747],{"type":35,"value":3713},{"type":30,"tag":89,"props":3749,"children":3750},{"style":123},[3751],{"type":35,"value":307},{"type":30,"tag":89,"props":3753,"children":3754},{"style":123},[3755],{"type":35,"value":126},{"type":30,"tag":89,"props":3757,"children":3759},{"class":91,"line":3758},68,[3760,3764,3768,3773,3777,3781],{"type":30,"tag":89,"props":3761,"children":3762},{"style":874},[3763],{"type":35,"value":877},{"type":30,"tag":89,"props":3765,"children":3766},{"style":123},[3767],{"type":35,"value":339},{"type":30,"tag":89,"props":3769,"children":3770},{"style":158},[3771],{"type":35,"value":3772},"shouldSucceed ",{"type":30,"tag":89,"props":3774,"children":3775},{"style":164},[3776],{"type":35,"value":167},{"type":30,"tag":89,"props":3778,"children":3779},{"style":158},[3780],{"type":35,"value":3713},{"type":30,"tag":89,"props":3782,"children":3783},{"style":123},[3784],{"type":35,"value":425},{"type":30,"tag":89,"props":3786,"children":3788},{"class":91,"line":3787},69,[3789],{"type":30,"tag":89,"props":3790,"children":3791},{"style":123},[3792],{"type":35,"value":434},{"type":30,"tag":89,"props":3794,"children":3796},{"class":91,"line":3795},70,[3797],{"type":30,"tag":89,"props":3798,"children":3799},{"emptyLinePlaceholder":13},[3800],{"type":35,"value":135},{"type":30,"tag":89,"props":3802,"children":3804},{"class":91,"line":3803},71,[3805,3809],{"type":30,"tag":89,"props":3806,"children":3807},{"style":1975},[3808],{"type":35,"value":3303},{"type":30,"tag":89,"props":3810,"children":3811},{"style":1981},[3812],{"type":35,"value":3308},{"type":30,"tag":89,"props":3814,"children":3816},{"class":91,"line":3815},72,[3817,3821,3826,3830,3834,3838,3842,3846,3850,3854,3858,3862,3866,3870],{"type":30,"tag":89,"props":3818,"children":3819},{"style":106},[3820],{"type":35,"value":277},{"type":30,"tag":89,"props":3822,"children":3823},{"style":152},[3824],{"type":35,"value":3825}," PaymentResult",{"type":30,"tag":89,"props":3827,"children":3828},{"style":175},[3829],{"type":35,"value":2459},{"type":30,"tag":89,"props":3831,"children":3832},{"style":123},[3833],{"type":35,"value":182},{"type":30,"tag":89,"props":3835,"children":3836},{"style":152},[3837],{"type":35,"value":2468},{"type":30,"tag":89,"props":3839,"children":3840},{"style":299},[3841],{"type":35,"value":2473},{"type":30,"tag":89,"props":3843,"children":3844},{"style":123},[3845],{"type":35,"value":193},{"type":30,"tag":89,"props":3847,"children":3848},{"style":152},[3849],{"type":35,"value":282},{"type":30,"tag":89,"props":3851,"children":3852},{"style":299},[3853],{"type":35,"value":2486},{"type":30,"tag":89,"props":3855,"children":3856},{"style":123},[3857],{"type":35,"value":193},{"type":30,"tag":89,"props":3859,"children":3860},{"style":152},[3861],{"type":35,"value":282},{"type":30,"tag":89,"props":3863,"children":3864},{"style":299},[3865],{"type":35,"value":2499},{"type":30,"tag":89,"props":3867,"children":3868},{"style":123},[3869],{"type":35,"value":307},{"type":30,"tag":89,"props":3871,"children":3872},{"style":123},[3873],{"type":35,"value":126},{"type":30,"tag":89,"props":3875,"children":3877},{"class":91,"line":3876},73,[3878,3882],{"type":30,"tag":89,"props":3879,"children":3880},{"style":106},[3881],{"type":35,"value":416},{"type":30,"tag":89,"props":3883,"children":3884},{"style":158},[3885],{"type":35,"value":3886}," shouldSucceed\n",{"type":30,"tag":89,"props":3888,"children":3890},{"class":91,"line":3889},74,[3891,3896,3900,3904,3909,3913,3918],{"type":30,"tag":89,"props":3892,"children":3893},{"style":106},[3894],{"type":35,"value":3895},"            ?",{"type":30,"tag":89,"props":3897,"children":3898},{"style":158},[3899],{"type":35,"value":3825},{"type":30,"tag":89,"props":3901,"children":3902},{"style":123},[3903],{"type":35,"value":339},{"type":30,"tag":89,"props":3905,"children":3906},{"style":175},[3907],{"type":35,"value":3908},"success",{"type":30,"tag":89,"props":3910,"children":3911},{"style":123},[3912],{"type":35,"value":182},{"type":30,"tag":89,"props":3914,"children":3915},{"style":185},[3916],{"type":35,"value":3917},"\"txn-456\"",{"type":30,"tag":89,"props":3919,"children":3920},{"style":123},[3921],{"type":35,"value":3079},{"type":30,"tag":89,"props":3923,"children":3925},{"class":91,"line":3924},75,[3926,3931,3935,3939,3944,3948,3953],{"type":30,"tag":89,"props":3927,"children":3928},{"style":106},[3929],{"type":35,"value":3930},"            :",{"type":30,"tag":89,"props":3932,"children":3933},{"style":158},[3934],{"type":35,"value":3825},{"type":30,"tag":89,"props":3936,"children":3937},{"style":123},[3938],{"type":35,"value":339},{"type":30,"tag":89,"props":3940,"children":3941},{"style":175},[3942],{"type":35,"value":3943},"failure",{"type":30,"tag":89,"props":3945,"children":3946},{"style":123},[3947],{"type":35,"value":182},{"type":30,"tag":89,"props":3949,"children":3950},{"style":185},[3951],{"type":35,"value":3952},"\"CARD_DECLINED\"",{"type":30,"tag":89,"props":3954,"children":3955},{"style":123},[3956],{"type":35,"value":358},{"type":30,"tag":89,"props":3958,"children":3960},{"class":91,"line":3959},76,[3961],{"type":30,"tag":89,"props":3962,"children":3963},{"style":123},[3964],{"type":35,"value":434},{"type":30,"tag":89,"props":3966,"children":3968},{"class":91,"line":3967},77,[3969],{"type":30,"tag":89,"props":3970,"children":3971},{"style":123},[3972],{"type":35,"value":443},{"type":30,"tag":89,"props":3974,"children":3976},{"class":91,"line":3975},78,[3977],{"type":30,"tag":89,"props":3978,"children":3979},{"emptyLinePlaceholder":13},[3980],{"type":35,"value":135},{"type":30,"tag":89,"props":3982,"children":3984},{"class":91,"line":3983},79,[3985],{"type":30,"tag":89,"props":3986,"children":3987},{"style":96},[3988],{"type":35,"value":3989},"\u002F\u002F Test JUnit 5 - s'exécute en millisecondes, sans infra\n",{"type":30,"tag":89,"props":3991,"children":3993},{"class":91,"line":3992},80,[3994,3998,4003],{"type":30,"tag":89,"props":3995,"children":3996},{"style":106},[3997],{"type":35,"value":1226},{"type":30,"tag":89,"props":3999,"children":4000},{"style":117},[4001],{"type":35,"value":4002}," OrderServiceTest",{"type":30,"tag":89,"props":4004,"children":4005},{"style":123},[4006],{"type":35,"value":126},{"type":30,"tag":89,"props":4008,"children":4010},{"class":91,"line":4009},81,[4011],{"type":30,"tag":89,"props":4012,"children":4013},{"emptyLinePlaceholder":13},[4014],{"type":35,"value":135},{"type":30,"tag":89,"props":4016,"children":4018},{"class":91,"line":4017},82,[4019,4023],{"type":30,"tag":89,"props":4020,"children":4021},{"style":1975},[4022],{"type":35,"value":3303},{"type":30,"tag":89,"props":4024,"children":4025},{"style":1981},[4026],{"type":35,"value":1984},{"type":30,"tag":89,"props":4028,"children":4030},{"class":91,"line":4029},83,[4031,4035,4040,4044],{"type":30,"tag":89,"props":4032,"children":4033},{"style":106},[4034],{"type":35,"value":682},{"type":30,"tag":89,"props":4036,"children":4037},{"style":175},[4038],{"type":35,"value":4039}," shouldCreateOrderWithSuccessfulPayment",{"type":30,"tag":89,"props":4041,"children":4042},{"style":123},[4043],{"type":35,"value":1471},{"type":30,"tag":89,"props":4045,"children":4046},{"style":123},[4047],{"type":35,"value":126},{"type":30,"tag":89,"props":4049,"children":4051},{"class":91,"line":4050},84,[4052,4057,4061,4065,4069,4073],{"type":30,"tag":89,"props":4053,"children":4054},{"style":152},[4055],{"type":35,"value":4056},"        OrderRepository",{"type":30,"tag":89,"props":4058,"children":4059},{"style":158},[4060],{"type":35,"value":1489},{"type":30,"tag":89,"props":4062,"children":4063},{"style":164},[4064],{"type":35,"value":167},{"type":30,"tag":89,"props":4066,"children":4067},{"style":106},[4068],{"type":35,"value":172},{"type":30,"tag":89,"props":4070,"children":4071},{"style":175},[4072],{"type":35,"value":1652},{"type":30,"tag":89,"props":4074,"children":4075},{"style":123},[4076],{"type":35,"value":1811},{"type":30,"tag":89,"props":4078,"children":4080},{"class":91,"line":4079},85,[4081,4086,4091,4095,4099,4103,4107,4112],{"type":30,"tag":89,"props":4082,"children":4083},{"style":152},[4084],{"type":35,"value":4085},"        PaymentGateway",{"type":30,"tag":89,"props":4087,"children":4088},{"style":158},[4089],{"type":35,"value":4090}," payment ",{"type":30,"tag":89,"props":4092,"children":4093},{"style":164},[4094],{"type":35,"value":167},{"type":30,"tag":89,"props":4096,"children":4097},{"style":106},[4098],{"type":35,"value":172},{"type":30,"tag":89,"props":4100,"children":4101},{"style":175},[4102],{"type":35,"value":3672},{"type":30,"tag":89,"props":4104,"children":4105},{"style":123},[4106],{"type":35,"value":182},{"type":30,"tag":89,"props":4108,"children":4109},{"style":874},[4110],{"type":35,"value":4111},"true",{"type":30,"tag":89,"props":4113,"children":4114},{"style":123},[4115],{"type":35,"value":358},{"type":30,"tag":89,"props":4117,"children":4119},{"class":91,"line":4118},86,[4120,4125,4129,4133,4137,4141,4145,4149,4153,4157],{"type":30,"tag":89,"props":4121,"children":4122},{"style":152},[4123],{"type":35,"value":4124},"        OrderService",{"type":30,"tag":89,"props":4126,"children":4127},{"style":158},[4128],{"type":35,"value":2075},{"type":30,"tag":89,"props":4130,"children":4131},{"style":164},[4132],{"type":35,"value":167},{"type":30,"tag":89,"props":4134,"children":4135},{"style":106},[4136],{"type":35,"value":172},{"type":30,"tag":89,"props":4138,"children":4139},{"style":175},[4140],{"type":35,"value":120},{"type":30,"tag":89,"props":4142,"children":4143},{"style":123},[4144],{"type":35,"value":182},{"type":30,"tag":89,"props":4146,"children":4147},{"style":158},[4148],{"type":35,"value":1597},{"type":30,"tag":89,"props":4150,"children":4151},{"style":123},[4152],{"type":35,"value":193},{"type":30,"tag":89,"props":4154,"children":4155},{"style":158},[4156],{"type":35,"value":2606},{"type":30,"tag":89,"props":4158,"children":4159},{"style":123},[4160],{"type":35,"value":358},{"type":30,"tag":89,"props":4162,"children":4164},{"class":91,"line":4163},87,[4165],{"type":30,"tag":89,"props":4166,"children":4167},{"emptyLinePlaceholder":13},[4168],{"type":35,"value":135},{"type":30,"tag":89,"props":4170,"children":4172},{"class":91,"line":4171},88,[4173,4178,4183,4187,4191,4195,4200],{"type":30,"tag":89,"props":4174,"children":4175},{"style":152},[4176],{"type":35,"value":4177},"        Order",{"type":30,"tag":89,"props":4179,"children":4180},{"style":158},[4181],{"type":35,"value":4182}," order ",{"type":30,"tag":89,"props":4184,"children":4185},{"style":164},[4186],{"type":35,"value":167},{"type":30,"tag":89,"props":4188,"children":4189},{"style":158},[4190],{"type":35,"value":2134},{"type":30,"tag":89,"props":4192,"children":4193},{"style":123},[4194],{"type":35,"value":339},{"type":30,"tag":89,"props":4196,"children":4197},{"style":175},[4198],{"type":35,"value":4199},"createPaidOrder",{"type":30,"tag":89,"props":4201,"children":4202},{"style":123},[4203],{"type":35,"value":2801},{"type":30,"tag":89,"props":4205,"children":4207},{"class":91,"line":4206},89,[4208,4213,4217,4221,4225,4230,4234,4239,4244,4249,4253,4258],{"type":30,"tag":89,"props":4209,"children":4210},{"style":106},[4211],{"type":35,"value":4212},"            new",{"type":30,"tag":89,"props":4214,"children":4215},{"style":175},[4216],{"type":35,"value":1697},{"type":30,"tag":89,"props":4218,"children":4219},{"style":123},[4220],{"type":35,"value":182},{"type":30,"tag":89,"props":4222,"children":4223},{"style":106},[4224],{"type":35,"value":2152},{"type":30,"tag":89,"props":4226,"children":4227},{"style":175},[4228],{"type":35,"value":4229}," BigDecimal",{"type":30,"tag":89,"props":4231,"children":4232},{"style":123},[4233],{"type":35,"value":182},{"type":30,"tag":89,"props":4235,"children":4236},{"style":185},[4237],{"type":35,"value":4238},"\"1000\"",{"type":30,"tag":89,"props":4240,"children":4241},{"style":123},[4242],{"type":35,"value":4243},"),",{"type":30,"tag":89,"props":4245,"children":4246},{"style":185},[4247],{"type":35,"value":4248}," \"EUR\"",{"type":30,"tag":89,"props":4250,"children":4251},{"style":123},[4252],{"type":35,"value":193},{"type":30,"tag":89,"props":4254,"children":4255},{"style":185},[4256],{"type":35,"value":4257}," \"pm-123\"",{"type":30,"tag":89,"props":4259,"children":4260},{"style":123},[4261],{"type":35,"value":3079},{"type":30,"tag":89,"props":4263,"children":4265},{"class":91,"line":4264},90,[4266],{"type":30,"tag":89,"props":4267,"children":4268},{"style":123},[4269],{"type":35,"value":2872},{"type":30,"tag":89,"props":4271,"children":4273},{"class":91,"line":4272},91,[4274],{"type":30,"tag":89,"props":4275,"children":4276},{"emptyLinePlaceholder":13},[4277],{"type":35,"value":135},{"type":30,"tag":89,"props":4279,"children":4281},{"class":91,"line":4280},92,[4282,4287,4291,4295,4299,4303,4307,4312,4316,4320],{"type":30,"tag":89,"props":4283,"children":4284},{"style":175},[4285],{"type":35,"value":4286},"        assertEquals",{"type":30,"tag":89,"props":4288,"children":4289},{"style":123},[4290],{"type":35,"value":182},{"type":30,"tag":89,"props":4292,"children":4293},{"style":158},[4294],{"type":35,"value":3065},{"type":30,"tag":89,"props":4296,"children":4297},{"style":123},[4298],{"type":35,"value":339},{"type":30,"tag":89,"props":4300,"children":4301},{"style":158},[4302],{"type":35,"value":3074},{"type":30,"tag":89,"props":4304,"children":4305},{"style":123},[4306],{"type":35,"value":193},{"type":30,"tag":89,"props":4308,"children":4309},{"style":158},[4310],{"type":35,"value":4311}," order",{"type":30,"tag":89,"props":4313,"children":4314},{"style":123},[4315],{"type":35,"value":339},{"type":30,"tag":89,"props":4317,"children":4318},{"style":175},[4319],{"type":35,"value":3630},{"type":30,"tag":89,"props":4321,"children":4322},{"style":123},[4323],{"type":35,"value":2959},{"type":30,"tag":89,"props":4325,"children":4327},{"class":91,"line":4326},93,[4328],{"type":30,"tag":89,"props":4329,"children":4330},{"style":123},[4331],{"type":35,"value":434},{"type":30,"tag":89,"props":4333,"children":4335},{"class":91,"line":4334},94,[4336],{"type":30,"tag":89,"props":4337,"children":4338},{"emptyLinePlaceholder":13},[4339],{"type":35,"value":135},{"type":30,"tag":89,"props":4341,"children":4343},{"class":91,"line":4342},95,[4344,4348],{"type":30,"tag":89,"props":4345,"children":4346},{"style":1975},[4347],{"type":35,"value":3303},{"type":30,"tag":89,"props":4349,"children":4350},{"style":1981},[4351],{"type":35,"value":1984},{"type":30,"tag":89,"props":4353,"children":4355},{"class":91,"line":4354},96,[4356,4360,4365,4369],{"type":30,"tag":89,"props":4357,"children":4358},{"style":106},[4359],{"type":35,"value":682},{"type":30,"tag":89,"props":4361,"children":4362},{"style":175},[4363],{"type":35,"value":4364}," shouldThrowWhenPaymentFails",{"type":30,"tag":89,"props":4366,"children":4367},{"style":123},[4368],{"type":35,"value":1471},{"type":30,"tag":89,"props":4370,"children":4371},{"style":123},[4372],{"type":35,"value":126},{"type":30,"tag":89,"props":4374,"children":4376},{"class":91,"line":4375},97,[4377,4381,4385,4389,4393,4397],{"type":30,"tag":89,"props":4378,"children":4379},{"style":152},[4380],{"type":35,"value":4124},{"type":30,"tag":89,"props":4382,"children":4383},{"style":158},[4384],{"type":35,"value":2075},{"type":30,"tag":89,"props":4386,"children":4387},{"style":164},[4388],{"type":35,"value":167},{"type":30,"tag":89,"props":4390,"children":4391},{"style":106},[4392],{"type":35,"value":172},{"type":30,"tag":89,"props":4394,"children":4395},{"style":175},[4396],{"type":35,"value":120},{"type":30,"tag":89,"props":4398,"children":4399},{"style":123},[4400],{"type":35,"value":2801},{"type":30,"tag":89,"props":4402,"children":4404},{"class":91,"line":4403},98,[4405,4409,4413],{"type":30,"tag":89,"props":4406,"children":4407},{"style":106},[4408],{"type":35,"value":4212},{"type":30,"tag":89,"props":4410,"children":4411},{"style":175},[4412],{"type":35,"value":1652},{"type":30,"tag":89,"props":4414,"children":4415},{"style":123},[4416],{"type":35,"value":2823},{"type":30,"tag":89,"props":4418,"children":4420},{"class":91,"line":4419},99,[4421,4425,4429,4433,4438],{"type":30,"tag":89,"props":4422,"children":4423},{"style":106},[4424],{"type":35,"value":4212},{"type":30,"tag":89,"props":4426,"children":4427},{"style":175},[4428],{"type":35,"value":3672},{"type":30,"tag":89,"props":4430,"children":4431},{"style":123},[4432],{"type":35,"value":182},{"type":30,"tag":89,"props":4434,"children":4435},{"style":874},[4436],{"type":35,"value":4437},"false",{"type":30,"tag":89,"props":4439,"children":4440},{"style":123},[4441],{"type":35,"value":3079},{"type":30,"tag":89,"props":4443,"children":4445},{"class":91,"line":4444},100,[4446],{"type":30,"tag":89,"props":4447,"children":4448},{"style":123},[4449],{"type":35,"value":2872},{"type":30,"tag":89,"props":4451,"children":4453},{"class":91,"line":4452},101,[4454],{"type":30,"tag":89,"props":4455,"children":4456},{"emptyLinePlaceholder":13},[4457],{"type":35,"value":135},{"type":30,"tag":89,"props":4459,"children":4461},{"class":91,"line":4460},102,[4462,4467,4471,4476,4480,4484,4488,4493],{"type":30,"tag":89,"props":4463,"children":4464},{"style":175},[4465],{"type":35,"value":4466},"        assertThrows",{"type":30,"tag":89,"props":4468,"children":4469},{"style":123},[4470],{"type":35,"value":182},{"type":30,"tag":89,"props":4472,"children":4473},{"style":158},[4474],{"type":35,"value":4475},"PaymentFailedException",{"type":30,"tag":89,"props":4477,"children":4478},{"style":123},[4479],{"type":35,"value":339},{"type":30,"tag":89,"props":4481,"children":4482},{"style":158},[4483],{"type":35,"value":1226},{"type":30,"tag":89,"props":4485,"children":4486},{"style":123},[4487],{"type":35,"value":193},{"type":30,"tag":89,"props":4489,"children":4490},{"style":123},[4491],{"type":35,"value":4492}," ()",{"type":30,"tag":89,"props":4494,"children":4495},{"style":106},[4496],{"type":35,"value":4497}," ->\n",{"type":30,"tag":89,"props":4499,"children":4501},{"class":91,"line":4500},103,[4502,4507,4511,4515,4519,4523,4527,4531,4535,4539,4543,4547,4551,4555,4559,4563],{"type":30,"tag":89,"props":4503,"children":4504},{"style":158},[4505],{"type":35,"value":4506},"            service",{"type":30,"tag":89,"props":4508,"children":4509},{"style":123},[4510],{"type":35,"value":339},{"type":30,"tag":89,"props":4512,"children":4513},{"style":175},[4514],{"type":35,"value":4199},{"type":30,"tag":89,"props":4516,"children":4517},{"style":123},[4518],{"type":35,"value":182},{"type":30,"tag":89,"props":4520,"children":4521},{"style":106},[4522],{"type":35,"value":2152},{"type":30,"tag":89,"props":4524,"children":4525},{"style":175},[4526],{"type":35,"value":1697},{"type":30,"tag":89,"props":4528,"children":4529},{"style":123},[4530],{"type":35,"value":182},{"type":30,"tag":89,"props":4532,"children":4533},{"style":106},[4534],{"type":35,"value":2152},{"type":30,"tag":89,"props":4536,"children":4537},{"style":175},[4538],{"type":35,"value":4229},{"type":30,"tag":89,"props":4540,"children":4541},{"style":123},[4542],{"type":35,"value":182},{"type":30,"tag":89,"props":4544,"children":4545},{"style":185},[4546],{"type":35,"value":4238},{"type":30,"tag":89,"props":4548,"children":4549},{"style":123},[4550],{"type":35,"value":4243},{"type":30,"tag":89,"props":4552,"children":4553},{"style":185},[4554],{"type":35,"value":4248},{"type":30,"tag":89,"props":4556,"children":4557},{"style":123},[4558],{"type":35,"value":193},{"type":30,"tag":89,"props":4560,"children":4561},{"style":185},[4562],{"type":35,"value":4257},{"type":30,"tag":89,"props":4564,"children":4565},{"style":123},[4566],{"type":35,"value":3569},{"type":30,"tag":89,"props":4568,"children":4570},{"class":91,"line":4569},104,[4571],{"type":30,"tag":89,"props":4572,"children":4573},{"style":123},[4574],{"type":35,"value":2872},{"type":30,"tag":89,"props":4576,"children":4578},{"class":91,"line":4577},105,[4579],{"type":30,"tag":89,"props":4580,"children":4581},{"style":123},[4582],{"type":35,"value":434},{"type":30,"tag":89,"props":4584,"children":4586},{"class":91,"line":4585},106,[4587],{"type":30,"tag":89,"props":4588,"children":4589},{"style":123},[4590],{"type":35,"value":443},{"type":30,"tag":31,"props":4592,"children":4593},{},[4594,4599,4601,4607,4609,4615,4616,4622],{"type":30,"tag":448,"props":4595,"children":4596},{},[4597],{"type":35,"value":4598},"L'avantage Java\u002FSpring :",{"type":35,"value":4600}," les interfaces sont des contrats vérifiés à la compilation. Si un adapter ne respecte pas le port, ",{"type":30,"tag":85,"props":4602,"children":4604},{"className":4603},[],[4605],{"type":35,"value":4606},"javac",{"type":35,"value":4608}," rejette le code avant l'exécution. Spring injecte automatiquement l'adapter correct (",{"type":30,"tag":85,"props":4610,"children":4612},{"className":4611},[],[4613],{"type":35,"value":4614},"@Repository",{"type":35,"value":545},{"type":30,"tag":85,"props":4617,"children":4619},{"className":4618},[],[4620],{"type":35,"value":4621},"@Component",{"type":35,"value":4623},") en production : le service métier ne sait pas quelle implémentation tourne.",{"type":30,"tag":48,"props":4625,"children":4626},{},[],{"type":30,"tag":52,"props":4628,"children":4630},{"id":4629},"exemple-3-java-le-dip-avec-spring",[4631],{"type":35,"value":4632},"Exemple 3 : Java, le DIP avec Spring",{"type":30,"tag":78,"props":4634,"children":4636},{"code":4635,"language":81,"meta":8,"className":82,"style":8},"\u002F\u002F L'abstraction\npublic interface NotificationService {\n    void sendOrderConfirmation(String userId, String orderId);\n    void sendShippingUpdate(String userId, String orderId, String trackingCode);\n}\n\n\u002F\u002F Le module de haut niveau (service métier)\n@Service\npublic class OrderFulfillmentService {\n\n    private final OrderRepository orderRepository;\n    private final NotificationService notificationService;\n\n    public OrderFulfillmentService(\n            OrderRepository orderRepository,\n            NotificationService notificationService) {\n        this.orderRepository = orderRepository;\n        this.notificationService = notificationService;\n    }\n\n    public void fulfillOrder(String orderId) {\n        Order order = orderRepository.findById(orderId)\n            .orElseThrow(() -> new OrderNotFoundException(orderId));\n\n        order.setStatus(OrderStatus.FULFILLING);\n        orderRepository.save(order);\n\n        notificationService.sendOrderConfirmation(order.getUserId(), orderId);\n    }\n}\n\n\u002F\u002F Implémentation de test\n@Service\n@Profile(\"test\")\npublic class MockNotificationService implements NotificationService {\n\n    private final List\u003CString> sentNotifications = new ArrayList\u003C>();\n\n    @Override\n    public void sendOrderConfirmation(String userId, String orderId) {\n        sentNotifications.add(\"confirmation:\" + userId + \":\" + orderId);\n    }\n}\n",[4637],{"type":30,"tag":85,"props":4638,"children":4639},{"__ignoreMap":8},[4640,4648,4668,4709,4762,4769,4776,4784,4795,4815,4822,4846,4870,4877,4892,4909,4929,4957,4985,4992,4999,5035,5074,5114,5121,5159,5188,5195,5241,5248,5255,5262,5270,5281,5306,5334,5341,5391,5398,5409,5456,5514,5521],{"type":30,"tag":89,"props":4641,"children":4642},{"class":91,"line":92},[4643],{"type":30,"tag":89,"props":4644,"children":4645},{"style":96},[4646],{"type":35,"value":4647},"\u002F\u002F L'abstraction\n",{"type":30,"tag":89,"props":4649,"children":4650},{"class":91,"line":102},[4651,4655,4659,4664],{"type":30,"tag":89,"props":4652,"children":4653},{"style":106},[4654],{"type":35,"value":109},{"type":30,"tag":89,"props":4656,"children":4657},{"style":106},[4658],{"type":35,"value":602},{"type":30,"tag":89,"props":4660,"children":4661},{"style":117},[4662],{"type":35,"value":4663}," NotificationService",{"type":30,"tag":89,"props":4665,"children":4666},{"style":123},[4667],{"type":35,"value":126},{"type":30,"tag":89,"props":4669,"children":4670},{"class":91,"line":129},[4671,4675,4680,4684,4688,4693,4697,4701,4705],{"type":30,"tag":89,"props":4672,"children":4673},{"style":106},[4674],{"type":35,"value":682},{"type":30,"tag":89,"props":4676,"children":4677},{"style":175},[4678],{"type":35,"value":4679}," sendOrderConfirmation",{"type":30,"tag":89,"props":4681,"children":4682},{"style":123},[4683],{"type":35,"value":182},{"type":30,"tag":89,"props":4685,"children":4686},{"style":152},[4687],{"type":35,"value":696},{"type":30,"tag":89,"props":4689,"children":4690},{"style":299},[4691],{"type":35,"value":4692}," userId",{"type":30,"tag":89,"props":4694,"children":4695},{"style":123},[4696],{"type":35,"value":193},{"type":30,"tag":89,"props":4698,"children":4699},{"style":152},[4700],{"type":35,"value":282},{"type":30,"tag":89,"props":4702,"children":4703},{"style":299},[4704],{"type":35,"value":403},{"type":30,"tag":89,"props":4706,"children":4707},{"style":123},[4708],{"type":35,"value":358},{"type":30,"tag":89,"props":4710,"children":4711},{"class":91,"line":138},[4712,4716,4721,4725,4729,4733,4737,4741,4745,4749,4753,4758],{"type":30,"tag":89,"props":4713,"children":4714},{"style":106},[4715],{"type":35,"value":682},{"type":30,"tag":89,"props":4717,"children":4718},{"style":175},[4719],{"type":35,"value":4720}," sendShippingUpdate",{"type":30,"tag":89,"props":4722,"children":4723},{"style":123},[4724],{"type":35,"value":182},{"type":30,"tag":89,"props":4726,"children":4727},{"style":152},[4728],{"type":35,"value":696},{"type":30,"tag":89,"props":4730,"children":4731},{"style":299},[4732],{"type":35,"value":4692},{"type":30,"tag":89,"props":4734,"children":4735},{"style":123},[4736],{"type":35,"value":193},{"type":30,"tag":89,"props":4738,"children":4739},{"style":152},[4740],{"type":35,"value":282},{"type":30,"tag":89,"props":4742,"children":4743},{"style":299},[4744],{"type":35,"value":403},{"type":30,"tag":89,"props":4746,"children":4747},{"style":123},[4748],{"type":35,"value":193},{"type":30,"tag":89,"props":4750,"children":4751},{"style":152},[4752],{"type":35,"value":282},{"type":30,"tag":89,"props":4754,"children":4755},{"style":299},[4756],{"type":35,"value":4757}," trackingCode",{"type":30,"tag":89,"props":4759,"children":4760},{"style":123},[4761],{"type":35,"value":358},{"type":30,"tag":89,"props":4763,"children":4764},{"class":91,"line":212},[4765],{"type":30,"tag":89,"props":4766,"children":4767},{"style":123},[4768],{"type":35,"value":443},{"type":30,"tag":89,"props":4770,"children":4771},{"class":91,"line":263},[4772],{"type":30,"tag":89,"props":4773,"children":4774},{"emptyLinePlaceholder":13},[4775],{"type":35,"value":135},{"type":30,"tag":89,"props":4777,"children":4778},{"class":91,"line":271},[4779],{"type":30,"tag":89,"props":4780,"children":4781},{"style":96},[4782],{"type":35,"value":4783},"\u002F\u002F Le module de haut niveau (service métier)\n",{"type":30,"tag":89,"props":4785,"children":4786},{"class":91,"line":314},[4787,4791],{"type":30,"tag":89,"props":4788,"children":4789},{"style":1975},[4790],{"type":35,"value":1978},{"type":30,"tag":89,"props":4792,"children":4793},{"style":1981},[4794],{"type":35,"value":2537},{"type":30,"tag":89,"props":4796,"children":4797},{"class":91,"line":361},[4798,4802,4806,4811],{"type":30,"tag":89,"props":4799,"children":4800},{"style":106},[4801],{"type":35,"value":109},{"type":30,"tag":89,"props":4803,"children":4804},{"style":106},[4805],{"type":35,"value":114},{"type":30,"tag":89,"props":4807,"children":4808},{"style":117},[4809],{"type":35,"value":4810}," OrderFulfillmentService",{"type":30,"tag":89,"props":4812,"children":4813},{"style":123},[4814],{"type":35,"value":126},{"type":30,"tag":89,"props":4816,"children":4817},{"class":91,"line":410},[4818],{"type":30,"tag":89,"props":4819,"children":4820},{"emptyLinePlaceholder":13},[4821],{"type":35,"value":135},{"type":30,"tag":89,"props":4823,"children":4824},{"class":91,"line":428},[4825,4829,4833,4837,4842],{"type":30,"tag":89,"props":4826,"children":4827},{"style":106},[4828],{"type":35,"value":144},{"type":30,"tag":89,"props":4830,"children":4831},{"style":106},[4832],{"type":35,"value":149},{"type":30,"tag":89,"props":4834,"children":4835},{"style":152},[4836],{"type":35,"value":607},{"type":30,"tag":89,"props":4838,"children":4839},{"style":158},[4840],{"type":35,"value":4841}," orderRepository",{"type":30,"tag":89,"props":4843,"children":4844},{"style":123},[4845],{"type":35,"value":425},{"type":30,"tag":89,"props":4847,"children":4848},{"class":91,"line":437},[4849,4853,4857,4861,4866],{"type":30,"tag":89,"props":4850,"children":4851},{"style":106},[4852],{"type":35,"value":144},{"type":30,"tag":89,"props":4854,"children":4855},{"style":106},[4856],{"type":35,"value":149},{"type":30,"tag":89,"props":4858,"children":4859},{"style":152},[4860],{"type":35,"value":4663},{"type":30,"tag":89,"props":4862,"children":4863},{"style":158},[4864],{"type":35,"value":4865}," notificationService",{"type":30,"tag":89,"props":4867,"children":4868},{"style":123},[4869],{"type":35,"value":425},{"type":30,"tag":89,"props":4871,"children":4872},{"class":91,"line":768},[4873],{"type":30,"tag":89,"props":4874,"children":4875},{"emptyLinePlaceholder":13},[4876],{"type":35,"value":135},{"type":30,"tag":89,"props":4878,"children":4879},{"class":91,"line":793},[4880,4884,4888],{"type":30,"tag":89,"props":4881,"children":4882},{"style":106},[4883],{"type":35,"value":277},{"type":30,"tag":89,"props":4885,"children":4886},{"style":175},[4887],{"type":35,"value":4810},{"type":30,"tag":89,"props":4889,"children":4890},{"style":123},[4891],{"type":35,"value":2801},{"type":30,"tag":89,"props":4893,"children":4894},{"class":91,"line":818},[4895,4900,4904],{"type":30,"tag":89,"props":4896,"children":4897},{"style":152},[4898],{"type":35,"value":4899},"            OrderRepository",{"type":30,"tag":89,"props":4901,"children":4902},{"style":299},[4903],{"type":35,"value":4841},{"type":30,"tag":89,"props":4905,"children":4906},{"style":123},[4907],{"type":35,"value":4908},",\n",{"type":30,"tag":89,"props":4910,"children":4911},{"class":91,"line":826},[4912,4917,4921,4925],{"type":30,"tag":89,"props":4913,"children":4914},{"style":152},[4915],{"type":35,"value":4916},"            NotificationService",{"type":30,"tag":89,"props":4918,"children":4919},{"style":299},[4920],{"type":35,"value":4865},{"type":30,"tag":89,"props":4922,"children":4923},{"style":123},[4924],{"type":35,"value":307},{"type":30,"tag":89,"props":4926,"children":4927},{"style":123},[4928],{"type":35,"value":126},{"type":30,"tag":89,"props":4930,"children":4931},{"class":91,"line":870},[4932,4936,4940,4945,4949,4953],{"type":30,"tag":89,"props":4933,"children":4934},{"style":874},[4935],{"type":35,"value":877},{"type":30,"tag":89,"props":4937,"children":4938},{"style":123},[4939],{"type":35,"value":339},{"type":30,"tag":89,"props":4941,"children":4942},{"style":158},[4943],{"type":35,"value":4944},"orderRepository ",{"type":30,"tag":89,"props":4946,"children":4947},{"style":164},[4948],{"type":35,"value":167},{"type":30,"tag":89,"props":4950,"children":4951},{"style":158},[4952],{"type":35,"value":4841},{"type":30,"tag":89,"props":4954,"children":4955},{"style":123},[4956],{"type":35,"value":425},{"type":30,"tag":89,"props":4958,"children":4959},{"class":91,"line":901},[4960,4964,4968,4973,4977,4981],{"type":30,"tag":89,"props":4961,"children":4962},{"style":874},[4963],{"type":35,"value":877},{"type":30,"tag":89,"props":4965,"children":4966},{"style":123},[4967],{"type":35,"value":339},{"type":30,"tag":89,"props":4969,"children":4970},{"style":158},[4971],{"type":35,"value":4972},"notificationService ",{"type":30,"tag":89,"props":4974,"children":4975},{"style":164},[4976],{"type":35,"value":167},{"type":30,"tag":89,"props":4978,"children":4979},{"style":158},[4980],{"type":35,"value":4865},{"type":30,"tag":89,"props":4982,"children":4983},{"style":123},[4984],{"type":35,"value":425},{"type":30,"tag":89,"props":4986,"children":4987},{"class":91,"line":930},[4988],{"type":30,"tag":89,"props":4989,"children":4990},{"style":123},[4991],{"type":35,"value":434},{"type":30,"tag":89,"props":4993,"children":4994},{"class":91,"line":938},[4995],{"type":30,"tag":89,"props":4996,"children":4997},{"emptyLinePlaceholder":13},[4998],{"type":35,"value":135},{"type":30,"tag":89,"props":5000,"children":5001},{"class":91,"line":946},[5002,5006,5010,5015,5019,5023,5027,5031],{"type":30,"tag":89,"props":5003,"children":5004},{"style":106},[5005],{"type":35,"value":277},{"type":30,"tag":89,"props":5007,"children":5008},{"style":106},[5009],{"type":35,"value":1304},{"type":30,"tag":89,"props":5011,"children":5012},{"style":175},[5013],{"type":35,"value":5014}," fulfillOrder",{"type":30,"tag":89,"props":5016,"children":5017},{"style":123},[5018],{"type":35,"value":182},{"type":30,"tag":89,"props":5020,"children":5021},{"style":152},[5022],{"type":35,"value":696},{"type":30,"tag":89,"props":5024,"children":5025},{"style":299},[5026],{"type":35,"value":403},{"type":30,"tag":89,"props":5028,"children":5029},{"style":123},[5030],{"type":35,"value":307},{"type":30,"tag":89,"props":5032,"children":5033},{"style":123},[5034],{"type":35,"value":126},{"type":30,"tag":89,"props":5036,"children":5037},{"class":91,"line":982},[5038,5042,5046,5050,5054,5058,5062,5066,5070],{"type":30,"tag":89,"props":5039,"children":5040},{"style":152},[5041],{"type":35,"value":4177},{"type":30,"tag":89,"props":5043,"children":5044},{"style":158},[5045],{"type":35,"value":4182},{"type":30,"tag":89,"props":5047,"children":5048},{"style":164},[5049],{"type":35,"value":167},{"type":30,"tag":89,"props":5051,"children":5052},{"style":158},[5053],{"type":35,"value":4841},{"type":30,"tag":89,"props":5055,"children":5056},{"style":123},[5057],{"type":35,"value":339},{"type":30,"tag":89,"props":5059,"children":5060},{"style":175},[5061],{"type":35,"value":3113},{"type":30,"tag":89,"props":5063,"children":5064},{"style":123},[5065],{"type":35,"value":182},{"type":30,"tag":89,"props":5067,"children":5068},{"style":158},[5069],{"type":35,"value":1837},{"type":30,"tag":89,"props":5071,"children":5072},{"style":123},[5073],{"type":35,"value":3079},{"type":30,"tag":89,"props":5075,"children":5076},{"class":91,"line":1022},[5077,5081,5085,5089,5093,5097,5102,5106,5110],{"type":30,"tag":89,"props":5078,"children":5079},{"style":123},[5080],{"type":35,"value":3133},{"type":30,"tag":89,"props":5082,"children":5083},{"style":175},[5084],{"type":35,"value":3138},{"type":30,"tag":89,"props":5086,"children":5087},{"style":123},[5088],{"type":35,"value":3143},{"type":30,"tag":89,"props":5090,"children":5091},{"style":106},[5092],{"type":35,"value":3148},{"type":30,"tag":89,"props":5094,"children":5095},{"style":106},[5096],{"type":35,"value":172},{"type":30,"tag":89,"props":5098,"children":5099},{"style":175},[5100],{"type":35,"value":5101}," OrderNotFoundException",{"type":30,"tag":89,"props":5103,"children":5104},{"style":123},[5105],{"type":35,"value":182},{"type":30,"tag":89,"props":5107,"children":5108},{"style":158},[5109],{"type":35,"value":1837},{"type":30,"tag":89,"props":5111,"children":5112},{"style":123},[5113],{"type":35,"value":1416},{"type":30,"tag":89,"props":5115,"children":5116},{"class":91,"line":1067},[5117],{"type":30,"tag":89,"props":5118,"children":5119},{"emptyLinePlaceholder":13},[5120],{"type":35,"value":135},{"type":30,"tag":89,"props":5122,"children":5123},{"class":91,"line":1083},[5124,5129,5133,5138,5142,5146,5150,5155],{"type":30,"tag":89,"props":5125,"children":5126},{"style":158},[5127],{"type":35,"value":5128},"        order",{"type":30,"tag":89,"props":5130,"children":5131},{"style":123},[5132],{"type":35,"value":339},{"type":30,"tag":89,"props":5134,"children":5135},{"style":175},[5136],{"type":35,"value":5137},"setStatus",{"type":30,"tag":89,"props":5139,"children":5140},{"style":123},[5141],{"type":35,"value":182},{"type":30,"tag":89,"props":5143,"children":5144},{"style":158},[5145],{"type":35,"value":3065},{"type":30,"tag":89,"props":5147,"children":5148},{"style":123},[5149],{"type":35,"value":339},{"type":30,"tag":89,"props":5151,"children":5152},{"style":158},[5153],{"type":35,"value":5154},"FULFILLING",{"type":30,"tag":89,"props":5156,"children":5157},{"style":123},[5158],{"type":35,"value":358},{"type":30,"tag":89,"props":5160,"children":5161},{"class":91,"line":1091},[5162,5167,5171,5175,5179,5184],{"type":30,"tag":89,"props":5163,"children":5164},{"style":158},[5165],{"type":35,"value":5166},"        orderRepository",{"type":30,"tag":89,"props":5168,"children":5169},{"style":123},[5170],{"type":35,"value":339},{"type":30,"tag":89,"props":5172,"children":5173},{"style":175},[5174],{"type":35,"value":344},{"type":30,"tag":89,"props":5176,"children":5177},{"style":123},[5178],{"type":35,"value":182},{"type":30,"tag":89,"props":5180,"children":5181},{"style":158},[5182],{"type":35,"value":5183},"order",{"type":30,"tag":89,"props":5185,"children":5186},{"style":123},[5187],{"type":35,"value":358},{"type":30,"tag":89,"props":5189,"children":5190},{"class":91,"line":1099},[5191],{"type":30,"tag":89,"props":5192,"children":5193},{"emptyLinePlaceholder":13},[5194],{"type":35,"value":135},{"type":30,"tag":89,"props":5196,"children":5197},{"class":91,"line":1107},[5198,5203,5207,5212,5216,5220,5224,5229,5233,5237],{"type":30,"tag":89,"props":5199,"children":5200},{"style":158},[5201],{"type":35,"value":5202},"        notificationService",{"type":30,"tag":89,"props":5204,"children":5205},{"style":123},[5206],{"type":35,"value":339},{"type":30,"tag":89,"props":5208,"children":5209},{"style":175},[5210],{"type":35,"value":5211},"sendOrderConfirmation",{"type":30,"tag":89,"props":5213,"children":5214},{"style":123},[5215],{"type":35,"value":182},{"type":30,"tag":89,"props":5217,"children":5218},{"style":158},[5219],{"type":35,"value":5183},{"type":30,"tag":89,"props":5221,"children":5222},{"style":123},[5223],{"type":35,"value":339},{"type":30,"tag":89,"props":5225,"children":5226},{"style":175},[5227],{"type":35,"value":5228},"getUserId",{"type":30,"tag":89,"props":5230,"children":5231},{"style":123},[5232],{"type":35,"value":398},{"type":30,"tag":89,"props":5234,"children":5235},{"style":158},[5236],{"type":35,"value":403},{"type":30,"tag":89,"props":5238,"children":5239},{"style":123},[5240],{"type":35,"value":358},{"type":30,"tag":89,"props":5242,"children":5243},{"class":91,"line":1116},[5244],{"type":30,"tag":89,"props":5245,"children":5246},{"style":123},[5247],{"type":35,"value":434},{"type":30,"tag":89,"props":5249,"children":5250},{"class":91,"line":11},[5251],{"type":30,"tag":89,"props":5252,"children":5253},{"style":123},[5254],{"type":35,"value":443},{"type":30,"tag":89,"props":5256,"children":5257},{"class":91,"line":1181},[5258],{"type":30,"tag":89,"props":5259,"children":5260},{"emptyLinePlaceholder":13},[5261],{"type":35,"value":135},{"type":30,"tag":89,"props":5263,"children":5264},{"class":91,"line":1241},[5265],{"type":30,"tag":89,"props":5266,"children":5267},{"style":96},[5268],{"type":35,"value":5269},"\u002F\u002F Implémentation de test\n",{"type":30,"tag":89,"props":5271,"children":5272},{"class":91,"line":1249},[5273,5277],{"type":30,"tag":89,"props":5274,"children":5275},{"style":1975},[5276],{"type":35,"value":1978},{"type":30,"tag":89,"props":5278,"children":5279},{"style":1981},[5280],{"type":35,"value":2537},{"type":30,"tag":89,"props":5282,"children":5283},{"class":91,"line":1257},[5284,5288,5293,5297,5302],{"type":30,"tag":89,"props":5285,"children":5286},{"style":1975},[5287],{"type":35,"value":1978},{"type":30,"tag":89,"props":5289,"children":5290},{"style":1981},[5291],{"type":35,"value":5292},"Profile",{"type":30,"tag":89,"props":5294,"children":5295},{"style":123},[5296],{"type":35,"value":182},{"type":30,"tag":89,"props":5298,"children":5299},{"style":185},[5300],{"type":35,"value":5301},"\"test\"",{"type":30,"tag":89,"props":5303,"children":5304},{"style":123},[5305],{"type":35,"value":3079},{"type":30,"tag":89,"props":5307,"children":5308},{"class":91,"line":1265},[5309,5313,5317,5322,5326,5330],{"type":30,"tag":89,"props":5310,"children":5311},{"style":106},[5312],{"type":35,"value":109},{"type":30,"tag":89,"props":5314,"children":5315},{"style":106},[5316],{"type":35,"value":114},{"type":30,"tag":89,"props":5318,"children":5319},{"style":117},[5320],{"type":35,"value":5321}," MockNotificationService",{"type":30,"tag":89,"props":5323,"children":5324},{"style":106},[5325],{"type":35,"value":1135},{"type":30,"tag":89,"props":5327,"children":5328},{"style":117},[5329],{"type":35,"value":4663},{"type":30,"tag":89,"props":5331,"children":5332},{"style":123},[5333],{"type":35,"value":126},{"type":30,"tag":89,"props":5335,"children":5336},{"class":91,"line":1294},[5337],{"type":30,"tag":89,"props":5338,"children":5339},{"emptyLinePlaceholder":13},[5340],{"type":35,"value":135},{"type":30,"tag":89,"props":5342,"children":5343},{"class":91,"line":1343},[5344,5348,5352,5357,5361,5365,5369,5374,5378,5382,5387],{"type":30,"tag":89,"props":5345,"children":5346},{"style":106},[5347],{"type":35,"value":144},{"type":30,"tag":89,"props":5349,"children":5350},{"style":106},[5351],{"type":35,"value":149},{"type":30,"tag":89,"props":5353,"children":5354},{"style":152},[5355],{"type":35,"value":5356}," List",{"type":30,"tag":89,"props":5358,"children":5359},{"style":123},[5360],{"type":35,"value":1684},{"type":30,"tag":89,"props":5362,"children":5363},{"style":106},[5364],{"type":35,"value":696},{"type":30,"tag":89,"props":5366,"children":5367},{"style":123},[5368],{"type":35,"value":1702},{"type":30,"tag":89,"props":5370,"children":5371},{"style":158},[5372],{"type":35,"value":5373}," sentNotifications ",{"type":30,"tag":89,"props":5375,"children":5376},{"style":164},[5377],{"type":35,"value":167},{"type":30,"tag":89,"props":5379,"children":5380},{"style":106},[5381],{"type":35,"value":172},{"type":30,"tag":89,"props":5383,"children":5384},{"style":152},[5385],{"type":35,"value":5386}," ArrayList",{"type":30,"tag":89,"props":5388,"children":5389},{"style":123},[5390],{"type":35,"value":1725},{"type":30,"tag":89,"props":5392,"children":5393},{"class":91,"line":1419},[5394],{"type":30,"tag":89,"props":5395,"children":5396},{"emptyLinePlaceholder":13},[5397],{"type":35,"value":135},{"type":30,"tag":89,"props":5399,"children":5400},{"class":91,"line":1427},[5401,5405],{"type":30,"tag":89,"props":5402,"children":5403},{"style":1975},[5404],{"type":35,"value":3303},{"type":30,"tag":89,"props":5406,"children":5407},{"style":1981},[5408],{"type":35,"value":3308},{"type":30,"tag":89,"props":5410,"children":5411},{"class":91,"line":1435},[5412,5416,5420,5424,5428,5432,5436,5440,5444,5448,5452],{"type":30,"tag":89,"props":5413,"children":5414},{"style":106},[5415],{"type":35,"value":277},{"type":30,"tag":89,"props":5417,"children":5418},{"style":106},[5419],{"type":35,"value":1304},{"type":30,"tag":89,"props":5421,"children":5422},{"style":175},[5423],{"type":35,"value":4679},{"type":30,"tag":89,"props":5425,"children":5426},{"style":123},[5427],{"type":35,"value":182},{"type":30,"tag":89,"props":5429,"children":5430},{"style":152},[5431],{"type":35,"value":696},{"type":30,"tag":89,"props":5433,"children":5434},{"style":299},[5435],{"type":35,"value":4692},{"type":30,"tag":89,"props":5437,"children":5438},{"style":123},[5439],{"type":35,"value":193},{"type":30,"tag":89,"props":5441,"children":5442},{"style":152},[5443],{"type":35,"value":282},{"type":30,"tag":89,"props":5445,"children":5446},{"style":299},[5447],{"type":35,"value":403},{"type":30,"tag":89,"props":5449,"children":5450},{"style":123},[5451],{"type":35,"value":307},{"type":30,"tag":89,"props":5453,"children":5454},{"style":123},[5455],{"type":35,"value":126},{"type":30,"tag":89,"props":5457,"children":5458},{"class":91,"line":1443},[5459,5464,5468,5473,5477,5482,5487,5492,5497,5502,5506,5510],{"type":30,"tag":89,"props":5460,"children":5461},{"style":158},[5462],{"type":35,"value":5463},"        sentNotifications",{"type":30,"tag":89,"props":5465,"children":5466},{"style":123},[5467],{"type":35,"value":339},{"type":30,"tag":89,"props":5469,"children":5470},{"style":175},[5471],{"type":35,"value":5472},"add",{"type":30,"tag":89,"props":5474,"children":5475},{"style":123},[5476],{"type":35,"value":182},{"type":30,"tag":89,"props":5478,"children":5479},{"style":185},[5480],{"type":35,"value":5481},"\"confirmation:\"",{"type":30,"tag":89,"props":5483,"children":5484},{"style":164},[5485],{"type":35,"value":5486}," +",{"type":30,"tag":89,"props":5488,"children":5489},{"style":158},[5490],{"type":35,"value":5491}," userId ",{"type":30,"tag":89,"props":5493,"children":5494},{"style":164},[5495],{"type":35,"value":5496},"+",{"type":30,"tag":89,"props":5498,"children":5499},{"style":185},[5500],{"type":35,"value":5501}," \":\"",{"type":30,"tag":89,"props":5503,"children":5504},{"style":164},[5505],{"type":35,"value":5486},{"type":30,"tag":89,"props":5507,"children":5508},{"style":158},[5509],{"type":35,"value":403},{"type":30,"tag":89,"props":5511,"children":5512},{"style":123},[5513],{"type":35,"value":358},{"type":30,"tag":89,"props":5515,"children":5516},{"class":91,"line":1452},[5517],{"type":30,"tag":89,"props":5518,"children":5519},{"style":123},[5520],{"type":35,"value":434},{"type":30,"tag":89,"props":5522,"children":5523},{"class":91,"line":1478},[5524],{"type":30,"tag":89,"props":5525,"children":5526},{"style":123},[5527],{"type":35,"value":443},{"type":30,"tag":31,"props":5529,"children":5530},{},[5531,5536,5538,5544],{"type":30,"tag":448,"props":5532,"children":5533},{},[5534],{"type":35,"value":5535},"L'avantage Spring :",{"type":35,"value":5537}," ",{"type":30,"tag":85,"props":5539,"children":5541},{"className":5540},[],[5542],{"type":35,"value":5543},"@Profile(\"test\")",{"type":35,"value":5545}," permet d'utiliser automatiquement le mock en environnement de test sans modifier le code métier. Le framework gère le wiring, le code métier reste pur.",{"type":30,"tag":48,"props":5547,"children":5548},{},[],{"type":30,"tag":52,"props":5550,"children":5552},{"id":5551},"quand-appliquer-le-dip-et-quand-ne-pas-le-faire",[5553],{"type":35,"value":5554},"Quand appliquer le DIP, et quand ne pas le faire",{"type":30,"tag":31,"props":5556,"children":5557},{},[5558],{"type":30,"tag":448,"props":5559,"children":5560},{},[5561],{"type":35,"value":5562},"Appliquer le DIP :",{"type":30,"tag":454,"props":5564,"children":5565},{},[5566,5571,5576],{"type":30,"tag":458,"props":5567,"children":5568},{},[5569],{"type":35,"value":5570},"Toute dépendance vers un système externe (base de données, API tierce, service d'email, service de paiement, file de message)",{"type":30,"tag":458,"props":5572,"children":5573},{},[5574],{"type":35,"value":5575},"Toute dépendance vers une infrastructure susceptible de changer",{"type":30,"tag":458,"props":5577,"children":5578},{},[5579],{"type":35,"value":5580},"Tout code que vous voulez unit-tester sans infrastructure",{"type":30,"tag":31,"props":5582,"children":5583},{},[5584],{"type":30,"tag":448,"props":5585,"children":5586},{},[5587],{"type":35,"value":5588},"Ne pas appliquer le DIP mécaniquement :",{"type":30,"tag":454,"props":5590,"children":5591},{},[5592,5597,5602],{"type":30,"tag":458,"props":5593,"children":5594},{},[5595],{"type":35,"value":5596},"Les entités et value objects du domaine (Order, User, Money) : pas de logique d'infrastructure",{"type":30,"tag":458,"props":5598,"children":5599},{},[5600],{"type":35,"value":5601},"Les utilitaires purs (calculs mathématiques, formatage de dates) : pas d'effet de bord",{"type":30,"tag":458,"props":5603,"children":5604},{},[5605],{"type":35,"value":5606},"Les dépendances stables et peu susceptibles de changer dans des petits projets",{"type":30,"tag":31,"props":5608,"children":5609},{},[5610,5615,5617,5623],{"type":30,"tag":448,"props":5611,"children":5612},{},[5613],{"type":35,"value":5614},"Le signal",{"type":35,"value":5616}," : si écrire un test unitaire pour votre classe nécessite de démarrer une base de données, une queue de messages, ou de configurer un service externe, appliquez le DIP. Cette question est aussi centrale dans les ",{"type":30,"tag":64,"props":5618,"children":5620},{"href":5619},"\u002Ffr\u002Fdette-technique\u002Ftests-integration-legacy-pieges",[5621],{"type":35,"value":5622},"tests d'intégration sur du code legacy",{"type":35,"value":5624}," : l'absence de DIP est souvent ce qui rend ces tests si difficiles et si fragiles à mettre en place.",{"type":30,"tag":48,"props":5626,"children":5627},{},[],{"type":30,"tag":2289,"props":5629,"children":5634},{"cta":5630,"href":5631,"title":5632,"type":5633},"Les 100 pratiques que l'IA n'enseigne pas →","https:\u002F\u002Fkamanga.fr\u002Freferentiel-craft","Le DIP n'est qu'une des 100 pratiques qui rendent un code testable","product",[5635],{"type":30,"tag":31,"props":5636,"children":5637},{},[5638],{"type":35,"value":5639},"Cet article détaille une pratique craft : inverser ses dépendances pour découpler le métier de l'infrastructure. Le Craft Bundle réunit les 100 pratiques que j'applique pour coder propre, du choix d'une abstraction au design d'un test rapide. Celles que l'IA ne vous apprendra jamais parce qu'elle ne les a jamais vues tenir en production.",{"type":30,"tag":48,"props":5641,"children":5642},{},[],{"type":30,"tag":52,"props":5644,"children":5646},{"id":5645},"faq-sur-le-dependency-inversion-principle",[5647],{"type":35,"value":5648},"FAQ sur le Dependency Inversion Principle",{"type":30,"tag":5650,"props":5651,"children":5652},"details",{},[5653,5659],{"type":30,"tag":5654,"props":5655,"children":5656},"summary",{},[5657],{"type":35,"value":5658},"1. Quelle est la différence entre DIP et Dependency Injection ?",{"type":30,"tag":31,"props":5660,"children":5661},{},[5662],{"type":35,"value":5663},"Le DIP est un principe architectural : les modules doivent dépendre d'abstractions. La Dependency Injection (DI) est une technique d'implémentation du DIP : les dépendances sont fournies de l'extérieur plutôt que créées à l'intérieur. On peut respecter le DIP sans DI (ex : factory pattern). On peut utiliser la DI sans respecter le DIP (ex : injecter une classe concrète sans interface). En pratique, les deux vont généralement ensemble.",{"type":30,"tag":5650,"props":5665,"children":5666},{},[5667,5672],{"type":30,"tag":5654,"props":5668,"children":5669},{},[5670],{"type":35,"value":5671},"2. Les containers DI (Spring, .NET DI, Angular) font-ils le travail à notre place ?",{"type":30,"tag":31,"props":5673,"children":5674},{},[5675],{"type":35,"value":5676},"Ils automatisent le wiring (qui injecte quoi), mais ne créent pas les abstractions à notre place. Spring injecte les classes concrètes si vous ne créez pas d'interfaces. La discipline architecturale de créer des interfaces pour les dépendances d'infrastructure reste une décision de l'équipe. Le framework ne peut pas la prendre à votre place.",{"type":30,"tag":5650,"props":5678,"children":5679},{},[5680,5685],{"type":30,"tag":5654,"props":5681,"children":5682},{},[5683],{"type":35,"value":5684},"3. Le DIP ne crée-t-il pas trop d'abstractions ?",{"type":30,"tag":31,"props":5686,"children":5687},{},[5688],{"type":35,"value":5689},"Oui, si mal appliqué. Créer une interface pour chaque classe, même les plus stables, est du sur-engineering. La règle que Martin Fowler formule clairement : créer une abstraction quand il y a au moins 2 implémentations possibles (production + test, provider A + provider B) ou quand la dépendance est vers un système externe. \"Pas d'abstraction prématurée\" s'applique au DIP comme à tout principe.",{"type":30,"tag":5650,"props":5691,"children":5692},{},[5693,5698],{"type":30,"tag":5654,"props":5694,"children":5695},{},[5696],{"type":35,"value":5697},"4. Comment introduire le DIP progressivement dans un codebase existant ?",{"type":30,"tag":31,"props":5699,"children":5700},{},[5701,5703,5709],{"type":35,"value":5702},"Le strangler fig pattern appliqué au DIP : ne pas refactorer tout le code existant d'un coup. À chaque nouvelle fonctionnalité ou bug fix qui touche une classe avec dépendances directes, extraire l'interface et introduire l'injection. Après 6 mois de cette discipline, les zones les plus actives du codebase respectent le DIP. Les zones stables peuvent rester dans l'état existant si elles ne causent pas de problèmes. Dans un contexte de ",{"type":30,"tag":64,"props":5704,"children":5706},{"href":5705},"\u002Ffr\u002Fdette-technique\u002Flegacy-code-evaluer-risque",[5707],{"type":35,"value":5708},"code legacy fortement couplé",{"type":35,"value":5710},", cette approche progressive est souvent la seule viable sans bloquer les livraisons.",{"type":30,"tag":5650,"props":5712,"children":5713},{},[5714,5719],{"type":30,"tag":5654,"props":5715,"children":5716},{},[5717],{"type":35,"value":5718},"5. Le DIP s'applique-t-il aux frontends (React, Vue) ?",{"type":30,"tag":31,"props":5720,"children":5721},{},[5722,5724,5730,5732,5738,5740,5746],{"type":35,"value":5723},"Oui. En React : les composants ne doivent pas appeler directement ",{"type":30,"tag":85,"props":5725,"children":5727},{"className":5726},[],[5728],{"type":35,"value":5729},"fetch()",{"type":35,"value":5731}," ou ",{"type":30,"tag":85,"props":5733,"children":5735},{"className":5734},[],[5736],{"type":35,"value":5737},"axios",{"type":35,"value":5739}," : ils doivent dépendre d'une abstraction (un service, un hook custom, un context) qui peut être mockée dans les tests. ",{"type":30,"tag":85,"props":5741,"children":5743},{"className":5742},[],[5744],{"type":35,"value":5745},"useOrderService()",{"type":35,"value":5747}," hook qui cache l'implémentation HTTP, facilement mockable dans les tests. Le DIP s'applique partout où il y a des effets de bord, frontend inclus.",{"type":30,"tag":48,"props":5749,"children":5750},{},[],{"type":30,"tag":2289,"props":5752,"children":5757},{"cta":5753,"href":5754,"title":5755,"type":5756},"Faire mon auto-évaluation →","\u002Fema","Ressource gratuite : Engineering Maturity Self-Assessment","resource",[5758],{"type":30,"tag":31,"props":5759,"children":5760},{},[5761],{"type":35,"value":5762},"L'Engineering Maturity Self-Assessment couvre le domaine Craft & Conception : évaluez votre niveau sur les principes SOLID, le couplage, et la testabilité. Obtenez un score de maturité et des recommandations concrètes en 10 minutes.",{"type":30,"tag":5764,"props":5765,"children":5766},"style",{},[5767],{"type":35,"value":5768},"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":102,"depth":102,"links":5770},[5771,5772,5773,5774,5775,5776,5777],{"id":54,"depth":102,"text":57},{"id":506,"depth":102,"text":509},{"id":572,"depth":102,"text":575},{"id":2306,"depth":102,"text":2309},{"id":4629,"depth":102,"text":4632},{"id":5551,"depth":102,"text":5554},{"id":5645,"depth":102,"text":5648},"markdown","content:fr:architecture-craft:dependency-inversion-pratique.md","content","fr\u002Farchitecture-craft\u002Fdependency-inversion-pratique.md","fr\u002Farchitecture-craft\u002Fdependency-inversion-pratique","md",1783466599736]