Jimple – Container de Injeição de Dependências desenvolvido em ES6

Em aplicações simples, é normal você não precisar lidar com muitas classes, funções ou variáveis. No NodeJS, por exemplo, para fazer um “Hello World” usando ExpressJS você normalmente precisa lidar com apenas 2 variáveis (no máximo do máximo). Mas, quando a aplicação vai ficando maior, é normal você começar a lidar com dezenas de classes, e, se bem projetadas, com suas dependências. Hoje, vou falar um pouco sobre o Jimple, uma biblioteca prática que desenvolvi para resolver esse problema no desenvolvimento com NodeJS.

Mas, por qual razão usar um container de injeção de dependências?

O conceito de injeção de dependências não é exatamente novo. Na verdade, ele vem de outras linguagens no qual a orientação a objetos não é uma opção, mas um requisito, como o Java. Isso acontece pois, quando você programa usando orientação a objetos, normalmente é necessário que uma classe dependa de outra, sem ser outra (ou seja, não é válido estender), logo, é necessário que uma classe tenha acesso a uma instância de outra classe de forma que a comunicação seja possível e as dependências de cada classe sejam correspondidas e a tarefa final possa ser realizada. Em linguagens onde a orientação a objeto é mais frequentemente adotada e oficializada, como Java e PHP, esse problema é resolvido com o uso de um container de injeção de dependências, no qual você registra as classes, registra que argumentos devem ser passados ao construtor (ou aos métodos) delas com base em outros serviços, e, a partir daí, consegue pegar o objeto correspondente à classe desejada, já com todas as suas dependências devidamente configuradas, conforme necessário. Quais as vantagens do uso de um container de injeção de dependências? Bem..

  • O uso de um container facilita o uso de classes que possuem dependências, favorecendo seu uso no projeto e incentivando assim a criação de testes unitários menos mágicos e mais fáceis de criar;
  • Containers normalmente estão preparados para tratar mais do que serviços, mas também configurações. Portanto, o uso de um container favorece o uso de uma configuração centralizada, que pode ser usada em qualquer classe que precisar dela;
  • A configuração de containers torna-se centralizada, portanto, caso você queira mudar a classe que é configurada como dependência para outra classe (ou classes), basta modificar em um único lugar;

No NodeJS, há o consenso de que ferramentas desse tipo não são de fato necessárias. O principal motivo para isso, argumentam, é que a função require(), nativa para você lidar com carregar módulos no NodeJS, já é mais do que suficiente e pode servir como uma forma primitiva de injeção de dependências. O problema desse pensamento (que require() consegue substituir um container de injeção de dependências) é que:

  • Módulos pensados para uso com containers de injeção de dependências são, na prática, mais testáveis, pois aceitam suas dependências como entrada; (isso é possível com require(), mas é razoavelmente mais complicado também)
  • Containers de injeção de dependências tornam suas dependências independentes do sistema de arquivo adotado, pois permitem o uso de identificadores virtuais;
  • Containers de injeção de dependências permitem maior inversão de controle, permitindo que você altere o comportamento do seu código sem mexer no código da aplicação principal, apenas nas configurações do container;
  • Containers de injeção de dependências possibilitam extensão mais fácil, através do uso da inversão de controle e dos identificadores virtuais;

Apresentando o jimple

Como pode ver, há fatores bem interessantes para o uso de containers de injeção de dependências. E, como opção de containers de injeção de dependências para NodeJS, resolvi desenvolver o Jimple.

O Jimple é uma biblioteca que implementa um container de injeção de dependências com API fortemente inspirada no Pimple, seu correspondente para PHP. Há algumas vantagens nessa correspondência:

  • Familiaridade para quem já trabalhou com o Pimple no PHP;
  • Simplicidade de uso; (a API é REALMENTE muito simples)
  • Extensibilidade; (é possível estender as configurações do container facilmente, sem precisar colocar tudo em um único arquivo, por exemplo)

Toda a biblioteca é 100% testada e fácil de usar. Além disso, a documentação é fácil de entender e há exemplos de uso para todos os métodos disponíveis na API. Outro detalhe interessante é que a biblioteca já foi desenvolvida usando ES6, e portanto, é desenvolvida especialmente para uso com versões superiores ou iguais ao NodeJS 4, e é facilmente estendível, bastando para isso um simples e eficiente:

Bom. É isso. Caso você queira testar mais profundamente a biblioteca, mas não queira instalar a biblioteca em seu PC, recomendo acessar esse link para poder usá-la diretamente pelo navegador.

Ah, e, como essa é a minha primeira biblioteca de código aberto, vale deixar claro que todo feedback é bem vindo. =)

Gostou do conteúdo desse post? Apoie o blog contribuindo a partir de R$1/mês através da nossa página no Apoia.se! Isso me ajudará a manter o blog no ar, além de trazer mais coisas legais para vocês! Obrigado desde já! 😀