<?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>Forem: José Vitor G. Soares</title>
    <description>The latest articles on Forem by José Vitor G. Soares (@josevitorsoares).</description>
    <link>https://forem.com/josevitorsoares</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%2F1470310%2F8f2e4dfe-966b-47df-8404-e66b1471df47.png</url>
      <title>Forem: José Vitor G. Soares</title>
      <link>https://forem.com/josevitorsoares</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/josevitorsoares"/>
    <language>en</language>
    <item>
      <title>Entendendo SOLID com Exemplos Práticos em TypeScript: Guia Definitivo 🎯</title>
      <dc:creator>José Vitor G. Soares</dc:creator>
      <pubDate>Wed, 02 Apr 2025 19:40:09 +0000</pubDate>
      <link>https://forem.com/josevitorsoares/entendendo-solid-com-exemplos-praticos-em-typescript-guia-definitivo-12mc</link>
      <guid>https://forem.com/josevitorsoares/entendendo-solid-com-exemplos-praticos-em-typescript-guia-definitivo-12mc</guid>
      <description>&lt;p&gt;A qualidade do software é essencial para o sucesso de qualquer projeto de desenvolvimento. Um código bem estruturado, escrito com boas práticas e organizado de forma clara não apenas reduz a quantidade de erros, mas também facilita sua manutenção e evolução ao longo do tempo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mas como garantir um software de qualidade? 🤔&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Não existe uma fórmula mágica, mas algumas abordagens podem fazer toda a diferença. Uma delas é aplicar os princípios SOLID, que ajudam a deixar o código mais organizado, flexível e sustentável.&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos explorar esses princípios na prática e entender como eles contribuem para um desenvolvimento mais eficiente.&lt;/p&gt;

&lt;p&gt;Vamos lá?&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde tudo começou 📅
&lt;/h2&gt;

&lt;p&gt;O SOLID teve seus primeiros passos com &lt;em&gt;Robert C Martin&lt;/em&gt;, também conhecido como “&lt;em&gt;Uncle Bob&lt;/em&gt;”, onde ele escreveu um artigo em 1995 entitulado “&lt;em&gt;The principles of OoD&lt;/em&gt;” (Algo como: Os Princípios do Design Orientado a Objetos). &lt;/p&gt;

&lt;p&gt;Com o passar dos anos, Robert se empenhou em escrever e consolidar os princípios de seu artigo, de uma forma mais categórica. Em 2002 lançou seu livro “Agile Software Development, Principles, Patterns, and Practices” (Traduzindo: Desenvolvimento Ágil de Software, Princípios, Padrões e Práticas) onde reune diversos artigos sobre o tema.&lt;/p&gt;

&lt;p&gt;Entretanto, a criação do termo “SOLID” não pertence a Robert, mas a Michael Feathers e aconteceu algum tempo depois.&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%2F0h03beu65046vp5z0mu1.jpg" 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%2F0h03beu65046vp5z0mu1.jpg" alt="Robert C Martin o “Uncle Bob”" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Robert C Martin o “Uncle Bob”&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas afinal, o que é SOLID? 🤔
&lt;/h2&gt;

&lt;p&gt;O termo SOLID se trata de um acrônimo, e diz respeito a 5 princípios que são utilizados para facilitar o processo do desenvolvimento de softwares. Além de ajudar no desenvolvimento, ele torna mais prático a realização de manutenções e adição de novas funcionalidades.&lt;/p&gt;

&lt;p&gt;Ele pode ser utilizado em qualquer linguagem de programação que utilize do paradigma da Orientação a Objetos.&lt;/p&gt;

&lt;p&gt;Os 5 princípios são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;S&lt;/strong&gt; - Single Reponsability Principle (Princípio da Responsabilidade Única)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O&lt;/strong&gt; - Open-Closed Principle (Princípio Aberto-Fechado)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L&lt;/strong&gt; - Liskov Substitution Principle (Princípio de Substituição de Liskov)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I&lt;/strong&gt; - Interface Segregation Principle (Princípio da Segregação da Interface)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt; - Dependency Inversion Principle (Princípio da Inversão de Dependência)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🟢 S - Single Responsibility Principle (SRP)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Princípio da Responsabilidade Única&lt;/strong&gt;: “Uma classe deve ter apenas uma razão para mudar.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso significa que cada classe ou módulo deve ter &lt;strong&gt;uma única responsabilidade&lt;/strong&gt; e não misturar múltiplos propósitos. Além de tornar o código mais modular, também o torna mais fácil e prático de ser testado.&lt;/p&gt;

