<?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: Filipi Firmino</title>
    <description>The latest articles on DEV Community by Filipi Firmino (@filipi_firmino_dev).</description>
    <link>https://dev.to/filipi_firmino_dev</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%2F3320104%2F54282094-aa52-4e76-af29-2bdda9231026.png</url>
      <title>DEV Community: Filipi Firmino</title>
      <link>https://dev.to/filipi_firmino_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/filipi_firmino_dev"/>
    <language>en</language>
    <item>
      <title>Saga Pattern: Consistência de Dados em Microsserviços de Verdade</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Sat, 01 Nov 2025 14:48:41 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/saga-pattern-consistencia-de-dados-em-microsservicos-de-verdade-4h34</link>
      <guid>https://dev.to/filipi_firmino_dev/saga-pattern-consistencia-de-dados-em-microsservicos-de-verdade-4h34</guid>
      <description>&lt;h2&gt;
  
  
  Bora falar de Sagas?
&lt;/h2&gt;

&lt;p&gt;Garantir consistência de dados em sistemas distribuídos é, sem exagero, um dos maiores perrengues que a gente enfrenta quando entra no mundo dos microsserviços. É tipo tentar manter várias bandas tocando juntas sem maestro — cada uma no seu ritmo, mas tudo tem que soar em harmonia.&lt;br&gt;
E é aí que entra o Saga Pattern: um jeito moderno e bem pragmático de coordenar serviços diferentes, sem perder escalabilidade nem resiliência.&lt;/p&gt;
&lt;h2&gt;
  
  
  🤔 Por que a gente precisa de Sagas?
&lt;/h2&gt;

&lt;p&gt;Num monolito, a vida é mais simples: tudo roda num banco central, transações ACID cuidam da consistência e tá tudo certo.&lt;br&gt;
Mas em microsserviços... cada domínio tem seu próprio banco. Então, imagina fechar um pedido de e-commerce — você precisa mexer em pedido, pagamento, estoque e entrega, tudo ao mesmo tempo e de forma sincronizada.&lt;br&gt;
Se uma dessas etapas falha, tipo o pagamento passa, mas o estoque não tá disponível... pronto, o sistema fica num estado meio zumbi.&lt;/p&gt;

&lt;p&gt;O Saga Pattern resolve exatamente isso: ele evita esses cenários "meio do caminho", garantindo que, se algo der errado, o sistema saiba como se recuperar — compensando as ações e voltando pra um estado consistente.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚙️ Como o Saga Pattern funciona na prática
&lt;/h2&gt;

&lt;p&gt;A ideia é dividir uma grande transação em várias transações locais.&lt;br&gt;
Cada microserviço faz sua parte (de forma ACID local) e, se alguma etapa der ruim, o sistema executa transações compensatórias pra desfazer o que já foi feito.&lt;/p&gt;

&lt;p&gt;Assim, mesmo com falhas ou timeouts, o sistema não quebra — ele se ajusta e segue a vida.&lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada serviço cuida da sua transação local;&lt;/li&gt;
&lt;li&gt;A comunicação entre eles acontece por eventos ou comandos;&lt;/li&gt;
&lt;li&gt;Se algo falha, rola compensação e nada fica “órfão” no sistema.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Tipos de Sagas: Coreografia vs Orquestração
&lt;/h2&gt;

&lt;p&gt;Coreografada:&lt;br&gt;
Cada serviço reage a eventos e publica seus próprios — tipo uma dança sincronizada sem maestro.&lt;br&gt;
É leve e funciona bem pra fluxos simples, mas conforme o sistema cresce, vira um caos entender quem chama quem.&lt;/p&gt;

&lt;p&gt;Orquestrada:&lt;br&gt;
Aqui entra um “maestro”: o orquestrador.&lt;br&gt;
Ele coordena o fluxo, chama os serviços (síncrono ou assíncrono), espera respostas e dispara compensações quando algo falha.&lt;br&gt;
Esse modelo é ótimo pra cenários mais críticos — tipo financeiro, pagamentos ou e-commerce de grande porte — porque dá rastreabilidade e facilita observabilidade.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔄 Ciclo de Vida e Estado
&lt;/h2&gt;

&lt;p&gt;Uma boa implementação de saga geralmente usa máquinas de estado pra acompanhar tudo:&lt;br&gt;
Iniciado → Reservando estoque → Pagando → Entregando → Finalizado.&lt;/p&gt;

&lt;p&gt;Isso garante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Idempotência (se rodar duas vezes, o resultado é o mesmo),&lt;/li&gt;
&lt;li&gt;Resiliência (suporte a retries, timeouts, intervenção manual),&lt;/li&gt;
&lt;li&gt;Auditoria (você sabe exatamente onde algo deu ruim).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🔁 Compensações: o segredo da consistência
&lt;/h2&gt;

&lt;p&gt;Pensa assim: se o pagamento falha, o sistema automaticamente desfaz o que já fez — tipo cancelar o pedido, liberar o estoque e reembolsar o valor.&lt;br&gt;
Essas ações compensatórias são o coração do Saga Pattern e o que garante que o sistema continue íntegro, sem dados zumbis vagando pelo banco.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚠️ Desafios e Boas Práticas
&lt;/h2&gt;

&lt;p&gt;Alguns pontos pra ficar de olho:&lt;/p&gt;

&lt;p&gt;Dual Write: gravar no banco e publicar evento ao mesmo tempo pode dar ruim se rolar falha no meio. Padrões como Outbox ou Change Data Capture ajudam muito aqui.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observabilidade: log detalhado, métricas e tracing distribuído são obrigatórios.&lt;/li&gt;
&lt;li&gt;Idempotência: sempre projete handlers que suportem reexecuções sem causar bagunça.&lt;/li&gt;
&lt;li&gt;Compensações bem definidas: se tem CobrarPedido(), precisa ter EstornarCobranca().&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você tá no ecossistema .NET, existem várias opções pra implementar sagas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MassTransit (integra bem com RabbitMQ, Azure Service Bus, etc.);&lt;/li&gt;
&lt;li&gt;NServiceBus;&lt;/li&gt;
&lt;li&gt;Ou até usando Dapr e Azure Durable Functions, se quiser algo mais workflow-oriented.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A escolha entre coreografia e orquestração vai depender do cenário — se o foco é rastreabilidade e controle, orquestração costuma ganhar.&lt;/p&gt;
&lt;h2&gt;
  
  
  💡 Exemplo prático (pseudocódigo com MassTransit)
