<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex Almeida</title>
    <description>The latest articles on DEV Community by Alex Almeida (@almeidaalex).</description>
    <link>https://dev.to/almeidaalex</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F556307%2F4f8e5ed2-48a4-479e-87f3-33301162f8e1.jpeg</url>
      <title>DEV Community: Alex Almeida</title>
      <link>https://dev.to/almeidaalex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/almeidaalex"/>
    <language>en</language>
    <item>
      <title>Duplicar código é um problema?</title>
      <dc:creator>Alex Almeida</dc:creator>
      <pubDate>Wed, 30 Oct 2024 21:48:14 +0000</pubDate>
      <link>https://dev.to/almeidaalex/duplicar-codigo-e-um-problema-4i13</link>
      <guid>https://dev.to/almeidaalex/duplicar-codigo-e-um-problema-4i13</guid>
      <description>&lt;p&gt;Quando você está escrevendo código, procurando uma solução elegante, ou não, para algum problema de código, ou de arquitetura, a pergunta que deveria ser feita é: alguém já enfrentou esse problema antes? Existe uma grande chance que sim, que este problema já tenha uma ou mais soluções padronizadas que o resolvam. Como desenvolvedores temos que ser eficientes, e nada melhor que usar o conhecimento alheio 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema
&lt;/h2&gt;

&lt;p&gt;Você trabalha em uma instituição financeira, que tem um serviço onde pode-se fazer transferências internacionais. Os desenvolvedores do app precisam mostrar a listra de transações realizadas num período, e para cada item da lista você pode clicar e ver mais detalhes daquela transação. &lt;/p&gt;

&lt;p&gt;Do lado do backend, você tem as seguintes entidades:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbeiqebrzskfn1n014mo7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbeiqebrzskfn1n014mo7.png" alt="Diagrama de classes com três entidades: Usuario, Transação e Beneficiário" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Poderia até ter mais atributos cada uma dessas entidades, mas não precisamos entrar afundo nesse detalhe.&lt;br&gt;
A resposta do endpoint para listar transações será simples, nome do beneficiado, tipo de transação, valor enviado e data. Como vc resolve isso?&lt;/p&gt;
&lt;h2&gt;
  
  
  Uma possível solução
&lt;/h2&gt;

&lt;p&gt;Existem muitas maneiras de se resolver um problema, pode-se simplesmente trazer os dados do banco, converter-los para seu modelo, se estiver usando algum ORM, e deixar disponível para consumo no formato JSON, vai funcionar, sim, é o ideal? Vamos falar mais sobre.&lt;/p&gt;

&lt;p&gt;Essa maneira de resolver traz pelo menos dois potenciais problemas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O primeiro que é mais fácil de ver, tem muita informação que é irrelevante para aplicação cliente, pelo menos nesse contexto. Então vc pensa: ah é só a aplicação que estiver consumindo ignorar o que não precisa. Eu entendo, mas perceba que vc está desperdiçando recursos, o que vc pede e não usa é desperdício.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Esse talvez também seja fácil de pegar, mas a princípio, talvez não seja importante, dependendo do caso. Expor seus modelos internos de forma pública vai tornar a manutenção ao longo prazo extremamente difícil. E por que? Se precisar mudar a estrutura de dados, como renomear um campo, isso vai gerar uma quebra de contrato com o mundo exterior, quem está consumindo essa estrutura. Aquele campo que tinha um nome X agora é XX, pronto, quebrou as aplicações consumidoras. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Outra maneira é criar um novo modelo que tenha exatamente as informações que são necessárias, soa melhor, não acha?&lt;/p&gt;

&lt;p&gt;Então vamos criar uma classe que represente esses dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DTO para listar transações&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;TransacaoListaDTO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;NomeBeneficiario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;TipoTransacao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;ValorEnviado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;Data&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que acabamos de criar agora é uma classe que define o que chamamos de &lt;em&gt;Data Transfer Object&lt;/em&gt; [Fowler PoEAA], mais conhecido como DTO, que funciona como uma interface de entrada e saída de uma aplicação, Se pensarmos em uma API REST que retorna um JSON, é esse objeto que será serializado na saída e também é usado como dados de entrada, para criar ou atualizar um recurso. Porém DTOs não se limitam a API REST, pode ser usado em qualquer outro tipo de integração.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Pode-se ter um controller mais ou menos assim&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TransacoesController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ControllerBase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TransacaoListaDTO&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;]&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ListarTransacoes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para buscar transações&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;transacoes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_repositorio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ObterTransacoes&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dtos&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;transacoes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;TransacaoListaDTO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;NomeBeneficiario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Beneficiario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Beneficiario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sobrenome&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;TipoTransacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TipoTransacao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;ValorEnviado&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dtos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pois bem, parece ótimo, &lt;em&gt;então toda vez que eu criar minhas APIs já vou criar um DTO de cara&lt;/em&gt;. Dependendo da complexidade do projeto e das entidades, &lt;strong&gt;não precisa&lt;/strong&gt;, se as entidade do projeto são do tipo “anêmicas”, e seu endpoint é um CRUD bem simples é perda de tempo, não adicione complexidade onde não existe complexidade.&lt;/p&gt;