&lt;p&gt;Imagine o cenário onde uma classe possui muitas responsabilidas, alterar um simples requisito pode levar a diversas alterações na classe por inteira. Por isso, as classes de uma aplicação devem ter responsabilidades únicas.&lt;/p&gt;

&lt;p&gt;Este princípio se extende também a métodos/funções. Se um método/função possuir mais de uma responsabilidade, será difícil realizar testes e garantir que ele esteja funcionando como deveria.&lt;/p&gt;

&lt;p&gt;Para entender melhor esse princípio vamos começar com o seguinte exemplo:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Errado:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&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="nf"&gt;criarPedido&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/*...*/&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;enviarConfirmacao&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/*...*/&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="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&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;Nesse código, a classe &lt;strong&gt;Pedido&lt;/strong&gt; está lidando com a criação de pedidos, com o envio de notificações e com geração de relatórios.&lt;/p&gt;

&lt;p&gt;Pensando na Orientação a Objetos, um pedido deveria enviar notificações e gerar relatórios? &lt;strong&gt;Não!&lt;/strong&gt; Um pedido deve conter funcionalidades que gerenciem os pedidos, não emails e relatórios.&lt;/p&gt;

&lt;p&gt;A solução desse problema seria criar classes diferentes, cada uma com sua lógica e estrutura.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;Correto:&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&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="nf"&gt;criarPedido&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/*...*/&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnviarEmail&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="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/*...*/&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&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="nf"&gt;gerarRelatorio&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&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;Nessa segunda versão, a classe &lt;strong&gt;Pedido&lt;/strong&gt; terá somente o código que está relacionado as operações com pedidos. As outras operações foram separadas em classes diferentes, aplicando a separação de responsabilidades e mantendo cada classe responsável por uma parte diferente da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens 🚀
&lt;/h3&gt;

&lt;p&gt;Esses são alguns dos benefícios de se utilizar o Princípio da Responsabilidade Única:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facilidade em realizar manutenções&lt;/li&gt;
&lt;li&gt;Simplificação da legibilidade do código&lt;/li&gt;
&lt;li&gt;Reusabilidade de classes e métodos/funções&lt;/li&gt;
&lt;li&gt;Facilidade em realizar testes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🟠 &lt;strong&gt;O&lt;/strong&gt; – &lt;strong&gt;Open-Closed Principle (OCP)&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Princípio Aberto-Fechado&lt;/strong&gt;: “O código deve estar aberto para extensão, mas fechado para modificação.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso significa que devemos &lt;strong&gt;evitar modificar códigos existentes&lt;/strong&gt; e, em vez disso, &lt;strong&gt;permitir extensões&lt;/strong&gt;, usando dos conceitos de herança ou interfaces.&lt;/p&gt;

&lt;p&gt;Se uma classe está aberta para modificações, se tornará cada vez mais complexo realizar a implementação de novos recuros. O melhor cenário é adptar o código para extender a classe, através de uma interface, dispensando a necessidade de alterá-la.&lt;/p&gt;

&lt;p&gt;Ao aplicar o princípio &lt;em&gt;Open-Closed&lt;/em&gt;, o código se assemelha ao mundo real, realizando de uma maneira bem &lt;strong&gt;sólida&lt;/strong&gt; a Orientação a Objetos.&lt;/p&gt;

&lt;p&gt;Para entender melhor esse princípio vamos começar com o seguinte exemplo:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Errado:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;efetuarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tipoPagamento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tipoPagamento&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;credito&lt;/span&gt;&lt;span class="dl"&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;processarPagamentoCartaoDeCredito&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tipoPagamento&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;debito&lt;/span&gt;&lt;span class="dl"&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;processarPagamentoCartaoDeDebito&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;private&lt;/span&gt; &lt;span class="nf"&gt;processarPagamentoCartaoDeCredito&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pagamento com cartão de crédito processado.&lt;/span&gt;&lt;span class="dl"&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;private&lt;/span&gt; &lt;span class="nf"&gt;processarPagamentoCartaoDeDebito&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pagamento com cartão de débito processado.&lt;/span&gt;&lt;span class="dl"&gt;"&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;Analisando esse código, percebe-se que ele executaria normalmente e também iria cumprir com o seu objetivo. &lt;/p&gt;

