<?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: Alberto Ventura</title>
    <description>The latest articles on DEV Community by Alberto Ventura (@albertoventura).</description>
    <link>https://dev.to/albertoventura</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%2F665279%2F0d29de6f-ffba-42dd-8c31-a1b57e3aed5c.png</url>
      <title>DEV Community: Alberto Ventura</title>
      <link>https://dev.to/albertoventura</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/albertoventura"/>
    <language>en</language>
    <item>
      <title>Seja um desenvolvedor melhor com S.O.L.I.D.</title>
      <dc:creator>Alberto Ventura</dc:creator>
      <pubDate>Sat, 19 Oct 2024 01:49:23 +0000</pubDate>
      <link>https://dev.to/albertoventura/seja-um-desenvolvedor-melhor-com-solid-1j8l</link>
      <guid>https://dev.to/albertoventura/seja-um-desenvolvedor-melhor-com-solid-1j8l</guid>
      <description>&lt;p&gt;Se você é desenvolvedor há algum tempo ou começou a estudar recentemente, já deve ter notado o termo S.O.L.I.D., tanto nas suas pesquisas quanto nas vagas que aparecem.&lt;/p&gt;

&lt;p&gt;Neste post, vou te explicar por que ele é tão importante e por que muitas empresas têm buscado cada vez mais profissionais que entendam e o apliquem.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que significa SOLID?
&lt;/h3&gt;

&lt;p&gt;O S.O.L.I.D. nada mais é do que um acrônimo de cinco princípios que, quando aplicados, fazem com que seu código atinja outro patamar de qualidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que ele é importante e é tão requisitado?
&lt;/h3&gt;

&lt;p&gt;O S.O.L.I.D. ajuda o desenvolvedor a escrever códigos mais legíveis, mais flexíveis e escaláveis, permitindo mais robustez e, por consequência, diminuindo a incidência de bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais são os princípios?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;S - Single Responsibility Principle (Princípio da responsabilidade única)&lt;/li&gt;
&lt;li&gt;O - Open/Closed Principle (Princípio Aberto-Fechado)&lt;/li&gt;
&lt;li&gt;L - Liskov Substitution Principle (Princípio da substituição de Liskov)&lt;/li&gt;
&lt;li&gt;I - Interface Segregation Principle (Princípio da Segregação da Interface)&lt;/li&gt;
&lt;li&gt;D - Dependency Inversion Principle (Princípio da inversão da dependência)&lt;/li&gt;
&lt;li&gt;Tente interpretar cada um desses princípios como uma abordagem de escrita e implementação, responsável por cada nuance do código.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  S - Single Responsibility Principle (Princípio da Responsabilidade Única)
&lt;/h2&gt;

&lt;p&gt;Esse princípio é responsável por definir que cada classe ou função escrita tenha apenas um objetivo, uma única responsabilidade.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tente pensar assim:&lt;/strong&gt; “Qual o propósito da sua função/classe? O que ela precisa resolver? Com o que ela precisa lidar?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo que viola o princípio da responsabilidade única:&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%2F5aykldc4xgf2dru27et7.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%2F5aykldc4xgf2dru27et7.png" alt="exemplo que viola o princípio da responsabilidade única" width="800" height="835"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui estamos agrupando várias responsabilidades à classe Pagamento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;realizar o pagamento&lt;/li&gt;
&lt;li&gt;gerar relatório&lt;/li&gt;
&lt;li&gt;enviar email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como corrigimos esse problema? Simples! Vamos lembrar que cada classe e/ou função tem que ter uma única responsabilidade. No caso da classe Pagamentos, a responsabilidade dela tem que ser apenas com pagamentos (funções também se aplicam). Se temos que gerar relatório ou enviar email, podemos criar uma classe para cada responsabilidade como essas.&lt;/p&gt;

&lt;p&gt;Veja o exemplo aplicando o princípio da responsabilidade única:&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%2F6ig12ommys6qmtnffl2a.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%2F6ig12ommys6qmtnffl2a.png" alt="exemplo aplicando o princípio da responsabilidade única" width="800" height="1103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Percebe como o código fica mais legível, contextualizado e melhor para dar manutenção?&lt;/p&gt;

