<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thiago Bertuzzi 👨🏻‍💻</title>
    <description>The latest articles on DEV Community by Thiago Bertuzzi 👨🏻‍💻 (@tbertuzzi).</description>
    <link>https://dev.to/tbertuzzi</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%2F351138%2F9639cf0b-4d86-49c1-be90-0a64c77931a5.png</url>
      <title>DEV Community: Thiago Bertuzzi 👨🏻‍💻</title>
      <link>https://dev.to/tbertuzzi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tbertuzzi"/>
    <language>en</language>
    <item>
      <title>MVP Conf 2025 - OWASP API Security Top 10</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Wed, 29 Oct 2025 12:38:53 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/mvp-conf-2025-owasp-api-security-top-10-315</link>
      <guid>https://dev.to/tbertuzzi/mvp-conf-2025-owasp-api-security-top-10-315</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6591ypewrza8g4ifpwj.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6591ypewrza8g4ifpwj.jpeg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;Tudo beleza?&lt;/p&gt;

&lt;p&gt;Sexta-feira dia 24/10/2025 tive o prazer de ter participado do MVPConf 2025, onde tive a oportunidade de palestrar sobre o tema OWASP API Security Top 10: Recomendações importantes para tornar suas APIs mais seguras.&lt;/p&gt;

&lt;p&gt;Durante o evento, abordei como as APIs REST se tornaram peças centrais em projetos de software — sejam mobile, web ou integrações de sistemas — e que, justamente por lidarem com dados e operações críticas, estão sujeitas a uma variedade de ataques, que vão desde falhas de autorização até consumo desenfreado de recursos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pt.slideshare.net/slideshow/owasp-api-security-top-10-recomendacoes-importantes-para-tornar-suas-apis-mais-seguras/283946270#1" rel="noopener noreferrer"&gt;Confira aqui a apresentação&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcquq0j4x7nqcrfgn9taw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcquq0j4x7nqcrfgn9taw.jpeg" alt=" " width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apresentei os &lt;strong&gt;10 principais vetores de risco definidos pela OWASP&lt;/strong&gt; para APIs, com destaque para vulnerabilidades como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Broken Object Level Authorization (BOLA)&lt;/strong&gt; – acesso indevido a objetos.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broken Authentication&lt;/strong&gt; – falhas em autenticação e tokens.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unrestricted Resource Consumption&lt;/strong&gt; – consumo ilimitado de recursos (DoS).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unrestricted Access to Sensitive Business Flows&lt;/strong&gt; – exposição de fluxos de negócio sensíveis.
&lt;/li&gt;
&lt;li&gt;Além de outros riscos como SSRF, más configurações de segurança e versionamento inadequado.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Trouxe &lt;strong&gt;recomendações práticas e aplicáveis&lt;/strong&gt; no dia a dia das equipes de desenvolvimento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usar &lt;strong&gt;IDs aleatórios ou UUIDs&lt;/strong&gt; para evitar inferência de recursos.
&lt;/li&gt;
&lt;li&gt;Implementar &lt;strong&gt;Rate Limiting e políticas de uso&lt;/strong&gt; para prevenir abusos.
&lt;/li&gt;
&lt;li&gt;Praticar &lt;strong&gt;governança de versões de API&lt;/strong&gt;, desativando endpoints obsoletos.
&lt;/li&gt;
&lt;li&gt;Garantir que &lt;strong&gt;parceiros e APIs externas&lt;/strong&gt; também sigam boas práticas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Reforcei a importância de &lt;strong&gt;integrar segurança desde o design até o monitoramento&lt;/strong&gt;, e não tratá-la como um “passo final” do ciclo de desenvolvimento.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Durante a sessão, tivemos uma excelente interação com o público — com perguntas sobre &lt;strong&gt;arquiteturas .NET, APIs em nuvem, microserviços e cenários reais de ataque&lt;/strong&gt; — o que demonstrou o quanto o tema é atual e necessário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquorfpvjdh8oupfl3x19.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquorfpvjdh8oupfl3x19.jpeg" alt=" " width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como profissional que atua com &lt;strong&gt;desenvolvimento, arquitetura e segurança&lt;/strong&gt;, acredito que essa palestra reforça o compromisso de elevar o nível de maturidade da comunidade técnica.&lt;/p&gt;

&lt;p&gt;Projetos bem-sucedidos não entregam apenas funcionalidades — &lt;strong&gt;entregam segurança, confiabilidade e confiança&lt;/strong&gt;. Em um mundo onde dados são o ativo mais valioso, &lt;strong&gt;falhar na segurança das APIs pode comprometer todo o negócio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O MVPConf foi o palco ideal para reforçar essa mensagem ao lado de tantos profissionais incríveis, MVPs e líderes de tecnologia que também acreditam em compartilhar conhecimento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6c9jhtn5prmze2ab2gw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6c9jhtn5prmze2ab2gw.png" alt=" " width="554" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No encerramento da palestra, destaquei a importância de fortalecer a cultura de &lt;strong&gt;API Security (falando dos cursos da &lt;a href="https://www.apisecuniversity.com/" rel="noopener noreferrer"&gt;APISec University&lt;/a&gt;)&lt;/strong&gt; dentro das equipes, lembrando que &lt;strong&gt;a proteção das APIs é um investimento essencial para a confiança e continuidade dos sistemas modernos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3diph1g3fzcpi3ukvfim.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3diph1g3fzcpi3ukvfim.jpeg" alt=" " width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agradeço ao time do &lt;strong&gt;MVPConf&lt;/strong&gt; pela organização impecável, aos colegas palestrantes pelo alto nível técnico e, principalmente, ao público que participou e compartilhou suas experiências.&lt;/p&gt;

&lt;p&gt;Esse tipo de troca é o que nos faz crescer como comunidade!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0tv0ovh3sp4yb1furoq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0tv0ovh3sp4yb1furoq.jpeg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado a todas as 36 pessoas que apareceram na minha palestra!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>security</category>
      <category>programming</category>
      <category>owasp</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>10 Dicas Basicas de Arquitetura de Código : 5 - Cuidado com integrações</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Wed, 09 Oct 2024 12:57:30 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-5-cuidado-com-integracoes-5237</link>
      <guid>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-5-cuidado-com-integracoes-5237</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtlwo1spdfn8wj4hbaxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtlwo1spdfn8wj4hbaxn.png" alt="Image description" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Dando continuidade a serie de artigos sobre arquitetura (se não viu a parte 4 &lt;a href="https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-4-overengineering-2c1g"&gt;clique aqui&lt;/a&gt;), é uma pratica comum precisar integrar seu sistema com softwares, API's, frameworks de terceiros. &lt;/p&gt;

&lt;p&gt;Porem é preciso tomar cuidado para não sujar sua arquitetura, ou ter uma dependencia tão grande de um sistema terceiro que pode acabar afetando seu próprio negocio. Dito isso, vamos dar uma olhada de como nos blidarmos e boas praticas que devemos seguir quando integramos nossos sistemas!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjag2kaktbxa5y4b30334.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjag2kaktbxa5y4b30334.png" alt="Image description" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1 Planejamento da Arquitetura de Integração
&lt;/h2&gt;

&lt;p&gt;Antes de iniciar a nossa implementação, é essencial definir como a integração com APIs e serviços externos se encaixa na arquitetura geral do software. &lt;/p&gt;

&lt;p&gt;Algumas questões críticas que devem ser respondidas no planejamento incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qual o impacto da dependência de APIs externas na disponibilidade e desempenho do sistema?&lt;/li&gt;
&lt;li&gt;Quais dados serão compartilhados ou consumidos?&lt;/li&gt;
&lt;li&gt;Quais são os requisitos de segurança para a integração?&lt;/li&gt;
&lt;li&gt;Como será a atualização e manutenção dessas integrações ao longo do tempo?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Duas abordagens comuns para integrar APIs são:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chamadas diretas:&lt;/strong&gt; O sistema se comunica diretamente com a API externa via HTTP/HTTPS. Ideal para integrações pontuais ou quando a latência da comunicação não é crítica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camada de integração intermediária:&lt;/strong&gt; A utilização de um middleware ou um barramento de serviços que centraliza a comunicação com APIs. Essa abordagem aumenta a flexibilidade e a resiliência ao desacoplar as integrações.&lt;/p&gt;

&lt;h2&gt;
  
  
  2 Resiliência e Tolerância a Falhas
&lt;/h2&gt;

&lt;p&gt;Eu sempre digo eu me preocupo mais quando uma API não é minha, por não ter o controle do que acontece com ela. Um dos maiores desafios ao integrar APIs de terceiros é a garantia de disponibilidade e estabilidade ( e tem algumas que da vontade de matar quem fez) . Mesmo que seu software esteja funcionando corretamente, você está à mercê de falhas externas quando depende de APIs de terceiros. Portanto, garantir que seu sistema seja resiliente a essas falhas é fundamental.&lt;/p&gt;

&lt;p&gt;Existem algumas formas de garantir e isso se chama Resiliência , ter um sistema resiliente garante que vc se proteja e escape dessas falhas :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeouts e Retry:&lt;/strong&gt; Sempre defina tempos de espera (timeouts) razoáveis para chamadas a APIs externas e implemente uma política de retentativa (retry). Dessa forma, se uma requisição falhar temporariamente, seu sistema pode tentar novamente de maneira controlada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit Breaker:&lt;/strong&gt; O padrão circuit breaker protege o sistema de um serviço ou API que está consistentemente falhando. Se o serviço estiver fora do ar ou inoperante por um período, o circuit breaker interrompe as tentativas de comunicação até que o serviço seja restaurado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fallbacks:&lt;/strong&gt; Em algumas situações, pode ser necessário um plano de contingência. Se uma API estiver indisponível, é possível fornecer uma resposta parcial ou usar dados em cache até que a API volte a funcionar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate Limiting e Controle de Fluxo:&lt;/strong&gt; Algumas APIs têm limites de uso (rate limits) impostos pelo provedor. Se seu sistema atingir esse limite, pode sofrer penalidades ou bloqueios temporários. Implementar mecanismos de controle de fluxo ajuda a evitar que esse limite seja atingido de forma inadvertida.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Segurança nas Integrações
&lt;/h2&gt;

&lt;p&gt;Eu tenho uma seria continua que estou sempre falando de segurança e realmente isso é uma preocupação dobrada quando se integra com serviços de terceiros.&lt;/p&gt;

&lt;p&gt;Existem algumas medidas que podemos tomar, afinal novamente eu digo : é um ambiente externo que na maioria das vezes não temos controle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autenticação e Autorização:&lt;/strong&gt; Use sempre padrões robustos de autenticação e autorização, como OAuth 2.0 ou OpenID Connect. Esses padrões garantem que apenas usuários e sistemas autorizados possam acessar a API ou o serviço.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transmissão Segura de Dados (HTTPS):&lt;/strong&gt; Toda a comunicação com APIs externas deve ser feita por meio de conexões seguras (HTTPS). Certifique-se de que o certificado TLS está atualizado e configurado corretamente para evitar ataques como man-in-the-middle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validação de Dados:&lt;/strong&gt; Nunca confie cegamente nos dados recebidos de APIs de terceiros (Zero Trust hoje e sempre). Sempre valide os dados de entrada, verificando se estão no formato esperado e se não contêm valores maliciosos ou inconsistentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escopo de Permissões:&lt;/strong&gt; Limite as permissões das chaves de API ou tokens de acesso ao mínimo necessário. Um princípio de menor privilégio deve ser aplicado em todas as integrações para minimizar o impacto em caso de comprometimento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rotação de Chaves e Tokens:&lt;/strong&gt; Assegure-se de que as chaves e tokens de API sejam rotacionados regularmente e que haja um processo de revogação em caso de suspeita de comprometimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  4 Monitoramento e Observabilidade
&lt;/h2&gt;