&lt;p&gt;Continuando no nosso problema, existe uma funcionalidade para exibir os detalhes de uma transação, então será necessário mais dados do que no atual DTO para listar transações, nesse detalhe as informações necessárias são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quanto foi enviado&lt;/li&gt;
&lt;li&gt;Qual a tarifa pra essa transação&lt;/li&gt;
&lt;li&gt;Nome completo de quem fez a transferência&lt;/li&gt;
&lt;li&gt;Código do banco&lt;/li&gt;
&lt;li&gt;Nome do banco&lt;/li&gt;
&lt;li&gt;Tipo de Conta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então podemos simplesmente adicionar mais atributos no DTO? Claro… que não. O fato das mesmas entidades estarem envolvidas não significa que o mesmo DTO será utilizado, cada DTO serve para um propósito, o propósito do primeiro é exibir uma lista de transações, entretanto agora o propósito é dar detalhes sobre a transferência. Seria algo parecido com isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;TransacaoDetalhesDTO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;ValorEnviado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;Tarifa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;NomeCompleto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;CodigoBanco&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;NomeBanco&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;TipoConta&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E finalmente eu chego no título do post, existem algumas informações que são iguais, então partindo do princípio DRY, é melhor criar um DTO base e outros DTOs herdarem, certo? Não, heranças parecem boas até que vc precisa mudar algo na classe base efeitos colaterais podem ser espalhados pelas classes. Tente manter os DTOs mais isolados possível, assim garante-se que uma mudança no DTO irá afetar diretamente os consumidores daqueles DTOs, dessa forma há menos dor de cabeça quanto mudanças forem necessárias, e elas sempre aparecem.&lt;/p&gt;

&lt;p&gt;Rolou até esse assunto em grupo de desenvolvedores onde participo se isso seria uma duplicação de código. Eu não considero uma duplicação, pra mim, para ser uma duplicação teria que sera mesma classe com os mesmos atributos, no caso apresentado nesse post as classes são parecidas, mas não iguais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumindo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DTOs (Data Transfer Objects) são usados como interface de entrada e saída em APIs.&lt;/li&gt;
&lt;li&gt;DTOs ajudam a evitar expor modelos internos e desperdiçar recursos.&lt;/li&gt;
&lt;li&gt;Crie DTOs diferentes para propósitos distintos, mesmo que envolvam as mesmas entidades.&lt;/li&gt;
&lt;li&gt;Evite herança entre DTOs para reduzir efeitos colaterais.&lt;/li&gt;
&lt;li&gt;DTOs semelhantes não são considerados duplicação de código se tiverem propósitos diferentes.&lt;/li&gt;
&lt;li&gt;Use DTOs quando necessário, mas evite adicionar complexidade desnecessária em projetos simples.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>backend</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Minhas 6 dicas para resolver problemas.</title>
      <dc:creator>Alex Almeida</dc:creator>
      <pubDate>Wed, 10 Mar 2021 15:41:55 +0000</pubDate>
      <link>https://dev.to/almeidaalex/minhas-6-dicas-para-resolver-problemas-j9f</link>
      <guid>https://dev.to/almeidaalex/minhas-6-dicas-para-resolver-problemas-j9f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Trabalhar na área de desenvolvimento é lidar com resolução de problemas a todo momento, ao longo dos anos, acabei desenvolvendo alguns hábitos para resolve-los.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quero comentar aqui algumas dicas que uso para resolver problemas que as vezes não tenho a menor ideia de como resolver. Esses dias, me deparei com um problema de frontend, para completar usando bibliotecas que no máximo conhecia pelo nome: react, redux e react-redux.&lt;/p&gt;

&lt;p&gt;Bora para as dicas!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Entenda com o que vc está trabalhando
&lt;/h3&gt;