&lt;/h2&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;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoSaga&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MassTransitStateMachine&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PedidoState&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;public&lt;/span&gt; &lt;span class="nf"&gt;PedidoSaga&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;InstanceState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nf"&gt;Initially&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;When&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PedidoCriado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PedidoId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&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;PedidoId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ReservarEstoque&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;PedidoId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PedidoId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TransitionTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Reservando&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nf"&gt;During&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Reservando&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;When&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EstoqueReservado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ProcessarPagamento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;PedidoId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PedidoId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TransitionTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pagando&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

            &lt;span class="nf"&gt;When&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ReservaFalhou&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CancelarPedido&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;PedidoId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PedidoId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Finalize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nf"&gt;SetCompletedWhenFinalized&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;No modelo coreografado, cada serviço publicaria eventos e escutaria eventos de outros, agindo de forma independente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PedidoCriado → Evento:PedidoCriado → Serviço Estoque responde
 (EstoqueReservado) / (FalhaReservaEstoque)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quando (e por que) usar ou evitar uma Saga?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use saga quando houver múltiplos serviços e a consistência dos dados entre eles for obrigatória para o negócio;&lt;/li&gt;
&lt;li&gt;    Evite em cenários de baixa criticidade ou quando a implementação e manutenção do padrão trouxerem mais complexidade que benefícios.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;O Saga Pattern não é bala de prata, mas está entre os padrões mais robustos e pragmáticos para lidar com consistência de dados distribuídos em microsserviços, especialmente em cenários críticos como e-commerce e financeiro. Aplicado de forma consciente, transforma sistemas frágeis em soluções resilientes, auditáveis e evolutivas.&lt;br&gt;
​&lt;/p&gt;

</description>
      <category>backend</category>
      <category>microservices</category>
      <category>dotnet</category>
      <category>saas</category>
    </item>
    <item>
      <title>🚫 A Armadilha dos Tipos Primitivos: Como Object Calisthenics Pode Salvar seu Código</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Sun, 26 Oct 2025 23:01:17 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/a-armadilha-dos-tipos-primitivos-como-object-calisthenics-pode-salvar-seu-codigo-497h</link>
      <guid>https://dev.to/filipi_firmino_dev/a-armadilha-dos-tipos-primitivos-como-object-calisthenics-pode-salvar-seu-codigo-497h</guid>
      <description>&lt;p&gt;Já parou para pensar quantas vezes você usou uma simples &lt;code&gt;decimal&lt;/code&gt; para representar um preço, &lt;code&gt;string&lt;/code&gt; para um SKU ou &lt;code&gt;int&lt;/code&gt; para uma quantidade no seu código? 🤔&lt;/p&gt;

&lt;p&gt;Se a resposta foi "várias vezes" (e provavelmente foi), você pode estar caindo numa armadilha muito comum: a &lt;strong&gt;obsessão por tipos primitivos&lt;/strong&gt;! Essa é uma das regras mais importantes do Object Calisthenics que pode transformar completamente a qualidade do seu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 O Que é Object Calisthenics?
&lt;/h2&gt;

&lt;p&gt;Object Calisthenics é como uma "academia para o seu código"! 💪 Criado por Jeff Bay, é um conjunto de 9 regras que funcionam como exercícios para tornar seu código mais orientado a objetos e próximo dos princípios SOLID.&lt;/p&gt;

&lt;p&gt;As 9 regras são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apenas um nível de indentação por método&lt;/li&gt;
&lt;li&gt;Não use a palavra-chave ELSE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encapsule todos os tipos primitivos e Strings&lt;/strong&gt; ⭐ (nosso foco hoje!)&lt;/li&gt;
&lt;li&gt;Coleções como objetos de primeira classe&lt;/li&gt;
&lt;li&gt;Um ponto por linha&lt;/li&gt;
&lt;li&gt;Não abrevie&lt;/li&gt;
&lt;li&gt;Mantenha todas as entidades pequenas&lt;/li&gt;
&lt;li&gt;Não mais que duas variáveis de instância por classe&lt;/li&gt;
&lt;li&gt;Evite getters/setters/properties&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🚨 O Problema: Obsessão por Tipos Primitivos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cenário Típico (que você já viu mil vezes)
&lt;/h3&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;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;_price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_stock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_sku&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Product&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;name&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;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;stock&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;sku&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Validação do nome&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome do produto inválido"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Validação do preço&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Preço deve ser maior que zero"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Validação do estoque&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Estoque não pode ser negativo"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Validação do SKU (aquela validação chata)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sku&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;span class="n"&gt;Regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@"^[A-Z0-9\-]+$"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SKU inválido"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_stock&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_sku&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sku&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;h3&gt;
  
  
  😱 Os Problemas Dessa Abordagem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Código Duplicado Everywhere&lt;/strong&gt;&lt;br&gt;
Precisa criar um &lt;code&gt;OrderItem&lt;/code&gt;? Vai ter que copiar todas essas validações de novo!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Responsabilidade Confusa&lt;/strong&gt;&lt;br&gt;
Por que diabos um &lt;code&gt;Product&lt;/code&gt; precisa saber como validar SKU? 🤯&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Violação do Princípio Aberto-Fechado&lt;/strong&gt;&lt;br&gt;
Se a regra de validação de preço mudar, você vai ter que mexer na classe &lt;code&gt;Product&lt;/code&gt;. E se tiver mais 10 classes usando preço? Boa sorte! 😅&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Classe Gigante&lt;/strong&gt;&lt;br&gt;
Sua classe vai ficar enorme sem ter nenhum comportamento realmente relacionado ao &lt;code&gt;Product&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ A Solução: Value Objects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Criando um Preço que se Valida
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&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;Price&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Preço deve ser maior que zero"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&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;Price&lt;/span&gt; &lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_value&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;Price&lt;/span&gt; &lt;span class="nf"&gt;ApplyDiscount&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;percentage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;percentage&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C2"&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;h3&gt;
  
  
  SKU que Sabe se Comportar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Text.RegularExpressions&lt;/span&gt;&lt;span class="p"&gt;;&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;SKU&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SKU&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;sku&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;Validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Validate&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;sku&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SKU não pode ser vazio"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;Regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@"^[A-Z0-9\-]{5,20}$"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SKU deve ter entre 5 e 20 caracteres alfanuméricos"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;Equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;SKU&lt;/span&gt; &lt;span class="n"&gt;sku&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;GetHashCode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetHashCode&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;h3&gt;
  
  
  Estoque com Regras de Negócio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&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;Stock&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Estoque não pode ser negativo"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsAvailable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsLowStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsOutOfStock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&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;Stock&lt;/span&gt; &lt;span class="nf"&gt;Remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InvalidOperationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Estoque insuficiente"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;);&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;Stock&lt;/span&gt; &lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;quantity&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;h3&gt;
  
  
  Nome de Produto com Validações
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&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;ProductName&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ProductName&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;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome não pode ser vazio"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome deve ter pelo menos 3 caracteres"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome não pode ter mais de 100 caracteres"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;Equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;ProductName&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;GetHashCode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetHashCode&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;h2&gt;
  
  
  🎉 O Resultado: Product Renovado