&lt;p&gt;Monitoramento, Log e saber o que acontece em integrações com APIs e serviços de terceiros é crucial para garantir sua continuidade e identificar problemas rapidamente. A observabilidade permite que sua equipe antecipe falhas, responda rapidamente a incidentes e mantenha um desempenho estável.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs detalhados de integração:&lt;/strong&gt; Registre todas as interações com serviços externos, incluindo chamadas bem-sucedidas, falhas, tempos de resposta e dados relevantes das transações. Isso facilita o diagnóstico de problemas e a auditoria de eventos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alertas e notificação de falhas:&lt;/strong&gt; Configure alertas em caso de falhas nas integrações. Um aumento nas falhas de requisição ou latência elevada pode ser um sinal de problemas com o serviço externo ou de sobrecarga na rede.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Métricas de desempenho:&lt;/strong&gt; Monitore métricas como tempo de resposta, taxas de erro e volume de tráfego. A análise dessas métricas permite identificar gargalos e ajustar a arquitetura para melhorar a eficiência.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Versionamento e Atualizações
&lt;/h2&gt;

&lt;p&gt;Sei que ja cansaram de ler mas novamente, NÃO TEMOS CONTROLE DO AMBIENTE DE TERCEICOS hahaha. Serviços e APIs de terceiros evoluem com o tempo. Versões antigas podem ser descontinuadas, novos recursos podem ser lançados, e mudanças podem impactar diretamente a forma como seu software se integra com eles. Por isso, é essencial estar preparado para lidar com essas atualizações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Versionamento de API:&lt;/strong&gt; Prefira trabalhar com APIs que versionam seus endpoints (mesmo sabendo que na maioria dos casos, não tem). Isso garante que novas atualizações não quebrem funcionalidades existentes em seu sistema. Adapte sua integração para lidar com diferentes versões de API, se necessário.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes regressivos&lt;/strong&gt;: Sempre que uma nova versão de API ou serviço de terceiro for lançada, execute testes de regressão para garantir que sua aplicação continuará funcionando corretamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comunicação com fornecedores:&lt;/strong&gt; Mantenha uma comunicação clara e constante com os fornecedores das APIs. Inscreva-se para receber notificações de atualizações, depreciações e novos recursos.&lt;/p&gt;

&lt;h2&gt;
  
  
  6 Desacoplamento e Flexibilidade
&lt;/h2&gt;

&lt;p&gt;Bom acho que essa altura dos artigos não preciso dizer o quão bom e correto é baixo ou desacoplamento né? Uma integração com serviços externos não deve criar uma dependência rígida que prejudique a escalabilidade ou a manutenção do software. O desacoplamento das integrações ajuda a manter a flexibilidade e evita que o sistema fique preso a um fornecedor específico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstração de integrações:&lt;/strong&gt; Crie camadas de abstração para as integrações com APIs e serviços de terceiros. Em vez de codificar diretamente as chamadas à API em todo o código, centralize essas interações em uma classe ou módulo específico, o que facilita futuras modificações ou trocas de serviço.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design baseado em interfaces:&lt;/strong&gt; Utilize interfaces para definir contratos entre o seu sistema e o serviço externo. Dessa forma, você pode substituir facilmente a implementação do serviço, sem precisar reescrever a lógica do seu sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  7 Documentação e Comunicação
&lt;/h2&gt;

&lt;p&gt;Por fim o que a maioria dos desenvolvedores odeia, mas que todo arquiteto deveria saber e entender que se precisa : Documentação. A documentação clara e acessível das integrações com APIs e serviços externos é fundamental para a manutenção do software e para o trabalho de equipes de desenvolvimento, especialmente em ambientes ágeis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Descreva fluxos de integração:&lt;/strong&gt; Documente como as integrações funcionam, incluindo os endpoints de API utilizados, parâmetros, formatos de dados e possíveis cenários de falha.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mantenha exemplos atualizados:&lt;/strong&gt; Forneça exemplos práticos de requisições e respostas das APIs, com base em diferentes cenários. Isso ajuda os desenvolvedores a compreender rapidamente o funcionamento da integração.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acompanhe mudanças:&lt;/strong&gt; Atualize a documentação sempre que houver modificações na forma de integração, seja por atualizações na API ou mudanças na arquitetura interna do sistema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5azcejv7mljfy3wneq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5azcejv7mljfy3wneq9.png" alt="Image description" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ufa em, parece muito mas é tranquilo se seguir as boas praticas!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A integração com APIs e serviços de terceiros pode oferecer enormes benefícios em termos de funcionalidades e eficiência. No entanto, é importante adotar boas práticas de arquitetura para garantir que essas integrações sejam seguras, resilientes e fáceis de manter ao longo do tempo. &lt;/p&gt;

&lt;p&gt;Seguindo esse artigo com essas recomendações, os desenvolvedores podem evitar armadilhas comuns, reduzir a complexidade do código e garantir que o sistema permaneça flexível e escalável.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>integration</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Código seguro com OWASP e SSDLC - 3 OWASP API Security Top 10</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Tue, 08 Oct 2024 13:11:31 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-3-owasp-api-security-top-10-23k6</link>
      <guid>https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-3-owasp-api-security-top-10-23k6</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxsqteue3kzmmw9l2sro.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxsqteue3kzmmw9l2sro.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;Tudo beleza?&lt;/p&gt;

&lt;p&gt;Dando continuidade ao conteudo de Código Seguro com OWASP e SSDLC, hoje vamos falar do OWASP API Security Top 10.&lt;/p&gt;

&lt;p&gt;Lembrando que nessa série ja abordamos o : &lt;a href="https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-1-top-ten-46he"&gt;Owasp TOP 10&lt;/a&gt; e o &lt;a href="https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-2-asvs-19l7"&gt;ASVS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Quando eu falei do Owasp TOP 10 eu especifiquei um panorama geral de todas as aplicações, porem um pouco mais focado o OWASP API Security Top 10 é uma lista que destaca as principais vulnerabilidades de segurança encontradas em APIs (Application Programming Interfaces). &lt;/p&gt;

&lt;p&gt;Essa lista serve como um guia para desenvolvedores, arquitetos e equipes de segurança garantirem que suas APIs estejam protegidas contra as ameaças mais comuns. &lt;/p&gt;

&lt;p&gt;Então vamos dar uma olhada em cada vulnerabilidade, junto com um exemplo prático em .NET para ilustrar como essas vulnerabilidades podem ocorrer e como mitigá-las.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12r0761uuihoimo5re6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12r0761uuihoimo5re6n.png" alt="Image description" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1 Broken Object Level Authorization&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Essa falha ocorre quando uma API não implementa de forma adequada a autorização de nível de objeto, permitindo que um usuário acesse dados ou objetos de outros usuários sem a devida permissão.&lt;/p&gt;

&lt;p&gt;Imagine que temos um controlador que permite que usuários acessem suas próprias contas. Se não validarmos corretamente o ID do usuário, um atacante pode acessar informações de outras contas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HttpGet("{id}")]
public IActionResult GetAccount(int id)
{
    var account = _accountService.GetAccountById(id);
    if (account == null)
    {
        return NotFound();
    }
    return Ok(account);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, um usuário mal-intencionado poderia acessar qualquer conta, alterando o parâmetro id. A solução seria garantir que o ID pertence ao usuário autenticado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HttpGet("{id}")]
