<?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: Thiago Zilli Sarmento</title>
    <description>The latest articles on DEV Community by Thiago Zilli Sarmento (@thiagozs).</description>
    <link>https://dev.to/thiagozs</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%2F404655%2Feae50f31-3bf8-414f-a310-07a5e9f715ff.jpeg</url>
      <title>DEV Community: Thiago Zilli Sarmento</title>
      <link>https://dev.to/thiagozs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thiagozs"/>
    <language>en</language>
    <item>
      <title>Problemas com Variáveis Globais: Prós e contra</title>
      <dc:creator>Thiago Zilli Sarmento</dc:creator>
      <pubDate>Fri, 08 Mar 2024 16:46:14 +0000</pubDate>
      <link>https://dev.to/thiagozs/problemas-com-variaveis-globais-pros-e-contra-1j92</link>
      <guid>https://dev.to/thiagozs/problemas-com-variaveis-globais-pros-e-contra-1j92</guid>
      <description>&lt;p&gt;&lt;strong&gt;Manutenção:&lt;/strong&gt; Elas podem levar a código que é difícil de manter e testar. Variáveis globais podem ser modificadas por qualquer parte do programa, tornando difícil rastrear e prever o estado do programa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concorrência:&lt;/strong&gt; Em um ambiente de execução concorrente, como é comum em Go, o acesso não sincronizado a variáveis globais pode causar condições de corrida, onde múltiplas goroutines leem e escrevem na mesma variável simultaneamente, levando a resultados inesperados e bugs difíceis de depurar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependência:&lt;/strong&gt; Código que depende de variáveis globais pode ser mais difícil de isolar em testes unitários, o que reduz a qualidade dos testes e pode aumentar o risco de defeitos no software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefícios e Boas Práticas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuração Inicial:&lt;/strong&gt; Em certos cenários, como configuração inicial de aplicativos ou definição de constantes, as variáveis globais podem ser úteis e aceitáveis.&lt;/p&gt;

&lt;p&gt;**Padrões de Design: **Para evitar os problemas associados com variáveis globais, padrões de design como "Singleton" ou injeção de dependência podem ser utilizados. Esses padrões permitem um maior controle sobre o acesso e a modificação do estado global.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sincronização:&lt;/strong&gt; Se o uso de uma variável global é inevitável, garantir que o acesso seja sincronizado, como utilizando mutexes, pode mitigar problemas de concorrência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A utilização de variáveis globais deve ser evitada quando possível. Alternativas como o uso de estruturas e métodos para encapsular estado e injeção de dependência devem ser preferidas para criar um código mais limpo, testável e manutenível. Quando necessário, seu uso deve ser cuidadosamente controlado e sincronizado para evitar condições de corrida e outros bugs relacionados à concorrência.&lt;/p&gt;

</description>
      <category>go</category>
      <category>global</category>
      <category>variable</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Adotando Flexibilidade e Escalabilidade em Go com o Padrão Options</title>
      <dc:creator>Thiago Zilli Sarmento</dc:creator>
      <pubDate>Wed, 21 Feb 2024 22:32:03 +0000</pubDate>
      <link>https://dev.to/thiagozs/adotando-flexibilidade-e-escalabilidade-em-go-com-o-padrao-options-5gfi</link>
      <guid>https://dev.to/thiagozs/adotando-flexibilidade-e-escalabilidade-em-go-com-o-padrao-options-5gfi</guid>
      <description>&lt;p&gt;No mundo da engenharia de software, padrões de design são cruciais para criar códigos escaláveis e fáceis de manter. Dentre estes, o padrão Options tem ganhado popularidade em Go por sua flexibilidade e elegância, especialmente ao configurar objetos complexos. Neste artigo, exploraremos o padrão Options em Go, comparando-o com métodos convencionais e examinando suas vantagens através de exemplos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compreendendo o Padrão Options&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O padrão Options em Go é uma abordagem de design usada para inicializar objetos com um conjunto potencialmente complexo de opções de configuração. Ele aborda o desafio de construtores ou funções que requerem muitos parâmetros, alguns dos quais podem ser opcionais.&lt;br&gt;