&lt;/h2&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;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;ProductName&lt;/span&gt; &lt;span class="n"&gt;_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="n"&gt;_price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Stock&lt;/span&gt; &lt;span class="n"&gt;_stock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;SKU&lt;/span&gt; &lt;span class="n"&gt;_sku&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ProductName&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Stock&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SKU&lt;/span&gt; &lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_stock&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_sku&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="nf"&gt;GetPrice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_price&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;GetStock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetSKU&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_sku&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Agora você pode ter comportamentos reais do Product!&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;CanBeSold&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsAvailable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;NeedsRestock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsLowStock&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;Price&lt;/span&gt; &lt;span class="nf"&gt;CalculateDiscountedPrice&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;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_price&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ApplyDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;discount&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;h3&gt;
  
  
  🚀 Como Usar na Prática
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Criação segura - qualquer valor inválido vai explodir na hora certa!&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;name&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;ProductName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Notebook Gamer XYZ"&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;price&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;Price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2999.99m&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;stock&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;Stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;15&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;sku&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;SKU&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"NGB-XYZ-2024"&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;product&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;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Comportamentos ricos!&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CanBeSold&lt;/span&gt;&lt;span class="p"&gt;())&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;discountedPrice&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CalculateDiscountedPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Produto disponível por &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;discountedPrice&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NeedsRestock&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"⚠️ Produto com estoque baixo - reabastecer!"&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;h2&gt;
  
  
  🎯 Benefícios Que Você Vai Ganhar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Reutilização Total&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Precisa de &lt;code&gt;Price&lt;/code&gt; em 20 classes? Use o mesmo &lt;code&gt;Price&lt;/code&gt; object em todas!&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Manutenção Centralizada&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Mudou a regra de validação? Só mexe em um lugar!&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Testes Mais Fáceis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Teste a validação do SKU separadamente do &lt;code&gt;Product&lt;/code&gt;. Cada coisa no seu lugar!&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Código Mais Expressivo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;product.CanBeSold()&lt;/code&gt; é muito mais claro que verificar &lt;code&gt;product.Stock &amp;gt; 0&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Fail-Fast&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Erros são detectados no momento da criação, não quando você menos espera.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Cuidados e Bom Senso
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nem tudo precisa virar Value Object!&lt;/strong&gt; 🧠&lt;/p&gt;

&lt;p&gt;Se você tem um &lt;code&gt;bool isActive&lt;/code&gt; no seu &lt;code&gt;Product&lt;/code&gt;, não precisa criar uma classe &lt;code&gt;IsActive&lt;/code&gt;. Use o bom senso!&lt;/p&gt;

&lt;p&gt;Object Calisthenics são &lt;strong&gt;exercícios&lt;/strong&gt;, não leis absolutas. A ideia é treinar seu pensamento orientado a objetos, não enlouquecer criando classe para tudo.&lt;/p&gt;

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

&lt;p&gt;A regra "Encapsule todos os tipos primitivos" do Object Calisthenics não é sobre complicar seu código - é sobre deixá-lo mais &lt;strong&gt;robusto&lt;/strong&gt;, &lt;strong&gt;reutilizável&lt;/strong&gt; e &lt;strong&gt;expressivo&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Quando você para de usar &lt;code&gt;decimal&lt;/code&gt; para preços, &lt;code&gt;string&lt;/code&gt; para SKUs e &lt;code&gt;int&lt;/code&gt; para quantidades e começa a criar objetos que representam conceitos reais do seu domínio, seu código ganha vida. Ele fica mais fácil de entender, testar e manter.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Próximos Passos
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identifique&lt;/strong&gt; os tipos primitivos no seu código atual&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pergunte-se&lt;/strong&gt;: "Esse valor tem regras de negócio? Precisa de validação?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crie Value Objects&lt;/strong&gt; para os casos que fazem sentido&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refatore gradualmente&lt;/strong&gt; - não precisa fazer tudo de uma vez!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lembre-se: você não escreve código apenas para a máquina, mas para &lt;strong&gt;pessoas&lt;/strong&gt; (incluindo você do futuro)! 😉&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>coding</category>
      <category>design</category>
    </item>
    <item>
      <title>Framework novo todo mês: evolução ou roda com adesivo novo?</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Tue, 05 Aug 2025 20:17:52 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/framework-novo-todo-mes-evolucao-ou-roda-com-adesivo-novo-1k6l</link>
      <guid>https://dev.to/filipi_firmino_dev/framework-novo-todo-mes-evolucao-ou-roda-com-adesivo-novo-1k6l</guid>
      <description>&lt;p&gt;Sabe quando você entra no Twitter e vê alguém dizendo: “Nova stack JavaScript que vai revolucionar o mercado!”… e você nem aprendeu direito a anterior? Pois é. Parece que estamos presos em um looping infinito de frameworks, onde o hype chega antes da estabilidade e a documentação às vezes é só um post no Medium de 2017.&lt;/p&gt;

&lt;p&gt;Hoje vamos falar da polêmica que todo dev já murmurou (ou gritou em silêncio): será que estamos realmente evoluindo, ou só refazendo a roda com nomes mais descolados?&lt;/p&gt;




&lt;h2&gt;
  
  
  🤹 O circo dos frameworks
&lt;/h2&gt;

&lt;p&gt;A cada três scrolls no feed do LinkedIn ou X, surge um novo “meta-framework”, “turbo stack”, “minimal boilerplate” ou alguma variação disso. A promessa é sempre a mesma: &lt;strong&gt;ser mais performático, mais fácil, mais intuitivo, mais tudo&lt;/strong&gt;. Mas será que alguém parou pra pensar se a gente &lt;em&gt;precisava&lt;/em&gt; mesmo disso?&lt;/p&gt;

&lt;p&gt;Um dev backend sênior que conheci uma vez me disse:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Todo framework novo é como uma start-up: começa resolvendo um problema real, mas logo vira uma empresa tentando justificar sua existência.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E ele não estava errado.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Por que caímos nesse ciclo?
&lt;/h2&gt;