public IActionResult GetAccount(int id)
{
    var account = _accountService.GetAccountByIdAndUserId(id, User.Identity.GetUserId());
    if (account == null)
    {
        return NotFound();
    }
    return Ok(account);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;2 Broken Authentication&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Autorização e Autenticação parecem a mesma coisa mas não são. A autenticação quebrada pode permitir que atacantes comprometam tokens de autenticação ou senhas, assumindo a identidade de outros usuários. Isso pode acontecer devido a tokens JWT fracos, gerenciamento de sessão inadequado, ou falhas na política de senhas.&lt;/p&gt;

&lt;p&gt;Uma API que aceita senhas fracas pode ser comprometida facilmente. Suponha que estamos usando uma autenticação baseada em token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public IActionResult Login(string username, string password)
{
    var user = _userService.Authenticate(username, password);
    if (user != null)
    {
        return Ok(new { Token = _tokenService.GenerateToken(user) });
    }
    return Unauthorized();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implemente uma política de senhas fortes e valide corretamente os tokens de autenticação, além de utilizar por exempplo  PasswordHasher para armazenar as senhas com segurança:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public IActionResult Login(string username, string password)
{
    var user = _userService.Authenticate(username, password);
    if (user != null)
    {
        var hashedPassword = _passwordHasher.HashPassword(user, password);
        if (_passwordHasher.VerifyHashedPassword(user, hashedPassword, password))
        {
            return Ok(new { Token = _tokenService.GenerateToken(user) });
        }
    }
    return Unauthorized();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;3 Excessive Data Exposure&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Lembra do as vezes menos é mais? APIs às vezes retornam mais dados do que o necessário, o que pode expor informações sensíveis que não deveriam ser acessíveis ao cliente.&lt;/p&gt;

&lt;p&gt;Uma API que retorna todos os dados de um usuário sem filtrar as informações sensíveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public IActionResult GetUser(int id)
{
    var user = _userService.GetUserById(id);
    return Ok(user);  // Retornando todos os dados, incluindo dados sensíveis
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retorne apenas os dados necessários e utilize DTOs (Data Transfer Objects) para filtrar a informação sensível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public IActionResult GetUser(int id)
{
    var user = _userService.GetUserById(id);
    var userDto = new UserDto { Name = user.Name, Email = user.Email }; // Expondo apenas os dados necessários
    return Ok(userDto);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;4 Lack of Resources &amp;amp; Rate Limiting&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Se sua API não for o ultraman zero beyond, ela precisa ter limites! (Ok essa referencia é só para quem gosta de Tokusatsu). APIs que não limitam adequadamente a quantidade de requisições podem sofrer ataques de negação de serviço (o famoso DoS), esgotando recursos e causando indisponibilidade.&lt;/p&gt;

&lt;p&gt;Usar RateLimiting com AspNetCoreRateLimit para limitar o número de requisições por cliente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services.AddInMemoryRateLimiting();
services.Configure&amp;lt;IpRateLimitOptions&amp;gt;(options =&amp;gt;
{
    options.GeneralRules = new List&amp;lt;RateLimitRule&amp;gt;
    {
        new RateLimitRule
        {
            Endpoint = "*",
            Limit = 1000,
            Period = "1h"
        }
    };
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;5 Broken Function Level Authorization&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Notem como autorização é importante, por isso no top 10 existem niveis diferentes pra cada tipo. Essa vulnerabilidade ocorre quando funções diferentes na API não possuem restrições de autorização adequadas, permitindo que usuários acessem funcionalidades para as quais não possuem permissão.&lt;/p&gt;

&lt;p&gt;Uma API que permite que qualquer usuário acesse funções administrativas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HttpPost]
public IActionResult DeleteUser(int id)
{
    _userService.DeleteUser(id);
    return Ok();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implemente checagens de autorização no nível de função, garantindo que apenas administradores possam realizar certas operações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Authorize(Roles = "Admin")]
[HttpPost]
public IActionResult DeleteUser(int id)
{
    _userService.DeleteUser(id);
    return Ok();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;6 Mass Assignment&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Atribuição massiva ocorre quando os dados recebidos da requisição permitem que um atacante defina campos sensíveis que deveriam ser restritos, como privilégios de administrador. Isso tambem ocorre quando é possivel acessar regras de negócio que não deveriam ser expostas.&lt;/p&gt;

&lt;p&gt;Uma API que permite que o cliente forneça dados arbitrários para atualizar um usuário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HttpPost]
public IActionResult UpdateUser([FromBody] User user)
{
    _userService.UpdateUser(user);
    return Ok();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilize DTOs para garantir que apenas os campos permitidos sejam atualizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class UpdateUserDto
{
    public string Name { get; set; }
    public string Email { get; set; }
}

[HttpPost]
public IActionResult UpdateUser([FromBody] UpdateUserDto userDto)
{
    _userService.UpdateUser(userDto);
    return Ok();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;7 Security Misconfiguration&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A configuração incorreta de componentes de segurança, como falhas no CORS, permissões de arquivos inadequadas, ou erros nos cabeçalhos de segurança, pode expor a API a ataques.&lt;/p&gt;

&lt;p&gt;Um erro frequente é permitir CORS para qualquer origem sem restrição.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services.AddCors(options =&amp;gt;
{
    options.AddDefaultPolicy(builder =&amp;gt;
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    });
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restrinja as origens permitidas e implemente corretamente os cabeçalhos de segurança.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services.AddCors(options =&amp;gt;
{
    options.AddDefaultPolicy(builder =&amp;gt;
    {
        builder.WithOrigins("https://siteConfiavel.com")
               .AllowAnyMethod()
               .AllowAnyHeader();
    });
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;8 Injection&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Falhas de injeção, como SQL Injection ou NoSQL Injection (sim elas existem tambem), ocorrem quando a entrada de dados não é validada corretamente, permitindo a execução de comandos maliciosos.&lt;/p&gt;

&lt;p&gt;Por exemplo uma API vulnerável a SQL Injection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public IActionResult GetUser(string username)
{
    var query = $"SELECT * FROM Users WHERE Username = '{username}'";
    var user = _dbContext.Users.FromSqlRaw(query).FirstOrDefault();
    return Ok(user);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use consultas parametrizadas para evitar injeção de SQL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public IActionResult GetUser(string username)
{
    var user = _dbContext.Users
                         .FromSqlRaw("SELECT * FROM Users WHERE Username = @username", new SqlParameter("@username", username))
                         .FirstOrDefault();
    return Ok(user);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;9 Improper Assets Management&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Muitas vezes precisamos atualizar APIs ou por erro, melhoria ou necessidades especificas por cliente. APIs podem expor versões antigas ou descontinuadas, o que pode ser um vetor de ataque se essas versões contiverem vulnerabilidades conhecidas.&lt;/p&gt;

&lt;p&gt;Suponha que há duas versões de uma API, mas a versão antiga ainda está acessível e vulnerável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Route("api/v1/[controller]")]
public class UserControllerV1 : ControllerBase
{
    // Código antigo, ainda acessível
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desative e remova versões antigas e implemente políticas de versionamento claras.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Route("api/v2/[controller]")]
public class UserControllerV2 : ControllerBase
{
    // Nova versão da API com melhorias de segurança
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;10 Insufficient Logging &amp;amp; Monitoring&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A falta de monitoramento adequado permite que ataques passem despercebidos e não sejam identificados a tempo, comprometendo a segurança da API. Alem disso o excesso de informação que não deveria ser retornada (um log interno com id's e etc) pode ser um prato cheio para quem quer saber uma falha, ou vulnerabilidade de sua API.&lt;/p&gt;

&lt;p&gt;Um exemplo simples não registrar tentativas de login falhas ou acessos maliciosos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Nenhum registro de falha de autenticação
public IActionResult Login(string username, string password)
{
    var user = _userService.Authenticate(username, password);
    if (user == null)
    {
        return Unauthorized();
    }
    return Ok();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implemente logging adequado e use ferramentas de monitoramento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public IActionResult Login(string username, string password)
{
    var user = _userService.Authenticate(username, password);
    if (user == null)
    {
        _logger.LogWarning($"Falha de autenticação para o usuário: {username}");
        return Unauthorized();
    }
    return Ok();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;São exemplos bem simples, porem implementar as boas práticas sugeridas no OWASP API Security Top 10 é fundamental para proteger suas APIs contra as vulnerabilidades mais comuns. O uso de boas práticas de segurança, como autenticação forte, autorização robusta, criptografia e monitoramento adequado, é essencial para garantir a segurança das aplicações.&lt;/p&gt;

&lt;p&gt;Participei de uma live no canal do &lt;a href="https://www.youtube.com/@MicrosoftReactor" rel="noopener noreferrer"&gt;Microsoft Reactor&lt;/a&gt; com meu amigo e MVP &lt;a href="https://renatogroffe.medium.com/" rel="noopener noreferrer"&gt;Renato Groffe&lt;/a&gt; onde abordamos e detalhamos mais esse top 10 :&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/_pOLRfTqx8U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Alem disso gravamos 2 Episódios sobre segurança em nosso &lt;a href="https://devshow.com.br/tag/seguranca/" rel="noopener noreferrer"&gt;DevShow Podcast&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Código seguro com OWASP e SSDLC - 2 ASVS</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Thu, 05 Oct 2023 13:02:13 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-2-asvs-19l7</link>
      <guid>https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-2-asvs-19l7</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6un35dyus40e7xmjn1p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6un35dyus40e7xmjn1p.jpg" alt="Bertuzzi com dados" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;Tudo beleza?&lt;/p&gt;

&lt;p&gt;Como prometido e Dando continuidade ao &lt;a href="https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-1-top-ten-46he"&gt;conteudo de Código Seguro com OWASP e SSDLC&lt;/a&gt;, hoje vamos falar do ASVS. &lt;/p&gt;

&lt;p&gt;Mas obviamente para começar: &lt;/p&gt;

&lt;h2&gt;
  
  
  O que é ASVS?
&lt;/h2&gt;

&lt;p&gt;ASVS é uma sigla que significa "Application Security Verification Standard" (Padrão de Verificação de Segurança de Aplicativos), e o projeto &lt;a href="https://owasp.org/www-project-application-security-verification-standard/" rel="noopener noreferrer"&gt;OWASP ASVS&lt;/a&gt; é uma iniciativa da OWASP que visa fornecer um conjunto de diretrizes e requisitos de segurança para o desenvolvimento e testes de aplicativos web. &lt;/p&gt;

&lt;p&gt;O objetivo principal do ASVS é garantir que os aplicativos web sejam projetados e construídos com segurança desde o início, protegendo-os contra as ameaças cibernéticas mais comuns.&lt;/p&gt;

&lt;p&gt;O OWASP ASVS é uma ferramenta do cara... para desenvolvedores, "testadores" e profissionais de segurança . Ele fornece um conjunto abrangente de requisitos de segurança que podem ser usados como um guia para desenvolvimento seguro e teste de aplicativos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: a versão atual do ASVS utilizada na escrita desse artigo é a 4.0.3 (a 5.0 ja foi anunciada) &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  E como Funciona?
&lt;/h2&gt;

&lt;p&gt;O OWASP ASVS é organizado em três níveis de segurança, cada um com requisitos específicos. Na maioria dos casos se sua aplicação esta no Nivel 1 eu ja fico feliz por você hahaha, pois é o minimo que se espera de um testes. Porem conforme exista uma maior  complexidade do negocio e os tipos de dados envolvidos é necessario subir o nivel:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nível 1&lt;/strong&gt; - Verificação Automatizada&lt;/p&gt;

&lt;p&gt;É o nível mais básico. Este nível é focado em verificações automatizadas que podem ser implementadas durante o ciclo de desenvolvimento. &lt;/p&gt;

&lt;p&gt;Ele inclui testes como verificação de vulnerabilidades conhecidas e configurações seguras de servidor web. Esses testes podem ser facilmente integrados em pipelines de CI/CD (Integração Contínua/Entrega Contínua) para fornecer feedback imediato aos desenvolvedores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nível 2&lt;/strong&gt; - Recomendado para aplicações e sistemas que contêm dados pessoais Verificação Funcional, geralmente para a maioria de aplicações comerciais.&lt;/p&gt;

&lt;p&gt;O segundo nível envolve verificações manuais para garantir que os requisitos de segurança estejam sendo atendidos. Isso inclui testes de autenticação, autorização, criptografia e proteção contra ameaças comuns, como injeção de SQL e XSS (Cross-Site Scripting). (OWASP Top Ten)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nível 3&lt;/strong&gt; - Verificação de Arquitetura&lt;/p&gt;

&lt;p&gt;Recomendado para aplicações críticas e transacionais uma aplicação que requeira um alto nível de confiabilidade.&lt;/p&gt;

&lt;p&gt;O nível mais alto do OWASP ASVS envolve revisões mais aprofundadas da arquitetura de segurança do aplicativo. Isso inclui avaliações de design de segurança, análise de risco e considerações de ameaças. Também aborda a conformidade com regulamentações de segurança, como GDPR (Regulamento Geral de Proteção de Dados) e HIPAA (Lei de Portabilidade e Responsabilidade de Seguro de Saúde).&lt;/p&gt;

&lt;p&gt;Cada nivel vai complementando o anterior , então dependendo do tipo de aplicação é necesario aplica-los.&lt;/p&gt;

&lt;p&gt;A implementação do ASVS prove : Maior segurança, Padrões Claros, Integração com CI/CD e Conformidade Regulatória.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33r5n9mdd0yt8lq73d36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33r5n9mdd0yt8lq73d36.png" alt="IBertuzzi surfando nos dados" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitetura ASVS :
&lt;/h2&gt;

&lt;p&gt;Focando nos primeiros niveis se você deseja que seu aplicativo tenha um padrão de segurança de alto nivel alguns tipos de "arquiteturas" podem ser uteis.&lt;/p&gt;

&lt;p&gt;Claro, considerando que você esta aplicando o OWASP Top TEN no seu ciclo de desenvolvimento ja podemos considerar que você esta no caminho certo, porem, para reforçar vamos falar especificamente de algumas arquiteturas que serão abordadas de forma mais detalhada nos proximos artigos :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilize patterns de segurança existentes&lt;/li&gt;
&lt;li&gt;Aplica frameworks/métodos de autenticação de mercado e testados :  não vai inventar o seu próprio sendo que existem varios opensource como &lt;a href="https://www.keycloak.org/" rel="noopener noreferrer"&gt;Keycloack &lt;/a&gt; e gratuitos para começar como o &lt;a href="https://learn.microsoft.com/pt-br/azure/active-directory-b2c/overview?WT.mc_id=DOP-MVP-5003242" rel="noopener noreferrer"&gt;Azure B2C&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Prefira uma a varias formas de autenticação : Se possivel utilize apenas uma forma de autenticação, isto alem de diminuir a complexidade diminui os riscos de brechas de segurança&lt;/li&gt;
&lt;li&gt;Autenticação segura para componentes de backend e serviços de terceiros : Principalmente em arquiteturas de microserviços é importante lembrar de criar uma autenticação segura entre os mesmos e claro em qualquer arquitetura uma autenticação segura com serviços que você não tem o controle&lt;/li&gt;
&lt;li&gt;Logs e monitoramento : Manter um monitoramento constante de quem e de onde é autenticado em sua aplicação. Isso facilita o rastreio para evitar problemas futuros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Access Control Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quem pode acessar o que e quais dados : Roles devem ser levadas a serio, é importante sempre tratar os dados que devem ou não ser acessados de acordo com as regras e perfis de acesso&lt;/li&gt;
&lt;li&gt;Um Único mecanismo bem testado para autenticação : Diversos mecanismos criam complexidades desnecessárias e abrem brechas de segurança&lt;/li&gt;
&lt;li&gt;Verificação de controles acontece só no Cliente ou no Server também? : Caso você esteja implementando tanto a solução de Client como Server prefira realizar a validação em ambos os lados. Isto melhora a segurança e tambem garante uma integridade de dados caso va compartilhar sua api com terceiros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Input and Output Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validação do que é Enviado : Validação de dados que são enviados para sua aplicação como formularios, sql injection, dados sem criptografia e dados que não deveriam estar la&lt;/li&gt;
&lt;li&gt;Validação do que é retornado : Tão perigoso quanto o envio são os dados retornados. É importante garantir que toda informação retornada seja para o perfil correto ou não possua dados sensiveis. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cryptographic Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os dados estão devidamente criptografados? : Tudo que é enviado ou gerado pela sua aplicação com informações sensiveis deve ter algum tipo de criptografia. Isso minimiza problemas e brechas de segurança em trafegos de dados.&lt;/li&gt;
&lt;li&gt;O que você armazena do lado do Client? : Cookies, secrets entre outros são informações armazenadas que podem abrir brechas para vazamentos de dados e possiveis invasores. É importante tomar cuidado no que é armazenado.&lt;/li&gt;
&lt;li&gt;Os dados do lado do servidor estão protegidos? : Não adianta nada proteger apenas o lado do Client,informações da aplicação publicada devem ser protegidas tambem. Prefira armazenar informações sensiveis em &lt;a href="https://learn.microsoft.com/pt-br/azure/key-vault/general/basic-concepts?WT.mc_id=DOP-MVP-5003242" rel="noopener noreferrer"&gt;keyvaults &lt;/a&gt;do que em arquivos de configuração por exemplo. &lt;/li&gt;
&lt;li&gt;Considere um cenario caso se algum invasor consiga roubar uma chave ou algum “secret”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Auditing Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Erros&lt;/li&gt;
&lt;li&gt;Logs de informações&lt;/li&gt;
&lt;li&gt;Auditoria&lt;/li&gt;
&lt;li&gt;Proteção de Logs Sensíveis : Essa parte é muito importante!! Deve-se tomar cuidado com o que se loga de facil acesso.Um log pode revelar informações sensiveis que abrem brechas de segurança e facilitam o acesso de um invasor para roubos de informações.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota : gravamos um &lt;a href="https://devshow.com.br/episode/devshow-39-monitoramento-e-observabilidade/" rel="noopener noreferrer"&gt;episódio do devshow&lt;/a&gt; só desse tema , vale a pena escutar. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Data Protection And Privacy Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dados devem ser classificados :&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Publico&lt;/li&gt;
&lt;li&gt;Interno&lt;/li&gt;
&lt;li&gt;Confidencial&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aplique controles próprios para cada tipo de informação garantindo que dados sensiveis não fiquem expostos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Communications Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proteja/Criptografe dados que são transmitidos&lt;/li&gt;
&lt;li&gt;Não exponha dados compartilhados entre micro serviços, Apis ou containers &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Malicious Software Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repositório GIT : Deve se tomar cuidado com o que você armazena em seus repositórios&lt;/li&gt;
&lt;li&gt;Secrets em Commits : Nunca, jamais, nem por brincadeira deve-se commitar secretes e informações sensiveis em repositórios.&lt;/li&gt;
&lt;li&gt;Bagunça em Branch : Branchs bagunçadas ou com nomes de desenvolvedores podem gerar dores de cabeça e abrir brechas de segurança. Prefira adotar um padrão como &lt;a href="https://dev.to/tbertuzzi/github-gitflow-organizando-a-bagunca-das-suas-branchs-3l0"&gt;Gitflow &lt;/a&gt; por exemplo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existem algumas ferramentas como &lt;a href="https://www.sonarsource.com/products/sonarqube/" rel="noopener noreferrer"&gt;Sonarqube&lt;/a&gt;/&lt;a href="https://sonarcloud.io/login" rel="noopener noreferrer"&gt;SonarCloud&lt;/a&gt; e &lt;a href="https://www.gitguardian.com/" rel="noopener noreferrer"&gt;GitGuardian&lt;/a&gt; quem podem lhe ajudar não permitir que informações Sensiveis sejam guardadas em repositórios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business Logic Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autenticação&lt;/li&gt;
&lt;li&gt;Controle de Acesso&lt;/li&gt;
&lt;li&gt;Gerenciamento de Sessão (expirar e etc)&lt;/li&gt;
&lt;li&gt;Regras de negocio com tratamentos e validações &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Muitas vezes os problemas de segurança estão na própria regra de negócio da aplicação. Aplique validações consistentes e revisões de logica. Um Código bem feito pode evitar problemas de segurança.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secure File Upload Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quais arquivos podem ser enviados? : Garanta que apenas os arquivos permitidos sejam possiveis de ser inseridos em sua aplicação&lt;/li&gt;
&lt;li&gt;Validação de Tipos de Arquivo : Um bom começo é permitir apenas extensões validas de acordo com sua regra de negócio&lt;/li&gt;
&lt;li&gt;Validação de Arquivos Maliciosos : Tenha um validador de arquivos eficiente para garantir que arquivos maliciosos não consigam prejudicar sua aplicação&lt;/li&gt;
&lt;li&gt;Arquivos que podem ser baixados : Garanta quais arquivos podem ou não ser baixados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configuration Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build and Deployment : Tenha uma esteira de Devops configurada e segura, garantindo quais informções estão em variaveis de ambiente, arquivos e etc&lt;/li&gt;
&lt;li&gt;Monitorar vulnerabilidades&lt;/li&gt;
&lt;li&gt;Variáveis de Ambientes para projetos separados&lt;/li&gt;
&lt;li&gt;Fontes assinadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ufa!!! Creio que para esse artigo ja tem muita coisa hehehe.&lt;/p&gt;

&lt;p&gt;Segurança é um assunto extenso e que deve ser levado a sério, então creio que com essas boas praticas sua aplicação deve atingir um nivel excelente de segurança durante o ciclo de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Recentemente fizemos uma live no Canal .net sobre o Assunto, quem quiser pode conferir :&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FoGR_QA1jrA?start=3"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Código seguro com OWASP e SSDLC - 1 Top Ten</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Mon, 02 Oct 2023 17:01:27 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-1-top-ten-46he</link>
      <guid>https://dev.to/tbertuzzi/codigo-seguro-com-owasp-e-ssdlc-1-top-ten-46he</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdt1q9di67qukbhl5yx3x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdt1q9di67qukbhl5yx3x.jpg" alt="Ladrão roubando dados" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Dando continuidade ao conteudo de segurança para código, hoje vamos falar dela a OWASP. Em um artigo anterior eu expliquei como funiona o &lt;a href="https://dev.to/tbertuzzi/desenvolvimento-seguro-s-sdlc-1n4f"&gt;Desenvolvimento Seguro, S-SDLC&lt;/a&gt; na parte da teoria, porem agora vamos começar a entender de vez como podemos melhorar nosso código do ponto de vista de segurança. &lt;/p&gt;

&lt;p&gt;Antes de mais nada o que é, quem é onde vive e o que come a OWASP?&lt;/p&gt;

&lt;p&gt;A Open Web Application Security Project ou OWASP é uma organização sem fins lucrativos fundada em 2001, cuja missão é melhorar a segurança do software. Seu nome completo reflete sua missão e importancia na segurança de aplicativos web, mas suas atividades vão além disso, abrangendo várias áreas de segurança. &lt;/p&gt;

&lt;p&gt;A organização é composta por uma comunidade global de especialistas em segurança, desenvolvedores, engenheiros, e outros profissionais que compartilham seu conhecimento e experiência para criar recursos e ferramentas de segurança acessíveis a todos.&lt;/p&gt;

&lt;p&gt;A Owasp em sim possui 3 objetivos : Fornecer Recursos Educacionais, Desenvolver Ferramentas e Padrões e Promover Melhores Práticas. Tudo voltado para que tenhamos uma ideia de onde seguir boas praticas para termos aplicações mais seguras.&lt;/p&gt;

&lt;h2&gt;
  
  
  Owasp Top Ten
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff313gba3q93zv9k9a4mg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff313gba3q93zv9k9a4mg.png" alt="Bertuzzi com Checklist" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma das contribuições mais reconhecidas da OWASP é o "OWASP Top Ten". Esta é uma lista anual das dez principais vulnerabilidades de segurança em aplicativos da web. &lt;/p&gt;

&lt;p&gt;O objetivo do OWASP Top Ten é conscientizar sobre as ameaças mais críticas e ajudar as organizações a priorizar seus esforços de segurança. As vulnerabilidades incluídas na lista podem variar ao longo do tempo à medida que as ameaças evoluem, mas geralmente incluem problemas como injeção de SQL, autenticação inadequada, exposição de dados sensíveis e muitos outros.&lt;/p&gt;

&lt;p&gt;Traduzindo para nosso querido portugues o &lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;Owasp Top Ten&lt;/a&gt; aborda os seguintes tópicos :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Injeção:&lt;/strong&gt; Vulnerabilidades que ocorrem quando dados não confiáveis são inseridos em comandos ou consultas não seguras, permitindo que um atacante execute código malicioso.&lt;/p&gt;

&lt;p&gt;Por exemplo dados não confiáveis são inseridos diretamente em instruções SQL, permitindo que um atacante execute comandos maliciosos no banco de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;userInput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"search"&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;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"SELECT * FROM Produtos WHERE Nome = '&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;userInput&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Quebra de Autenticação:&lt;/strong&gt; Falhas na autenticação e gerenciamento de sessões que podem permitir que um invasor assuma a identidade de outro usuário.&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;senhaDigitada&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="n"&gt;Senha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Acesso concedido&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;3. Exposição de Dados Sensíveis:&lt;/strong&gt; Quando informações confidenciais são acessíveis por pessoas não autorizadas devido a configurações inadequadas ou vulnerabilidades na aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;cartaoCredito&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"cartao"&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;4. Controle de Acesso Quebrado:&lt;/strong&gt; Falhas na aplicação de autorização e controle de acesso, permitindo que usuários não autorizados acessem recursos protegidos.&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;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsInRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Administrador"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Usuário não autorizado&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;5. Má Configuração de Segurança, Logs e dados:&lt;/strong&gt; Configurações incorretas que podem abrir brechas de segurança, como servidores web com informações de depuração ativadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"Logging"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"LogLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Debug"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Falha de Segurança em Componentes:&lt;/strong&gt; Quando componentes de terceiros, como bibliotecas ou frameworks, contêm vulnerabilidades conhecidas que podem ser exploradas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package VulnerableLibrary &lt;span class="nt"&gt;--version&lt;/span&gt; 1.0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;7. Cross-Site Scripting (XSS):&lt;/strong&gt; Vulnerabilidades que permitem que um invasor injete scripts maliciosos em páginas da web vistas por outros usuários.&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="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;userInput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"comment"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Comentário: "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;userInput&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;8. Deserialização Insegura:&lt;/strong&gt; Quando dados não confiáveis são desserializados sem verificação adequada, permitindo que um atacante execute código arbitrário.&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="n"&gt;MemoryStream&lt;/span&gt; &lt;span class="n"&gt;stream&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;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializedData&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;BinaryFormatter&lt;/span&gt; &lt;span class="n"&gt;formatter&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;BinaryFormatter&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="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Deserialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&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;9. Regras de Negócios Quebrada:&lt;/strong&gt; Falhas na lógica de negócios que podem ser exploradas por atacantes.&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;if&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="n"&gt;ID&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Acesso total concedido&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;10. Redirecionamento e Encaminhamento Não Confiável:&lt;/strong&gt; Quando aplicativos permitem que um invasor redirecione ou encaminhe um usuário para sites maliciosos, comprometendo sua segurança.&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="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Respeitando e implementando essas dicas do TOP TEN sua aplicação tem o minimo de segurança aceitavel para estar no ar.&lt;/p&gt;

&lt;p&gt;Claro que isso é apenas um resumo, para entender melhor é necessario revisar toda a documentação do &lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;OWASP TOP TEN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porem é uma introdução pois no proximo artigo iremos falar de OWASP ASVS então nos vemos la!&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>10 Dicas Basicas de Arquitetura de Código : 4 - Overengineering</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Thu, 20 Jul 2023 18:40:58 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-4-overengineering-2c1g</link>
      <guid>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-4-overengineering-2c1g</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7q2imspdvshblj88z6cq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7q2imspdvshblj88z6cq.png" alt="Bertuzzi no PC" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Dando continuidade a serie de artigos sobre arquitetura (se não viu a parte 3 &lt;a href="https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-3-cuidado-com-o-que-voce-armazena-290o"&gt;clique aqui&lt;/a&gt;), é muito comum encontramos patterns, arquiteturas complexas, soluções mirabolantes e pessoas vendendo cursos de "microservice First" quando estamos procurando a melhor solução para nossos projetos.&lt;/p&gt;

&lt;p&gt;Porem pior do que não saber como fazer é fazer em excesso e encher a arquitetura/aplicação de complexidade desnecessaria e isso é conhecido como Overengineering/Superengenharia!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9444039smet67o8ksj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9444039smet67o8ksj5.png" alt="bertuzzi montado" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overengineering ou Superengenharia consiste em criar arquiteturas, sistemas ou soluções que ultrapassam os requisitos necessários, resultando em uma complexidade desnecessária, custos elevados e uma eficiência reduzida. Embora a inovação (e as vezes pró atividade) seja fundamental para avanços tecnológicos, o overengineering pode ter consequências graves que superam seus potenciais benefícios. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. La se vai o Orçamento, custos elevados:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um dos problemas mais evidentes do overengineering é o custo adicional que ele nos tras. Ao adicionar recursos e funcionalidades complexas além do necessário, os custos de desenvolvimento, produção e manutenção podem aumentar consideravelmente. Investir recursos financeiros em aspectos que não agregam valor real ao produto final pode ser prejudicial para a saúde financeira de uma empresa ou projeto. &lt;/p&gt;

&lt;p&gt;Um bom exemplo é contratar serviços desnecessarios, componentes mirabolantes, diversos serviços de Cloud e etc. Outro cenario são diversas horas desnecessarias em um cronograma que gera custo x hora de profissionais. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Vamos usar aquele Framework/Modelo que é legal , complexidade Desnecessária:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;À medida que um projeto é sobrecarregado com recursos excessivos, sua complexidade aumenta. Isso torna a compreensão do sistema mais difícil, tanto para os desenvolvedores que precisam mantê-lo quanto para os usuários que o utiliza. A complexidade desnecessária pode resultar em dificuldades de resolução de problemas, tornando a identificação de erros e falhas uma tarefa mais complicada e demorada.&lt;/p&gt;

&lt;p&gt;Um exemplo classico, fazer um projeto microservices só porque ta no hype ou porque te disseram que é melhor sem considerar se você precisa de tamanha complexidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. E agora quem fez isso ? Dificuldades de Manutenção:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sistemas com complexidade desnecesaria podem se tornar verdadeiros problemas para os desenvolvedores que precisam fazer atualizações ou correções. A manutenção se torna uma tarefa dificil e geralmente com grandes chances de erros, especialmente quando há falta de documentação adequada e padrões claros de desenvolvimento. A longo prazo, a falta de facilidade na manutenção pode levar a sistemas obsoletos e incompatíveis com novas tecnologias .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Muito daora! Mas quando você me entrega? Atrasos no Tempo de Desenvolvimento:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enquanto os Arquitetos/Desenvolvedores se esforçam para criar um sistema (com complexidade desnecessaria) sofisticado, pode haver um aumento significativo no tempo de desenvolvimento. O foco em detalhes não essenciais pode atrasar a entrega do projeto , o que pode ser prejudicial em setores onde a rapidez é fundamental para o sucesso e para seus clientes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Precisamos realizar uma integração nova e agora? Dificuldades na Integração:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com o aumento de complexidade desnecessaria, a integração com outros sistemas pode se tornar um verdadeiro desafio. A falta de interoperabilidade com soluções existentes pode resultar em incompatibilidades e dificuldades na troca de dados entre diferentes sistemas, o que, por sua vez, pode prejudicar a eficiência operacional de toda a organização.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.Arquitetura complexa, mas o sistema faz o que? Falta de Foco no Usuário:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você pode ter um sistema com uma complexidade gigante (que na cabeça de muitos é um sistema bom) , porem se ele não atende o que foi pedido el não serve para nada. Ao priorizar a adição de recursos avançados, pode-se negligenciar as necessidades básicas e a usabilidade do produto para os clientes. Isso pode resultar em uma experiência do usuário desfavorável e, em última instância, levar à rejeição do produto pelo cliente ou mercado.&lt;/p&gt;

&lt;p&gt;Como dizem no Master Chefe : As vezes menos é mais! &lt;/p&gt;

&lt;p&gt;O overengineering pode levar a uma série de problemas que afetam negativamente a viabilidade e a sustentabilidade de um projeto ou organização. É essencial encontrar um equilíbrio entre funcionalidade e simplicidade, garantindo que os recursos adicionados agreguem valor real ao produto final e atendam às necessidades reais dos usuários. Ao evitar esses problemas as empresas podem otimizar seus processos, economizar recursos e oferecer soluções mais eficientes e melhores.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>overengineering</category>
      <category>beginners</category>
    </item>
    <item>
      <title>GitHub : GitFlow , Organizando a bagunça das suas branchs</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Mon, 10 Jul 2023 14:34:01 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/github-gitflow-organizando-a-bagunca-das-suas-branchs-3l0</link>
      <guid>https://dev.to/tbertuzzi/github-gitflow-organizando-a-bagunca-das-suas-branchs-3l0</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoftykouc0nj1z9yby0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoftykouc0nj1z9yby0d.png" alt="Bertuzzi com bagunça" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Organização é algo muito importante para desenvolvimento de aplicações, principalmente nos repositorios de código. Uma falta de organização adequada pode resultar em perda de código, merges erroneos, problemas de segurança, versões incorretas colocadas em produção e etc.&lt;/p&gt;

&lt;p&gt;Uma forma que eu gosto muito de organização de branchs é o GitFlow e é dele que vamos falar hoje. Bora?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7muzh5vh99jg4q43xv5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7muzh5vh99jg4q43xv5v.png" alt="GitFlow Diagrama" width="494" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Calma! A Imagem acima pode ate assustar um pouco, mas eu garanto que é mais simples do que é!&lt;/p&gt;

&lt;p&gt;O Gitflow, desenvolvido por Vincent Driessen, oferece uma estrutura clara para colaboração e integração contínua, permitindo um desenvolvimento mais organizado e escalável. Ele pode ser aplicado a qualquer serviço que hospede repositorios Git , porem GitHub oferece recursos e ferramentas que facilitam a implementação e o gerenciamento desse fluxo.&lt;/p&gt;

&lt;p&gt;Então utilizando o Github como exemplo vamos entender as etapas do Fluxo :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Repositório "master/main" e "develop":&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quando criamos um projeto no GitHub, temos um repositório vazio.&lt;/p&gt;

&lt;p&gt;O branch &lt;strong&gt;"main"&lt;/strong&gt; é criada como a versão mais estável e entregável do software. Esta branch contém apenas o código que está em produção e é considerado estável e pronto para ser implantado. Ela não deve ser modificado diretamente. Em vez disso, as alterações são trazidas de outros branches, como a branch &lt;strong&gt;"release"&lt;/strong&gt; e a branch &lt;strong&gt;"hotfix"&lt;/strong&gt; que veremos mais para frente.&lt;/p&gt;

&lt;p&gt;Devemos criar uma branch "develop" que seria o ambiente de desenvolvimento contínuo. Esta Branch contém todo o código em desenvolvimento, incluindo novos recursos, correções de bugs e melhorias. É a partir da branch "develop" que novos branches de features, releases são criados. Podemos dizer que a Develop é a branch candidata a ir para produção.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Branches de feature:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essas branches são usados para adicionar novos recursos ao projeto. Elas são criados a partir da branch "develop" e são nomeados de forma descritiva, como "feature/nome-da-feature". As branches de feature são desenvolvidos independentemente e, quando concluídos, são mesclados de volta para o branch "develop".&lt;/p&gt;

&lt;p&gt;Por exemplo : &lt;/p&gt;

&lt;p&gt;Um desenvolvedor (ou responsavel pelo repositório) cria um branch de feature chamado "feature/adicionar-tarefas" no GitHub a partir do branch "develop", em seguida ele ou a equipe trabalha na branch fazendo várias alterações para implementar o recurso. são feitos diversos commits e pushs das alterações para o branch no GitHub.&lt;/p&gt;

&lt;p&gt;Quando o desenvolvimento está concluído, o desenvolvedor abre um pull request (PR) no GitHub para mesclar a branch de feature na branch "develop".&lt;br&gt;
Outros membros da equipe (ou algum responsavel) revisam o código, fazem comentários e, finalmente, o PR é aprovado e mesclado no GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Branches de hotfix:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essas branches são usados para corrigir bugs críticos encontrados no código em produção. Elas são criadas a partir do branch "main" e, quando concluídas, são mesclados tanto na branch "main" quanto na branch "develop". Isso garante que a correção seja refletida tanto na versão atual em produção quanto na próxima versão em desenvolvimento.&lt;/p&gt;

&lt;p&gt;Por exemplo : &lt;/p&gt;

&lt;p&gt;Alguem encontra um erro/bug crítico no código em produção, uma branch de hotfix chamado "hotfix/bug-critico" é criada no GitHub a partir da branch "main".&lt;br&gt;
Após a correção do bug é e os commits feitos no GitHub ,um PR é aberto para mesclar a branch de hotfix no branch "main".&lt;/p&gt;

&lt;p&gt;O PR é revisado, aprovado e mesclado no GitHub, garantindo que a correção seja refletida tanto na versão atual em produção quanto na próxima versão em desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Branches de release:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quando o código na branch "develop" está pronto para ser colocado em produção, uma branch de release é criado a partir dele. &lt;/p&gt;

&lt;p&gt;A branch de release é usado para realizar atividades finais de teste, correção de bugs e preparação para o lançamento. Qualquer correção de bug necessária é feita diretamente na branch de release. Quando o branch de release está pronto, ela é mesclada tanto no branch "main" quanto no branch "develop", marcando assim uma nova versão do software.&lt;/p&gt;

&lt;p&gt;Por exemplo : &lt;/p&gt;

&lt;p&gt;Quando o código na branch "develop" está pronto para ser liberado, uma branch de release chamado "release/v1.0" é criada no GitHub a partir da branch "develop".&lt;/p&gt;

&lt;p&gt;Após a conclusão da branch de release, um PR é aberto no GitHub para mesclar o branch de release no branch "main".&lt;br&gt;
O PR é revisado, aprovado e mesclado no GitHub, marcando assim uma nova versão do software.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpksr73mee2t66brftot8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpksr73mee2t66brftot8.png" alt="bertuzzi check" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De forma simples estas são as Etapas. É possivel adapta-las para o uso do dia a dia de forma que atenda a necessidade da sua equipe, assim como nomenclaturas utilizadas nos nomes de releases,hotfix e features.&lt;/p&gt;

&lt;p&gt;O que eu gosto da utilização desse padrão com o Github é que ele fornece uma interface intuitiva e ferramentas poderosas para facilitar o uso do Gitflow. temos recursos como pull requests, revisões de código, rastreamento de problemas e integração contínua para ajudar as equipes a colaborar e gerenciar o desenvolvimento de software de forma eficiente.&lt;/p&gt;

&lt;p&gt;Utilizar o Gitflow com o GitHub, podemos ter um fluxo de trabalho estruturado, facilitando a coordenação e a colaboração entre os membros da equipe. A combinação dessas duas ferramentas permite um controle preciso sobre as diferentes etapas do ciclo de vida do código, promovendo um desenvolvimento mais organizado, estável e confiável.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>github</category>
      <category>gitflow</category>
      <category>git</category>
      <category>development</category>
    </item>
    <item>
      <title>GitHub : Dependabot suas dependencias atualizadas e seguras</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Fri, 07 Jul 2023 14:44:12 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/github-dependabot-suas-dependencias-atualizadas-e-seguras-5687</link>
      <guid>https://dev.to/tbertuzzi/github-dependabot-suas-dependencias-atualizadas-e-seguras-5687</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqswszoo12epk1lkscxao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqswszoo12epk1lkscxao.png" alt="Bertuzzi invocado" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Não é novidade que meu repositorio favorito é o &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;, inclusive sempre digo que o mesmo tem diversas funcionalidades muito bacanas para ajudar a melhorar e proteger seu código.&lt;/p&gt;

&lt;p&gt;Quando desenvolvemos um software é comum depender de bibliotecas e pacotes de terceiros, porem manter tudo atualizado é geralmente um problema. Existem pacotes que possuem diversas atualizações importantes de segurança, ja outros ao atualizar quebram nosso build com mudanças de assinatura de método ou funcionalidades.&lt;/p&gt;

&lt;p&gt;O Github tem uma ferramenta muito legal para nos ajudar nisso o &lt;a href="https://github.com/dependabot" rel="noopener noreferrer"&gt;Dependabot&lt;/a&gt;! E é dele que vamos falar hoje!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fur77w9mluksb9akmn8ph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fur77w9mluksb9akmn8ph.png" alt="Bertuzzi Robo" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependabot!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Dependabot é um serviço de integração contínua oferecido pelo GitHub, projetado especificamente para monitorar e atualizar automaticamente as dependências dos repositórios. Ele analisa regularmente o arquivo de manifesto de dependências (como o package.json no JavaScript ou o csproj  do .net) e notifica sobre versões desatualizadas, novas e atualizações criticas de  correções de segurança.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legal, mas como funciona?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Dependabot funciona integrado ao seu repositorio ou a um fluxo devops do GitHub. Quando ativado em um repositório, o Dependabot verifica regularmente as dependências em busca de atualizações disponíveis. O Mais incrivel é que ele cria solicitações de pull (PRs) com as atualizações propostas, permitindo que você revise e teste as mudanças antes de comita-las em seu código.&lt;/p&gt;

&lt;p&gt;Mais incrivel ainda do ponto de vista de segurança, o Dependabot analisa as atualizações em busca de vulnerabilidades conhecidas. Se uma atualização resolver uma vulnerabilidade de segurança, o Dependabot criará uma PR específica para essa atualização, destacando a importância da correção. Isso é incrivel! Principalmente para manter o seu projeto protegido contra possíveis ameaças.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como configurar o DependaBot?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Existem 2 formas de configurar o DependaBot, uma é com um arquivo &lt;strong&gt;dependabot.yml&lt;/strong&gt; adicionado ao seu repositorio (caso queira ver todas as opções do Arquivo &lt;a href="https://docs.github.com/pt/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;), ou no proprio repositorio : &lt;/p&gt;

&lt;p&gt;No seu repositorio clique em settings :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ob1d6bdtejbhczlf2m7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ob1d6bdtejbhczlf2m7.jpg" alt="Settings" width="337" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Seguida nas opções de segurança :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l1f3vp2uqqmccxmg6yc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l1f3vp2uqqmccxmg6yc.jpg" alt="Seccurity options" width="446" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então temos todas as opções do Dependabot :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmdrjdz3bmqcgaj9yy55.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmdrjdz3bmqcgaj9yy55.jpg" alt="Dependabot" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso queira configurações mais especificas pode acessar a documentação oficial &lt;a href="https://docs.github.com/pt/code-security/dependabot" rel="noopener noreferrer"&gt;clicando aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Um exemplo de como ele se comporta :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qhqxn85v8kyw9fdzhxj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qhqxn85v8kyw9fdzhxj.jpg" alt="Dependabot" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Pull request é bem explicativo e facil de entender antes de dar o merge :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ap95q116pc0k09xaq4f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ap95q116pc0k09xaq4f.jpg" alt="Dependabot" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Então recapitulando os beneficios do Dependabot :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manutenção dependências:&lt;/strong&gt; Ele automatiza a tarefa de acompanhar e atualizar suas dependências, poupando tempo e esforço. Ele mantém você informado sobre as atualizações disponíveis e cria PRs prontas para serem revisadas e mescladas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correção de vulnerabilidades:&lt;/strong&gt; Isso ajuda a garantir que você esteja ciente das vulnerabilidades conhecidas nas suas dependências. Ao criar PRs específicas para resolver essas vulnerabilidades, ele facilita a aplicação das correções necessárias para manter seu código e sistema seguro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ja esta no GitHub:&lt;/strong&gt; O Dependabot é um serviço nativo do GitHub, o que significa que ele se integra perfeitamente ao ambiente do GitHub. Ele se alinha com os fluxos de trabalho existentes, Actions, repositorio ,notificações e revisões de código, facilitando a adoção e utilização por desenvolvedores.&lt;/p&gt;

&lt;p&gt;Caso queira saber mais sobre Desenvolvimento seguro &lt;a href="https://dev.to/tbertuzzi/desenvolvimento-seguro-s-sdlc-1n4f"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso queira saber o que não se deve armazenar no seu código &lt;a href="https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-3-cuidado-com-o-que-voce-armazena-290o"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>security</category>
      <category>github</category>
      <category>devops</category>
      <category>development</category>
    </item>
    <item>
      <title>10 Dicas Basicas de Arquitetura de Código : 3 - Cuidado com o que você armazena no seu código</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Wed, 05 Jul 2023 14:33:21 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-3-cuidado-com-o-que-voce-armazena-290o</link>
      <guid>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-3-cuidado-com-o-que-voce-armazena-290o</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwttrskymaeyv4461r1j9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwttrskymaeyv4461r1j9.png" alt="Bertuzzi no PC" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Dando continuidade a serie de artigos sobre arquitetura (se não viu a parte 2 &lt;a href="https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-2-code-smells-54nf"&gt;clique aqui&lt;/a&gt;), Algumas dicas basicas de arquitetura se extendem alem de padrões código limpo e etc. &lt;/p&gt;

&lt;p&gt;Existem algumas coisas que devemos nos preocupar, como a adoção de medidas de segurança eficientes para proteger informações sensíveis. &lt;/p&gt;

&lt;p&gt;Existem muitas informações sensíveis/confidenciais, como senhas, chaves de API, tokens de autenticação entre outras. No entanto, infelizmente, ainda é comum encontrar projetos que armazenam tais segredos diretamente no código e pior nos repositórios Git. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr1vv5fx0eqygcr4w5si.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr1vv5fx0eqygcr4w5si.png" alt="Bertuzzi detetive" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Existem alguns pontos que devemos nos preocupar :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vulnerabilidade:&lt;/strong&gt; Ao armazenar segredos no código fonte (e comitando  no repositório Git), você está expondo essas informações a qualquer pessoa com acesso ao repositório. Isso inclui colaboradores, hackers ou indivíduos mal-intencionados que possam explorar essas informações para obter acesso não autorizado aos sistemas e dados sensíveis. Imagina se alguem por algum erro ou "cagada" deixa o repositório publico?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Histórico de alterações:&lt;/strong&gt; Quem ja escutou a frase : "Uma vez que cai na internet ja era". Então,o Git mantém um histórico completo de todas as alterações feitas no código e nos arquivos do repositório. Isso significa que, mesmo que você exclua ou apague secrets e outras coisas posteriormente, eles ainda poderão ser recuperados do histórico de commits. Essa vulnerabilidade pode ser explorada por alguém com acesso ao repositório, o que coloca em risco a segurança dos dados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compartilhamento:&lt;/strong&gt; O desenvolvimento de aplicações na maioria dos casos envolve vários desenvolvedores, testadores e administradores de sistemas. Quando você armazena informações sensiveis você acaba compartilhando com várias pessoas. Isso amplia o risco de exposição acidental ou intencional das informações, especialmente quando os níveis de acesso e controle não são adequadamente definidos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mudanças de ambiente:&lt;/strong&gt; Alem dos riscos citados acima, existe tambem um problema ao implantar um aplicativo em diferentes ambientes (desenvolvimento, teste, produção) ou escalar sua infraestrutura. Obviamente é necessário gerenciar diferentes configurações/secrets  para cada ambiente. Ao armazenar essas configurações/secrets  no código fonte ou no repositório (imagina um cenario de deploy automatico), a gestão dessas configurações se torna complicada, levando a erros, vazamentos e dificuldades em manter a sincronização adequada entre as diferentes instâncias.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv17sw52y8h06i7p3sc3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv17sw52y8h06i7p3sc3e.png" alt="Bertuzzi Check" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Certo, mas como resolver?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Variáveis de ambiente&lt;/strong&gt;: Ao invés de armazenar informações sensiveis no código , utilize variáveis de ambiente para acessar essas informações durante a execução da aplicação. Dessa forma, você pode proteger esses dados em um local separado, acessível apenas pelo sistema operacional ou pelo gerenciador de execução.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ferramentas de gestão de segredos:&lt;/strong&gt; Há várias ferramentas disponíveis para o gerenciamento seguro de segredos, como o Azure Key Vault (Caso queira conhecer fizemos uma &lt;a href="https://www.youtube.com/watch?v=l5m6QeEWIZc" rel="noopener noreferrer"&gt;live no Canal dotNet Sobre&lt;/a&gt;) , AWS Secrets Manager ou HashiCorp Vault. Essas soluções permitem o armazenamento centralizado de segredos e fornecem mecanismos seguros para acessá-los durante a execução da aplicação. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Arquivos de configuração externos:&lt;/strong&gt; Mais facil que contratar um serviço é utilizar arquivos de configuração externos, como arquivos JSON, XML, YAML ou INI, para armazenar os segredos. Esses arquivos podem ser criptografados ou protegidos por permissões adequadas, garantindo que apenas usuários autorizados tenham acesso a eles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controle de acesso e revisões:&lt;/strong&gt; Não adianta nada se preocupar se sua equipe não se preocupa.É importante implementar controles de acesso adequados aos repositórios Git e aos sistemas de gerenciamento de segredos. Além disso, é fundamental realizar revisões periódicas para identificar e corrigir possíveis exposições de segredos, garantindo a conformidade com as políticas de segurança estabelecidas.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo você pode ter a melhor arquitetura do mundo, se não se preocupar com o que armazena no seu código/repositório essa sua aplicação bem escrita pode não vai ficar muito tempo no ar.... &lt;/p&gt;

&lt;p&gt;Caso queira saber mais sobre Desenvolvimento seguro &lt;a href="https://dev.to/tbertuzzi/desenvolvimento-seguro-s-sdlc-1n4f"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>security</category>
      <category>git</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>10 Dicas Basicas de Arquitetura de Código : 2 - Code Smells</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Wed, 07 Jun 2023 12:43:56 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-2-code-smells-54nf</link>
      <guid>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-2-code-smells-54nf</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohfcx2f4kg2ou7b7agop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohfcx2f4kg2ou7b7agop.png" alt="Bertuzzi no Pc" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Dando continuidade a serie de artigos sobre arquitetura (se não viu a parte 1 &lt;a href="https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-1-aproveitando-os-beneficios-da-virtualizacao-1ih4"&gt;clique aqui&lt;/a&gt;), hoje vamos falar sobre quando ta fedendo a ... Bem, Código mal cheirosos no portugues bem claro heheheh&lt;/p&gt;

&lt;p&gt;Bora?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6undfg0xua6gwxibfng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6undfg0xua6gwxibfng.png" alt="Bertuzzi voando com um cheiro" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em um bom resumo &lt;strong&gt;Code Smells&lt;/strong&gt; são indicações de possiveis problemas ou deficiências no seu código que podem afetar negativamente a qualidade, perfomance e principalmente manutenção  de uma aplicação. &lt;/p&gt;

&lt;p&gt;Esses "Smells" de código devem ser levados em consideração pois  são sinais de que algo pode estar errado com o projeto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Smells&lt;/strong&gt; podem ser identificados através de análises e/ou revisões de código. Geralmente são analises feitas por desenvolvedores mais experientes, alem de existirem diversos problemas que podem ocorrer.&lt;/p&gt;

&lt;p&gt;Para te ajudar a verificar o seu código (Considerando exemplos comuns) vou demonstrar alguns casos de &lt;strong&gt;Code Smells&lt;/strong&gt; que podem te ajudar a identificar problemas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehaoypnq224x15rc5w91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehaoypnq224x15rc5w91.png" alt="Bertuzzi em frente a lixeira pegando fogo" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código em duplicidade:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A famosa duplicidade de código ocorre quando há trechos semelhantes ou idênticos em diferentes partes do código. Isso pode levar a problemas de manutenção, pois qualquer alteração deve ser feita em vários lugares. &lt;br&gt;
Um exemplo de duplicação seria quando a mesma lógica é repetida em diferentes métodos ou classes. A solução para esse problema é extrair a lógica duplicada para um método separado e chamá-lo onde for necessário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Código com duplicação&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotalPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;total&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;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;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Preco&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantidade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&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;void&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotalVenda&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Venda&lt;/span&gt; &lt;span class="n"&gt;venda&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;total&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;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;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;venda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Preco&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantidade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Código refatorado&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;CalcularTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;itens&lt;/span&gt;&lt;span class="p"&gt;)&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;total&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;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;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;itens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Preco&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantidade&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;total&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotalPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itens&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&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;void&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotalVenda&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Venda&lt;/span&gt; &lt;span class="n"&gt;venda&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itens&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&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;Classe com mais responsabilidades do que devia:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você ja ouviu a palavra da Mono-Classe? Se não nem escute porque ta errado hahaha. Uma classe com muitas responsabilidades tende a ser mais difícil de entender, testar e manter.&lt;br&gt;
É importante seguir o princípio da responsabilidade única (quer entender mais escute nosso episódio &lt;a href="https://devshow.com.br/episode/devshow-21-solid-srp/" rel="noopener noreferrer"&gt;DEVSHOW #21 – SOLID (SRP)&lt;/a&gt;, onde cada classe deve ter apenas uma razão para mudar. &lt;br&gt;
Isso pode ser identificado quando uma classe executa várias operações diferentes ou possui muitos métodos e propriedades. A solução para isso é dividir a classe em classes menores e mais especializadas, seguindo o princípio da segregação de interfaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Classe com muitas responsabilidades&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;ProcessamentoPedido&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;void&lt;/span&gt; &lt;span class="nf"&gt;ProcessarPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para processar o pedido&lt;/span&gt;

        &lt;span class="c1"&gt;// Enviar email de confirmação&lt;/span&gt;
        &lt;span class="nf"&gt;EnviarEmailConfirmacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Atualizar estoque&lt;/span&gt;
        &lt;span class="nf"&gt;AtualizarEstoque&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Gerar relatório&lt;/span&gt;
        &lt;span class="nf"&gt;GerarRelatorio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&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;EnviarEmailConfirmacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para enviar o email&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;AtualizarEstoque&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para atualizar o estoque&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;GerarRelatorio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para gerar o relatório&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classes refatoradas&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;EmailService&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;void&lt;/span&gt; &lt;span class="nf"&gt;EnviarEmailConfirmacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para enviar o email&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EstoqueService&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;void&lt;/span&gt; &lt;span class="nf"&gt;AtualizarEstoque&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para atualizar o estoque&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RelatorioService&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;void&lt;/span&gt; &lt;span class="nf"&gt;GerarRelatorio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para gerar o relatório&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProcessamentoPedido&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;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&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;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&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;RelatorioService&lt;/span&gt; &lt;span class="n"&gt;relatorioService&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;ProcessamentoPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RelatorioService&lt;/span&gt; &lt;span class="n"&gt;relatorioService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emailService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estoqueService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relatorioService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relatorioService&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ProcessarPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para processar o pedido&lt;/span&gt;

        &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnviarEmailConfirmacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AtualizarEstoque&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;relatorioService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GerarRelatorio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&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;&lt;strong&gt;Métodos muito longos:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se você não quer escutar a palavra da Mono-Classe cuidado com o Mono-Método! Métodos longos podem dificultar a compreensão e manutenção do código. &lt;br&gt;
É recomendado que as funções sejam curtas e executem apenas uma tarefa específica. Isso pode ser identificado quando um método possui muitas linhas de código ou realiza várias ações diferentes. A solução é extrair partes do método em funções menores e mais especializadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Método muito longo&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ProcessarPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Lógica 1&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// Lógica 2&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// Lógica 3&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// Lógica 10&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Método refatorado&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ProcessarPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;ProcessarLogica1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;ProcessarLogica2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;ProcessarLogica3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nf"&gt;ProcessarLogica10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&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;ProcessarLogica1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Lógica 1&lt;/span&gt;
    &lt;span class="c1"&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;ProcessarLogica2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Lógica 2&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Classe ou método com muitos parâmetros:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não adianta nada refatorar um método gigante e encher o mesmo de 500 parametros. Quando uma classe ou método possui muitos parâmetros, isso pode indicar uma falta de coesão ou uma responsabilidade excessiva. &lt;br&gt;
Isso pode dificultar a compreensão e o uso da classe ou método. A solução é agrupar parâmetros relacionados em objetos ou estruturas de dados e passá-los como um único argumento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Classe com muitos parâmetros&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;Pedido&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;void&lt;/span&gt; &lt;span class="nf"&gt;AdicionarItem&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;descricao&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;preco&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;quantidade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;dataEntrega&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para adicionar item&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classe refatorada&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;ItemPedido&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="n"&gt;Descricao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Preco&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Quantidade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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;DateTime&lt;/span&gt; &lt;span class="n"&gt;DataEntrega&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&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;void&lt;/span&gt; &lt;span class="nf"&gt;AdicionarItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ItemPedido&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para adicionar item&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;&lt;strong&gt;Métodos ou classes com baixa coesão:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ainda falando de baixa coesão, a mesma ocorre quando há muitas responsabilidades ou tarefas diferentes agrupadas em um único método ou classe. Isso pode tornar o código mais difícil de entender e manter. A solução é dividir o método ou classe em partes menores e mais coesas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Classe com baixa coesão&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;Relatorio&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;void&lt;/span&gt; &lt;span class="nf"&gt;GerarRelatorioVendas&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para buscar dados de vendas&lt;/span&gt;

        &lt;span class="c1"&gt;// Lógica para calcular total de vendas&lt;/span&gt;

        &lt;span class="c1"&gt;// Lógica para formatar e exibir relatório&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classe refatorada&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;Relatorio&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;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Venda&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;BuscarVendas&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para buscar dados de vendas&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;CalcularTotalVendas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Venda&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vendas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para calcular total de vendas&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;void&lt;/span&gt; &lt;span class="nf"&gt;ExibirRelatorio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Venda&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vendas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para formatar e exibir relatório&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;void&lt;/span&gt; &lt;span class="nf"&gt;GerarRelatorioVendas&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;vendas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;BuscarVendas&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;total&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotalVendas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vendas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;ExibirRelatorio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vendas&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;&lt;strong&gt;Dependências desnecessárias:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Muitas vezes declaramos classes, ou refatoramos um código e esquecemos varias dependências que não são mais utilizadas. Isso pode aumentar o acoplamento e tornar o código mais frágil. A solução é remover as dependências não utilizadas ou separá-las em classes ou módulos independentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Classe com dependências desnecessárias&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;PedidoService&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;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&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;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&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;PedidoService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EstoqueService&lt;/span&gt; &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emailService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estoqueService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;estoqueService&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ProcessarPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para processar o pedido&lt;/span&gt;

        &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnviarEmailConfirmacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;estoqueService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AtualizarEstoque&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&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="c1"&gt;// Classe refatorada&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;PedidoService&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;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&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;PedidoService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emailService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailService&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ProcessarPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para processar o pedido&lt;/span&gt;

        &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnviarEmailConfirmacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&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;&lt;strong&gt;Muitas responsabilidades em uma classe base:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A famosa classe "Zelador"! Quando uma classe base contém muitas funcionalidades e responsabilidades, ela pode se tornar complexa e difícil de entender. Isso pode levar a problemas de manutenção e dificultar a extensibilidade do código. A solução é extrair as responsabilidades em classes derivadas ou interfaces mais especializadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Classe base com muitas responsabilidades&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;Animal&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;void&lt;/span&gt; &lt;span class="nf"&gt;Mover&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para mover o animal&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;void&lt;/span&gt; &lt;span class="nf"&gt;Comer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para alimentar o animal&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;void&lt;/span&gt; &lt;span class="nf"&gt;Dormir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para fazer o animal dormir&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classes derivadas ou interfaces especializadas&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IMovel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Mover&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="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IComivel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Comer&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="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IDormivel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Dormir&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cachorro&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IMovel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IComivel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IDormivel&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;void&lt;/span&gt; &lt;span class="nf"&gt;Mover&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para mover o cachorro&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;void&lt;/span&gt; &lt;span class="nf"&gt;Comer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para alimentar o cachorro&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;void&lt;/span&gt; &lt;span class="nf"&gt;Dormir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para fazer o cachorro dormir&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Uso excessivo de comentários:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eu sempre digo que a arquitetura/código bem feito(a) é auto explicativo. Por mais que os comentários sejam úteis para explicar o propósito de um código, o uso excessivo deles pode ser indicativo de código mal escrito ou falta de clareza. Um código limpo e bem estruturado deve ser autoexplicativo na maioria dos casos. A solução é simplificar o código e usar nomes descritivos para classes, métodos e variáveis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Classe para calcular o total do pedido&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;CalculadoraPedido&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Método para calcular o total do pedido&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;CalcularTotalPedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&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;total&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="c1"&gt;// Loop pelos itens do pedido&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;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Cálculo do subtotal do item&lt;/span&gt;
            &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;subtotal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Preco&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Quantidade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// Adicionar o subtotal ao total&lt;/span&gt;
            &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;subtotal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Retornar o total do pedido&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&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;&lt;strong&gt;Objetos com muitas propriedades:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quando você cria um objeto com um grande número de propriedades, isso pode indicar uma falta de coesão e um design pouco eficiente. Uma classe com muitas propriedades pode ser difícil de entender e pode indicar que ela está tentando fazer muitas coisas ao mesmo tempo (muitas vezes mais do que deveria). A solução é revisar a classe e identificar se é possível dividir suas responsabilidades em classes mais especializadas ou agrupar propriedades relacionadas em objetos compostos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Classe com muitas propriedades&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;Pessoa&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="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Idade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Endereco&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Telefone&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classe refatorada&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;Pessoa&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="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Idade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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;Endereco&lt;/span&gt; &lt;span class="n"&gt;Endereco&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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;Contato&lt;/span&gt; &lt;span class="n"&gt;Contato&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&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;Endereco&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="n"&gt;Logradouro&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Cidade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Estado&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;CEP&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&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;Contato&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="n"&gt;Telefone&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&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;Falta de tratamento de erros adequado:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eu sei em, você ja fez ou viu um Catch vazio... Um código que não possui tratamento adequado de erros, como exceções não capturadas ou blocos catch vazios, pode resultar em falhas no sistema e comportamentos inesperados. É importante implementar tratamento de erros apropriado para lidar com exceções e situações inesperadas de forma segura e controlada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Falta de tratamento de erros adequado&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;Dividir&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;a&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;b&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;a&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Tratamento de erros adequado&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;Dividir&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;a&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;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;a&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DivideByZeroException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para lidar com a divisão por zero&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para lidar com outras exceções&lt;/span&gt;
        &lt;span class="k"&gt;throw&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;&lt;strong&gt;Falta de testes automatizados:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É eu sei , se funciona na produção com certeza funciona na homologação. A falta de testes automatizados é um code smell comum em projetos. &lt;br&gt;
A ausência de testes unitários adequados torna mais difícil verificar a corretude do código e introduz riscos de regressão. É recomendado implementar testes automatizados para garantir que o código funcione corretamente e evitar problemas futuros.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Falta de testes automatizados&lt;/span&gt;

&lt;span class="c1"&gt;// Código a ser testado&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;CalcularTotal&lt;/span&gt;&lt;span class="p"&gt;(&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="kt"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;valores&lt;/span&gt;&lt;span class="p"&gt;)&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;total&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;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;valor&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;valores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Implementação de testes automatizados&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TestFixture&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;CalculadoraTests&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Test&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;void&lt;/span&gt; &lt;span class="nf"&gt;CalcularTotal_DeveRetornarSomaDosValores&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;calculadora&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;Calculadora&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;valores&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="kt"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;1.5m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2.5m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3.5m&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="c1"&gt;// Act&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CalcularTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valores&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Assert&lt;/span&gt;
        &lt;span class="n"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AreEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;7.5m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultado&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;&lt;strong&gt;Ausência de documentação adequada:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Principalmente para quem faz componentes, dlls, frameworks entre outros códigos que serão consumidos por terceiros, um código não possuir documentação adequada, como comentários explicativos ou documentação XML, pode ser difícil para outros desenvolvedores entenderem o propósito e o funcionamento do código. É recomendado fornecer documentação clara e concisa para ajudar na compreensão e no uso correto do código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ausência de documentação adequada&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;Cliente&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="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="c1"&gt;// Documentação adequada&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// Representa um cliente no sistema.&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;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;Cliente&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// Obtém ou define o nome do cliente.&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;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="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// Obtém ou define o e-mail do cliente.&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;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="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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;Ufa! Acho que por hoje ta bom né? hahaha. É claro que existem muitos outros casos, mas creio que com esses exemplos você ja entendeu os mais comuns e tambem a ideia dos Code Smells conseguindo identifica-los.&lt;/p&gt;

&lt;p&gt;Caso queira entender mais sobre SOLID e alguns dos principios citados eu recomendo escutar nossos &lt;a href="https://devshow.com.br/tag/solid/" rel="noopener noreferrer"&gt;episódios do DEVSHOW Relacionados ao tema&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>codesmells</category>
      <category>architecture</category>
      <category>beginners</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>10 Dicas Basicas de Arquitetura de Código : 1 - Aproveitando os Benefícios da Virtualização</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Tue, 06 Jun 2023 20:30:35 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-1-aproveitando-os-beneficios-da-virtualizacao-1ih4</link>
      <guid>https://dev.to/tbertuzzi/10-dicas-basicas-de-arquitetura-de-codigo-1-aproveitando-os-beneficios-da-virtualizacao-1ih4</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsuw4e3caj75kx3vi88ml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsuw4e3caj75kx3vi88ml.png" alt="Bertuzzi no PC" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Vou começar uma serie de artigos de dicas basicas para desenvolvedores com conceitos simples e uteis de Arquitetura com .net (Mesmo que você consiga aplicar para sua linguagem :) ).&lt;/p&gt;

&lt;p&gt;Hoje vamos falar de &lt;strong&gt;Métodos Virtuais&lt;/strong&gt; ! Bora!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6hffqavpkziwlas2jae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6hffqavpkziwlas2jae.png" alt="Bertuzzi com Métodos Virtuais" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por mais que alguns escrevam artigos dizendo o contrario, a arquitetura de software desempenha um papel fundamental no desenvolvimento de aplicativos eficientes e escaláveis. &lt;/p&gt;

&lt;p&gt;Uma das abordagens mais poderosas é a utilização de métodos virtuais. Essa técnica oferece uma série de benefícios que vão desde a extensibilidade até a facilidade de manutenção do código. &lt;/p&gt;

&lt;p&gt;O que são métodos virtuais?&lt;/p&gt;

&lt;p&gt;Um método virtual é aquele que pode ser sobrescrito em uma classe derivada, permitindo que seu comportamento seja modificado para atender às necessidades específicas dessa classe. Essa flexibilidade é alcançada através do uso da palavra-chave &lt;strong&gt;virtual&lt;/strong&gt; na declaração do método na classe base e da palavra-chave &lt;strong&gt;override&lt;/strong&gt; na declaração do método na classe derivada.&lt;/p&gt;

&lt;p&gt;E Quais as vantagens?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Extensibilidade:&lt;/strong&gt; Ao utilizar métodos virtuais, é possível estender a funcionalidade de uma classe base através da criação de classes derivadas que substituem o comportamento dos métodos virtuais. Isso permite adicionar novos recursos ou personalizar o comportamento existente sem modificar a classe base, mantendo assim a integridade do código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Polimorfismo:&lt;/strong&gt; O polimorfismo é um dos princípios fundamentais da programação orientada a objetos, e os métodos virtuais são uma ferramenta essencial para sua implementação. Com métodos virtuais, é possível tratar objetos derivados como objetos da classe base, facilitando o uso de herança e permitindo que diferentes implementações de um método sejam invocadas com base no tipo de objeto em tempo de execução.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Manutenção simplificada:&lt;/strong&gt; As modificações em um método na classe base refletem-se automaticamente em todas as classes derivadas que o sobrescrevem. Isso simplifica a manutenção do código, uma vez que as alterações são centralizadas e propagadas para todas as partes relevantes do sistema.&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo bem facil para isso :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&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;virtual&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MeuCabelo&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;"Meu Cabelo Esta grande"&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bertuzzi&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Pessoa&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Andre&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Pessoa&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MeuCabelo&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;"Meu Cabelo Esta Sumindo."&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Ewerton&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Pessoa&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MeuCabelo&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;"Meu Cabelo Sumiu."&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&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="n"&gt;args&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;bertuzzi&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;Bertuzzi&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;andre&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;Andre&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;ewerton&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;Ewerton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;bertuzzi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MeuCabelo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Saída: "Meu Cabelo Esta grande."&lt;/span&gt;
        &lt;span class="n"&gt;andre&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MeuCabelo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// Saída: "Meu Cabelo Esta Sumindo."&lt;/span&gt;
        &lt;span class="n"&gt;ewerton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MeuCabelo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Saída: "Meu Cabelo Sumiu."&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;Neste exemplo, a classe base Pessoal possui um método virtual MeuCabelo() que exibe uma frase genérico. As classes derivadas Andre e Ewerton substituem esse método para exibir suas proprias fases genericas. Ao instanciar os objetos e chamar o método MeuCabelo(), o comportamento apropriado é invocado com base no tipo de objeto em tempo de execução.&lt;/p&gt;

&lt;p&gt;Como a classe Bertuzzi não sobrescreve o método, a mesma possui o comportamento do método Virtual.&lt;/p&gt;

&lt;p&gt;Simples não? Com essa implementação simples muitos softwares que as vezes precisam de comportamentos especificos podem ser implementados de maneira facil ;).&lt;/p&gt;

&lt;p&gt;Caso queira saber mais sobre o assunto abordado no principio de OCP (Open-Closed Principle). Vou deixar esses dois links que eu recomendo muito :&lt;/p&gt;

&lt;p&gt;1 - &lt;a href="https://devshow.com.br/episode/devshow-22-solid-ocp/" rel="noopener noreferrer"&gt;DEVSHOW #22 – SOLID (OCP)&lt;/a&gt;&lt;br&gt;
2 - &lt;a href="https://www.youtube.com/watch?v=UlSNpWFTU3Q" rel="noopener noreferrer"&gt;SOLID: OCP - Open/Closed Principle (Princípio do Aberto/Fechado)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>programming</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>ChatGPT e 500 Ferramentas de i.a. : Meus dados estão protegidos?</title>
      <dc:creator>Thiago Bertuzzi 👨🏻‍💻</dc:creator>
      <pubDate>Thu, 01 Jun 2023 16:33:35 +0000</pubDate>
      <link>https://dev.to/tbertuzzi/chatgpt-e-500-ferramentas-de-ia-meus-dados-estao-protegidos-i53</link>
      <guid>https://dev.to/tbertuzzi/chatgpt-e-500-ferramentas-de-ia-meus-dados-estao-protegidos-i53</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrzgw2wb5nt1gh5r9pkx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrzgw2wb5nt1gh5r9pkx.png" alt="Logo do Artigo" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala galera,&lt;/p&gt;

&lt;p&gt;tudo beleza?&lt;/p&gt;

&lt;p&gt;Com a nova onda de centenas de serviços de inteligencia artificial onde o objetivo é destruir o mundo e criar a matrix, diversas  empresas estão cada vez mais dependentes dessas tecnologias. &lt;br&gt;
Diversos sistemas de inteligência artificial (IA) e chatbots, como o ChatGPT, para aprimorar ( e acelerar) suas operações e melhorar a experiência do cliente. &lt;/p&gt;

&lt;p&gt;Porem... essa "novidade" e enorme adoção de novas tecnologias também traz consigo preocupações significativas em relação à segurança de dados sensíveis, o que curiosamente eu vejo varias pessoas ignorarem enquanto estão deslumbradas com a tecnlogia.&lt;/p&gt;

&lt;p&gt;Vamos bater um papo de por que as empresas devem se preocupar com a segurança de dados e dar algumas dicas práticas sobre como protegê-los em um cenário novo e dominado pela IA.&lt;/p&gt;

&lt;p&gt;Bora?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge7ktojf8gyngvx9t7lb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge7ktojf8gyngvx9t7lb.png" alt="Bertuzzi no Chat" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A I.A. e Meu novo empregado o ChatGPT :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bem não é novidade para ninguem que mais utilizado que as redes sociais para compartilhar fotos da nossa vida, o ChatGPT tem sido utilizado de forma massiva tanto para estudos, inutilidades e principalmente no mundo corporativo.&lt;/p&gt;

&lt;p&gt;Caso você tenha saido da caverna hoje, o ChatGPT é um modelo de linguagem baseado em IA que pode gerar respostas humanas em conversas. Embora seja uma ferramenta poderosa para comunicação e interação com os clientes, é importante reconhecer os desafios associados à segurança de dados que surgem com sua utilização.&lt;/p&gt;

&lt;p&gt;Existem muitas empresas realizando integrações com a tecnologia do ChatGPT entre outras ferramentas, enviando documentos, dados de clientes, pesquisas constantes com informações da empresa e etc.&lt;/p&gt;

&lt;p&gt;Não podemos nos esquecer que mesmo com essa facilidade a segurança de dados sensíveis é essencial para proteger a confidencialidade, integridade e disponibilidade das informações. Se uma empresa lida com dados confidenciais de clientes, como informações pessoais, dados financeiros ou segredos comerciais, qualquer violação pode levar a consequências graves. Isso inclui danos à reputação, perda de clientes, multas regulatórias e possíveis litígios.&lt;/p&gt;

&lt;p&gt;Certo, mas como podemos utilizar o bom da "nova" tecnologia mas continuar seguros?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54phdrk2m9qdsq7drpio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54phdrk2m9qdsq7drpio.png" alt="Detetive" width="398" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algumas dicas para proteger dados sensiveis :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Criptografia:&lt;/strong&gt; Todo cuidado é pouco na hora de trafegar informações, Documentos, Imagens e etc. Utilize técnicas de criptografia para proteger os dados sensíveis durante o armazenamento e a transmissão. Isso garante que mesmo se houver uma violação de segurança, os dados permanecerão inacessíveis para os invasores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controles de acesso:&lt;/strong&gt; Um Chat própio na empresa é interessante. Mas sera que todos podem buscar qualquer coisa e receber os mesmos resultados? Implemente medidas rigorosas de controle de acesso para limitar quem pode acessar os dados sensíveis. Apenas funcionários autorizados devem ter permissão para visualizar, modificar ou manipular essas informações.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitoramento e detecção de ameaças:&lt;/strong&gt; Mais uma tecnologia, mas uma abertura para problemas externos (e internos claro). Implemente sistemas de monitoramento de segurança para identificar possíveis ameaças e atividades suspeitas. Isso inclui a detecção de padrões incomuns de acesso, tentativas de intrusão ou atividades maliciosas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Treinamento e conscientização dos desenvolvedores:&lt;/strong&gt; treine e ensine seus desenvolvedores sobre as melhores práticas de desenvolvimento seguro ,de dados e a importância de proteger informações sensíveis. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Treinamento e conscientização dos funcionários:&lt;/strong&gt; Mesmo com o tópico anterior não adianta implementar sistemas seguros se os funcionarios não fazem sua parte. Eduque seus funcionários sobre as melhores práticas de segurança de dados e a importância de proteger informações sensíveis. Eles devem estar cientes dos riscos envolvidos e saber como evitar ameaças, como phishing e engenharia social.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avaliações regulares de segurança:&lt;/strong&gt; Realize avaliações periódicas de segurança para identificar possíveis vulnerabilidades em seus sistemas e processos. Isso ajudará a garantir que todas as medidas de segurança estejam atualizadas e sejam eficazes contra as ameaças mais recentes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lembre-se sempre, cada tecnologia que facilita o dia a dia pode abrir portas para problemas ou brechas de segurança. Nós como desenvolvedores, arquitetos e profissionais de TI em geral devemos sempre estar atentos a esses problemas.&lt;/p&gt;

&lt;p&gt;Caso queria saber mais sobre Desenvolvimento seguro vou deixar aqui este meu outro artigo : &lt;a href="https://dev.to/tbertuzzi/desenvolvimento-seguro-s-sdlc-1n4f"&gt;Desenvolvimento Seguro, S-SDLC&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alem disso , sera que &lt;a href="https://devshow.com.br/episode/devshow-41-chat-gpt/" rel="noopener noreferrer"&gt;O CHATGPT SUBSTITUIRÁ OS DESENVOLVEDORES?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Aquele abraço!&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>security</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