&lt;p&gt;Mas, e se fosse necessário adicionar uma nova forma de pagamento? Seguindo a estrutura, &lt;strong&gt;seria&lt;/strong&gt; &lt;strong&gt;necessário&lt;/strong&gt; &lt;strong&gt;modificar&lt;/strong&gt; &lt;strong&gt;a classe&lt;/strong&gt; para adicionar mais uma verificação - um &lt;em&gt;if -&lt;/em&gt; e mais um método para o processamento do novo meio de pagamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Correto:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IMetodoPagamento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PagamentoCartaoDeCredito&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IMetodoPagamento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pagamento com cartão de crédito processado.&lt;/span&gt;&lt;span class="dl"&gt;"&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PagamentoCartaoDeDebito&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IMetodoPagamento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pagamento com cartão de débito processado.&lt;/span&gt;&lt;span class="dl"&gt;"&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;processarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;metodoPagamento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IMetodoPagamento&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;metodoPagamento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pagar&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;Nessa segunda versão, é utilizada uma abstração que permite que sejam adicionados novos meios de pagamento sem alterar a classe &lt;strong&gt;Pagamento&lt;/strong&gt;. Para adicionar uma nova forma de pagamento, basta criar uma nova classe que implemente a interface &lt;strong&gt;IMetodoPagamento&lt;/strong&gt;, assim mantendo a estrutura inical fechada para a modificações e aberta a extensões.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens 🚀
&lt;/h3&gt;

&lt;p&gt;Esses são alguns dos benefícios de se utilizar o Princípio Aberto-Fechado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Torna o projeto mais flexível&lt;/li&gt;
&lt;li&gt;Possibilita a adição de novas funcionalidades de forma fácil.&lt;/li&gt;
&lt;li&gt;Códigos mais legíveis&lt;/li&gt;
&lt;li&gt;Diminui bugs de forma mais significativa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🟡 &lt;strong&gt;L&lt;/strong&gt; – &lt;strong&gt;Liskov Substitution Principle (LSP)&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Princípio da Substituição de Liskov&lt;/strong&gt;: “Se S é uma subclasse de T, então os objetos do tipo T podem ser substituídos por objetos do tipo S sem alterar o comportamento do programa.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso significa que &lt;strong&gt;uma subclasse pode substituir uma superclasse, sem interromper o funcionamento da aplicação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Inicialmente, ele foi idealizado pela cientista da computção &lt;strong&gt;Barbara Liskov&lt;/strong&gt;, entretanto &lt;em&gt;Robert C Martin&lt;/em&gt; atribuiu uma definição mais simples a esse princípio: “&lt;em&gt;Classes derivadas (ou classes-filhas) devem ser capazes de substituir suas classes-base (ou classes-mães)&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;Em outras palavras, &lt;em&gt;Robert&lt;/em&gt; definiu que uma classe-filha deve ser capaz de realizar todas as operações de sua classe-mãe. Esse princípio reforça novamente o paradigma da Orientação a Objetos, utilizando o conceito de &lt;strong&gt;polimorfismo&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Para entender melhor esse princípio vamos começar com o seguinte exemplo:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Errado:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;abastecerComGasolina&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Abastecendo carro com gasolina...&lt;/span&gt;&lt;span class="dl"&gt;"&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CarroEletrico&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;abastecerComGasolina&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Carros elétricos não usam gasolina&lt;/span&gt;&lt;span class="dl"&gt;"&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;// Uso:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;meuCarro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CarroEletrico&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;meuCarro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abastecerComGasolina&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Erro inesperado!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Analisando é possível perceber que há algo de errado nesse código. Normalmente, carros elétricos não utilizam gasolina como seu combustível. Entretanto, a classe &lt;strong&gt;CarroEletrico&lt;/strong&gt; é filha da classe &lt;strong&gt;Carro&lt;/strong&gt; ela e herda todos os seus comportamentos.&lt;/p&gt;