&lt;p&gt;Existem alguns fatores — técnicos, emocionais e até sociais — que explicam esse comportamento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Curiosidade natural do dev&lt;/strong&gt;: Aprender coisa nova dá aquele shot de dopamina. Parece que estamos “evoluindo” só por ter digitado &lt;code&gt;npm install o-novo-do-momento&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FOMO&lt;/strong&gt; (Fear of Missing Out): Ver todo mundo postando sobre o novo &lt;code&gt;XJS&lt;/code&gt; faz a gente se sentir desatualizado. Gatilho da escassez ativado com sucesso. 😅&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prova social&lt;/strong&gt;: Se grandes empresas usam, deve ser bom, né? (Spoiler: nem sempre.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Síndrome do impostor inversa&lt;/strong&gt;: “Se eu não estou aprendendo o novo framework, será que sou um dev de verdade?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resultado? Gente migrando de stack antes mesmo da anterior estar consolidada no projeto.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 E o problema não é o framework...
&lt;/h2&gt;

&lt;p&gt;Antes que você pense que isso é um manifesto reacionário do tipo “voltemos ao jQuery”, calma lá.&lt;/p&gt;

&lt;p&gt;Frameworks são importantes, sim. Eles abstraem complexidade, padronizam boas práticas e impulsionam a comunidade. O problema está &lt;strong&gt;no consumo desenfreado&lt;/strong&gt;, não na criação. É como querer trocar de carro toda semana só porque lançaram um com farol de LED.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nem toda mudança é evolução. E nem toda novidade vale a pena pra você, agora.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Então o que fazer?
&lt;/h2&gt;

&lt;p&gt;A chave aqui é &lt;em&gt;intencionalidade&lt;/em&gt;. Em vez de correr atrás de tudo o que brilha, que tal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Investigar a real necessidade da stack&lt;/strong&gt; antes de adotar algo novo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estudar fundamentos&lt;/strong&gt;, que nunca saem de moda (HTTP, arquitetura, lógica de programação...).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dominar bem uma stack&lt;/strong&gt; antes de saltar para outra. Ser especialista ainda é sexy, viu?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entender o contexto do projeto e da equipe&lt;/strong&gt;. Às vezes, o melhor framework é aquele que TODO MUNDO CONSEGUE USAR.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Conclusão: nem toda buzzword vira legado
&lt;/h2&gt;

&lt;p&gt;O mundo dev tem um ritmo alucinante — e parte disso é o que torna tudo tão instigante. Mas também pode ser exaustivo se você entrar no jogo do hype como se fosse um campeonato.&lt;/p&gt;

&lt;p&gt;Você não precisa conhecer todos os frameworks para ser um bom dev. Precisa saber escolher &lt;strong&gt;quando&lt;/strong&gt; usar algo novo — e quando dizer: “Tá bom assim, obrigado.”&lt;/p&gt;

&lt;p&gt;Então da próxima vez que surgir uma nova lib com nome de animal selvagem misturado com sigla obscura, respira fundo. Pergunta pra si mesmo:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Isso resolve um problema real ou só alimenta minha ansiedade de estar por dentro?&lt;/strong&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;“Framework bom é igual café: não precisa ser o mais caro, só precisa funcionar bem no seu dia a dia.” – Um dev cansado, provavelmente.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Reinventando a roda: por que todo projeto quer criar "a sua própria arquitetura"?</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Mon, 04 Aug 2025 22:06:08 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/reinventando-a-roda-por-que-todo-projeto-quer-criar-a-sua-propria-arquitetura-1n12</link>
      <guid>https://dev.to/filipi_firmino_dev/reinventando-a-roda-por-que-todo-projeto-quer-criar-a-sua-propria-arquitetura-1n12</guid>
      <description>&lt;p&gt;&lt;em&gt;“Aqui a gente usa uma arquitetura que a gente mesmo criou...”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se você já ouviu (ou falou) isso, provavelmente já está sentindo um leve arrepio no teclado. 😅 E se ainda não ouviu, prepare-se: é questão de tempo até topar com um sistema que mais parece uma ficção científica mal escrita.&lt;/p&gt;

&lt;p&gt;Vamos conversar sobre essa mania quase ritualística que muitos times devs têm de criar &lt;em&gt;A Arquitetura Suprema™, única, personalizada&lt;/em&gt;, como se o projeto fosse uma startup unicórnio em Marte — quando, na real, é um CRUD de orçamento com autenticação e um botão de exportar pra Excel.&lt;/p&gt;




&lt;h2&gt;
  
  
  O ego do dev arquiteto (e o custo disso)
&lt;/h2&gt;

&lt;p&gt;No fundo, no fundo, criar uma arquitetura do zero dá aquela sensação boa de poder. É como brincar de Lego: você decide onde vai cada pecinha. Só que, diferente do Lego, aqui o tempo custa caro e o time do futuro vai te xingar em 3 linguagens diferentes.&lt;/p&gt;

&lt;p&gt;Arquitetura customizada demais, sem seguir padrões consolidados como DDD, Clean Architecture ou até um MVC bem feito, vira dívida técnica disfarçada de inovação. Você pode até convencer o time de que aquele &lt;em&gt;handler mágico com 5 middlewares e 12 interceptadores&lt;/em&gt; é o caminho — mas daqui 6 meses, quando outro dev tentar dar manutenção, vai ser tipo montar um quebra-cabeça com peças de jogos diferentes.&lt;/p&gt;




&lt;h2&gt;
  
  
  O paradoxo da inovação: nem tudo precisa ser novo
&lt;/h2&gt;

&lt;p&gt;Aqui entra um dos gatilhos mentais mais traiçoeiros do mundo tech: o da &lt;strong&gt;curiosidade&lt;/strong&gt;. O desenvolvedor vê uma arquitetura no Medium, ou assiste uma talk sobre microserviços em Kubernetes, e pronto — quer aplicar isso no sistema de controle de ponto do RH.&lt;/p&gt;

&lt;p&gt;Mas inovação sem propósito é só complexidade disfarçada. &lt;/p&gt;

&lt;p&gt;Você não ganha pontos por usar 3 filas Kafka, 2 sagas e uma pitada de event sourcing num projeto que tem 50 usuários ativos. Isso não é arquitetura moderna — é &lt;strong&gt;overengineering gourmet&lt;/strong&gt;. E a conta vai chegar. Ah, vai.&lt;/p&gt;




&lt;h2&gt;
  
  
  "Mas aqui é diferente..."
&lt;/h2&gt;

&lt;p&gt;Todo dev já ouviu (ou disse) isso. É o mantra da customização desenfreada: &lt;em&gt;“nosso caso é especial”&lt;/em&gt;. Spoiler: 90% das vezes, não é.&lt;/p&gt;

&lt;p&gt;Empresas bem-sucedidas, de todos os tamanhos, adotam padrões. Do iFood ao Nubank, do Magazine Luiza ao seu sistema interno de gestão de planilhas — todos ganham em previsibilidade, reuso e facilidade de onboard.&lt;/p&gt;

&lt;p&gt;Quando você foge dos padrões por "excesso de criatividade", está empurrando seu projeto pro isolamento técnico. E sabe o que mora no isolamento? Bugs, burnout e devs com vontade de mudar de time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ok, mas e a tal da flexibilidade?
&lt;/h2&gt;

&lt;p&gt;Agora você pode estar pensando: “Então é pra fazer tudo igual sempre?”. Calma, jovem padawan. Flexibilidade é importante, sim. Mas ela precisa nascer de um &lt;strong&gt;alicerce sólido&lt;/strong&gt; — e não de um castelo de areia feito com conceitos que só você entende.&lt;/p&gt;

&lt;p&gt;Padrões servem pra você &lt;strong&gt;ganhar tempo com o que realmente importa&lt;/strong&gt;: regras de negócio, performance, experiência do usuário. Não pra você perder semanas discutindo onde vai ficar a camada de orquestração do seu Domain Notification Aggregator (que, sejamos honestos, ninguém além de você entende).&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão: menos show, mais código sustentável
&lt;/h2&gt;

&lt;p&gt;No fim das contas, arquitetura não é palco pra ego. É fundação. E fundação boa é aquela que permite que outras pessoas construam em cima — sem medo, sem dor e sem precisar te ligar no domingo à noite pra entender como fazer um PUT funcionar.&lt;/p&gt;

&lt;p&gt;A real maturidade de um time está em &lt;strong&gt;saber quando inovar e quando apenas seguir o que já funciona&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;E antes de criar o seu próximo “framework próprio com arquitetura que a gente bolou aqui”, dá uma olhada em como o mercado está resolvendo esse problema. Talvez a resposta esteja ali, no bom e velho Clean Architecture com um toque de simplicidade.&lt;/p&gt;

&lt;p&gt;Afinal, o que é mais sexy do que um sistema que funciona, é escalável e qualquer dev consegue entender?&lt;/p&gt;

&lt;p&gt;Nada. Absolutamente nada. ❤️&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;"&lt;em&gt;Simplicidade é o último grau de sofisticação.&lt;/em&gt;"&lt;br&gt;&lt;br&gt;
– Leonardo da Vinci (e todo dev que já limpou a bagunça de um sistema “visionário”)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Quer continuar esse papo? Me conta nos comentários: qual foi a arquitetura mais bizarra que você já viu em produção? 😬&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Async/Await na prática: por que seu código 'assíncrono' ainda está lento?</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Sat, 02 Aug 2025 16:56:10 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/asyncawait-na-pratica-por-que-seu-codigo-assincrono-ainda-esta-lento-1m0j</link>
      <guid>https://dev.to/filipi_firmino_dev/asyncawait-na-pratica-por-que-seu-codigo-assincrono-ainda-esta-lento-1m0j</guid>
      <description>&lt;p&gt;Você colocou &lt;code&gt;async&lt;/code&gt; no método, &lt;code&gt;await&lt;/code&gt; em tudo quanto é canto, a IDE parou de reclamar... mas o sistema continua lento. Dá até vontade de gritar: &lt;strong&gt;“Tô usando async! Por que isso ainda parece síncrono com insônia?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Calma, dev. Bora entender onde tá o bug invisível (e como evitá-lo no mundo real do .NET).&lt;/p&gt;




&lt;h2&gt;
  
  
  Primeiro, um alerta: &lt;code&gt;async/await&lt;/code&gt; não é magia negra ⚠️
&lt;/h2&gt;

&lt;p&gt;Sim, a sintaxe parece um encantamento de Hogwarts: &lt;code&gt;await AbrirConexaoComBancoAsync();&lt;/code&gt;&lt;br&gt;
Mas por trás disso, tem &lt;strong&gt;threads&lt;/strong&gt;, &lt;strong&gt;tasks&lt;/strong&gt;, &lt;strong&gt;contextos de sincronização&lt;/strong&gt;, e um compilador trabalhando mais do que o estagiário em semana de entrega.&lt;/p&gt;

&lt;p&gt;E é aí que mora o perigo: muita gente usa &lt;code&gt;async/await&lt;/code&gt; achando que está paralelizando tudo, &lt;strong&gt;quando na real está só empilhando promessas mal resolvidas&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Entendendo a armadilha: o falso assíncrono
&lt;/h2&gt;

&lt;p&gt;Veja este exemplo clássico de cilada:&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;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Usuario&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetUsuariosAsync&lt;/span&gt;&lt;span class="p"&gt;()&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;lista&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Usuario&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="k"&gt;foreach&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;id&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;listaDeIds&lt;/span&gt;&lt;span class="p"&gt;)&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;usuario&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_servicoUsuarios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuscarPorIdAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario&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="n"&gt;lista&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;Você olha isso e pensa:&lt;/p&gt;

