{"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\/pt\/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":"Como senti falta do cara no poste ou de uma hist\u00f3ria sobre uma engenhosidade incr\u00edvel"},"content":{"rendered":"<p>Nesta nota escreverei sobre a import\u00e2ncia das decis\u00f5es arquitet\u00f4nicas ao desenvolver, dar suporte a um aplicativo e em um ambiente de desenvolvimento de equipe.<\/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- guardanapo operacional Professor Lucifer Gorgonzola. Rube Goldberg<\/a><\/p>\n<p>Durante minha juventude, trabalhei em um aplicativo de pedido de t\u00e1xi. No programa voc\u00ea pode selecionar um ponto de coleta, um ponto de entrega, calcular o custo da viagem, o tipo de tarifa e, de fato, pedir um t\u00e1xi. Recebi o aplicativo na \u00faltima etapa de pr\u00e9-lan\u00e7amento, ap\u00f3s adicionar diversas corre\u00e7\u00f5es, o aplicativo foi lan\u00e7ado na AppStore; J\u00e1 nessa fase, toda a equipe entendeu que estava muito mal implementado, n\u00e3o eram utilizados padr\u00f5es de projeto, todos os componentes do sistema estavam intimamente conectados, em geral era poss\u00edvel escrev\u00ea-lo em uma grande classe cont\u00ednua (objeto Deus), nada teria mudado, portanto, a forma como as classes misturavam os seus limites de responsabilidade e, na sua massa total, sobrepunham-se umas \u00e0s outras num acoplamento morto. Posteriormente, a administra\u00e7\u00e3o decidiu escrever a aplica\u00e7\u00e3o do zero, utilizando a arquitetura correta, o que foi feito e o produto final foi implementado para v\u00e1rias dezenas de clientes B2B.<\/p>\n<p>No entanto, descreverei um incidente curioso da arquitetura do passado, do qual \u00e0s vezes acordo suando frio no meio da noite, ou de repente me lembro no meio do dia e come\u00e7o a rir histericamente. O problema \u00e9 que n\u00e3o consegui acertar o cara no poste da primeira vez, e isso derrubou a maior parte do aplicativo, mas o mais importante primeiro.<\/p>\n<p>Era um dia normal de trabalho, um dos clientes recebeu a tarefa de refinar um pouco o design do aplicativo. \u00c9 trivial mover o \u00edcone no centro da tela de sele\u00e7\u00e3o do endere\u00e7o de coleta alguns pixels para cima. Bem, tendo estimado profissionalmente a tarefa em 10 minutos, levantei o \u00edcone 20 pixels para cima, sem suspeitar de nada, resolvi verificar a ordem do t\u00e1xi.<\/p>\n<p>O qu\u00ea? O aplicativo n\u00e3o mostra mais o bot\u00e3o de pedido? Como isso aconteceu?<\/p>\n<p>Eu n\u00e3o conseguia acreditar no que via; depois de aumentar o \u00edcone em 20 pixels, o aplicativo parou de mostrar o bot\u00e3o continuar pedido. Depois de reverter a altera\u00e7\u00e3o, vi o bot\u00e3o novamente. Algo estava errado aqui. Depois de passar 20 minutos no depurador, fiquei um pouco cansado de desenrolar o espaguete de chamadas para classes sobrepostas, mas descobri que *mover a imagem realmente muda a l\u00f3gica da aplica\u00e7\u00e3o*<\/p>\n<p>Tudo girava em torno do \u00edcone no centro &#8211; um homem em um poste, ao movimentar a carta ele pulou para animar o movimento da c\u00e2mera, essa anima\u00e7\u00e3o foi seguida pelo desaparecimento do bot\u00e3o na parte inferior. Aparentemente o programa pensou que o homem deslocado em 20 pixels estava pulando, ent\u00e3o de acordo com sua l\u00f3gica interna ele escondeu o bot\u00e3o de confirma\u00e7\u00e3o.<\/p>\n<p>Como isso pode acontecer? Ser\u00e1 que o *estado* da tela realmente n\u00e3o depende do padr\u00e3o da m\u00e1quina de estado, mas da *representa\u00e7\u00e3o* da posi\u00e7\u00e3o do homem no mastro?<\/p>\n<p>Acontece que assim, toda vez que o mapa \u00e9 desenhado, o aplicativo *<a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiview\/1622469-hittest?language=objc\" target=\" _blank\" rel= \"noopener\">cutucou visualmente<\/a>* no meio da tela e verificou o que estava l\u00e1, se houver um homem em um poste, significa que a anima\u00e7\u00e3o de mudan\u00e7a do mapa terminou e precisa ser mostrada bot\u00e3o. Se o homem n\u00e3o estiver l\u00e1, o mapa ser\u00e1 deslocado e o bot\u00e3o dever\u00e1 ser ocultado.<\/p>\n<p>No exemplo acima, est\u00e1 tudo bem, em primeiro lugar, \u00e9 um exemplo de M\u00e1quinas Goldberg (m\u00e1quinas obscuras), em segundo lugar, um exemplo da relut\u00e2ncia do desenvolvedor em interagir de alguma forma com outros desenvolvedores da equipe (tente descobrir sem eu), em terceiro lugar, voc\u00ea pode listar todos os problemas de acordo com o SOLID, padr\u00f5es (cheiros de c\u00f3digo), viola\u00e7\u00f5es de MVC e muito mais.<\/p>\n<p>Tente n\u00e3o fazer isso, desenvolva-se em todas as dire\u00e7\u00f5es poss\u00edveis, ajude seus colegas no trabalho. Feliz Ano Novo a todos)<\/p>\n<h3>Links<\/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>Nesta nota escreverei sobre a import\u00e2ncia das decis\u00f5es arquitet\u00f4nicas ao desenvolver, dar suporte a um aplicativo e em um ambiente de desenvolvimento de equipe. Auto- guardanapo operacional Professor Lucifer Gorgonzola. Rube Goldberg Durante minha juventude, trabalhei em um aplicativo de pedido de t\u00e1xi. No programa voc\u00ea pode selecionar um ponto de coleta, um ponto de<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/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;Como senti falta do cara no poste ou de uma hist\u00f3ria sobre uma engenhosidade incr\u00edvel&#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":"pt","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\/pt\/wp-json\/wp\/v2\/posts\/2872","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=2872"}],"version-history":[{"count":23,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2872\/revisions"}],"predecessor-version":[{"id":3902,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2872\/revisions\/3902"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}