Tradicionalmente, em linguagens como Go, você pode usar uma função construtora com uma longa lista de parâmetros ou vários construtores. No entanto, isso pode rapidamente se tornar complicado e propenso a erros, especialmente à medida que o número de parâmetros aumenta ou quando muitos deles são opcionais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de Implementação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Considere um struct Login em uma aplicação Go que requer várias dependências e configurações. Veja como o padrão Options pode ser implementado de forma elegante:&lt;br&gt;
Definindo as Structs Options e Params&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package login

type Options func(*LoginParams) error

type LoginParams struct {
    client client.ClientRepo
    auth   auth.AuthRepo
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criando o Struct Login com Options&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Login struct {
    params *LoginParams
}

func NewLogin(opts ...Options) (*Login, error) {
    params := &amp;amp;LoginParams{}

    for _, opt := range opts {
        if err := opt(params); err != nil {
            return nil, err
        }
    }

    return &amp;amp;Login{params: params}, nil
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fornecendo Opções Funcionais&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func WithClient(repo client.ClientRepo) Options {
    return func(p *LoginParams) error {
        p.client = repo
        return nil
    }
}

func WithAuth(repo auth.AuthRepo) Options {
    return func(p *LoginParams) error {
        p.auth = repo
        return nil
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefícios do Padrão Options&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt;: Adicione novas opções facilmente sem alterar a assinatura do construtor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legibilidade&lt;/strong&gt;: Os chamadores podem ver de relance quais opções estão sendo configuradas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidade&lt;/strong&gt;: As opções podem ser omitidas ou adicionadas conforme necessário, reduzindo a necessidade de múltiplos construtores ou lógica de inicialização complexa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenibilidade&lt;/strong&gt;: Centraliza a lógica de configuração, tornando o código mais fácil de manter e estender.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Comparação com Métodos Convencionais&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Em contraste com métodos tradicionais, onde você pode sobrecarregar funções ou construtores, o padrão Options oferece uma abordagem mais escalável e fácil de manter. Funções sobrecarregadas podem se tornar complicadas e menos intuitivas, especialmente com muitos parâmetros opcionais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aplicação no Mundo Real&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Em nosso exemplo, NewLogin pode ser inicializado com várias configurações sem a necessidade de vários construtores ou uma longa lista de parâmetros. Esta abordagem é especialmente benéfica em projetos maiores onde as configurações podem ser complexas e variadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;loginInstance, err := NewLogin(WithClient(clientRepo), WithAuth(authRepo))

if err != nil {
    log.Fatal(err)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este trecho demonstra como NewLogin pode ser configurado de forma flexível com diferentes opções. O código resultante é limpo, legível e fácil de modificar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O padrão Options em Go oferece uma solução elegante para a inicialização de objetos com configurações complexas. Ao fornecer escalabilidade, legibilidade e flexibilidade, ele se destaca como uma escolha superior em comparação com métodos mais convencionais. Este padrão é particularmente valioso em aplicações de grande escala onde as configurações são diversas e sujeitas a mudanças.&lt;/p&gt;

</description>
      <category>go</category>
      <category>scale</category>
      <category>pattern</category>
      <category>options</category>
    </item>
    <item>
      <title>Aprimorando o Tratamento de Erros em Go com o Pacote httpe (echo)</title>
      <dc:creator>Thiago Zilli Sarmento</dc:creator>
      <pubDate>Wed, 21 Feb 2024 22:27:30 +0000</pubDate>
      <link>https://dev.to/thiagozs/aprimorando-o-tratamento-de-erros-em-go-com-o-pacote-httpe-echo-5he7</link>
      <guid>https://dev.to/thiagozs/aprimorando-o-tratamento-de-erros-em-go-com-o-pacote-httpe-echo-5he7</guid>
      <description>&lt;p&gt;No mundo do desenvolvimento de software, especialmente em ambientes de &lt;strong&gt;microserviços&lt;/strong&gt;, a gestão eficaz de erros é crucial. O tratamento estruturado de erros não só melhora a qualidade do código, mas também facilita a depuração e a manutenção. Hoje, quero compartilhar com vocês uma abordagem moderna utilizando o pacote &lt;strong&gt;httpe&lt;/strong&gt; em &lt;strong&gt;Go&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O pacote &lt;strong&gt;httpe&lt;/strong&gt; é uma ferramenta projetada para simplificar a forma como lidamos com erros em aplicações &lt;strong&gt;Go&lt;/strong&gt;, especialmente aquelas que interagem com HTTP. Com ele, podemos criar objetos de erro &lt;strong&gt;HTTP&lt;/strong&gt; com código de status específico, mensagem e detalhes internos opcionais. Isso permite um maior controle e uma melhor resposta aos consumidores da &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por que isso é importante? Em primeiro lugar, centraliza a lógica de erro, promovendo a reutilização e a consistência. Em segundo lugar, fornece uma camada de abstração, onde podemos incorporar lógicas, como logs detalhados ou métricas, sem poluir o código principal. Além disso, ao separar a lógica de erro do código de negócios, tornamos nosso código mais limpo e fácil de manter.&lt;/p&gt;

&lt;p&gt;Um exemplo chave é a função &lt;strong&gt;ParseMessageToErrors&lt;/strong&gt; do &lt;strong&gt;httpe&lt;/strong&gt;, que transforma mensagens de erro em formatos estruturados. Isso é particularmente útil para APIs &lt;strong&gt;REST&lt;/strong&gt;, onde os consumidores precisam de respostas claras e consistentes.&lt;/p&gt;

&lt;p&gt;Em resumo, adotar um pacote como o httpe pode ser um passo significativo para melhorar a robustez e a clareza do tratamento de erros em suas aplicações Go. Com ele, você eleva o nível da sua aplicação e, por consequência, a satisfação dos usuários finais.&lt;/p&gt;

&lt;p&gt;Código fonte&lt;br&gt;
&lt;a href="https://github.com/thiagozs/go-httpe"&gt;https://github.com/thiagozs/go-httpe&lt;/a&gt;&lt;/p&gt;

</description>
      <category>errors</category>
      <category>http</category>
      <category>go</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Desenvolvimento de Features: Navegando Entre Falhas e Sucesso</title>
      <dc:creator>Thiago Zilli Sarmento</dc:creator>
      <pubDate>Wed, 21 Feb 2024 22:23:34 +0000</pubDate>
      <link>https://dev.to/thiagozs/desenvolvimento-de-features-navegando-entre-falhas-e-sucesso-4f9m</link>
      <guid>https://dev.to/thiagozs/desenvolvimento-de-features-navegando-entre-falhas-e-sucesso-4f9m</guid>
      <description>&lt;h2&gt;
  
  
  Desenvolvimento Ágil: A Arte de Corrigir em Movimento
&lt;/h2&gt;

&lt;p&gt;No mundo dinâmico do desenvolvimento de software, adaptabilidade e eficiência são fundamentais. Quando estamos no meio do desenvolvimento de uma nova feature, enfrentar falhas e erros é uma realidade comum. A habilidade de identificar e corrigir esses problemas imediatamente pode ser a diferença entre sucesso e fracasso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix Imediato: Prevenção é Melhor que Cura
&lt;/h2&gt;

&lt;p&gt;Ao desenvolver uma nova funcionalidade, é natural que desafios e bugs surjam no caminho. Implementar correções ("fixes") assim que esses problemas são identificados não é apenas eficiente, mas também preventivo. Isso minimiza o risco de bugs se acumularem ou se tornarem mais complexos, economizando tempo e recursos no longo prazo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detectar, Agir, Avançar: Um Ciclo Contínuo de Melhoria
&lt;/h2&gt;

&lt;p&gt;O processo de desenvolvimento deve ser iterativo e reflexivo. Detectar um erro, agir imediatamente para corrigi-lo e, em seguida, continuar o desenvolvimento, é um ciclo que promove a melhoria contínua. Isso mantém a qualidade do código elevada e assegura que a feature final seja robusta e confiável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flexibilidade e Resiliência: Adaptando-se às Mudanças
&lt;/h2&gt;

&lt;p&gt;Ser flexível e resiliente diante de falhas e erros é uma qualidade valiosa em desenvolvimento de software. A capacidade de adaptar-se rapidamente e fazer correções eficientes é o que permite à equipe manter o ritmo e garantir que a entrega final atenda ou exceda as expectativas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: Fix Hoje, Sucesso Amanhã
&lt;/h2&gt;

&lt;p&gt;Corrigir problemas durante o desenvolvimento de uma feature não é apenas uma prática recomendada, é um indicador de uma equipe ágil e de um projeto bem gerenciado. Encare cada fix como um passo em direção à excelência, mantendo a qualidade e a integridade do projeto sempre em foco. Lembre-se: um fix hoje pode significar a diferença entre o sucesso e a necessidade de revisões extensivas amanhã.&lt;/p&gt;

</description>
      <category>developer</category>
      <category>fails</category>
      <category>sucess</category>
      <category>scrum</category>
    </item>
    <item>
      <title>A Importância de Checar Erros em Go</title>
      <dc:creator>Thiago Zilli Sarmento</dc:creator>
      <pubDate>Wed, 21 Feb 2024 22:20:10 +0000</pubDate>
      <link>https://dev.to/thiagozs/a-importancia-de-checar-erros-em-go-378i</link>
      <guid>https://dev.to/thiagozs/a-importancia-de-checar-erros-em-go-378i</guid>
      <description>&lt;p&gt;Ao programar em Go, uma das práticas mais cruciais é a gestão eficiente dos erros. Go adota uma abordagem única para lidar com erros, que é tanto robusta quanto explícita. Em vez de exceções e try-catch que são comuns em muitas linguagens de programação, Go utiliza um sistema de tuplas, onde uma função pode retornar um erro como um de seus valores de retorno.&lt;br&gt;
Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;valor, err := algumaFuncao()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;algumaFuncao()&lt;/code&gt; retorna dois valores: um valor de interesse e um erro. É uma convenção em Go verificar esse erro imediatamente após a chamada da função. Ignorar essa etapa pode levar a bugs sutis e difíceis de diagnosticar, problemas de desempenho e, em última instância, falhas no sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que é tão Importante?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clareza e Legibilidade&lt;/strong&gt;: O manejo explícito de erros torna o código mais legível. É fácil para os desenvolvedores, especialmente aqueles que são novos no código, entender onde e por que um erro pode ocorrer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robustez&lt;/strong&gt;: Ao verificar e lidar com erros de forma proativa, você pode evitar muitos problemas em tempo de execução. O sistema não só se torna mais robusto, mas também mais seguro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnóstico Rápido&lt;/strong&gt;: Quando um erro ocorre, é muito mais fácil diagnosticar e corrigir o problema se você souber exatamente onde e por que o erro aconteceu.
Exemplo Prático
Veja um exemplo prático para ilustrar a importância:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;file, err := os.Open("arquivo.txt")
if err != nil {
   log.Fatalf("Erro ao abrir o arquivo: %v", err)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, se um erro ocorrer ao tentar abrir o arquivo (por exemplo, se o arquivo não existir), o programa não só captura esse erro, mas também fornece um feedback útil sobre o que deu errado. Isso facilita a rápida identificação e resolução do problema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A gestão de erros em Go é um componente essencial para escrever software confiável e eficiente. Ao adotar a prática de verificar erros de forma consistente, você não só torna seu código mais robusto e fácil de entender, mas também assegura que seu aplicativo possa ser mantido e ampliado com confiança ao longo do tempo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/import%25C3%25A2ncia-de-checar-erros-em-go-thiago-sarmento/?trackingId=%2Bdvm8uoVQvetEwMrqAOI5A%3D%3D"&gt;Linkedin: A importancia de checar erros em go&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>errors</category>
      <category>check</category>
    </item>
  </channel>
</rss>