&lt;p&gt;“&lt;strong&gt;Olha que lindo, tudo assíncrono!&lt;/strong&gt;”&lt;/p&gt;

&lt;p&gt;Mas não. Tá tudo &lt;strong&gt;sequencial&lt;/strong&gt;. Um &lt;code&gt;await&lt;/code&gt; só roda depois que o outro termina.&lt;br&gt;
Isso é o equivalente a usar Uber pra ir pra padaria da esquina. Funciona? Funciona. Mas tá longe de ser eficiente.&lt;/p&gt;
&lt;h2&gt;
  
  
  A solução? &lt;code&gt;Task.WhenAll&lt;/code&gt; na sua vida 🧠
&lt;/h2&gt;

&lt;p&gt;Se o serviço permite chamadas em paralelo, &lt;strong&gt;faça isso&lt;/strong&gt;:&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;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Usuario&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetUsuariosAsync&lt;/span&gt;&lt;span class="p"&gt;()&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;tarefas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listaDeIds&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;id&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_servicoUsuarios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuscarPorIdAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&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;resultados&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WhenAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tarefas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resultados&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&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;Agora sim: todas as requisições estão rolando ao mesmo tempo, aproveitando o que a programação assíncrona tem de melhor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outro vilão oculto: o tal do &lt;code&gt;ConfigureAwait(false)&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Se você tá desenvolvendo em &lt;strong&gt;ASP.NET Core&lt;/strong&gt;, usar ou não usar &lt;code&gt;ConfigureAwait(false)&lt;/code&gt; pode ser a diferença entre uma app escalável ou uma panela de pressão explodindo.&lt;/p&gt;

&lt;p&gt;Por padrão, &lt;code&gt;await&lt;/code&gt; tenta capturar o contexto de sincronização original (tipo, o contexto do thread do request).&lt;br&gt;
Mas no ASP.NET Core, você &lt;strong&gt;não precisa disso&lt;/strong&gt;. E evitar essa captura &lt;strong&gt;libera a thread mais cedo&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_algumaCoisa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FazAlgoAsync&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ConfigureAwait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Menos overhead. Mais performance. Mais paz.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tá, mas quando NÃO usar paralelismo?
&lt;/h2&gt;

&lt;p&gt;Nem todo &lt;code&gt;async&lt;/code&gt; precisa ser paralelo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se os métodos compartilham estado (tipo, gravam na mesma lista), &lt;strong&gt;melhor evitar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Se sua fonte de dados limita chamadas concorrentes (como alguns bancos ou APIs), paralelismo pode &lt;strong&gt;prejudicar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Se o serviço for "assíncrono em aparência, mas síncrono por dentro", também &lt;strong&gt;não adianta muito&lt;/strong&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja: &lt;strong&gt;assíncrono é ótimo&lt;/strong&gt; — mas nem tudo que brilha é &lt;code&gt;Task.Run()&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Moral da thread
&lt;/h2&gt;