&lt;h2&gt;
  
  
  O - Open/Closed Principle
&lt;/h2&gt;

&lt;p&gt;Esse princípio indica que uma função ou classe deve estar sempre aberta para ser estendida, mas fechada para modificação.&lt;br&gt;
Tá, mas o que isso quer dizer?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Pense assim:&lt;/strong&gt; Algo novo precisa ser inserido no seu código e isso tem que ser estendido sem modificar o código base.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Deixa eu te mostrar um exemplo que viola esse princípio:&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%2Fouxjmq5snr25e8pqkfzj.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%2Fouxjmq5snr25e8pqkfzj.png" alt="exemplo que viola o princípio aberto/fechado" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja o código acima. Imagine que agora você precisa implementar pagamentos via Pix e, para obedecer à estrutura, você vai precisar modificar o código, dando brecha para bugs.&lt;/p&gt;

&lt;p&gt;Agora deixa eu te mostrar o mesmo código, só que aplicando o princípio de aberto/fechado:&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%2Fv7euyfwxc3vl7euywnlc.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%2Fv7euyfwxc3vl7euywnlc.png" alt="exemplo aplicando o princípio aberto/fechado" width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Percebe como dessa forma você torna seu código escalável, fácil de ler e estender? Agora você pode acrescentar quantas situações precisar, sem modificar o código principal!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Dica:&lt;/strong&gt; as interfaces são suas amigas; você sempre pode contar com elas!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  L - Liskov Substitution Principle (Princípio da Substituição de Liskov)
&lt;/h2&gt;

&lt;p&gt;O princípio da substituição de Liskov define que uma subclasse sempre poderá ser substituída por sua superclasse, pois a subclasse deve ter o comportamento igual ao da sua superclasse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Calma lá, o que é superclasse?
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Deixa eu te lembrar:&lt;/strong&gt; Pense na superclasse como a classe (classe pai) que é herdada por subclasses (classes filhas). Por exemplo, uma superclasse do tipo Felino será herdada pela subclasse do tipo Gato.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  E como esse princípio seria aplicado na prática?
&lt;/h3&gt;

&lt;p&gt;Primeiro, deixa eu te mostrar um exemplo que viola o Princípio da Substituição de Liskov:&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%2Ftgakbyzv037zx1tu5ykt.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%2Ftgakbyzv037zx1tu5ykt.png" alt="exemplo que viola o princípio da substituição de Liskov" width="800" height="667"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se a gente reparar, tem algo estranho no código, pois, caso a gente tente executar o método voar, nesse contexto vai dar errado, porque, apesar de um pinguim ser uma ave, ele não voa.&lt;/p&gt;

&lt;p&gt;E como a gente resolve isso? Simples! Vamos criar derivações da classe pai para o contexto que precisamos, por exemplo:&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%2F6n3rw931z0akgjqkwdpw.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%2F6n3rw931z0akgjqkwdpw.png" alt="exemplo aplicando o princípio da substituição de Liskov" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Percebe como a gente acaba modelando nosso código de modo mais bem estruturado? Desse modo, a gente evita erros surpresa e simplifica a manutenção do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  I - Interface Segregation Principle (Princípio da Segregação de Interface)
&lt;/h2&gt;

&lt;p&gt;Esse princípio define que uma classe não deve implementar interfaces genéricas ou métodos que não irá utilizar.&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo que viola esse princípio:&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%2Fxmu9skf4okxbfdf2z2bd.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%2Fxmu9skf4okxbfdf2z2bd.png" alt="exemplo que viola o princípio da segregação de interface" width="800" height="870"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se implementarmos a interface Funcionário do jeito que ela está, vamos violar o princípio da Segregação de Interface. Apesar de todos receberem salário, um atendente gerencia projeto? Um gerente realiza atendimento? Estaremos implementando métodos que as classes não irão usar, e isso é ruim para a coesão e flexibilidade do nosso sistema.&lt;/p&gt;

