6
respostas

Dagger realmente vale a pena?

Olá, no curso é abordado o uso do Dagger 2, framework de DI para android.

Eu venho do Java EE e Spring e já tive um bom contato com outros frameworks de DI e IoC.

A questão é que eu sinceramente achei o Dagger cheio de boilerplates, eu entendo que é porque ele não usa reflection e é mais performático, mas...

No exemplo do curso temos apenas uma acitivity, então a complexidade é muito pequena, no entanto eu tenho um projeto com mais de 50 activities e fragments e quando você leva para esse cenário aplicar o Dagger parece que traz mais verbosidade.

Exemplo de situações:

  1. Para cada activity ou fragment eu preciso criar a interface component ou então criar uma e declarar o inject para todas os pontos de injeção, em alguns momentos vários, em alguns casos criar vários modules também. No fim do dia acabo tendo 1 module + 1 component para cada activity.

  2. Além dos itens acima, em cada lugar que quero injetar (activities por exemplo), eu preciso fazer a amarração com a interface component no onCreate, tendo que recuperar o component via application, o que no meu ponto de vista acaba criando mais acoplamento. Para piorar preciso repetir esse processo isso em todas essas activities.

Para tentar melhorar esse cenário eu tentei fazer classes genéricas e declarar os modules e componentes para tentar um reaproveitamento, mas sem sucesso, justamente pelo comportamento de injeção em tempo de compilação do Dagger.

Por fim, acabo tendo a sensação de que é melhor instanciar as classes da forma comum, pois o ganho de desacoplamento e reuso é muito pequeno em relação ao tanto de configurações e boilerplates necessários.

-

Gostaria de saber a experiência de outros devs em relação a esse problema e se por acaso alguém tem dicas ou exemplos de arquiteturas bem elaboradas com esse framework (que vá além do helloworld).

6 respostas

Fala ai Bodão, tranquilo ?

Cara na versão mais recente ele já tratou de melhorar vários desses pontos, por exemplo, não é mais necessário chamar o método de injeção, ele consegue fazer isso sozinho, só é necessário herdar da activity/fragment do dagger, ai ele consegue solucionar isso.

A ideia é ter vários modulos, para deixar mais semantico possível, mas pode ter apenas um component.

Mateus Brandino, obrigado pela resposta.

O problema que você precisa continuar indicando na interface component qual as classes que vão receber a injeção, e isso não escalável, já que toda vez que você criar uma nova classe você precisa ir lá e declarar ela...

Outro ponto, o client precisa conhecer sobre o mecanismo de injeção, quando você herda de DaggerActivity você viola o básico da DI que é o acoplamento.

Sinceramente quero muito usar o Dagger, pois sei que que DI e IoC favorecem muito o código limpo, mas o Dagger tá muito aquém perto de outros frameworks como EJB, Spring ou CDI.

:(

O problema é limitação de hardware que o android tem, se pudessemos usar reflection sem maiores problemas, com certeza ele seria usa, tanto que a primeira versão do dagger era feita usando isso, ainda que de forma otimizada, os aplicativos sentiam muito a falta de performance.

E tem outro detalhe, no android as libs precisam gerar código, então elas só nos dão a facilidade de não ser necessário escrever um monte de coisa, basicamente.

Nos projetos que trabalhei consegui usar sem muitos problemas e facilitou bastante o desenvolvimento.

Ok, entendo a questão do reflection.

Você tem algum exemplo legal de algum projeto que não seja helloworld?

dá uma olhada nesse - https://github.com/MathBrandino/CasaDoCodigo59/tree/master/app/src/main/java/com/example/matheus/casadocodigocomlibs

não usei a versão mais recente, mas já te trás uma serie de contextos.

Matheus, dei uma olhada e é bem parecido com o que estou fazendo por aqui também... acho que não tem como fugir desse boilerplate mesmo.

Estou dando uma olhada nesse cara https://google.github.io/dagger/android que é o específico para android do Dagger, mas no fim do dia acaba caindo nos mesmos problemas da client conhecer o mecanismo de injeção.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software