&lt;p&gt;Async não resolve tudo, mas bem usado é &lt;strong&gt;poder puro ⚙️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O uso de &lt;code&gt;async/await&lt;/code&gt; no C# é uma das maiores evoluções da linguagem.Mas usá-los de forma ingênua é como dirigir uma Ferrari com freio de mão puxado: bonito por fora, frustrante por dentro.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Seja esperto. Entenda o que tá rodando por baixo.&lt;br&gt;
Meça, monitore, e use as ferramentas com propósito.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Seu sistema, seu time e seu cliente vão agradecer (e talvez até o seu GC também).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.:&lt;/strong&gt;&lt;br&gt;
Se você leu até aqui e pensou “&lt;em&gt;puts, eu faço isso no meu código&lt;/em&gt;😬” — respira. Refatora.&lt;br&gt;
E compartilha esse artigo com o time antes que mais alguém invente de colocar &lt;code&gt;async void&lt;/code&gt; no Controller.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dev vai perder o emprego por causa da IA? Ou é só drama do Twitter?</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Fri, 01 Aug 2025 21:18:15 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/dev-vai-perder-o-emprego-por-causa-da-ia-ou-e-so-drama-do-twitter-22p5</link>
      <guid>https://dev.to/filipi_firmino_dev/dev-vai-perder-o-emprego-por-causa-da-ia-ou-e-so-drama-do-twitter-22p5</guid>
      <description>&lt;p&gt;Você já abriu o X (ex-Twitter), viu um post tipo “Copilot escreve melhor que muito júnior por aí”, e sentiu aquele frio na espinha? Calma. Respira. Esse papo de “IA vai substituir os devs” já virou o novo “o HTML vai morrer”.&lt;/p&gt;

&lt;p&gt;Mas sim, &lt;strong&gt;temos que conversar sobre isso com seriedade (e memes, se possível)&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  IA escreve código. E daí?
&lt;/h2&gt;

&lt;p&gt;Sim, o Copilot completa código. O ChatGPT te dá um CRUD inteiro em segundos. O Gemini e o Claude agora até explicam lógica recursiva com exemplos de bolo de cenoura. Tá assustador? Um pouco. Mas será que isso significa o fim dos devs?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoiler: não. Significa o fim dos devs que só decoram stackoverflow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A IA tá aqui pra automatizar o braçal, o repetitivo, o que você faz de olhos fechados. E isso não é o fim. É só o &lt;em&gt;shift + tab&lt;/em&gt; da profissão: um recuo estratégico pra gente pensar em mais alto nível.&lt;/p&gt;




&lt;h2&gt;
  
  
  E o júnior, como fica?
&lt;/h2&gt;

&lt;p&gt;Muita gente fala: “Mas e o dev júnior? Como vai aprender se a IA faz tudo?”&lt;br&gt;&lt;br&gt;
Bom... se você depender de digitar &lt;code&gt;for (int i = 0; i &amp;lt; 10; i++)&lt;/code&gt; 10 mil vezes pra aprender, talvez o problema não seja a IA. Talvez a gente precise repensar &lt;em&gt;como ensinamos&lt;/em&gt; programação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A boa notícia é que a IA também pode ser o melhor professor que você já teve.&lt;/strong&gt; Te explica, te corrige, não julga quando você pergunta pela décima vez o que é &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A má notícia? Agora não tem mais desculpa pra não evoluir. 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  O futuro do dev: mais estrategista, menos digitador
&lt;/h2&gt;

&lt;p&gt;Quem vai continuar relevante?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quem entende o &lt;strong&gt;porquê&lt;/strong&gt; das coisas, não só o "como".&lt;/li&gt;
&lt;li&gt;Quem sabe tomar decisões técnicas e arquiteturais, mesmo com um assistente sugerindo caminhos.&lt;/li&gt;
&lt;li&gt;Quem usa IA como &lt;strong&gt;aliada&lt;/strong&gt;, e não como muleta.&lt;/li&gt;
&lt;li&gt;Quem domina soft skills: comunicação, colaboração, visão de produto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Porque no fim das contas, &lt;strong&gt;saber apertar botões é diferente de saber resolver problemas&lt;/strong&gt;. E resolver problema é o que as empresas pagam pra você fazer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Devs não vão sumir. Mas os “copiadores de stackoverflow” vão.
&lt;/h2&gt;

&lt;p&gt;A IA não está te substituindo. Ela está substituindo &lt;strong&gt;quem não evolui&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lembra quando diziam que o Excel ia acabar com os contadores? E o AutoCAD ia matar os arquitetos? Então. Eles continuam aí. Mas os melhores aprenderam a usar essas ferramentas a seu favor.&lt;/p&gt;

&lt;p&gt;É isso que vai acontecer com a IA: &lt;strong&gt;quem aprender a pilotar a máquina, vai mais longe.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Moral do bug: não é sobre a IA — é sobre o que você faz com ela
&lt;/h2&gt;

&lt;p&gt;Pare de brigar com a IA como se ela fosse seu concorrente. Ela não quer seu trampo. Ela quer seu tempo. Quer te dar espaço pra criar, arquitetar, explorar ideias novas. Enquanto ela cuida do resto.&lt;/p&gt;

&lt;p&gt;Então na próxima vez que você ouvir “a IA vai te substituir”, responda:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Só se o cara for igual a um autocomplete. Eu sou mais do que isso.”&lt;/strong&gt; 😉&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S.: Se esse texto te deu aquele alívio existencial, compartilha com um amigo que tá surtando achando que o GPT vai virar Tech Lead dele. Bora respirar juntos.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Mentores que não codam: dá pra confiar ou é cilada, Bino?</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Thu, 31 Jul 2025 18:13:00 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/mentores-que-nao-codam-da-pra-confiar-ou-e-cilada-bino-311n</link>
      <guid>https://dev.to/filipi_firmino_dev/mentores-que-nao-codam-da-pra-confiar-ou-e-cilada-bino-311n</guid>
      <description>&lt;p&gt;Sabe aquele mentor famosinho no LinkedIn que fala bonito sobre carreira dev, mas que nunca mostrou um &lt;code&gt;git log&lt;/code&gt; ou um &lt;code&gt;for&lt;/code&gt; na vida? Pois é… esse artigo é pra você que já se pegou pensando: &lt;strong&gt;"Será que eu devo ouvir alguém que não escreve código?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bora conversar sobre isso sem alfinetada gratuita, mas com umas verdades que talvez incomodem -&lt;em&gt;um pouquinho só, prometo&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  “Na minha época, isso tudo era mato...” — a sabedoria ou a enrolação?
&lt;/h2&gt;

&lt;p&gt;Mentoria é um negócio mágico. Ter alguém que te guia, te mostra caminhos, evita que você caia em armadilhas... é como ter um GPS emocional e técnico na jornada. Mas, como todo bom GPS, ele precisa estar &lt;strong&gt;atualizado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E aí começa o dilema: se o mentor não mexe mais com código, será que ele ainda entende os desafios reais de hoje? Tipo, como explicar burnout por causa de 34 deploys por semana se a pessoa nunca usou GitHub Actions ou enfrentou um Jira caótico às 17h de sexta?&lt;/p&gt;

&lt;p&gt;A comparação é cruel, eu sei. Mas &lt;strong&gt;ela é necessária&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nem todo mentor precisa ser um “coder ninja” (mas ajuda bastante)
&lt;/h2&gt;

