{"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\/pt\/2019\/04\/05\/the-good-the-bad-and-the-ugly-singleton\/","title":{"rendered":"O bom, o mau e o feio Singleton"},"content":{"rendered":"<p>Nesta nota descreverei minha experi\u00eancia e a experi\u00eancia de meus colegas ao trabalhar com o padr\u00e3o Singleton (Singleton na literatura estrangeira), enquanto trabalhava em v\u00e1rios projetos (bem-sucedidos e n\u00e3o t\u00e3o bem-sucedidos). Descreverei por que pessoalmente acho que esse padr\u00e3o n\u00e3o pode ser usado em lugar nenhum e tamb\u00e9m descreverei quais fatores psicol\u00f3gicos na equipe influenciam a integra\u00e7\u00e3o desse antipadr\u00e3o. Dedicado a todos os desenvolvedores ca\u00eddos e aleijados que estavam tentando entender por que tudo come\u00e7ou com um dos membros da equipe trazendo um cachorrinho fofo, f\u00e1cil de manusear, que n\u00e3o requer cuidados e conhecimentos especiais para cuidar dele, e terminou com a fera criada tomar seu projeto como ref\u00e9m, requer cada vez mais horas de trabalho e consome os nervos do usu\u00e1rio, seu dinheiro e cria n\u00fameros absolutamente monstruosos para avaliar a implementa\u00e7\u00e3o de coisas aparentemente simples coisas.<\/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>A hist\u00f3ria se passa em um universo alternativo, todas as coincid\u00eancias s\u00e3o aleat\u00f3rias&#8230;<\/em><\/p>\n<h3>Acaricie o gato em casa com Cat@Home<\/h3>\n<p>Toda pessoa \u00e0s vezes na vida tem um desejo irresist\u00edvel de acariciar um gato. Analistas de todo o mundo prev\u00eaem que a primeira startup que criou um aplicativo para entrega e aluguel de gatos se tornar\u00e1 extremamente popular e em um futuro pr\u00f3ximo ser\u00e1 comprada pelo <strong>Moogle<\/strong> por trilh\u00f5es de d\u00f3lares. Logo isso acontece &#8211; um cara de Tyumen cria o aplicativo <strong>Cat@Home<\/strong> e logo se torna um trilion\u00e1rio, a empresa <strong>Moogle<\/strong> obt\u00e9m uma nova fonte de lucro e milh\u00f5es de pessoas estressadas t\u00eam a oportunidade de pe\u00e7a um gato para sua casa para passar mais roupas e se acalmar.<\/p>\n<h3>Ataque dos Clones<\/h3>\n<p>Um dentista extremamente rico de Murmansk, Alexey Goloborodko, impressionado com um artigo sobre Cat@Home da Forbes, decide que tamb\u00e9m quer ser astronomicamente rico. Para atingir esse objetivo, atrav\u00e9s de seus amigos, ele encontra uma empresa de Goldfield &#8211; que \u00e9 a cidade de Goldfield. Wakeboard DevPops, que fornece servi\u00e7os de desenvolvimento de software, encomenda a eles o desenvolvimento de um clone Cat@Home.<\/p>\n<h3>Time vencedor<\/h3>\n<p>O projeto se chama Fur&#038;Pure, confiado a uma talentosa equipe de desenvolvimento de 20 pessoas; A seguir, vamos nos concentrar em uma equipe de desenvolvimento m\u00f3vel de 5 pessoas. Cada membro da equipe recebe sua parte do trabalho, munido de \u00e1gil e scrum, a equipe conclui o desenvolvimento no prazo (em seis meses), sem bugs, lan\u00e7a o aplicativo na iStore, onde \u00e9 avaliado em 5 por 100.000 usu\u00e1rios, h\u00e1 muitos coment\u00e1rios sobre o qu\u00e3o bom \u00e9 o aplicativo, qu\u00e3o excelente \u00e9 o servi\u00e7o (afinal, universo alternativo). Os gatos est\u00e3o passados, o aplicativo est\u00e1 liberado, tudo parece estar indo bem. Por\u00e9m, Moogle n\u00e3o tem pressa em comprar uma startup por trilh\u00f5es de d\u00f3lares, porque n\u00e3o s\u00f3 gatos, mas tamb\u00e9m cachorros j\u00e1 apareceram no Cat@Home.<\/p>\n<h3>O cachorro late, a caravana segue em frente<\/h3>\n<p>O propriet\u00e1rio do aplicativo decide que \u00e9 hora de adicionar c\u00e3es ao aplicativo, solicita uma avalia\u00e7\u00e3o \u00e0 empresa e recebe aproximadamente <strong>pelo menos seis meses para adicionar c\u00e3es ao aplicativo. Na verdade, o aplicativo ser\u00e1 escrito do zero novamente. Durante esse per\u00edodo, o Moogle adicionar\u00e1 cobras, aranhas e porquinhos-da-\u00edndia ao aplicativo, e o Fur&#038;Pur receber\u00e1 apenas c\u00e3es.<br \/>Por que isso aconteceu? A falta de arquitetura de aplica\u00e7\u00e3o flex\u00edvel \u00e9 a culpada por tudo; um dos fatores mais comuns \u00e9 o antipadr\u00e3o <strong>Singleton<\/strong>.<\/p>\n<h3>O que h\u00e1 de errado?<\/h3>\n<p>Para encomendar um gato em casa o consumidor precisa criar um pedido e encaminh\u00e1-lo para o escrit\u00f3rio, onde o escrit\u00f3rio ir\u00e1 process\u00e1-lo e enviar um entregador com o gato, o entregador j\u00e1 receber\u00e1 o pagamento pelo servi\u00e7o. <br \/>Um dos programadores decide criar uma classe &#8220;Cat Application&#8221; com os campos necess\u00e1rios, traz esta classe para o espa\u00e7o global da aplica\u00e7\u00e3o atrav\u00e9s de um <strong>singleton<\/strong>. Por que ele est\u00e1 fazendo isso? Para economizar tempo (economizando meia hora), porque \u00e9 mais f\u00e1cil tornar um aplicativo p\u00fablico do que pensar na arquitetura do aplicativo e usar inje\u00e7\u00e3o de depend\u00eancia. Ent\u00e3o outros desenvolvedores pegam esse objeto global e vinculam suas classes a ele. <\/strong>Por exemplo, todas as telas acessam o objeto global &#8220;Cat Request&#8221; e mostrar dados do aplicativo. Como resultado, esse aplicativo monol\u00edtico \u00e9 testado e lan\u00e7ado.<br \/>Tudo parece estar bem, mas de repente aparece um cliente com a necessidade de adicionar solicita\u00e7\u00f5es de c\u00e3es ao aplicativo. A equipe come\u00e7a a avaliar freneticamente quantos componentes do sistema ser\u00e3o afetados por essa mudan\u00e7a. Ao final da an\u00e1lise, verifica-se que \u00e9 necess\u00e1rio refazer de 60 a 90% do c\u00f3digo para ensinar a aplica\u00e7\u00e3o a aceitar n\u00e3o apenas &#8220;Request For Cat&#8221; mas tamb\u00e9m &#8220;Pedido de Cachorro&#8221;, j\u00e1 \u00e9 in\u00fatil avaliar a adi\u00e7\u00e3o de outros animais nesta fase, para dar conta de pelo menos dois.<\/p>\n<h3>Como prevenir o singleton<\/h3>\n<p>Primeiro, na fase de levantamento de requisitos, indique explicitamente a necessidade de criar uma arquitetura flex\u00edvel e extens\u00edvel. Em segundo lugar, vale a pena realizar uma revis\u00e3o independente do c\u00f3digo do produto paralelamente, com pesquisa obrigat\u00f3ria dos pontos fracos. Se voc\u00ea \u00e9 um desenvolvedor e adora singletons, sugiro que recupere o ju\u00edzo antes que seja tarde demais, caso contr\u00e1rio, noites sem dormir e nervos em frangalhos ser\u00e3o garantidos. Se voc\u00ea estiver trabalhando em um projeto legado que possui muitos singletons, tente se livrar deles ou do projeto o mais r\u00e1pido poss\u00edvel.<br \/>Voc\u00ea precisa mudar do <em>antipadr\u00e3o de objetos\/vari\u00e1veis \u200b\u200bglobais singletons<\/em> para inje\u00e7\u00e3o de depend\u00eancia &#8211; o padr\u00e3o de design mais simples no qual todos os dados necess\u00e1rios s\u00e3o fornecidos a uma inst\u00e2ncia de uma classe no est\u00e1gio de inicializa\u00e7\u00e3o, sem necessidade adicional de serem vinculados ao espa\u00e7o global.<\/p>\n<h3>Fontes<\/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>Nesta nota descreverei minha experi\u00eancia e a experi\u00eancia de meus colegas ao trabalhar com o padr\u00e3o Singleton (Singleton na literatura estrangeira), enquanto trabalhava em v\u00e1rios projetos (bem-sucedidos e n\u00e3o t\u00e3o bem-sucedidos). Descreverei por que pessoalmente acho que esse padr\u00e3o n\u00e3o pode ser usado em lugar nenhum e tamb\u00e9m descreverei quais fatores psicol\u00f3gicos na equipe influenciam<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2019\/04\/05\/the-good-the-bad-and-the-ugly-singleton\/\">Continue reading <span class=\"screen-reader-text\">&#8220;O bom, o mau e o feio 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":"pt","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\/pt\/wp-json\/wp\/v2\/posts\/1705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1705"}],"version-history":[{"count":43,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1705\/revisions"}],"predecessor-version":[{"id":3962,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1705\/revisions\/3962"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}