Princípios do SOLID com TypeScript

Thiago S. Adriano
3 min readOct 9, 2020

--

Veja nesse artigo um exemplo prático do principio OCP — Princípio Aberto-Fechado

SOLID com TypeScript: OCP

Introdução

Dando continuidade a minha série de artigos sobre os princípios do SOLID com TypeScript e aproveitando a liberação do episódio 2 do nosso podcast: DevShow #22 SOLID OCP. Hoje irei abordar o segundo principio do SOLID, OCP.

OCP — Princípio Aberto-Fechado

O OCP diz que as entidades de software (classes, módulos, funções… ) devem ser abertas para ampliação, mas fechadas para modificação.

De forma mais detalhada, diz que podemos estender o comportamento de uma classe por meio de herança, interface e composição, mas não podemos permitir a abertura dessa classe para fazer modificações.

Em uma pesquisa rápida pela internet eu achei uma imagem que descreve bem esse principio:

Violação: Note que na imagem com fundo rosa nós temos um robo que começa com uma faca falando que pode cortar e depois de uma nova demanda esse mesmo robo troca a faca por um rolo de pintar.

Essa imagem lembra algo? rs

É muito comum no desenvolvimento de software situações como essa onde temos uma classe que tem uma determinada funcionalidade e ao decorrer da evolução do sistema ela tenha que sofrer algumas mudanças. É nesse momento que devemos lembrar desse principio (OCP).

Na segunda imagem nós temos um robo que começa com uma faca falando que pode cortar e depois de uma nova demanda aparece com um rolo de pintar na outra mão.

Em uma breve analise, note que ele não alterou (perdeu) como na primeira imagem a funcionalidade de cortar, com a evolução ele acabou ganhando uma nova funcionalidade, a de pintar.

Esse seria o comportamento perfeito para que consigamos atender a nova demanda e ainda garantir que o que esta no publicado não seja alterado.

Bom, mas como ficaria isso no código?

Para que esse principio fique mais claro, vamos criar um exemplo prático utilizando o TypeScript.

Exemplo prático

Vamos começar com um código simples:

Nessa classe nós temos uma classe com um método chamado Export, que valida o tipo de documento e dependendo do tipo que ele for, ele exporta os dados que estiverem em data para um dos formatos: pdf ou excel.

Até aqui tranquilo, nós temos um código simples que esta validando o tipo de arquivo que esta em um enum.

Agora imagine o seguinte cenário, chegou uma nova demanda para exportar os dados para Word, como você faria essa alteração?

Pensando rapidamente nós colocaríamos o novo tipo no enum e adicionaríamos um if no método exportar correto?

Algo assim:

Demanda done, mas dai vem aquela pergunta, essa é a melhor forma de resolver a nossa demanda?

A resposta é não, resolvemos a demanda, mas em uma breve analise estamos dando mais uma responsabilidade para nossa classe Arquivos, além de estar violando o primeiro principio do SOLID o SRP, o correto pensando no OCP seria estender essa classe, não atribuir mais uma funcionalidade nela, com a possibilidade de quebrar algo existente.

Agora pensando no OCP, como resolver essa demanda ?

Na realidade é bem simples, veja a seguir como ficaria a nossa classe:

Com essa implementação nós estamos atendendo a nova demanda, garantindo o SRP (Removendo a responsabilidade de validar o tipo da classe) e o OCP, garantindo que a classe Arquivos esteja fechada para mudança, mas aberta para extensão.

Bem simples e mais organizado né?

Bom, com isso nós finalizamos mais esse artigo, espero que tenham gostado e até um próximo artigo pessoal.

--

--