&lt;p&gt;Calma, respira. Não tô dizendo que só vale escutar quem tá com o VS Code aberto 24h por dia. Longe disso. Conhecimento teórico, vivência em outras áreas, visão de negócios... tudo isso é valiosíssimo.&lt;/p&gt;

&lt;p&gt;Mas sejamos sinceros: &lt;strong&gt;quando o mentor nunca passou por nada parecido com o que você vive hoje, o risco de virar conselho genérico disfarçado de sabedoria é altíssimo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;É tipo pedir dica de arquitetura de microsserviços pra quem parou no monolito do Delphi. Pode vir algo útil? Até pode. Mas não seria mais prático (e seguro) conversar com alguém que realmente vive isso?&lt;/p&gt;




&lt;h2&gt;
  
  
  O que realmente importa num mentor?
&lt;/h2&gt;

&lt;p&gt;Mais do que saber programar (embora isso seja ótimo), um bom mentor precisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ter empatia de contexto&lt;/strong&gt;: entender o que você tá passando hoje, e não só o que &lt;em&gt;ele passou&lt;/em&gt; há 10 anos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compartilhar experiências com vulnerabilidade&lt;/strong&gt;: não é só contar vitórias, é mostrar os tombos também.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estar em aprendizado constante&lt;/strong&gt;: o mentor que estagnou vira estátua, não guia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saber ouvir mais do que falar&lt;/strong&gt;: porque às vezes, o melhor conselho é só fazer a pergunta certa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ah, e se ele ainda codar de vez em quando, aí é bônus nível épico.&lt;/p&gt;




&lt;h2&gt;
  
  
  A real: mentor bom não precisa saber tudo — só precisa estar disposto a caminhar com você
&lt;/h2&gt;

&lt;p&gt;No fim do dia, o código muda, as ferramentas evoluem, mas &lt;strong&gt;os dilemas continuam os mesmos&lt;/strong&gt;: insegurança, medo de não dar conta, decisões difíceis, síndrome do impostor, burnout, pressão.&lt;/p&gt;

&lt;p&gt;Um mentor não serve só pra te ensinar a usar &lt;code&gt;async/await&lt;/code&gt;, mas pra te lembrar que tá tudo bem se hoje você só conseguiu abrir o editor e tomar um café. Que todo mundo tem fases. E que crescimento de verdade vem mais de conversa sincera do que de fórmulas mágicas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão que vale ouro (sem depender de pull request)
&lt;/h2&gt;

&lt;p&gt;Confie em mentores que se importam com você como pessoa, não só como um “júnior querendo chegar lá”.&lt;br&gt;&lt;br&gt;
Desconfie de quem nunca mostra o bastidor, mas vive dando palestra sobre “ser sênior em 6 meses”.&lt;br&gt;&lt;br&gt;
E mais importante: &lt;strong&gt;seja também o mentor que você gostaria de ter tido.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O mercado precisa de menos palestrinha e mais gente de verdade.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S.: Tem algum mentor que te ajudou mesmo sem codar todos os dias? Manda esse artigo pra ele com um “valeu!” no assunto. Reconhecimento também é prática sênior 😉&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>Será que eu sei mesmo programar?</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Wed, 30 Jul 2025 23:16:24 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/sera-que-eu-sei-mesmo-programar-jbg</link>
      <guid>https://dev.to/filipi_firmino_dev/sera-que-eu-sei-mesmo-programar-jbg</guid>
      <description>&lt;h2&gt;
  
  
  🧠 “Será que eu sei mesmo programar?” — a verdade sobre a síndrome do impostor no mundo dev
&lt;/h2&gt;

&lt;p&gt;Você já olhou praquele código que escreveu ontem e pensou: “quem foi o gênio que escreveu isso?”... e aí percebeu que foi você mesmo? Pois é. Bem-vindo ao clube nada exclusivo (mas pouco falado) da &lt;strong&gt;síndrome do impostor&lt;/strong&gt; &lt;br&gt;
— aquele bug mental que vive dizendo que você não é bom o suficiente, mesmo com todos os testes passando em verde.&lt;/p&gt;

&lt;p&gt;Talvez você esteja rindo com nervoso agora. E tudo bem. Vamos falar sobre isso com a leveza e sinceridade que esse tema merece.&lt;/p&gt;




&lt;h2&gt;
  
  
  A build falhou, mas não foi o código. Foi você (ou pelo menos é o que sua mente diz)
&lt;/h2&gt;

&lt;p&gt;No mundo do desenvolvimento, é comum acharmos que todo mundo manja mais do que a gente. O cara do time que parece resolver tudo só com &lt;code&gt;regex&lt;/code&gt;, a dev que faz live coding no Twitch, o amigo que fala de arquitetura como se estivesse explicando receita de pão... E aí, do nada, você se vê pensando: &lt;strong&gt;"O que eu tô fazendo aqui?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spoiler: se você tá se perguntando isso, é sinal de que provavelmente está exatamente onde deveria estar. Porque quem acha que já sabe tudo, geralmente não sabe o suficiente pra perceber o quanto ainda tem pra aprender. 🤷&lt;/p&gt;




&lt;h2&gt;
  
  
  "Mas eu não sei nem como esse código funciona!" — todo dev, toda semana
&lt;/h2&gt;

&lt;p&gt;A síndrome do impostor é traiçoeira porque ela se adapta. No início da carreira, ela diz que você não manja nada. No meio da carreira, ela diz que todo mundo ao seu redor manja mais. No fim da carreira… bom, ela ainda tá lá dizendo que você teve sorte.&lt;/p&gt;

&lt;p&gt;Esse sentimento de inadequação é mais comum do que parece. Sabe aquele dev que você admira no LinkedIn? Ele provavelmente também sente isso. Ele só aprendeu a conviver com o sentimento, como quem ignora aquele aviso do Windows pedindo pra atualizar.&lt;/p&gt;

&lt;p&gt;A real é: &lt;strong&gt;todo mundo está improvisando em algum nível&lt;/strong&gt;. O segredo não é eliminar a síndrome do impostor, mas aprender a usá-la como combustível. Se você sente que sabe pouco, talvez isso só signifique que você se importa em fazer bem feito. E isso já é meio caminho andado.&lt;/p&gt;




&lt;h2&gt;
  
  
  A mentira que te contaram: “Quando eu for sênior, isso vai passar”
&lt;/h2&gt;

&lt;p&gt;Olha... não vai. Ou melhor, até pode passar, mas volta. Em outros formatos. Quando você vira sênior, o fantasma muda de roupa e aparece como o "medo de não estar liderando bem", "de não saber arquitetura direito", ou "de estar atrasado na IA quântica com Blockchain em Rust rodando no Kubernetes do metaverso". E tudo bem.&lt;/p&gt;