&lt;p&gt;Mesmo lançando a exceção no método &lt;strong&gt;abastecerComGasolina&lt;/strong&gt; da classe filha (CarroEletrico), a estrutura continuaria sendo problemática, pois a classe &lt;strong&gt;CarroEletrico&lt;/strong&gt; não teria os mesmos comportamentos de sua classe mãe (Carro).&lt;/p&gt;

&lt;p&gt;Para estar adequado ao Princípio de Substituição de Liskov, deveria ser possível utilizar a classe &lt;strong&gt;CarroEletrico&lt;/strong&gt; nos mesmos lugares onde estivesse a classe &lt;strong&gt;Carro&lt;/strong&gt;, já que, pelo conceito de &lt;strong&gt;herança&lt;/strong&gt;, um “carro elétrico” é um “carro”.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Correto:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;abastecer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CarroAGasolina&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;abastecer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Abastecendo carro com gasolina...&lt;/span&gt;&lt;span class="dl"&gt;"&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CarroEletrico&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;abastecer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Carregando a bateria do carro elétrico...&lt;/span&gt;&lt;span class="dl"&gt;"&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;// Uso:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;meuCarro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Veiculo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CarroEletrico&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;meuCarro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abastecer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ✅ Sem erro&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessa segunda versão, além de modificar a estrutura inicial transformando a classe &lt;strong&gt;Carro&lt;/strong&gt; na classe &lt;strong&gt;abstrata&lt;/strong&gt; &lt;strong&gt;Veiculo&lt;/strong&gt;, também é adicionado a classe &lt;strong&gt;CarroAGasolina&lt;/strong&gt;. Com isso, esse código representa melhor o mundo real, não forçando uma classe a fazer algo que ela originalmente não faria.&lt;/p&gt;

&lt;p&gt;Além disso, se houver a necessidade de utilizar uma instância de &lt;strong&gt;Veiculo&lt;/strong&gt;, tanto uma instância de &lt;strong&gt;CarroAGasolina&lt;/strong&gt; quanto uma intância de &lt;strong&gt;CarroEletrico&lt;/strong&gt; podem ser utilizadas sem nenhum problema. Isso garante que uma classe filha execute todos os comportamentos de sua classe mãe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens 🚀
&lt;/h3&gt;

&lt;p&gt;Esses são alguns dos benefícios de se utilizar o Princípio da Substituição de Liskov:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementa uma modelagem mais fiel à realidade&lt;/li&gt;
&lt;li&gt;Ajuda a reduzir erros inesperados na aplicação&lt;/li&gt;
&lt;li&gt;Simplifica a manutenção do código&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔵 &lt;strong&gt;I&lt;/strong&gt; – &lt;strong&gt;Interface Segregation Principle (ISP)&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Princípio de Segregação de Interfaces&lt;/strong&gt;: “Nenhuma classe deve ser forçada a depender de métodos que não usa.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso significa que devemos evitar a criação de interfaces grandes e genéricas, e, ao invés disso, realizar uma &lt;strong&gt;segregação&lt;/strong&gt; a fim de torná-la menor e mais específica. Quando criamos uma interface, qualquer classe que deseje compartilhar os mesmos comportamentos precisa implementar todos os métodos que ela possui.&lt;/p&gt;

&lt;p&gt;No paradigma da Orientação a Objetos, ao declaramos uma interface estamos estabelecendo um &lt;strong&gt;modelo de contrato&lt;/strong&gt;, onde cada objeto terá seu comportamento definido com base no conjunto de métodos que essa interface expõe.&lt;/p&gt;

&lt;p&gt;Para entender melhor esse princípio vamos começar com o seguinte exemplo:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Errado:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Dispositivo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;imprimir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;escanear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;fax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImpressoraBasica&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;Dispositivo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;imprimir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Imprimindo: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;// ❌ Métodos que não fazem sentido para uma impresoa básica:&lt;/span&gt;
  &lt;span class="nf"&gt;escanear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Função de escaneamento não suportada.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;fax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Função de fax não suportada.&lt;/span&gt;&lt;span class="dl"&gt;"&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;Analisando esse código, é possível perceber que a classe &lt;strong&gt;ImpressoaBasica&lt;/strong&gt; foi forçada a implementar métodos que não fazem sentido para ela. &lt;/p&gt;