&lt;p&gt;Como podemos solucionar? Simples, vamos segregar! Veja o exemplo abaixo aplicando o princípio da Segregação de Interface:&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%2F4abv3bp1ji1chhllgl0h.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%2F4abv3bp1ji1chhllgl0h.png" alt="exemplo aplicando o princípio da segregação de interface" width="800" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao invés de termos apenas uma interface Funcionário, criamos outras que recebem os métodos de forma separada. Percebe que dessa forma a gente consegue segregar as implementações?&lt;/p&gt;

&lt;p&gt;Se no futuro for necessário adicionar outra função que só o gerente faz (como aprovarOrçamento), podemos adicionar mais interfaces sem alterar as classes que não precisam dessa função.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Dica:&lt;/strong&gt; quando for implementar uma interface, pense: essa classe irá usar tudo dessa interface? Não? Então vamos segregar!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  D - Dependency Inversion Principle (Princípio da Inversão de Dependência)
&lt;/h2&gt;

&lt;p&gt;Esse princípio define que todas as classes devem depender de abstrações (interfaces) e não de outras classes.&lt;/p&gt;

&lt;p&gt;Esse princípio nos orienta que, caso precisemos fazer acoplamentos e integrações, a porta de entrada deve ser através de interfaces, e não de instâncias internas.&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo que viola esse princípio:&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%2Fjq14s1oag1igkp3he9ni.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%2Fjq14s1oag1igkp3he9ni.png" alt="exemplo que viola o princípio da inversão de dependência" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma, sua classe está dependendo de um mau acoplamento, pois se você mudar algo na sua dependência, vai precisar alterar a classe (lembra do princípio de Aberto/Fechado?).&lt;/p&gt;

&lt;p&gt;Por exemplo, se precisarmos inserir outro meio de pagamento, vamos precisar mexer no código, porque o serviço de pagamento está totalmente dependente da classe CartãoDeCrédito.&lt;/p&gt;

&lt;p&gt;A melhor forma de resolver esse problema é tornando sua classe independente, através do uso de interfaces!&lt;/p&gt;

&lt;p&gt;Vamos modificar o código anterior para que obedeça ao princípio da inversão de dependências:&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%2Fwixsuzhp9f554x6z18ny.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%2Fwixsuzhp9f554x6z18ny.png" alt="exemplo aplicando o princípio da inversão de dependência" width="800" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Percebe que dessa forma a gente faz um desacoplamento das dependências e torna sua classe independente? A classe não precisa saber ou instanciar o que vai usar; tudo o que ela precisa saber está na interface!&lt;/p&gt;

&lt;p&gt;Se você precisar implementar outros meios de pagamento, sua interface cuida para que o serviço de pagamentos entenda e você não precise alterar nada nele.&lt;/p&gt;

&lt;p&gt;Desse modo, você torna suas classes mais robustas, extensíveis e flexíveis, ajudando na qualidade e manutenção!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Dica:&lt;/strong&gt; sempre que precisar instanciar ou inserir algo na classe, se pergunte: eu posso fazer isso através de uma interface?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pense em interfaces como um contrato, um contrato que garante que o que você está usando vai receber o que você espera!&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Agora você sabe o que é o S.O.L.I.D., o que significa cada princípio e como ele se aplica no código. Aproveite agora para praticar, aplicando os 5 princípios com essas perguntinhas básicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S: Qual o propósito dessa classe ou função? O que ela precisa resolver?&lt;/li&gt;
&lt;li&gt;O: O que eu preciso acrescentar vai modificar a classe? Será que eu não posso apenas estender?&lt;/li&gt;
&lt;li&gt;L: Essa subclasse que eu estou implementando pode ser substituída pela sua superclasse?&lt;/li&gt;
&lt;li&gt;I: Essa classe vai implementar tudo o que sua interface disponibiliza?&lt;/li&gt;
&lt;li&gt;D: Como posso tornar essa classe o mais independente possível? Posso fazer isso através de uma interface?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por enquanto é isso! Espero ter ajudado!&lt;br&gt;
&lt;em&gt;Gostaria de contribuir com algo? Coloque nos comentários, bora estender!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>programming</category>
      <category>productivity</category>
      <category>solidprinciples</category>
    </item>
  </channel>
</rss>
