{"id":2872,"date":"2021-01-08T19:02:22","date_gmt":"2021-01-08T16:02:22","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2872"},"modified":"2024-12-16T22:32:25","modified_gmt":"2024-12-16T19:32:25","slug":"%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%bd%d0%b5-%d0%bf%d0%be%d0%bf%d0%b0%d0%bb-%d0%b2-%d0%bc%d1%83%d0%b6%d0%b8%d0%ba%d0%b0-%d0%bd%d0%b5-%d1%88%d0%b5%d1%81%d1%82%d0%b5-%d0%b8%d0%bb%d0%b8-%d0%b8%d1%81%d1%82","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2021\/01\/08\/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%bd%d0%b5-%d0%bf%d0%be%d0%bf%d0%b0%d0%bb-%d0%b2-%d0%bc%d1%83%d0%b6%d0%b8%d0%ba%d0%b0-%d0%bd%d0%b5-%d1%88%d0%b5%d1%81%d1%82%d0%b5-%d0%b8%d0%bb%d0%b8-%d0%b8%d1%81%d1%82\/","title":{"rendered":"Comment j&#8217;ai rat\u00e9 le gars sur le poteau ou une histoire d&#8217;ing\u00e9niosit\u00e9 incroyable"},"content":{"rendered":"<p>Dans cette note, j&#8217;\u00e9crirai sur l&#8217;importance des d\u00e9cisions architecturales lors du d\u00e9veloppement, de la prise en charge d&#8217;une application et dans un environnement de d\u00e9veloppement en \u00e9quipe.<\/p>\n<p><a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Rube_Goldberg%27s_%22Self-Operating_Napkin%22_(cropped).gif\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Rube_Goldberg%27s_%22Self-Operating_Napkin%22_%28cropped%29.gif\" alt=\"\" \/><\/a><\/p>\n<p><a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Rube_Goldberg%27s_%22Self-Operating_Napkin%22_(cropped).gif\" target=\"_blank\" rel=\"noopener\">Auto- serviette d&#8217;op\u00e9ration Professeur Lucifer Gorgonzola. Rub\u00e9 Goldberg<\/a><\/p>\n<p>Dans ma jeunesse, j&#8217;ai travaill\u00e9 sur une application de commande de taxi. Dans le programme, vous pouvez s\u00e9lectionner un point de prise en charge, un point de d\u00e9p\u00f4t, calculer le co\u00fbt du trajet, le type de tarif et, effectivement, commander un taxi. J&#8217;ai re\u00e7u l&#8217;application lors de la derni\u00e8re \u00e9tape du pr\u00e9-lancement ; apr\u00e8s avoir ajout\u00e9 plusieurs correctifs, l&#8217;application a \u00e9t\u00e9 publi\u00e9e dans l&#8217;AppStore. D\u00e9j\u00e0 \u00e0 ce stade, toute l&#8217;\u00e9quipe a compris qu&#8217;il \u00e9tait tr\u00e8s mal impl\u00e9ment\u00e9, que les mod\u00e8les de conception n&#8217;\u00e9taient pas utilis\u00e9s, que tous les composants du syst\u00e8me \u00e9taient \u00e9troitement li\u00e9s, en g\u00e9n\u00e9ral, il \u00e9tait possible de l&#8217;\u00e9crire dans une grande classe continue (objet Dieu), rien n&#8217;aurait chang\u00e9, de m\u00eame la mani\u00e8re dont les classes ont m\u00e9lang\u00e9 leurs fronti\u00e8res de responsabilit\u00e9 et, dans leur masse totale, se sont superpos\u00e9es dans un couplage mort. Plus tard, la direction a d\u00e9cid\u00e9 d&#8217;\u00e9crire l&#8217;application \u00e0 partir de z\u00e9ro, en utilisant la bonne architecture, ce qui a \u00e9t\u00e9 fait et le produit final a \u00e9t\u00e9 impl\u00e9ment\u00e9 chez plusieurs dizaines de clients B2B.<\/p>\n<p>Cependant, je vais d\u00e9crire un curieux incident de l&#8217;architecture pass\u00e9e, dont je me r\u00e9veille parfois avec des sueurs froides au milieu de la nuit, ou dont je me souviens soudainement au milieu de la journ\u00e9e et me mets \u00e0 rire hyst\u00e9riquement. Le probl\u00e8me, c&#8217;est que je n&#8217;ai pas r\u00e9ussi \u00e0 frapper le gars sur le poteau du premier coup, ce qui a fait \u00e9chouer la plupart des applications, mais avant tout.<\/p>\n<p>C&#8217;\u00e9tait une journ\u00e9e de travail ordinaire, l&#8217;un des clients a re\u00e7u pour t\u00e2che d&#8217;affiner l\u00e9g\u00e8rement la conception de l&#8217;application &#8211; Il est simple de d\u00e9placer l\u2019ic\u00f4ne au centre de l\u2019\u00e9cran de s\u00e9lection de l\u2019adresse de retrait de quelques pixels. Eh bien, apr\u00e8s avoir professionnellement estim\u00e9 la t\u00e2che \u00e0 10 minutes, j&#8217;ai \u00e9lev\u00e9 l&#8217;ic\u00f4ne de 20 pixels, ne me doutant absolument de rien, j&#8217;ai d\u00e9cid\u00e9 de v\u00e9rifier la commande de taxi.<\/p>\n<p>Quoi\u00a0? L&#8217;application n&#8217;affiche plus le bouton de commande ? Comment est-ce arriv\u00e9\u00a0?<\/p>\n<p>Je n&#8217;en croyais pas mes yeux\u00a0; apr\u00e8s avoir augment\u00e9 l&#8217;ic\u00f4ne de 20 pixels, l&#8217;application a cess\u00e9 d&#8217;afficher le bouton Continuer la commande. Apr\u00e8s avoir annul\u00e9 le changement, j&#8217;ai revu le bouton. Quelque chose n\u2019allait pas ici. Apr\u00e8s avoir pass\u00e9 20 minutes dans le d\u00e9bogueur, j&#8217;en avais un peu marre de d\u00e9rouler les spaghettis d&#8217;appels \u00e0 des classes qui se chevauchent, mais j&#8217;ai d\u00e9couvert que *d\u00e9placer l&#8217;image change vraiment la logique de l&#8217;application*<\/p>\n<p>Tout \u00e9tait question de l&#8217;ic\u00f4ne au centre &#8211; un homme sur un poteau, en d\u00e9pla\u00e7ant la carte il sautait pour animer le mouvement de la cam\u00e9ra, cette animation \u00e9tait suivie de la disparition du bouton en bas. Apparemment, le programme pensait que l&#8217;homme d\u00e9cal\u00e9 de 20 pixels \u00e9tait en train de sauter, donc selon sa logique interne, il a cach\u00e9 le bouton de confirmation.<\/p>\n<p>Comment cela peut-il arriver\u00a0? L&#8217;*\u00e9tat* de l&#8217;\u00e9cran ne d\u00e9pend-il vraiment pas du mod\u00e8le de la machine \u00e0 \u00e9tats, mais de la *repr\u00e9sentation* de la position de l&#8217;homme sur le poteau\u00a0?<\/p>\n<p>Il s&#8217;est av\u00e9r\u00e9 que chaque fois que la carte est dessin\u00e9e, l&#8217;application *<a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiview\/1622469-hittest?langage=objc\" target=\" _blank\" rel= \"noopener\">a pouss\u00e9 visuellement<\/a>* au milieu de l&#8217;\u00e9cran et a v\u00e9rifi\u00e9 ce qu&#8217;il y avait l\u00e0, s&#8217;il y a un homme sur un poteau, cela signifie que l&#8217;animation de changement de carte est termin\u00e9e et doit \u00eatre affich\u00e9e bouton. Si l&#8217;homme n&#8217;est pas l\u00e0, alors la carte est d\u00e9cal\u00e9e et le bouton doit \u00eatre masqu\u00e9.<\/p>\n<p>Dans l&#8217;exemple ci-dessus, tout va bien, d&#8217;une part, c&#8217;est un exemple de machines Goldberg (machines abscons), et d&#8217;autre part, un exemple de la r\u00e9ticence du d\u00e9veloppeur \u00e0 interagir d&#8217;une mani\u00e8re ou d&#8217;une autre avec d&#8217;autres d\u00e9veloppeurs de l&#8217;\u00e9quipe (essayez de le comprendre sans moi), troisi\u00e8mement, vous pouvez lister tous les probl\u00e8mes selon SOLID, les mod\u00e8les (odeurs de code), les violations MVC et bien plus encore.<\/p>\n<p>Essayez de ne pas faire cela, d\u00e9veloppez-vous dans toutes les directions possibles, aidez vos coll\u00e8gues dans leur travail. Bonne ann\u00e9e \u00e0 tous)<\/p>\n<h3>Liens<\/h3>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Goldberg_Machine\" target=\"_blank\" rel=\"noopener\">https:\/\/ru.wikipedia.org\/wiki\/Goldberg_Machine<\/a> <\/p>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener\">https:\/\/ru.wikipedia.org\/wiki\/SOLID<\/a> <\/p>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/refactoring\/smells\" target=\"_blank\" rel=\"noopener\">https:\/\/refactoring.guru\/ru\/refactoring\/smells<\/a> <\/p>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/Model-View-Controller\" target=\"_blank\" rel=\"noopener\">https:\/\/ru.wikipedia.org\/wiki\/Model -View-Controller<\/a><\/p>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/state\" target=\"_blank\" rel=\"noopener\">https:\/\/refactoring.guru\/ru\/design-patterns\/state <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cette note, j&#8217;\u00e9crirai sur l&#8217;importance des d\u00e9cisions architecturales lors du d\u00e9veloppement, de la prise en charge d&#8217;une application et dans un environnement de d\u00e9veloppement en \u00e9quipe. Auto- serviette d&#8217;op\u00e9ration Professeur Lucifer Gorgonzola. Rub\u00e9 Goldberg Dans ma jeunesse, j&#8217;ai travaill\u00e9 sur une application de commande de taxi. Dans le programme, vous pouvez s\u00e9lectionner un point<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2021\/01\/08\/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%bd%d0%b5-%d0%bf%d0%be%d0%bf%d0%b0%d0%bb-%d0%b2-%d0%bc%d1%83%d0%b6%d0%b8%d0%ba%d0%b0-%d0%bd%d0%b5-%d1%88%d0%b5%d1%81%d1%82%d0%b5-%d0%b8%d0%bb%d0%b8-%d0%b8%d1%81%d1%82\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Comment j&#8217;ai rat\u00e9 le gars sur le poteau ou une histoire d&#8217;ing\u00e9niosit\u00e9 incroyable&#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":[61,52],"tags":[171,95,170],"class_list":["post-2872","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-bugs","tag-patterns","tag-software-architecture","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"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}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2872","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=2872"}],"version-history":[{"count":23,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2872\/revisions"}],"predecessor-version":[{"id":3902,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2872\/revisions\/3902"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=2872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=2872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=2872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}