{"id":2320,"date":"2019-11-04T13:29:54","date_gmt":"2019-11-04T10:29:54","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2320"},"modified":"2024-12-16T22:32:32","modified_gmt":"2024-12-16T19:32:32","slug":"command-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2019\/11\/04\/command-pattern\/","title":{"rendered":"Comando Padr\u00e3o"},"content":{"rendered":"<p><a href=\"https:\/\/pixabay.com\/illustrations\/vegan-go-vegan-compassion-sign-1343429\/\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2327\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/govegan.png\" alt=\"\" width=\"400\" height=\"260\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/govegan.png 400w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/govegan-300x195.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>Padr\u00e3o de comando refere-se a padr\u00f5es de design comportamentais.<\/p>\n<p>Esse \u00e9 o padr\u00e3o que estou preso h\u00e1 muito tempo, \u00e9 t\u00e3o simples que \u00e9 muito complexo. Mas, pessoalmente, acho que a beleza do auto-estudo \u00e9 que voc\u00ea tem todo o tempo do mundo para pesquisar um determinado t\u00f3pico de todos os \u00e2ngulos.<\/p>\n<p>Portanto, no GoF a aplicabilidade \u00e9 descrita de forma bastante sucinta e clara:<br \/><b><i>Encapsula uma solicita\u00e7\u00e3o como um objeto, permitindo parametrizar clientes com diferentes solicita\u00e7\u00f5es, usar filas, registrar solicita\u00e7\u00f5es e realizar opera\u00e7\u00f5es de cancelamento.<\/i><\/b><\/p>\n<p>Agora vamos implementar uma vers\u00e3o simples do comando da descri\u00e7\u00e3o:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>string fakeTrumpsRequest = \u201cSELECT * from Users where name beginsWith DonaldTrump\u201d\n<\/code><\/pre>\n<\/div>\n<p>Encapsulamos a solicita\u00e7\u00e3o em um objeto de classe string, ele pode ser usado para configurar clientes, adicionar comandos \u00e0 fila, registrar, cancelar (usando o padr\u00e3o \u201cSnapshot\u201d)<\/p>\n<p>Parece-me que isso \u00e9 suficiente para realizar consultas SQL e similares, mas h\u00e1 detalhes de implementa\u00e7\u00e3o, diferentes op\u00e7\u00f5es de aplica\u00e7\u00e3o, a base de c\u00f3digo do padr\u00e3o, fun\u00e7\u00f5es de cliente e classes auxiliares tamb\u00e9m s\u00e3o muito diferentes. <\/p>\n<h3>Partes materiais<\/h3>\n<p>O padr\u00e3o <\/p>\n<p>Command come\u00e7a com um <b>protocolo Command<\/b>, que cont\u00e9m um \u00fanico m\u00e9todo <b>execute()<\/b>. Em seguida vem o <b>Comando e Receptor Espec\u00edficos.<\/b> O CC implementa a opera\u00e7\u00e3o no Receptor, descreve a conex\u00e3o entre o Receptor e a a\u00e7\u00e3o. Alguma coisa n\u00e3o est\u00e1 clara? Eu tamb\u00e9m, mas vamos em frente. O <b>Cliente<\/b>cria uma inst\u00e2ncia de um <b>Comando Espec\u00edfico<\/b>, associando-o ao <b>Receptor<\/b>. <b>Invocador<\/b> &#8211; objeto que realiza o processo de lan\u00e7amento de <b>Comandos<\/b>.<\/p>\n<p>Agora vamos tentar descobrir usando um exemplo, digamos que queremos atualizar o myOS no myPhone, para isso iniciamos o aplicativo myOS_Update, nele pressionamos o bot\u00e3o Atualizar Agora! relatar uma atualiza\u00e7\u00e3o bem-sucedida.<\/p>\n<p><b>O cliente <\/b>no exemplo acima \u00e9 o aplicativo myOS_Update, o <b>Invoker<\/b> \u00e9 o bot\u00e3o \u201cAtualizar agora!\u201d b>atualizar o sistema utilizando o m\u00e9todo execute(), que acessa o <b>Receptor<\/b>&#8211; daemon de atualiza\u00e7\u00e3o do sistema operacional.<\/p>\n<h3>Usar exemplo<\/h3>\n<p>Vamos aceitar a UI do aplicativo myOS_Update! t\u00e3o bom que decidiram vend\u00ea-lo como um produto separado para fornecer uma interface para atualiza\u00e7\u00e3o de outros sistemas operacionais. Neste caso implementaremos uma aplica\u00e7\u00e3o com suporte a extens\u00f5es atrav\u00e9s de bibliotecas, nas bibliotecas haver\u00e1 implementa\u00e7\u00f5es de <b>Comandos Espec\u00edficos, Receptores<\/b>, deixaremos o <b>Invoker<\/b> est\u00e1tico\/imut\u00e1vel , <b>Cliente<\/b>, protocolo <b>Comandos<\/b>.<\/p>\n<p>Assim, n\u00e3o h\u00e1 necessidade de suporte a c\u00f3digo mut\u00e1vel, pois nosso c\u00f3digo permanecer\u00e1 inalterado, problemas poder\u00e3o surgir apenas quando implementado no lado do cliente, devido a erros no c\u00f3digo de seus <b>Comandos Espec\u00edficos<\/b> e <b> Receptores<\/b>. Al\u00e9m disso, nesta implementa\u00e7\u00e3o n\u00e3o h\u00e1 necessidade de transferir o c\u00f3digo fonte da aplica\u00e7\u00e3o principal, ou seja, encapsulamos comandos e intera\u00e7\u00f5es UI usando o padr\u00e3o <b>Command<\/b>.<\/p>\n<h3>Fontes<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/command\" target=\"_blank\" rel=\"noopener\">https:\/\/refactoring.guru\/ru\/design-patterns\/command <\/a><br \/><a href=\"https:\/\/www.amazon.com\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612\" target=\"_blank\" rel=\"noopener\">https:\/\/www.amazon.com\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Padr\u00e3o de comando refere-se a padr\u00f5es de design comportamentais. Esse \u00e9 o padr\u00e3o que estou preso h\u00e1 muito tempo, \u00e9 t\u00e3o simples que \u00e9 muito complexo. Mas, pessoalmente, acho que a beleza do auto-estudo \u00e9 que voc\u00ea tem todo o tempo do mundo para pesquisar um determinado t\u00f3pico de todos os \u00e2ngulos. Portanto, no GoF<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2019\/11\/04\/command-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Comando Padr\u00e3o&#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":[127,95],"class_list":["post-2320","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-command","tag-patterns","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\/2320","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=2320"}],"version-history":[{"count":14,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2320\/revisions"}],"predecessor-version":[{"id":3935,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2320\/revisions\/3935"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}