&lt;p&gt;Quando a gente olha para nossa base de código, já quer ir sentando o dedo no problema, mas as vezes é difícil de entender como nosso outro amigo desenvolvedor/a pensou, porque usou tais bibliotecas, porque o código foi escrito daquela maneira, entre outra coisas. Entender qual é a ideia por trás da biblioteca, suas funções, como ela funciona, quais problemas ela quer resolver e não sair reinventando a roda é super importante.&lt;/p&gt;

&lt;p&gt;Como podemos descobrir isso? É o próximo passo.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use a documentação oficial
&lt;/h3&gt;

&lt;p&gt;Não há maneira melhor de entender os pontos citados anteriormente. Uma boa documentação irá contar a motivação por trás daquela solução, vai ter exemplos simples e práticos para que possamos ter uma visão geral, também contém documentação mais avançada da API caso seja necessário. Aliás, fique atento com a versão da biblioteca e versão da documentação, entre uma versão major e outra muita coisa pode mudar.&lt;/p&gt;

&lt;p&gt;Enfim, é uma grande fonte de conhecimento, com esse entendimento vc poderá ir para a próxima fase. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Isole o problema
&lt;/h3&gt;

&lt;p&gt;Sim, vc entendeu tudo, ou pelo menos uma parte importante do que aquela lib se propõe a fazer, mas quando olha pra base de código está um nojo, que vc não sabe onde começa e onde termina e vc só quer fazer uma pequena mudança, então pegue esse conhecimento e tente fazer um exemplo fora da aplicação de maneira isolada, tem várias formas de fazer isso. &lt;/p&gt;

&lt;p&gt;Se vc esta trabalhando com frontend: React, Angular, Vue, o que seja, vc pode usar editores online, como Stackblitz, CodePen, etc.&lt;/p&gt;

&lt;p&gt;Talvez seu problema seja desenvolvimento backend, pode-se criar um teste unitário, um teste integrado ou subir uma infra no docker, muitas possibilidades.&lt;/p&gt;

&lt;p&gt;Nada disso deu certo, talvez vc precise do próximo passo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Peça ajuda para alguém
&lt;/h3&gt;

&lt;p&gt;A gente não é uma ilha e vc não está resolvendo um problema único no mundo, provavelmente vc está com um problema que muitos outros já passaram, inclusive alguém da sua própria equipe, empresa, cidade, enfim, alguém já sofreu.&lt;/p&gt;

&lt;p&gt;Geralmente eu determino um tempo que vou trabalhar num problema, até jogar a toalha. Tem hora que damos voltas e voltas, e o simples fato de compartilhar o problema com alguém, faz que vc tenha uma nova visão do problema, e por muitas vezes ter o momento "eureka".&lt;/p&gt;

&lt;p&gt;Se esse lampejo de luz não aparecer, essa pessoa possa te ajudar dizer:  - Olha, quando isso acontecer basta fazer tal coisa, é a hora que vc faz aquela cara de "ahhhh era só isso?"&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Aplique seus conhecimentos adquiridos
&lt;/h3&gt;

&lt;p&gt;Essa é a melhor parte, parte de resolver o problema real, agora que vc já tem a faca que o queijo na mão, é aplicar o que aprendeu e fazer aquele PR maravilhoso. Pode dar alguma coisa errada? Claro que  pode, foi o meu caso, eu estava tentando entender o redux, depois react e por fim, react-redux, ou seja, foi um processo de cada vez. Inclusive estava olhando uma versão diferente na documentação do que realmente tínhamos em produção, já cantei essa bola no passo 3.&lt;/p&gt;

&lt;p&gt;Tudo resolvido, o último passo é um dos mais importantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Divida o conhecimento com os colegas
&lt;/h3&gt;

&lt;p&gt;Use aquele seu exemplo isolado para explicar aos seus colegas de trabalho, ou até mesmo para o mundo, como resolveu seu problema. Além de ajudar as pessoas, vc consegue absorver melhor o conhecimento, de forma que alguém possa perguntar algo e vc saber responder com propriedade, ou no máximo gerar alguma dúvida, assim vc irá buscar mais conhecimento para solidificar o aprendizado, no final, vc só tem ganhar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concluindo
&lt;/h3&gt;

&lt;p&gt;Esse é um processo que tenho obtido um certo sucesso, não sei se vai servir para tudo mundo, mas achei legal compartilhar, pois posso ajudar alguém. E você, tem alguma fórmula para resolver problemas?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>desenvolvimento</category>
      <category>programacao</category>
    </item>
  </channel>
</rss>
