[S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [L] - Liskov Substitution Principle - LSP
Tags: java, solidprinciples
Published: 2024-05-25 00:53:18

Continuando a série sobre SOLID, caso não tenha lido o artigo anterior:

{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-o-openclosed-principle-ocp-3bal %}

Neste artigo estarei falando sobre o **terceiro princípio** que é:

**[L] -Liskov Substitution Principle** 
**Princípio da Substituição de Liskov - LSP**
“Se para cada objeto o1 do tipo S há um objeto o2 do tipo T de forma que, para todos os programas P definidos em termos de T, o comportamento de P é inalterado quando o1 é substituído por o2 então S é um subtipo de T.”

O Princípio de Substituição de Liskov leva esse nome por ter sido criado por Barbara Liskov, em 1988. 

Tal definição foi resumida e popularizada por Robert C. Martin (Uncle Bob), em seu livro “Agile Principles Patterns and Practices”, como:

“Classes derivadas devem poder ser substitutas de suas classes base”

Ou seja, toda classe derivada deve poder ser usada como se fosse a classe base.

Para mim, foi um dos conceitos mais difíceis de entender. Portanto, não se preocupe se não conseguir compreender de imediato. Tenho esperança de que, com os exemplos de código, você sairá deste artigo entendendo esse princípio.

Vamos criar um sistema de notificações onde inicialmente temos um EmailNotification e, posteriormente, adicionamos um SMSNotification. 

Veremos como implementar isso sem e com o LSP.

_Sem LSP_
**Classe Notification e EmailNotification sem LSP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ov7lako4tws23e9y4yuw.png)

**Adicionando SMSNotification sem LSP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kga5uqw6js3yh87wuysw.png)

Neste exemplo, a classe SMSNotification altera o comportamento esperado ao adicionar uma verificação de número de telefone, o que pode causar problemas quando substituímos a classe base Notification pela classe derivada SMSNotification.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fdko5pwbk8k5wozo1jn6.png)

_Com LSP_
Para seguir o LSP, devemos projetar nossas classes de forma que respeitem as expectativas da superclasse e evitem adicionar comportamentos que possam quebrar a substituição.

**Interface Notification**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msfd7ttgbdh65q9xk55o.png)

**Classe EmailNotification**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qjppkl4l1gzsoy25ktdt.png)

**Classe SMSNotification**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hme0g3hdkl6c9nsd831p.png)

**Uso das Classes**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pey46xp51oe9bdr3apme.png)

Explicação:

- Interface Notification: Define o contrato para uma notificação. Todas as notificações devem implementar os métodos setRecipient, setMessage e send.
- Classe EmailNotification: Implementa a interface Notification e define a lógica específica para enviar um email.
- Classe SMSNotification: Implementa a interface Notification e define a lógica específica para enviar um SMS. A verificação do número de telefone é feita no método setRecipient, garantindo que qualquer configuração inválida seja tratada antes de tentar enviar a notificação.
- Uso das Classes: Demonstramos como criar e usar instâncias de EmailNotification e SMSNotification de forma intercambiável através da interface Notification, respeitando o LSP.

**Ao seguir o Princípio da Substituição de Liskov, garantimos que nossas subclasses podem ser usadas em qualquer contexto onde a superclasse é esperada, sem alterar o comportamento correto do programa. Isso torna o código mais robusto e facilita a manutenção e extensão do sistema.**

_PS: Para ir direto para o próximo princípio:_
{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-i-interface-segregation-principle-isp-3ho3 %}