&lt;p&gt;A grande sacada é entender que &lt;strong&gt;confiança não vem de saber tudo — vem de saber que você é capaz de aprender o que for necessário&lt;/strong&gt;. É aquela skill secreta que não aparece no currículo, mas que todo bom dev precisa: a coragem de dizer "não sei" sem travar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Então o que eu faço com esse bug mental?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fale sobre isso.&lt;/strong&gt; O simples ato de compartilhar esse sentimento com colegas ou mentores já é um "debug" poderoso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registre suas vitórias.&lt;/strong&gt; Mantenha uma pastinha (física ou mental) com os projetos que deu conta, os bugs que matou, os PRs que foram aprovados de primeira.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare-se com seu eu de ontem, não com o dev do YouTube.&lt;/strong&gt; Lembre-se: o vídeo editado de alguém nunca vai refletir a bagunça que é o processo real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dê tempo ao tempo.&lt;/strong&gt; A confiança é acumulada como XP em um RPG — aos poucos, errando, tentando, caindo e levantando.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Moral da história? O impostor não vai embora, mas você pode colocá-lo no banco de trás.
&lt;/h2&gt;

&lt;p&gt;A síndrome do impostor é tipo aquele linter chato: fica te lembrando das falhas, mas também te empurra pra melhorar. E no fundo, ela só existe porque você se importa. Porque quer entregar código limpo, entender o sistema, fazer bonito no review.&lt;/p&gt;

&lt;p&gt;Então da próxima vez que ela aparecer, respira fundo e lembra: &lt;strong&gt;você não está sozinho nessa. E se duvidar, tá indo bem melhor do que imagina.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E se ainda não acredita em mim… olha só o tanto de gente compartilhando esse artigo dizendo “sou eu todinho”. 😉&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S.: Se esse artigo falou contigo, manda praquele colega que vive se achando "juninho", mesmo sendo brabo. Bora desbugar essa mentalidade juntos.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cleancode</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CLT, PJ ou Freela? A treta mais antiga do TI depois de Tabs vs Spaces</title>
      <dc:creator>Filipi Firmino</dc:creator>
      <pubDate>Mon, 28 Jul 2025 21:04:24 +0000</pubDate>
      <link>https://dev.to/filipi_firmino_dev/clt-pj-ou-freela-a-treta-mais-antiga-do-ti-depois-de-tabs-vs-spaces-2kcc</link>
      <guid>https://dev.to/filipi_firmino_dev/clt-pj-ou-freela-a-treta-mais-antiga-do-ti-depois-de-tabs-vs-spaces-2kcc</guid>
      <description>&lt;h2&gt;
  
  
  💼 CLT, PJ ou Freela? A treta mais antiga do TI depois de Tabs vs Spaces
&lt;/h2&gt;

&lt;p&gt;Se você é dev e nunca parou pra pensar em qual modelo de contratação vale mais a pena… &lt;strong&gt;provavelmente você ainda tá no LinkedIn da forma errada.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A real é que no mundo moderno do desenvolvimento — especialmente se você manja de .NET, Python, JS, IA, automação, ou se tem uma API rodando na cabeça — &lt;strong&gt;as opções são muitas e cada uma tem suas tretas, vantagens e ciladas.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos quebrar isso de forma leve (e um pouco sarcástica, porque né, a vida já é complexa demais sem humor).&lt;/p&gt;




&lt;h2&gt;
  
  
  🧑‍💻 CLT — “Contrato com Leveza... ou Tensão?”
&lt;/h2&gt;

&lt;p&gt;CLT é aquele modelo que muita empresa ama, porque traz estabilidade e conformidade legal.&lt;br&gt;&lt;br&gt;
Mas pro dev? Nem sempre é 100% amor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🟢 Pontos positivos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Férias pagas (sim, você pode sumir 30 dias sem culpa)&lt;/li&gt;
&lt;li&gt;13º salário, FGTS, plano de saúde, VR (alô iFood!)&lt;/li&gt;
&lt;li&gt;Estabilidade (o famoso “carteira assinada” que acalma o coração da sua mãe)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔴 Pontos negativos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Salário líquido menor (impostos, o terror do dev que fez o curso de finanças com Excel)&lt;/li&gt;
&lt;li&gt;Carga tributária absurda pro empregador (que podia virar aumento, né?)&lt;/li&gt;
&lt;li&gt;Pouca flexibilidade em alguns casos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;“O salário entra e já tem um boleto esperando ele na porta com um facão.”&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💼 PJ — “Pode Jogar que o imposto é seu”
&lt;/h2&gt;

&lt;p&gt;O famoso “Pessoa Jurídica” virou padrão em muitas startups e empresas que querem menos burocracia (e mais resultados).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🟢 Pontos positivos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Salário maior (sem impostos CLTianos comendo metade)&lt;/li&gt;
&lt;li&gt;Liberdade pra negociar, trabalhar remoto, até emitir nota ouvindo música eletrônica&lt;/li&gt;
&lt;li&gt;Se organizar direitinho, dá pra pagar menos imposto legalmente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔴 Pontos negativos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sem férias, sem 13º, sem "benefícios" (você é sua própria empresa)&lt;/li&gt;
&lt;li&gt;Tem que pagar contador, emitir nota, cuidar do IR — é tipo ser dev e meio financeiro&lt;/li&gt;
&lt;li&gt;Se der ruim, não tem seguro-desemprego pra te abraçar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;“Hoje sou Dev, amanhã CEO de mim mesmo, depois de amanhã tô pagando DARF com lágrimas.”&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 Freela — o modo nômade dos devs criativos (e corajosos)
&lt;/h2&gt;

&lt;p&gt;Freelancer é pra quem curte &lt;strong&gt;liberdade com adrenalina&lt;/strong&gt;. Pode ser full time ou projeto por projeto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🟢 Pontos positivos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Liberdade total (trabalhar da praia, do café ou do quarto escuro às 3h)&lt;/li&gt;
&lt;li&gt;Escolhe com quem trabalhar (em teoria)&lt;/li&gt;
&lt;li&gt;Potencial de ganhar bem se souber se vender&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔴 Pontos negativos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instabilidade: um mês você fatura R$10k, no outro come miojo com criatividade&lt;/li&gt;
&lt;li&gt;Tem que caçar cliente, lidar com prazo, contrato, cobrar (às vezes com jeitinho)&lt;/li&gt;
&lt;li&gt;Tudo depende de você: disciplina, gestão, entrega, cobrar e ainda programar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;“Trabalhar quando quiser... desde que queira trabalhar o tempo todo.”&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Qual o melhor modelo então?
&lt;/h2&gt;

&lt;p&gt;A resposta mais odiada do Stack Overflow também vale aqui: &lt;strong&gt;depende&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quer estabilidade e não quer pensar em impostos? Vai de CLT.&lt;/li&gt;
&lt;li&gt;Quer mais grana e topa lidar com papelada? PJ é teu lugar.&lt;/li&gt;
&lt;li&gt;Quer liberdade total e tem veia empreendedora? Freela pode ser o caminho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A verdade é que sua carreira é um produto. E você é o CEO.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>clt</category>
      <category>pj</category>
      <category>devlive</category>
      <category>carreira</category>
    </item>
  </channel>
</rss>
