Conteúdo
Princípios SOLID com Angular
SOLID é um conceito muito interessante em qualidade de código e é fácil aprender seus conceitos com exemplos de desenvolvimento back-end. Mas quem é dev front-end também tem muito a ganhar ao conhecer o SOLID.
No artigo de hoje eu trago um resumo sobre o que é SOLID com Angular. Estes princípios foram definidos nos anos 2000 por Robert C. Martin e Michael Feathers, no intuito de promover técnicas e conceitos que facilitassem o desenvolvimento e manutenção de sistemas complexos de computação.
Robert C. Martin, mais conhecido como Uncle Bob é uma das referências em engenharia e arquitetura de software no mundo, sendo um dos assinantes do Manifesto Ágil, além de criador de conceitos consagrados na comunidade como Clean Code e Clean Architecture.
Não distante, Michael Feathers, também é reconhecido como um dos grandes nomes do mundo do desenvolvimento de software, foi, de fato, o criador do acrônimo S.O.L.I.D.
Se você já ouviu falar de Clean Code e Clean Architecture saiba que estes princípios formam a pedra angular de todos estes conceitos.
Assim, se o seu objetivo é tornar-se um bom engenheiro de software, é de suma importância o entendimento destes princípios antes de aprofundar em qualquer modelo arquitetural mais rebuscado.
Os cinco princípios do solid
[S]ingle Responsibility Principle: Princípio da responsabilidade única.
[O]pen/Closed Principle: Princípio de aberto e fechado.
[L]iskov Substituition Principle: Princípio de substituição de Liskov.
[I]nterface Segregation Principle: Princípio da segregação de interface.
[D]ependence Inversion Principle: Princípio de inversão de dependência.
Quer saber mais sobre o Angular? Acompanhe o Blog e o meu curso => Aqui
[S] – Single Responsibility Principle: Princípio da responsabilidade única
Este princípio nos diz que “uma classe deve ter um, e somente um, motivo para mudar”, porém pode ser aplicado a funções, componentes, entidades, etc.
Esse princípio declara que uma classe deve ser especializada em um único assunto e possuir apenas uma responsabilidade dentro do software, ou seja, a classe deve ter uma única tarefa ou ação para executar.
Formas de utilizar o conceito: errado
Neste caso temos alguns problemas, pois ficou tudo dentro de um componente e o S é chamado de Single Responsibility Principle.
Devido a isso, se um outro componente quiser utilizar essas funções, teríamos que criar tudo novamente? E a resposta é não, o correto é separarmos em um serviço e assim usamos em uma forma desacoplada e reutilizada para outros componentes etc.
Formas de utilizar o conceito: correto
[O] – Open/Closed Principle: Princípio de aberto e fechado
Segundo Uncle Bob, “as entidades de software (classes, módulos, funções, etc.) devem ser abertas para ampliação, mas fechadas para modificação”.
Passando para a definição desta regra: classe/objeto deve ser aberto para expansão, mas fechado para modificação.
O que isto significa?
Você precisa escrever o código de tal forma que novas funcionalidades possam ser introduzidas sem modificar o código existente.
Inicialmente, referia-se à realização do polimorfismo (alteração do comportamento dos objetos) por meio de herança, ou seja, criar uma classe base e herdar dela.
“Você deve ser capaz de estender o comportamento de uma classe sem modificá-la.”
Formas de utilizar o conceito: errado
Formas de utilizar o conceito: correto
Veja que fizemos o extends da classe e usamos dentro do nosso contexto atual.
Cartão gold e silver ficaram dentro de suas classes utilizando o getJurosMensal da classe extendida.
Então abrimos para ampliação devido o extends e fechamos para modificação. A modificação veio dentro da sua própria responsabilidade.
[L] – Liskov Substituition Principle: Princípio de substituição de Liskov
O princípio de substituição de Liskov está ligado diretamente ao princípio anterior, o OCP (Open Closed Principle). Criado por Barbara Liskov em 1987, durante a conferência “Data Abstraction”
No qual defende a ideia que uma classe base pode ser substituída em qualquer momento por suas classes herdadas sem ser modificada.
Vimos que aqui ele gera um modelo de como devemos implementar a em nossa nova classe.
Repare que temos carneDoLanche(), nome e no super o valor “picanha” que irá compor o valor do nome.
[I] – Interface Segregation Principle: Princípio da segregação de interface
Neste caso utilizaremos interfaces, porém é bem parecido com o exemplo anterior.
Ele mesmo já diz implements ( implementar ), ele mostra que precisamos para implementar esta classe.
Veja que usamos o implements ao invés do extends e não precisamos utilizar o super(“Picanha”).
A própria classe entende as necessidades que devemos utilizar nela. Legal né?
Implementsé usado quando uma classe implementa uma interface,extendsé quando uma classe estende uma outra classe (concreta ou abstrata) ou quando uma interface estende uma outra interface.Ou seja, a keyword
extendsé usada para quando um tipo (classe ou interface) é derivado do seu mesmo tipo, e oimplementsé sempre que deseja fazer uma implementação, no caso uma classe implementa uma interface.
[D] – Dependence Inversion Principle: Princípio de inversão de dependência
Este princípio diz que toda classe deve depender de abstrações e não de implementações. Segundo Uncle Bob.
- Módulos de alto nível não devem depender de módulos de baixo nível.
- Ambos devem depender da abstração.
- As abstrações não devem depender de detalhes.
- Detalhes devem depender de abstrações.
Sendo bem direto, procure sempre depender de interfaces e não de classes concretas.
Formas de utilizar o conceito: errado
Veja que tipamos o comprarLanche() com a classe Lanche e isso é errado para o Dependence Inversion Principle. O correto é tiparmos com uma Interface.
Formas de utilizar o conceito: correto
Conclusão
O SOLID, como representam um desenvolvimento orientado a objetos em sua essência, se tornam uma porta de entrada para se alcançar essa escrita de código saudável e coerente.
É um padrão de projeto que pode se mostrar assustador no início, e nem sempre conseguimos aplicar com maestria, mas a prática e constância, aos poucos trará a experiência levamos ao amadurecimento do nosso código.


