{"id":624,"date":"2009-09-23T11:53:19","date_gmt":"2009-09-23T09:53:19","guid":{"rendered":"http:\/\/www.do-as-i-say.com\/notes\/?p=624"},"modified":"2012-12-06T08:22:29","modified_gmt":"2012-12-06T06:22:29","slug":"decouplage-symfony-explique-a-ma-maman-3","status":"publish","type":"post","link":"https:\/\/www.do-as-i-say.com\/notes\/2009\/09\/decouplage-symfony-explique-a-ma-maman-3\/","title":{"rendered":"Symfony expliqu\u00e9 \u00e0 ma maman, 3\u00e8me partie : le d\u00e9couplage"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-632\" style=\"border: 1px solid black;\" title=\"Une prise verte. Dingue.\" src=\"http:\/\/www.do-as-i-say.com\/notes\/wp-content\/uploads\/prise_electrique-150x150.jpg\" alt=\"Une prise verte. Dingue.\" width=\"128\" height=\"128\" \/>Alors que j&rsquo;avais presque fini l&rsquo;\u00e9pisode sur le MVC, j&rsquo;en suis venu \u00e0 r\u00e9aliser qu&rsquo;il manquait une \u00e9tape. Un concept capital dans toutes nos histoires de framework, de bo\u00eete \u00e0 outils et de m\u00e9thodologie. Je ne vous fait pas languir plus longtemps : il porte le nom de <strong>d\u00e9couplage<\/strong>.<\/p>\n<p>Pour une fois, le champ lexical auquel le concept est emprunt\u00e9 n&rsquo;est pas celui du BTP, m\u00eame si on n&rsquo;en est pas loin : c&rsquo;est celui de l&rsquo;\u00e9lectricit\u00e9. D\u00e9coupler y signifie supprimer le couplage entre deux circuits (ok, on est proche de la lapalissade, mais bon).<\/p>\n<p><!--more--><\/p>\n<p>L&rsquo;exemple le plus parlant sera celui de la prise \u00e9lectrique. Si on n&rsquo;avait pas d\u00e9fini de standard ni\u00a0 un principe de prises m\u00e2les et femelles, on vivrait dans un monde o\u00f9 les appareils \u00e9lectriques ne pourraient \u00eatre vendus pr\u00eats \u00e0 \u00eatre branch\u00e9s, o\u00f9 il faudrait\u00a0 faire intervenir un \u00e9lectricien pour les raccorder au r\u00e9seau, et o\u00f9 une fois install\u00e9s on ne pourrait plus les d\u00e9placer ni les brancher ailleurs (sauf \u00e0 r\u00e9p\u00e9ter l&rsquo;intervention). Assombrissons le tableau, et imaginons que dans ce m\u00eame monde le r\u00e9seau \u00e9lectrique n&rsquo;aie pas de tension standard, mais distribue du 230 volts ici, 110 l\u00e0, 3.14 ailleurs, etc. Non seulement il faudrait une manipulation technique pour connecter le grille-pain, mais aussi pour l&rsquo;adapter \u00e0 la tension. Manip&rsquo; \u00e0 r\u00e9p\u00e9ter \u00e0 chaque d\u00e9placement de la b\u00eate&#8230;<\/p>\n<p>Le probl\u00e8me que l&rsquo;on aurait dans un tel monde serait celui d&rsquo;un tr\u00e8s fort <strong>couplage <\/strong>entre les appareils et le r\u00e9seau \u00e9lectrique. Inutile de vous faire un dessin pour expliquer \u00e0 quel point \u00e7a ne serait pas commode. Pour rester poli et ne pas dire chiant. Ah mince je l&rsquo;ai dit.<\/p>\n<p>En informatique, on s&rsquo;est rapidement souci\u00e9 du couplage, que ce soit du point de vue mat\u00e9riel comme pour les prises \u00e9lectriques en d\u00e9finissant des standards plus ou moins universels (PCI, RS232, USB, firewire&#8230;), ou logiciel (dans les programmes, ou dans les couches inf\u00e9rieures, par exemple le mod\u00e8le adopt\u00e9 pour l&rsquo;interconnexion des r\u00e9seaux, OSI, mais c&rsquo;est un autre sujet).<\/p>\n<p>En ce qui concerne le sujet qui nous int\u00e9resse, le d\u00e9veloppement d&rsquo;applications web via les frameworks en g\u00e9n\u00e9ral et Symfony en particulier, le d\u00e9couplage est une notion critique.<br \/>\nElle fonde l&rsquo;organisation du framework lui-m\u00eame, et sous-tend toutes les bonnes pratiques qui vont avec et doivent \u00eatre appliqu\u00e9es dans le code sp\u00e9cifique \u00e0 l&rsquo;application.<\/p>\n<h2>Interfacer pour mieux d\u00e9coupler<\/h2>\n<p>Pour le formuler autrement, le<strong> d\u00e9couplage consiste en l&rsquo;ind\u00e9pendance maximale <\/strong>de toutes les \u00ab\u00a0briques\u00a0\u00bb entre elles. Mais comme ces briques doivent communiquer, leurs <strong>interfaces, c&rsquo;est-\u00e0-dire leur fronti\u00e8res de communication<\/strong>, doivent \u00eatre codifi\u00e9es.<br \/>\nC&rsquo;est pourquoi en \u00e9lectricit\u00e9 on a r\u00e9duit les nombres de connecteurs et d\u00e9finit des standards. C&rsquo;est pourquoi en informatique on a d\u00e9fini des <em>protocoles<\/em>, autrement dit des r\u00e8gles d&rsquo;\u00e9change. Car pour permettre le d\u00e9couplage, il faut se concentrer sur l&rsquo;endroit \u2014 si je puis me permettre \u2014 o\u00f9 \u00e7a s&rsquo;accouple, et l&rsquo;abstraire des contingences et des sp\u00e9cificit\u00e9s (amen).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-649\" style=\"border: 1px solid black;\" title=\"sfToasterPlugin\" src=\"http:\/\/www.do-as-i-say.com\/notes\/wp-content\/uploads\/grille-pain.jpg\" alt=\"sfToasterPlugin\" width=\"128\" height=\"128\" \/>De la m\u00eame mani\u00e8re qu&rsquo;on ne souhaite pas avoir \u00e0 changer de grille-pain si on change les prises ou si on d\u00e9m\u00e9nage, on veut pouvoir faire abstraction, en d\u00e9veloppant une application web, de la fa\u00e7on dont l&rsquo;acc\u00e8s aux donn\u00e9es est g\u00e9r\u00e9 (il nous suffit de savoir qu&rsquo;il l&rsquo;est), du type de serveur de base de donn\u00e9es (on veut id\u00e9alement pouvoir utiliser n&rsquo;importe lequel). Bref, on veut pouvoir se brancher dessus sans avoir \u00e0 se demander comment. Aussi simplement qu&rsquo;en branchant une prise m\u00e2le dans une prise femelle.<br \/>\nD&rsquo;une mani\u00e8re g\u00e9n\u00e9rale, les fonctionnalit\u00e9s du framework doivent pouvoir \u00eatre<strong> utilis\u00e9es les unes ind\u00e9pendamment des autres<\/strong>, sans quoi leur mise en \u0153uvre reviendra la plupart du temps \u00e0 \u00e9craser une mouche avec un marteau-piqueur, ou pour rester sur notre champ lexical du jour, \u00e0 faire construire une maison enti\u00e8re pour pouvoir brancher notre grille-pain.<\/p>\n<p>Cette ind\u00e9pendance des \u00ab\u00a0\u00e9l\u00e9ments\u00a0\u00bb a un deuxi\u00e8me int\u00e9r\u00eat, non des moindres : il rend possible l&rsquo;\u00e9volution ou la r\u00e9paration des uns sans avoir \u00e0 intervenir sur les autres.<br \/>\nDans la vie bien d\u00e9coupl\u00e9e, vous pouvez acheter une cafeti\u00e8re neuve (ouaip, changeons d&rsquo;objet \u00e9lectrom\u00e9nager, \u00e7a commence \u00e0 devenir saoulant le grille-pain) sans avoir \u00e0 refaire toute votre installation \u00e9lectrique, non ?  Et bien si votre code et votre application sont eux aussi <em>correctement d\u00e9coupl\u00e9s <\/em>vous devez pouvoir modifier, mettons, votre logiciel d&rsquo;envoi de mail sans avoir \u00e0 retoucher \u00e0 tous les endroits o\u00f9 vous envoyez des mails.<\/p>\n<p>En r\u00e9sum\u00e9, si vous voulez briller en soci\u00e9t\u00e9 (ou en lan party, encore que..) pensez \u00e0 caser \u00ab\u00a0d\u00e9couplage\u00a0\u00bb au d\u00e9tour d&rsquo;une saillie, \u00e7a fait toujours son effet. Si vous voulez briller en tests unitaires, c&rsquo;est bien aussi, mais \u00e7a sera l&rsquo;objet d&rsquo;un \u00e9pisode de la saison 2.<\/p>\n<p><em>Dans le prochain \u00e9pisode, cette fois c&rsquo;est jur\u00e9-crach\u00e9-si-je-mens-je-vais-\u00e0-Denfert, on parlera de MVC\u2026<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alors que j&rsquo;avais presque fini l&rsquo;\u00e9pisode sur le MVC, j&rsquo;en suis venu \u00e0 r\u00e9aliser qu&rsquo;il manquait une \u00e9tape. Un concept capital dans toutes nos histoires de framework, de bo\u00eete \u00e0 outils et de m\u00e9thodologie. Je ne vous fait pas languir plus longtemps : il porte le nom de d\u00e9couplage. Pour une fois, le champ lexical [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[50,42,21,3,55],"class_list":["post-624","post","type-post","status-publish","format-standard","hentry","category-trucs-expliques-a-ma-maman","tag-decouplage","tag-design-patterns","tag-framework","tag-principe","tag-symfony"],"_links":{"self":[{"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/posts\/624","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/comments?post=624"}],"version-history":[{"count":52,"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/posts\/624\/revisions"}],"predecessor-version":[{"id":1204,"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/posts\/624\/revisions\/1204"}],"wp:attachment":[{"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/media?parent=624"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/categories?post=624"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.do-as-i-say.com\/notes\/wp-json\/wp\/v2\/tags?post=624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}