{"id":1705,"date":"2019-04-05T20:11:03","date_gmt":"2019-04-05T20:11:03","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=1705"},"modified":"2024-12-16T22:32:39","modified_gmt":"2024-12-16T19:32:39","slug":"the-good-the-bad-and-the-ugly-singleton","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2019\/04\/05\/the-good-the-bad-and-the-ugly-singleton\/","title":{"rendered":"Le Bon, la Brute et le Truand Singleton"},"content":{"rendered":"<p>Dans cette note, je d\u00e9crirai mon exp\u00e9rience et celle de mes coll\u00e8gues lorsque j&#8217;ai travaill\u00e9 avec le mod\u00e8le Singleton (Singleton dans la litt\u00e9rature \u00e9trang\u00e8re), tout en travaillant sur divers projets (r\u00e9ussis et moins r\u00e9ussis). Je d\u00e9crirai pourquoi je pense personnellement que ce mod\u00e8le ne peut \u00eatre utilis\u00e9 nulle part, et je d\u00e9crirai \u00e9galement quels facteurs psychologiques dans l&#8217;\u00e9quipe influencent l&#8217;int\u00e9gration de cet anti-mod\u00e8le. D\u00e9di\u00e9 \u00e0 tous les d\u00e9veloppeurs d\u00e9chus et paralys\u00e9s qui essayaient de comprendre pourquoi tout a commenc\u00e9 lorsqu&#8217;un des membres de l&#8217;\u00e9quipe a amen\u00e9 un petit chiot mignon, facile \u00e0 manipuler, ne n\u00e9cessitant pas de soins ni de connaissances particuli\u00e8res pour en prendre soin, et s&#8217;est termin\u00e9 avec la b\u00eate \u00e9lev\u00e9e. prendre votre projet en otage, n\u00e9cessite de plus en plus d&#8217;heures de travail et ronge les nerfs de l&#8217;utilisateur, votre argent et cr\u00e9e des chiffres absolument monstrueux pour \u00e9valuer la mise en \u0153uvre de choses apparemment simples des choses.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1712\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/04\/singleton.jpg\" alt=\"\" width=\"380\" height=\"323\" \/><br \/>\n<a href=\"https:\/\/pixabay.com\/photos\/wolf-in-sheep-s-clothing-wolf-sheep-2577813\/\" target=\"_blank\" rel=\"noopener noreferrer\">Wolf in sheep&#8217;s clothing<\/a> by <a class=\"hover_opacity\" href=\"https:\/\/pixabay.com\/users\/SarahRichterArt-1546275\/\">SarahRichterArt<\/a><\/p>\n<p><em>L&#8217;histoire se d\u00e9roule dans un univers alternatif, toutes les co\u00efncidences sont al\u00e9atoires&#8230;<\/em><\/p>\n<h3>Carotter un chat \u00e0 la maison avec Cat@Home<\/h3>\n<p>Toute personne, parfois dans la vie, a un d\u00e9sir irr\u00e9sistible de caresser un chat. Les analystes du monde entier pr\u00e9disent que la premi\u00e8re startup qui a cr\u00e9\u00e9 une application pour la livraison et la location de chats deviendra extr\u00eamement populaire et sera rachet\u00e9e dans un avenir proche par <strong>Moogle<\/strong> pour des milliards de dollars. Bient\u00f4t, cela arrive &#8211; un gars de Tioumen cr\u00e9e l&#8217;application <strong>Cat@Home<\/strong> et devient bient\u00f4t un milliardaire, la soci\u00e9t\u00e9 <strong>Moogle<\/strong> obtient une nouvelle source de profit et des millions de personnes stress\u00e9es ont l&#8217;opportunit\u00e9 de commandez un chat chez eux pour un repassage suppl\u00e9mentaire et calmez-vous.<\/p>\n<h3>Attaque des clones<\/h3>\n<p>Alexey Goloborodko, un dentiste extr\u00eamement riche de Mourmansk, impressionn\u00e9 par un article de Forbes sur Cat@Home, d\u00e9cide qu&#8217;il veut aussi devenir astronomiquement riche. Pour atteindre cet objectif, gr\u00e2ce \u00e0 ses amis, il trouve une entreprise \u00e0 Goldfield &#8211; un fournisseur de services. Wakeboard DevPops, qui fournit des services de d\u00e9veloppement de logiciels, leur commande le d\u00e9veloppement d&#8217;un clone Cat@Home.<\/p>\n<h3>\u00c9quipe gagnante<\/h3>\n<p>Le projet s&#8217;appelle Fur&#038;Pure, confi\u00e9 \u00e0 une talentueuse \u00e9quipe de d\u00e9veloppement de 20 personnes\u00a0; Concentrons-nous ensuite sur une \u00e9quipe de d\u00e9veloppement mobile de 5 personnes. Chaque membre de l&#8217;\u00e9quipe obtient sa part du travail, arm\u00e9 d&#8217;agile et de Scrum, l&#8217;\u00e9quipe termine le d\u00e9veloppement dans les d\u00e9lais (en six mois), sans bugs, publie l&#8217;application dans l&#8217;iStore, o\u00f9 elle est not\u00e9e 5 par 100 000 utilisateurs, il y en a beaucoup des commentaires sur la qualit\u00e9 de l&#8217;application et l&#8217;excellence du service (univers alternatif apr\u00e8s tout). Les chats sont repass\u00e9s, l&#8217;application est sortie, tout semble bien se passer. Cependant, Moogle n&#8217;est pas press\u00e9 d&#8217;acheter une startup pour des milliards de dollars, car non seulement des chats mais aussi des chiens sont d\u00e9j\u00e0 apparus dans Cat@Home.<\/p>\n<h3>Le chien aboie, la caravane avance<\/h3>\n<p>Le propri\u00e9taire de l&#8217;application d\u00e9cide qu&#8217;il est temps d&#8217;ajouter des chiens \u00e0 l&#8217;application, demande une \u00e9valuation \u00e0 l&#8217;entreprise et dispose d&#8217;environ <strong>au moins six mois pour ajouter des chiens \u00e0 l&#8217;application. En fait, l\u2019application sera r\u00e9\u00e9crite \u00e0 partir de z\u00e9ro. Pendant ce temps, Moogle ajoutera des serpents, des araign\u00e9es et des cobayes \u00e0 l&#8217;application, et Fur&#038;Pur ne recevra que des chiens.<br \/>Pourquoi est-ce arriv\u00e9 ? Le manque d&#8217;architecture d&#8217;application flexible est \u00e0 l&#8217;origine de tout\u00a0; l&#8217;un des facteurs les plus courants est l&#8217;anti-mod\u00e8le <strong>Singleton<\/strong>.<\/p>\n<h3>Qu&#8217;est-ce qui ne va pas\u00a0?<\/h3>\n<p>Pour commander un chat \u00e0 la maison, le consommateur doit cr\u00e9er une demande et l&#8217;envoyer au bureau, o\u00f9 le bureau la traitera et enverra un coursier avec le chat, le coursier recevra d\u00e9j\u00e0 le paiement du service. <br \/>L&#8217;un des programmeurs d\u00e9cide de cr\u00e9er une classe \u00ab\u00a0Cat Application\u00a0\u00bb\u00a0; avec les champs n\u00e9cessaires, introduit cette classe dans l&#8217;espace d&#8217;application global via un <strong>singleton<\/strong>. Pourquoi fait-il \u00e7a ? Pour gagner du temps (une \u00e9conomie d&#8217;un centime d&#8217;une demi-heure), car il est plus facile de rendre une application publique que de r\u00e9fl\u00e9chir \u00e0 l&#8217;architecture de l&#8217;application et d&#8217;utiliser l&#8217;injection de d\u00e9pendances. Ensuite, d&#8217;autres d\u00e9veloppeurs r\u00e9cup\u00e8rent cet objet global et y lient leurs classes. <\/strong>Par exemple, tous les \u00e9crans eux-m\u00eames acc\u00e8dent \u00e0 l&#8217;objet global &#8220;Cat Request&#8221; et afficher les donn\u00e9es sur l&#8217;application. En cons\u00e9quence, une telle application monolithique est test\u00e9e et publi\u00e9e.<br \/>Tout semble aller bien, mais tout \u00e0 coup, un client appara\u00eet avec l&#8217;obligation d&#8217;ajouter des demandes de chiens \u00e0 l&#8217;application. L\u2019\u00e9quipe commence fr\u00e9n\u00e9tiquement \u00e0 \u00e9valuer combien de composants du syst\u00e8me seront affect\u00e9s par ce changement. A l&#8217;issue de l&#8217;analyse, il s&#8217;av\u00e8re qu&#8217;il faut refaire de 60 \u00e0 90% du code afin d&#8217;apprendre \u00e0 l&#8217;application \u00e0 accepter non seulement &#8220;Request For Cat&#8221; mais aussi &#8220;Demande pour un Chien&#8221;, il est d\u00e9j\u00e0 inutile d&#8217;\u00e9valuer l&#8217;ajout d&#8217;autres animaux \u00e0 ce stade, pour en g\u00e9rer au moins deux.<\/p>\n<h3>Comment emp\u00eacher le singleton<\/h3>\n<p>Tout d&#8217;abord, au stade de la collecte des exigences, indiquez explicitement la n\u00e9cessit\u00e9 de cr\u00e9er une architecture flexible et extensible. Deuxi\u00e8mement, il convient de proc\u00e9der en parall\u00e8le \u00e0 un examen ind\u00e9pendant du code du produit, avec une recherche obligatoire des points faibles. Si vous \u00eates d\u00e9veloppeur et que vous aimez les singletons, alors je vous sugg\u00e8re de reprendre vos esprits avant qu&#8217;il ne soit trop tard, sinon les nuits blanches et les nerfs \u00e0 vif sont garantis. Si vous travaillez sur un projet existant comportant de nombreux singletons, essayez de vous en d\u00e9barrasser le plus rapidement possible, ainsi que du projet.<br \/>Vous devez passer de l&#8217;<em>anti-mod\u00e8le d&#8217;objets\/variables globaux singletons<\/em> \u00e0 l&#8217;injection de d\u00e9pendances &#8211; le mod\u00e8le de conception le plus simple dans lequel toutes les donn\u00e9es n\u00e9cessaires sont fournies \u00e0 une instance d&#8217;une classe au stade de l&#8217;initialisation, sans qu&#8217;il soit n\u00e9cessaire de les lier \u00e0 l&#8217;espace global.<\/p>\n<h3>Sources<\/h3>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/137975\/what-is-so-bad-about-singletons\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/stackoverflow. com\/questions\/137975\/what-is-so-bad-about-singletons<\/a><br \/><a href=\"http:\/\/misko.hevery.com\/2008\/08\/17\/singletons-are-pathological-liars\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/misko.hevery.com\/2008\/08\/17\/singletons-are-pathological-liars\/<\/a><br \/>\n<a href=\"https:\/\/blog.ndepend.com\/singleton-pattern-costs\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/blog.ndepend.com\/singleton-pattern-costs\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cette note, je d\u00e9crirai mon exp\u00e9rience et celle de mes coll\u00e8gues lorsque j&#8217;ai travaill\u00e9 avec le mod\u00e8le Singleton (Singleton dans la litt\u00e9rature \u00e9trang\u00e8re), tout en travaillant sur divers projets (r\u00e9ussis et moins r\u00e9ussis). Je d\u00e9crirai pourquoi je pense personnellement que ce mod\u00e8le ne peut \u00eatre utilis\u00e9 nulle part, et je d\u00e9crirai \u00e9galement quels facteurs<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2019\/04\/05\/the-good-the-bad-and-the-ugly-singleton\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Le Bon, la Brute et le Truand Singleton&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[49,52],"tags":[96,95,97],"class_list":["post-1705","post","type-post","status-publish","format-standard","hentry","category-blog","category-tutorials","tag-antipatterns","tag-patterns","tag-singleton","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=1705"}],"version-history":[{"count":43,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1705\/revisions"}],"predecessor-version":[{"id":3962,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1705\/revisions\/3962"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=1705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=1705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=1705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}