{"id":10056,"date":"2023-12-12T11:39:25","date_gmt":"2023-12-12T14:39:25","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=10056"},"modified":"2023-12-26T09:51:45","modified_gmt":"2023-12-26T12:51:45","slug":"nao-adote-um-padrao-sem-um-motivo-razoavel","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/nao-adote-um-padrao-sem-um-motivo-razoavel\/","title":{"rendered":"N\u00e3o Adote um Padr\u00e3o sem um Motivo Razo\u00e1vel"},"content":{"rendered":"\n<p>Padr\u00f5es de projeto, ou <em>Design Patterns<\/em>, t\u00eam um lugar especial na caixa de ferramentas de qualquer desenvolvedor de software. Mas, como especialista na \u00e1rea, eu diria que \u00e9 crucial exercer discernimento na escolha de um padr\u00e3o. Voc\u00ea j\u00e1 se deparou com um c\u00f3digo sobrecarregado de padr\u00f5es aplicados sem necessidade? Eu j\u00e1 vi muitos e sei o quanto isso pode complicar o que deveria ser simples.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Ess\u00eancia dos Padr\u00f5es de Projeto<\/h2>\n\n\n\n<p>\u00c9 fundamental reconhecer que um padr\u00e3o de projeto \u00e9 uma resposta consagrada a problemas comuns de desenvolvimento de software. Eles s\u00e3o destilados de experi\u00eancias acumuladas ao longo dos anos e s\u00e3o valiosos, desde que aplicados com o devido crit\u00e9rio.<\/p>\n\n\n\n<p>Os padr\u00f5es que usamos hoje foram em grande parte influenciados pela obra seminal &#8220;Design Patterns: Elements of Reusable Object-Oriented Software&#8221;, publicada pela &#8220;Gangue dos Quatro&#8221;. Esse grupo definiu 23 padr\u00f5es que moldaram a maneira como pensamos solu\u00e7\u00f5es em engenharia de software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quando Aplicar um Padr\u00e3o de Projeto<\/h2>\n\n\n\n<p>A quest\u00e3o crucial \u00e9: estamos aplicando um padr\u00e3o porque ele \u00e9 realmente necess\u00e1rio ou porque parece uma solu\u00e7\u00e3o inteligente? N\u00e3o \u00e9 raro que desenvolvedores, \u00e0s vezes, escolham um padr\u00e3o sem um prop\u00f3sito claro. Certifique-se de que h\u00e1 um problema real que demanda a solu\u00e7\u00e3o que o padr\u00e3o oferece.<\/p>\n\n\n\n<p>Por exemplo, o famoso <em>Singleton<\/em> pode ser \u00fatil se precisamos de uma \u00fanica inst\u00e2ncia controlada de uma classe. Mas pergunte-se: tenho essa necessidade espec\u00edfica ou estou complicando o que poderia ser uma simples inst\u00e2ncia gerenciada de outra forma?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Armadilha da Complexidade Injustificada<\/h2>\n\n\n\n<p>A sobre-engenharia \u00e9 uma falha tanto quanto a sub-engenharia. Imagine a introdu\u00e7\u00e3o de um <em>Factory Method<\/em> sem haver a necessidade de flexibilidade na cria\u00e7\u00e3o de objetos. Isso poderia apenas adicionar um n\u00edvel desnecess\u00e1rio de abstra\u00e7\u00e3o. Aqui est\u00e1 um exemplo em C# que poderia ser questionado:<\/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=\"public interface IProduct {\n    void Operate();\n}\n\npublic class ConcreteProduct : IProduct {\n    public void Operate() {\n        \/\/ Opera\u00e7\u00e3o concreta\n    }\n}\n\npublic abstract class Creator {\n    public abstract IProduct FactoryMethod();\n}\n\npublic class ConcreteCreator : Creator {\n    public override IProduct FactoryMethod() {\n        return new ConcreteProduct();\n    }\n}\" 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: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">interface<\/span><span style=\"color: #D8DEE9FF\"> IProduct <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Operate<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/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\">ConcreteProduct<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> IProduct <\/span><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\">Operate<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Opera\u00e7\u00e3o concreta<\/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>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">abstract<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Creator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><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\">abstract<\/span><span style=\"color: #D8DEE9FF\"> IProduct <\/span><span style=\"color: #88C0D0\">FactoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/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\">ConcreteCreator<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> Creator <\/span><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\">override<\/span><span style=\"color: #D8DEE9FF\"> IProduct <\/span><span style=\"color: #88C0D0\">FactoryMethod<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> ConcreteProduct<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/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><\/code><\/pre><\/div>\n\n\n\n<p>Este c\u00f3digo introduz um <em>Factory Method<\/em> atrav\u00e9s de uma classe abstrata e uma implementa\u00e7\u00e3o concreta. Mas ser\u00e1 que realmente precisamos dessa abstra\u00e7\u00e3o? Ou poder\u00edamos simplesmente instanciar <code>ConcreteProduct<\/code> diretamente onde \u00e9 necess\u00e1rio?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Relev\u00e2ncia e a Evolu\u00e7\u00e3o dos Padr\u00f5es de Projeto<\/h2>\n\n\n\n<p>Os padr\u00f5es de projeto evolu\u00edram com a tecnologia, e o contexto no qual operamos hoje \u00e9 diferente daquele do passado. Considere as mudan\u00e7as nos paradigmas de programa\u00e7\u00e3o, as novas plataformas e a forma como arquitetamos aplica\u00e7\u00f5es em nuvem. Utilizar um padr\u00e3o deve ser uma decis\u00e3o alinhada com o contexto atual, n\u00e3o apenas um reflexo de pr\u00e1ticas anteriores.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Adotar um padr\u00e3o de projeto deve ser uma a\u00e7\u00e3o deliberada, baseada em uma necessidade genu\u00edna. Isso pressup\u00f5e compreender o problema e o contexto em sua totalidade. Sem essa compreens\u00e3o, corremos o risco de criar sistemas complexos e fr\u00e1geis. Por isso, antes de adotar o pr\u00f3ximo padr\u00e3o, pense nisso: Estou criando uma solu\u00e7\u00e3o mais f\u00e1cil de entender e manter? Estou contribuindo para a evolu\u00e7\u00e3o do sistema de maneira positiva?<\/p>\n\n\n\n<p>Em meus grupos de estudos e mentorias, discutimos essas nuances com o objetivo de alcan\u00e7ar um n\u00edvel de excel\u00eancia no uso de padr\u00f5es de projeto. Aprender quando e como aplic\u00e1-los corretamente \u00e9 uma habilidade essencial para qualquer desenvolvedor 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>Padr\u00f5es de projeto devem ser adotados para solucionar problemas espec\u00edficos e n\u00e3o por conveni\u00eancia ou popularidade.<\/li>\n\n\n\n<li>A complexidade n\u00e3o justificada resultante do uso inadequado de padr\u00f5es pode dificultar a compreens\u00e3o e manuten\u00e7\u00e3o do software.<\/li>\n\n\n\n<li>A aplica\u00e7\u00e3o de padr\u00f5es deve considerar o contexto evolutivo da tecnologia e as necessidades reais do sistema, garantindo efici\u00eancia e clareza no desenvolvimento de software.<\/li>\n<\/ol>\n","protected":false},"featured_media":10043,"parent":0,"template":"","cursos":[7],"class_list":["post-10056","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\/10056","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\/10043"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=10056"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=10056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}