{"id":9088,"date":"2023-11-02T11:42:07","date_gmt":"2023-11-02T14:42:07","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=9088"},"modified":"2023-12-27T09:02:13","modified_gmt":"2023-12-27T12:02:13","slug":"os-patterns-que-voce-domina-define-os-problemas-que-voce-consegue-resolver","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/os-patterns-que-voce-domina-define-os-problemas-que-voce-consegue-resolver\/","title":{"rendered":"Os patterns que voce\u0302 domina define os problemas que voce\u0302 consegue resolver"},"content":{"rendered":"\n<p>\u00c0s vezes, somos confrontados com desafios t\u00e9cnicos que parecem um verdadeiro cabo de guerra entre eleg\u00e2ncia e desempenho. Voc\u00ea j\u00e1 se viu nessa situa\u00e7\u00e3o? Quer se trate de avaliar express\u00f5es matem\u00e1ticas complexas ou de construir sistemas altamente eficientes, os <em>design patterns<\/em> s\u00e3o solu\u00e7\u00f5es poderosas para problemas de projeto que se repetem em diversos contextos, facilitando o desenvolvimento de software robusto e manuten\u00edvel.<\/p>\n\n\n\n<p>O padr\u00e3o <em>Visitor<\/em> \u00e9 sobejamente potente para resolver dilemas como a dualidade entre c\u00f3digo elegante e perform\u00e1tico. Mas, quando ser\u00e1 que o uso deste padr\u00e3o n\u00e3o \u00e9 a escolha ideal? Vamos mergulhar um pouco mais nesse t\u00f3pico.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entendendo o Visitor e Suas Limita\u00e7\u00f5es<\/h2>\n\n\n\n<p>O padr\u00e3o <em>Visitor<\/em> permite adicionar novas opera\u00e7\u00f5es a objetos sem necessidade de modificar suas classes. Isso \u00e9 particularmente \u00fatil em estruturas compostas, como \u00e1rvores sint\u00e1ticas de express\u00f5es matem\u00e1ticas. No entanto, esse padr\u00e3o tem suas limita\u00e7\u00f5es. Por exemplo, ele pode se tornar problem\u00e1tico em situa\u00e7\u00f5es onde a estrutura de dados est\u00e1 em constante mudan\u00e7a, pois cada altera\u00e7\u00e3o pode exigir uma revis\u00e3o em cada <em>visitor <\/em>criado.<\/p>\n\n\n\n<p>Al\u00e9m disso, o uso excessivo deste padr\u00e3o em situa\u00e7\u00f5es que requerem apenas opera\u00e7\u00f5es simples pode levar a uma complexidade desnecess\u00e1ria e a um c\u00f3digo exageradamente burocr\u00e1tico. Portanto, \u00e9 importante balancear sua aplica\u00e7\u00e3o e considerar alternativas, como padr\u00f5es <em>Strategy<\/em> ou <em>Command<\/em>, que podem ser mais adequados para determinadas situa\u00e7\u00f5es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementando Visitor em C#<\/h2>\n\n\n\n<p>A implementa\u00e7\u00e3o de <em>Visitor<\/em> em C# pode ser uma demonstra\u00e7\u00e3o de como separar algoritmos dos objetos que os executam. Contudo, vamos ampliar a vis\u00e3o com um exemplo um pouco mais detalhado:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ ... [C\u00f3digo anterior simplificado] ...\n\npublic class ExpressionOptimizer : IExpressionVisitor\n{\n   public void Visit(Literal literal)\n   {\n       \/\/ Otimiza\u00e7\u00f5es espec\u00edficas para literais, se necess\u00e1rio\n   }\n\n\n   public void Visit(Addition addition)\n   {\n       \/\/ Otimiza\u00e7\u00f5es espec\u00edficas para soma, como simplifica\u00e7\u00e3o de express\u00f5es\n   }\n\n\n   \/\/ Implementa\u00e7\u00f5es adicionais para otimiza\u00e7\u00f5es nos m\u00e9todos Visit.\n}\n\n\n\/\/ ... [C\u00f3digo anterior simplificado] ...\n\n\n\/\/ Aplica\u00e7\u00e3o do Visitor para otimiza\u00e7\u00e3o:\nvar expression = new Addition(new Literal(1), new Literal(2));\nvar optimizer = new ExpressionOptimizer();\nexpression.Accept(optimizer);\n\n\/\/ Fonte: ChatGPT\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ ... [C\u00f3digo anterior simplificado] ...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ExpressionOptimizer<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> IExpressionVisitor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Visit<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Literal literal<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">       <\/span><span style=\"color: #616E88\">\/\/ Otimiza\u00e7\u00f5es espec\u00edficas para literais, se necess\u00e1rio<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Visit<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Addition addition<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">       <\/span><span style=\"color: #616E88\">\/\/ Otimiza\u00e7\u00f5es espec\u00edficas para soma, como simplifica\u00e7\u00e3o de express\u00f5es<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">   <\/span><span style=\"color: #616E88\">\/\/ Implementa\u00e7\u00f5es adicionais para otimiza\u00e7\u00f5es nos m\u00e9todos Visit.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ ... [C\u00f3digo anterior simplificado] ...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Aplica\u00e7\u00e3o do Visitor para otimiza\u00e7\u00e3o:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> expression <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Addition<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Literal<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">),<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Literal<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">2<\/span><span style=\"color: #ECEFF4\">))<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> optimizer <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> ExpressionOptimizer<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">expression<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Accept<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">optimizer<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Fonte: ChatGPT<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Ao apresentar um <em>visitor <\/em>dedicado \u00e0 otimiza\u00e7\u00e3o de express\u00f5es, demonstramos como o padr\u00e3o pode ser expandido. Considere que, em um ambiente real, cada tipo de node em nossa \u00e1rvore de express\u00f5es poderia requerer uma otimiza\u00e7\u00e3o diferente, o <em>Visitor<\/em> nos permite adicionar essa l\u00f3gica sem alterar os nodes j\u00e1 existentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>O dom\u00ednio do padr\u00e3o <em>Visitor<\/em> expande sua caixa de ferramentas e, com ela, a gama de problemas que voc\u00ea \u00e9 capaz de solucionar. Contudo, \u00e9 igualmente crucial reconhecer suas limita\u00e7\u00f5es e n\u00e3o aplic\u00e1-lo indiscriminadamente. Em cen\u00e1rios onde a estrutura de dados \u00e9 vol\u00e1til ou as opera\u00e7\u00f5es s\u00e3o triviais, outras abordagens podem ser mais adequadas. E lembre-se: a introspec\u00e7\u00e3o sobre esses aspectos \u00e9 essencial. J\u00e1 aplicou o <em>Visitor<\/em> quando n\u00e3o deveria? Que aprendizado isso trouxe?<\/p>\n\n\n\n<p>O di\u00e1logo sobre <em>Design Patterns<\/em> e suas aplica\u00e7\u00f5es pr\u00e1ticas, vantagens e limita\u00e7\u00f5es, \u00e9 um tema constante em meus grupos de estudos e mentorias. Atrav\u00e9s deles, compartilhamos experi\u00eancias e aprofundamos o conhecimento sobre quando e como implementar essas poderosas abordagens de projeto de software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>O padr\u00e3o <em>Visitor<\/em> facilita a adi\u00e7\u00e3o de novas opera\u00e7\u00f5es a objetos sem alterar suas classes, ideal para estruturas de dados compostas, mas pode ser inadequado para estruturas em constante altera\u00e7\u00e3o.<\/li>\n\n\n\n<li>O <em>Visitor<\/em> pode introduzir complexidade desnecess\u00e1ria se usado em excesso ou em opera\u00e7\u00f5es simples, sendo importante considerar padr\u00f5es alternativos.<\/li>\n\n\n\n<li>A compreens\u00e3o dos <em>Design Patterns<\/em>, seu uso efetivo e as limita\u00e7\u00f5es associadas enriquecem grandemente a capacidade de resolver problemas e evoluir sistemas de software.<\/li>\n<\/ol>\n","protected":false},"featured_media":9236,"parent":0,"template":"","cursos":[7],"class_list":["post-9088","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-gof"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/9088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/9236"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=9088"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=9088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}