&lt;p&gt;Mesmo um objeto de &lt;strong&gt;ImpressoraBasica&lt;/strong&gt; sendo um &lt;strong&gt;Dispositivo,&lt;/strong&gt; não faz sentido que ela implemente métodos que não irá utilizar. &lt;/p&gt;

&lt;p&gt;O cenário ideal seria onde a classe &lt;strong&gt;ImpressoraBasica&lt;/strong&gt; implementasse uma interface que tivesse somente o(s) método(s) que ela fosse utilizar, nesse caso, apenas o método &lt;strong&gt;imprimir&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Correto:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Imprimir&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;imprimir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Escanear&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;escanear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Fax&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImpressoraBasica&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;Imprimir&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;imprimir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Imprimindo: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImpressoraMultifuncional&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;Imprimir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Escanear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Fax&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;imprimir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Imprimindo: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;escanear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Escaneando: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;fax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Enviado fax: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;documento&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;Nessa segunda versão, &lt;strong&gt;segregamos&lt;/strong&gt; a interface &lt;strong&gt;Dispositivo&lt;/strong&gt; em &lt;strong&gt;interfaces menores e mais específicas&lt;/strong&gt;. Isso faz com que cada classe implemente somente as funcionalidades que serão utilizadas.&lt;/p&gt;

&lt;p&gt;Agora a classe &lt;strong&gt;ImpressoraBasica&lt;/strong&gt; implementa apenas a interface &lt;strong&gt;Imprimir&lt;/strong&gt;, dispensando os métodos que antes não eram utilizados. Como a classe &lt;strong&gt;ImpressoraMultifuncional&lt;/strong&gt; implementa as três interfaces, ela pode utilizar de todos os métodos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens 🚀
&lt;/h3&gt;

&lt;p&gt;Esses são alguns dos benefícios de se utilizar o Princípio de Segregação de Interfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aplicações mais coesas e mais flexíveis&lt;/li&gt;
&lt;li&gt;Códigos mais fáceis de manter e estender&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🟣 &lt;strong&gt;D&lt;/strong&gt; – &lt;strong&gt;Dependency Inversion Principle (DIP)&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Princípio da Inversão de Dependência&lt;/strong&gt;: “Depende de abstrações, não de implementações.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso significa que módulos de &lt;strong&gt;alto nível&lt;/strong&gt; não devem depender diretamente de módulos de &lt;strong&gt;baixo nível&lt;/strong&gt;. Para evitar essa dependência, deve existir uma camada de abstração entre ambos, buscando reduzir o acoplamento entre os componentes.&lt;/p&gt;

