{"id":9991,"date":"2023-12-04T20:56:43","date_gmt":"2023-12-04T23:56:43","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=9991"},"modified":"2023-12-26T09:55:55","modified_gmt":"2023-12-26T12:55:55","slug":"como-factories-ajudam-a-tornar-o-codigo-mais-expressivo","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/como-factories-ajudam-a-tornar-o-codigo-mais-expressivo\/","title":{"rendered":"Como Factories Ajudam a Tornar o C\u00f3digo Mais Expressivo"},"content":{"rendered":"\n<p>Quando escrevo c\u00f3digo, uma das minhas principais preocupa\u00e7\u00f5es \u00e9 sua expressividade. Por que isso importa tanto? Imagine poder olhar para um peda\u00e7o de c\u00f3digo e rapidamente discernir sua inten\u00e7\u00e3o e funcionalidade. N\u00e3o apenas voc\u00ea, mas qualquer pessoa que venha a trabalhar com esse c\u00f3digo no futuro, encontrar\u00e1 mais facilidade e efici\u00eancia na manuten\u00e7\u00e3o e compreens\u00e3o do mesmo.<\/p>\n\n\n\n<p>Expressividade no c\u00f3digo nos permite comunicar inten\u00e7\u00f5es de maneira clara. Como eu consigo essa clareza? Uma das t\u00e9cnicas que utilizo \u00e9 a aplica\u00e7\u00e3o de <em>Factories<\/em>, um padr\u00e3o de projeto que me oferece liberdade e flexibilidade na constru\u00e7\u00e3o de objetos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O Poder dos Factories<\/h2>\n\n\n\n<p><em>Factories<\/em>, no contexto de padr\u00f5es de design, referem-se a um meio de criar inst\u00e2ncias de objetos sem expor a l\u00f3gica de cria\u00e7\u00e3o ao c\u00f3digo cliente e sem referenciar as classes concretas que est\u00e3o sendo instanciadas. Esse padr\u00e3o encapsula a cria\u00e7\u00e3o de objetos de tal forma que pode-se postergar a decis\u00e3o entre criar um novo objeto ou reutilizar uma inst\u00e2ncia j\u00e1 existente.<\/p>\n\n\n\n<p>Por que isso \u00e9 ben\u00e9fico? Considerando que o padr\u00e3o <em>Factory<\/em> encapsula o comportamento de cria\u00e7\u00e3o, o c\u00f3digo cliente fica desacoplado das classes concretas. Isso significa que mudan\u00e7as na l\u00f3gica de cria\u00e7\u00e3o ou nas classes concretas t\u00eam um impacto m\u00ednimo, se algum, no c\u00f3digo cliente. Isso \u00e9 um exemplo cl\u00e1ssico da aplica\u00e7\u00e3o do princ\u00edpio de responsabilidade \u00fanica e do princ\u00edpio aberto-fechado, onde o c\u00f3digo deve ser aberto para extens\u00e3o, mas fechado para modifica\u00e7\u00e3o.<\/p>\n\n\n\n<p>Vamos aprimorar o exemplo pr\u00e1tico de um padr\u00e3o <em>Factory<\/em> em C#:<\/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{\n    string GetName();\n}\n\npublic class ConcreteProductA : IProduct\n{\n    public string GetName()\n    {\n        return &quot;ConcreteProductA&quot;;\n    }\n}\n\npublic class ConcreteProductB : IProduct\n{\n    public string GetName()\n    {\n        return &quot;ConcreteProductB&quot;;\n    }\n}\n\npublic static class ProductFactory\n{\n    public static IProduct CreateProduct(string type)\n    {\n        switch (type)\n        {\n            case &quot;A&quot;:\n                return new ConcreteProductA();\n            case &quot;B&quot;:\n                return new ConcreteProductB();\n            default:\n                throw new ArgumentException(&quot;Invalid product type&quot;);\n        }\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>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">GetName<\/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\">ConcreteProductA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> IProduct<\/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\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">GetName<\/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: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">ConcreteProductA<\/span><span style=\"color: #ECEFF4\">&quot;<\/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>\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\">ConcreteProductB<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> IProduct<\/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\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">GetName<\/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: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">ConcreteProductB<\/span><span style=\"color: #ECEFF4\">&quot;<\/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>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">static<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ProductFactory<\/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\">static<\/span><span style=\"color: #D8DEE9FF\"> IProduct <\/span><span style=\"color: #88C0D0\">CreateProduct<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #D8DEE9FF\"> type<\/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: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">switch<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">type<\/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: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">case<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">A<\/span><span style=\"color: #ECEFF4\">&quot;<\/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\"> ConcreteProductA<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">case<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">B<\/span><span style=\"color: #ECEFF4\">&quot;<\/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\"> ConcreteProductB<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">default<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">throw<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> ArgumentException<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Invalid product type<\/span><span style=\"color: #ECEFF4\">&quot;<\/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: #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>Nesse aperfei\u00e7oamento, <code>ProductFactory<\/code> oferece uma interface ainda mais flex\u00edvel, capaz de criar diferentes tipos de produtos com base em um par\u00e2metro. Isso ilustra como o padr\u00e3o <em>Factory<\/em> pode ser estendido e adaptado para diferentes necessidades sem obrigar o c\u00f3digo cliente a se acoplar a implementa\u00e7\u00f5es concretas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>A expressividade do c\u00f3digo \u00e9 fundamental para a manuten\u00e7\u00e3o e escalabilidade de um sistema. Utilizando padr\u00f5es de design como os <em>Factories<\/em>, \u00e9 poss\u00edvel alcan\u00e7ar um alto n\u00edvel de clareza e comunicar as inten\u00e7\u00f5es de maneira eficaz. Essas estrat\u00e9gias de design permitem n\u00e3o somente melhorar a qualidade do nosso c\u00f3digo, mas tamb\u00e9m tornar a experi\u00eancia de desenvolvimento mais prazerosa e menos propensa a erros ou mal-entendidos.<\/p>\n\n\n\n<p>Mergulhar ainda mais fundo nos padr\u00f5es de projeto como <em>Factory Method<\/em> e <em>Abstract Factory<\/em> pode revelar a sutileza e efic\u00e1cia desses padr\u00f5es em situa\u00e7\u00f5es complexas e diversos cen\u00e1rios de design de software. Refletindo sobre os princ\u00edpios <em>SOLID<\/em> e como padr\u00f5es como o <em>Factory<\/em> podem ajudar a aderir a esses princ\u00edpios, n\u00f3s vamos al\u00e9m da teoria e aplicamos pr\u00e1ticas que resultam em software robusto e f\u00e1cil de evoluir.<\/p>\n\n\n\n<p>Se voc\u00ea quiser se aprofundar mais nesse assunto e em outros temas correlatos, participe dos meus grupos de estudos e mentorias, onde essas e outras t\u00e9cnicas s\u00e3o discutidas e aprimoradas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A expressividade do c\u00f3digo \u00e9 essencial para entender a inten\u00e7\u00e3o e funcionalidade do mesmo.<\/li>\n\n\n\n<li>O padr\u00e3o <em>Factory<\/em> \u00e9 um exemplo de design pattern que ajuda a tornar o c\u00f3digo mais expressivo, flex\u00edvel e f\u00e1cil de manter.<\/li>\n\n\n\n<li>Melhorar a demonstra\u00e7\u00e3o pr\u00e1tica do padr\u00e3o <em>Factory<\/em> com varia\u00e7\u00f5es e exemplos ajuda a ilustrar como padr\u00f5es de design podem ser adaptados a diferentes cen\u00e1rios.<\/li>\n<\/ol>\n","protected":false},"featured_media":9973,"parent":0,"template":"","cursos":[7],"class_list":["post-9991","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\/9991","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\/9973"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=9991"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=9991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}