Neste Open-coding nós abordamos sobre o Princípio de Inversão de Dependência (DIP - Dependency Inversion Principle), o último princípio dentre os cinco princípios SOLID
.
Primeiro nós falamos sobre as diferenças entre interfaces
e classes abstratas
, criamos uns exemplos na pasta concepts
.
Segundo, nós exercitamos o DIP criando cinco exemplos dentro da pasta calculator-dip
.
Node.js Primeiro, para rodar o projeto na sua máquina, vamos precisar utilizar o Node.js. Para instalar o node, basta ir neste site aqui. Caso você não saiba como instalar o Node.js, acesse esse conteúdo e instale de acordo com seu sistema operational (Windows, Linux, MacOS).
Dependências do projeto
Para instalar as dependências do projeto, acesse a pasta do projeto no terminal. Depois acesse qual dos subprojetos você quer instalar as dependências, entrando na pasta concepts
ou na pasta calculator-dip
. Dentro de uma dessas pastas, rode o comando:
npm install
Existem dois exemplos dentro da pasta concepts/
, o abstract-class.ts
e o interfaces.ts
. Para rodar cada um dos exemplos, entre na pasta concepts/
e rode os comandos:
npm run abstract-class
npm run interfaces
Existem cinco exemplos dentro da pasta calculator-dip
. Para rodar cada um dos exemplos, entre na pasta calculator-dip
pelo terminal e rode os comandos:
Exemplo 1
Tratamos sobre o problema de acoplamento forte que existe entre as classes.
npm run example-1
Exemplo 2
Evidenciamos o problema vendo na prática como a criação de outras implementações das classes podem dificultar na refatoração quando estamos num contexto de forte acoplamento.
npm run example-2
Exemplo 3
Aplicamos o Dependency Injection (DI) para retirar a responsabilidade da classe Calculator de instanciar objetos das outras classes.
npm run example-3
Exemplo 4
Aplicamos o Dependency Inversion Principle (DIP) para inverter a dependência que o Calculator tem das outras classes, agora passando a depender de interfaces.
npm run example-4
Exemplo 5
Finalizamos aplicando o Inversion of Control (IoC) para tirar a responsabilidade da parte principal da aplicação de instanciar as dependências e injetar manualmente na criação do Calculator. Para isso, utilizamos também um padrão de projeto chamado Factory, onde centralizamos a criação do Calculator e abstraímos a injeção manual das dependências.
npm run example-5
Uma boa extensão desse projeto é utilizar bibliotecas como o TSyringe para fazer injeções de dependências de forma mais organizada e otimizada utilizando outros padrões como o Singleton
. Ou utilizar o framework Nest.js para realizar as injeções de dependências de forma automática.