<?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: Felipe Santos</title>
    <description>The latest articles on DEV Community by Felipe Santos (@felipesntr).</description>
    <link>https://dev.to/felipesntr</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%2F687112%2F5f0174fb-bece-4062-bf3d-7439d4f008e4.jpg</url>
      <title>DEV Community: Felipe Santos</title>
      <link>https://dev.to/felipesntr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipesntr"/>
    <language>en</language>
    <item>
      <title>Design Pattern Operation Result em C#</title>
      <dc:creator>Felipe Santos</dc:creator>
      <pubDate>Tue, 18 Jun 2024 18:34:09 +0000</pubDate>
      <link>https://dev.to/felipesntr/design-pattern-operation-result-em-c-2g8o</link>
      <guid>https://dev.to/felipesntr/design-pattern-operation-result-em-c-2g8o</guid>
      <description>&lt;p&gt;O Operation Result Design Pattern é um ferramenta incrível para você ter nas bases do seu projeto. Isso ajuda a lidar de forma muito mais assertiva com os resultados de operações do seu sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Operation Result Design Pattern
&lt;/h2&gt;

&lt;p&gt;Para começar, o Operation Result Design Pattern é utilizado para encapsular o resultado de operações de forma que permite uma estrutura consistente de retornar tanto o sucesso quanto a falha de alguma operação.&lt;br&gt;
Ele também é uma alternativa ao disparos de exceções, ao invés de lidar com as exceções, você trabalha com um resultado.&lt;/p&gt;
&lt;h2&gt;
  
  
  Alguns obejtivos ao utilizar o Operation Result
&lt;/h2&gt;

&lt;p&gt;Ter um indicador de sucesso ou falha da operação;&lt;br&gt;
Ter acesso ao motivo da falha se a operação tiver falhado ou o valor resultante da operação caso tenha sido sucedida.&lt;/p&gt;
&lt;h2&gt;
  
  
  Criação da classe Resultado
&lt;/h2&gt;

&lt;p&gt;A classe Resultado em si encpasula o resultado de alguma operação. Ela pode incluir um valor de retorno quando a operação for bem sucedida ou os detalhes de erros em operações que falharam.&lt;br&gt;
Em C# podemos escrever a classe Resultado da seguinte maneira, assim conseguimos usar o Resultado para tipos diferentes de valores&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Resultado&amp;lt;Tipo&amp;gt;
{
    public Resultado()
    {
        Erros = [];
    }

    public Resultado(params string[] erros)
    {
        Erros = erros.ToImmutableList();
    }

    public Tipo? Valor { get; init; }
    public bool TemErros() =&amp;gt; Erros.Count &amp;gt; 0;
    public bool Sucesso =&amp;gt; !TemErros();
    public IReadOnlyCollection&amp;lt;string&amp;gt; Erros { get; init; }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com essa pequena implementação você já tem disponível a lista de erros, caso a operação tenha falhado, armazenadas em um objeto ImmutableList, caso a operação tenha falhado, e consegue retornar como um IReadOnlyCollection. Além disso consegue saber se a operação foi sucedida ou não e no caso do sucesso, trabalhar em cima do valor resultante.&lt;br&gt;
Lendo um pouco mais a classe, conseguimos entender que a criação do objeto com o construtor vazio representa uma operação de sucesso e quando tem itens no construtor significa que a operação falhou.&lt;/p&gt;
&lt;h2&gt;
  
  
  Adicionando a gravidade da mensagem!
&lt;/h2&gt;

&lt;p&gt;Ao invés de retornar somente mensagens de erros quando houverem erros, você pode retornar mensagens e em cada mensagem disponibilizar um nível de gravidade, ou seja, a mensagem pode ser somente uma informação, quer seria o caso de sucesso, ou pior, ela pode ser um erro, que seria uma mensagem com maior gravidade.&lt;br&gt;
Assim, podemos escrever uma nova classe para representar essas mensagens e um enum para representar os níveis&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class ResultadoMensagem
{
    public ResultadoMensagem(string menssagem, MensagemGravidade gravidade)
    {
        Mensagem = menssagem?? throw new ArgumentNullException(nameof(menssagem));
        Gravidade = gravidade;
    }

    public string Mensagem { get; }
    public MensagemGravidade Gravidade{ get; }
}

public enum MensagemGravidade
{
    Informacao = 0,
    Aviso = 1,
    Erro = 2,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim vamos adaptar a classe de resultado ao novo padrão utilizando as mensagens com gravidade!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Resultado&amp;lt;Tipo&amp;gt;
{
    public Resultado()
    {
        Mensagens = [];
    }

    public Resultado(params ResultadoMensagem[] mensagens)
    {
        Mensagens = [.. mensagens];
    }

    public Tipo? Valor { get; init; }
    public bool TemErros() =&amp;gt; Mensagens.Count &amp;gt; 0;
    public bool Sucesso =&amp;gt; !TemErros();
    public IReadOnlyCollection&amp;lt;ResultadoMensagem&amp;gt; Mensagens { get; init; }
    public IEnumerable&amp;lt;ResultadoMensagem&amp;gt; ProcurarErros() 
        =&amp;gt; Mensagens.Where(mensagem =&amp;gt; mensagem.Gravidade == MensagemGravidade.Erro);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Espero que eu tenha ajudado de alguma forma, pode deixar um comentário caso tenha alguma dúvida sobre esse design pattern!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>designpatterns</category>
      <category>result</category>
    </item>
    <item>
      <title>I've just completed a front-end coding challenge from</title>
      <dc:creator>Felipe Santos</dc:creator>
      <pubDate>Mon, 30 Aug 2021 16:31:10 +0000</pubDate>
      <link>https://dev.to/felipesntr/i-ve-just-completed-a-front-end-coding-challenge-from-5961</link>
      <guid>https://dev.to/felipesntr/i-ve-just-completed-a-front-end-coding-challenge-from-5961</guid>
      <description>&lt;p&gt;I've just completed a front-end coding challenge from @frontendmentor! 🎉&lt;/p&gt;

&lt;p&gt;You can see my solution here: &lt;a href="https://www.frontendmentor.io/solutions/responsive-sunnyside-agency-landing-page-using-flexbox-Dx8DUU2AZ"&gt;https://www.frontendmentor.io/solutions/responsive-sunnyside-agency-landing-page-using-flexbox-Dx8DUU2AZ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any suggestions on how I can improve are welcome!&lt;/p&gt;

&lt;h1&gt;
  
  
  FrontendMentor #CodeChallenge
&lt;/h1&gt;

</description>
      <category>frontendmentor</category>
      <category>frontend</category>
      <category>challenge</category>
    </item>
  </channel>
</rss>