&lt;p&gt;Na Orientação a Objetos, é comum que confundam a &lt;strong&gt;Inversão de Dependência&lt;/strong&gt; com a &lt;strong&gt;Injeção de Dependência&lt;/strong&gt;. Entretanto, mesmo sendo coisas diferentes, elas se relacionam entre si para tornar o código mais desacoplado.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: Não confunda a &lt;strong&gt;Inversão de Dependência&lt;/strong&gt; com &lt;strong&gt;Injeção de Dependência&lt;/strong&gt;. A &lt;em&gt;Inversão de Dependência&lt;/em&gt; se trata de um princípio (conceito) enquanto a &lt;em&gt;Injeção de Dependência&lt;/em&gt; se trata de um padrão de projeto (&lt;em&gt;Design Pattern&lt;/em&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para entender melhor esse princípio vamos começar com o seguinte exemplo:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Errado:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotificacaoViaSMS&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Enviando SMS: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ...`&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GerenciadorDeNotificacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;notificador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotificacaoViaSMS&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;notificar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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="nx"&gt;notificador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&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;A primeira impressão é que não existe nada errado com esse código. Entretanto, a classe &lt;strong&gt;GerenciadorDeNotificacao&lt;/strong&gt; depende diretamente da implementação da classe &lt;strong&gt;NotificacaoViaSMS&lt;/strong&gt; para o envio das mensagems.&lt;/p&gt;

&lt;p&gt;Caso surja a necessidade de alterar o tipo de notificação, será necessário adicionar mais uma instância no &lt;strong&gt;GerenciadorDeNotificacao&lt;/strong&gt;. Afinal, ela &lt;strong&gt;está&lt;/strong&gt; &lt;strong&gt;diretamente acoplada&lt;/strong&gt; à implementação concreta da classe &lt;strong&gt;NotificacaoViaSMS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para permitir a injeção de diferentes meios de notificação seria preciso utilizar de uma camada de abstração.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Correto:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Notificador&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotificacaoViaSMS&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;Notificador&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Enviando SMS: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ...`&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotificacaoViaEmail&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;Notificador&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Enviando Email: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ...`&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GerenciadorDeNotificacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;notificador&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Notificador&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;

  &lt;span class="nf"&gt;notificar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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="nx"&gt;notificador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enviar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&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;// Uso:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;notificadorSMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotificacaoViaSMS&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;notificadorEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotificacaoViaEmail&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gerenciadorDeNotificacaoSMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GerenciadorDeNotificacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;notificadorSMS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;gerenciadorDeNotificacaoSMS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notificar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Seu pedido foi confirmado!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gerenciadorDeNotificacaoEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GerenciadorDeNotificacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;notificadorEmail&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;gerenciadorDeNotificacaoEmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notificar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Seu pedido foi confirmado!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessa segunda versão, a classe &lt;strong&gt;GerenciadorDeNotificacao&lt;/strong&gt; passa a depender de uma &lt;strong&gt;abstração,&lt;/strong&gt; a &lt;strong&gt;interface Notificador&lt;/strong&gt;. Isso faz com que seja possível trabalhar com qualquer implementação que satisfaça a essa abstração, facilitando manutenções e extensões.&lt;/p&gt;

&lt;p&gt;Com essas alterações, garantimos que a classe de &lt;strong&gt;alto nível&lt;/strong&gt; (&lt;strong&gt;GerenciadorDeNotificacao&lt;/strong&gt;) seja &lt;strong&gt;independente&lt;/strong&gt; dos detalhes de implementação da classe de &lt;strong&gt;baixo nível&lt;/strong&gt; (NotificacaoViaEmail ou NotificacaoViaSMS).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: No trecho “&lt;em&gt;constructor(private notificador: Notificador){}&lt;/em&gt;” é utilizado da &lt;strong&gt;Injeção de Dependência&lt;/strong&gt;, exemplificando existe diferença entre o princípio (&lt;em&gt;Inversão de Dependência&lt;/em&gt;) e o padrão de projeto (&lt;em&gt;Injeção de Dependência&lt;/em&gt;), mas que eles trabalham em conjunto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Vantagens 🚀
&lt;/h3&gt;

&lt;p&gt;Esses são alguns dos benefícios de se utilizar o Princípio de Inversão de Dependência:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promove flexibilidade e extensibilidade das aplicações&lt;/li&gt;
&lt;li&gt;Facilita a construção de testes de unidade&lt;/li&gt;
&lt;li&gt;Ajuda a construir códigos mais robustos e duradouros&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Ao aplicar esses princípios e boas práticas, você não apenas eleva a qualidade do seu código, mas também torna seu desenvolvimento mais claro. Programar vai além de simplesmente fazer a máquina executar comandos, trata-se de criar soluções bem estruturadas e que facilitem a colaboração.&lt;/p&gt;

&lt;p&gt;No fim das contas, tudo isso se resume a uma frase famosa de &lt;em&gt;Martin Fowler&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Qualquer tolo consegue escrever código que um computador entenda. Bons programadores escrevem código que humanos possam entender.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neste artigo, exploramos o significado de SOLID e como seus princípios ajudam a tornar nossos projetos orientados a objetos mais organizados e eficientes.&lt;/p&gt;

&lt;p&gt;Agora é hora de colocar esse conhecimento em prática e aplicar essas ideias no seu código para evoluir ainda mais como desenvolvedor!&lt;/p&gt;

</description>
      <category>solidprinciples</category>
      <category>typescript</category>
      <category>cleancode</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
