Transcript
Page 1: Dagger 2 Injeção de dependências no mundo Android

INJEÇÃO DE DEPENDÊNCIAS NO MUNDO ANDROID

CLÊRTON LEAL

Page 2: Dagger 2 Injeção de dependências no mundo Android

QUEM SOU EU

▸ Clêrton Leal

▸ Nascido e criado na cidade de Fortaleza

▸ Trabalhando como consultor para a Avenue Code de Belo Horizonte

▸ Morando em BH a pouco mais de 5 meses =)

Page 3: Dagger 2 Injeção de dependências no mundo Android

DAGGER 2

Page 4: Dagger 2 Injeção de dependências no mundo Android

TÓPICOS DE HOJE

▸ Histórico sobre Injeção de Dependências no mundo Android e porque devemos usar o Dagger 2 para isso.

▸ Injeção de Dependências como um padrão de projetos e quais suas vantagens.

▸ Como aplicar Dagger 2 em seus projetos Android.

Page 5: Dagger 2 Injeção de dependências no mundo Android

SENTA QUE LÁ VEM HISTÓRIA

Page 6: Dagger 2 Injeção de dependências no mundo Android

INJEÇÃO DE DEPENDÊNCIAS NO ANDROID

▸ RoboGuice

▸ Dagger

▸ Dagger 2

Page 7: Dagger 2 Injeção de dependências no mundo Android

ROBOGUICE

Page 8: Dagger 2 Injeção de dependências no mundo Android

É UMA EXTENSÃO DO PROJETO GUICE, CRIADO PELO GOOGLE EM 2006 POR BOB LEE E JESSE WILSON.

Page 9: Dagger 2 Injeção de dependências no mundo Android

LANÇADO EM 2010 E FOI UMA ENORME EVOLUÇÃO NA CRIAÇÃO DE APPS ANDROID.

Page 10: Dagger 2 Injeção de dependências no mundo Android

PONTOS POSITIVOS

▸ Módulos facilmente testáveis

▸ Códigos de fácil manutenção

▸ Nada de XMLs de configuração

▸ Muitas facilidades para o desenvolvimento Android

Page 11: Dagger 2 Injeção de dependências no mundo Android

O GUICE É 100% BASEADO EM REFLECTION. =/

Page 12: Dagger 2 Injeção de dependências no mundo Android

PONTOS NEGATIVOS

▸ Problemas de injeção aconteciam apenas em Runtime.

▸ Logs de erros extremamente ruins.

▸ Debug difícil e com uma stack confusa.

▸ Muito lento para inicialização e injeção em geral.

Page 13: Dagger 2 Injeção de dependências no mundo Android

TODOS OS PROBLEMAS DO GUICE OCORREM EM TEMPO DE EXECUÇÃO

Page 14: Dagger 2 Injeção de dependências no mundo Android

UMA FORMA MAIS INTELIGENTE SERIA TRATAR AS INJEÇÃO EM TEMPO DE COMPILAÇÃO

Page 15: Dagger 2 Injeção de dependências no mundo Android

DAGGER

Page 16: Dagger 2 Injeção de dependências no mundo Android

EM 2011 A SQUARE CONTRATA BOB LEE E JESSE WILSON.

Page 17: Dagger 2 Injeção de dependências no mundo Android

EM 2012 É LANÇADO O DAGGER.

Page 18: Dagger 2 Injeção de dependências no mundo Android

PONTOS POSITIVOS

▸ O Dagger tem como lema: “Falhe o mais cedo possível”.

▸ Análise de todas as dependências e injeções em tempo de compilação.

▸ Eliminado uso de Reflection na injeção de métodos, campos e processamento de annotations.

▸ Escalabilidade. Pode ser usado sem problemas em grandes projetos.

▸ Detecção de dependências cíclicas em tempo de compilação.

Page 19: Dagger 2 Injeção de dependências no mundo Android

AINDA USA REFLECTION PARA CARREGAR AS CLASSES GERADAS EM TEMPO DE COMPILAÇÃO

Page 20: Dagger 2 Injeção de dependências no mundo Android

DAGGER 2

Page 21: Dagger 2 Injeção de dependências no mundo Android

EM 2013 A GOOGLE PUBLICOU UMA ESPECIFICAÇÃO DE UMA VERSÃO MELHORADA DO DAGGER.

Page 22: Dagger 2 Injeção de dependências no mundo Android

A COMUNIDADE DO DAGGER SE DIVIDIU ENTRE SQUARE E GOOGLE. ASSIM O PROJETO FOI FORKED.

Page 23: Dagger 2 Injeção de dependências no mundo Android

EM 2014 O DAGGER 2 FOI LANÇADO COMO UM PROJETO DO GOOGLE PARA INJEÇÃO DE DEPENDÊNCIA DE ALTA PERFORMANCE.

Page 24: Dagger 2 Injeção de dependências no mundo Android

DAGGER 2

▸ Proposto, desenvolvido e mantido pelo Google.

▸ Eliminou 100% do uso de reflection no projeto.

▸ Transferiu toda a analise de código restante de Runtime para compilation time.

▸ Fácil de debugar e com uma stack de execução limpa.

▸ Stack trace limpo e de fácil análise.

Page 25: Dagger 2 Injeção de dependências no mundo Android

NEGATIVOS

DAGGER 2

▸ Menos flexível que outros DI frameworks.

Page 26: Dagger 2 Injeção de dependências no mundo Android

INJEÇÃO DE DEPENDÊNCIAS

Page 27: Dagger 2 Injeção de dependências no mundo Android

PRIMEIRAMENTE TEMOS QUE ENTENDER QUE INJEÇÃO DE É UMA PADRÃO DE PROJETOS E NÃO É SOBRE FRAMEWORKS DA MODA.

Page 28: Dagger 2 Injeção de dependências no mundo Android

TODO PROJETO TEM DEPENDÊNCIAS.

Page 29: Dagger 2 Injeção de dependências no mundo Android

public class TwitterApi { private final OkClient okClient; private final TwitterAuth twitterAuth; public TwitterApi() { this.okClient = new OkClient(); this.twitterAuth = new TwitterAuth(okClient); } public void postTweet(String tweet) { /*Posting tweet*/ } }

Page 30: Dagger 2 Injeção de dependências no mundo Android

public void doTweet() { TwitterApi twitterApi = new TwitterApi(); twitterApi.postTweet("Dagger é amor. <3"); }

Page 31: Dagger 2 Injeção de dependências no mundo Android

GRAFICO DE DEPENDÊNCIAS

Twitter API

Twitter Auth

OkClient

Page 32: Dagger 2 Injeção de dependências no mundo Android

public class TwitterApi { private final OkClient okClient; private final TwitterAuth twitterAuth; public TwitterApi() { this.okClient = new OkClient(); this.twitterAuth = new TwitterAuth(okClient); } public void postTweet(String tweet) { /*Posting tweet*/ } }

Page 33: Dagger 2 Injeção de dependências no mundo Android

public class TwitterApi { private final OkClient okClient; private final TwitterAuth twitterAuth; public TwitterApi(OkClient okClient, TwitterAuth twitterAuth) { this.okClient = okClient; this.twitterAuth = twitterAuth; } public void postTweet(String tweet) { /*Posting tweet*/ } }

Page 34: Dagger 2 Injeção de dependências no mundo Android

public void doTweet() { TwitterApi twitterApi = new TwitterApi(); twitterApi.postTweet("Dagger é amor. <3"); }

Page 35: Dagger 2 Injeção de dependências no mundo Android

public void doTweet() { OkClient okClient = new OkClient(); TwitterAuth twitterAuth = new TwitterAuth(okClient); TwitterApi twitterApi = new TwitterApi(okClient, twitterAuth); twitterApi.postTweet("Dagger é amor. <3"); }

Page 36: Dagger 2 Injeção de dependências no mundo Android

TWITTER API HTTP CLIENT

TWITTER AUTH

Page 37: Dagger 2 Injeção de dependências no mundo Android

COMPLEXIDADE É UM PROBLEMA.

Page 38: Dagger 2 Injeção de dependências no mundo Android

MAS O QUE EU GANHO COM ESSA COMPLEXIDADE A MAIS NO MEU CÓDIGO?

Page 39: Dagger 2 Injeção de dependências no mundo Android

TESTABILIDADE!!!

Page 40: Dagger 2 Injeção de dependências no mundo Android

public class TwitterApi { private final OkClient okClient; private final TwitterAuth twitterAuth; public TwitterApi() { this.okClient = new OkClient(); this.twitterAuth = new TwitterAuth(okClient); } public void postTweet(String tweet) { /*Posting tweet*/ } }

Page 41: Dagger 2 Injeção de dependências no mundo Android

public class TwitterApi { private final OkClient okClient; private final TwitterAuth twitterAuth; public TwitterApi(OkClient okClient, TwitterAuth twitterAuth) { this.okClient = okClient; this.twitterAuth = twitterAuth; } public void postTweet(String tweet) { /*Posting tweet*/ } }

Page 42: Dagger 2 Injeção de dependências no mundo Android

DAGGER NÃO TRÁS INJEÇÃO DE DEPENDÊNCIAS PARA O SEU PROJETO.

Page 43: Dagger 2 Injeção de dependências no mundo Android

DAGGER TRÁS A SIMPLIFICAÇÃO DO USO DE INJEÇÃO DE DEPENDÊNCIAS.

Page 44: Dagger 2 Injeção de dependências no mundo Android

public void doTweet() { OkClient okClient = new OkClient(); TwitterAuth twitterAuth = new TwitterAuth(okClient); TwitterApi twitterApi = new TwitterApi(okClient, twitterAuth); twitterApi.postTweet("Dagger é amor. <3"); }

Page 45: Dagger 2 Injeção de dependências no mundo Android

@InjectTwitterApi twitterApi; public void doTweet() { twitterApi.postTweet("Dagger é amor. <3"); }

Page 46: Dagger 2 Injeção de dependências no mundo Android

TWITTER API HTTP CLIENT

TWITTER AUTH

MAIN APP

Page 47: Dagger 2 Injeção de dependências no mundo Android

DAGGER 2 API

Page 48: Dagger 2 Injeção de dependências no mundo Android

API

▸ @Module: Mecanismo para prover dependências a serem injetadas.

▸ @Inject: Mecanismo que requer a injeção de uma dependência.

▸ @Component: Elo entre os modules e os injetáveis.

Page 49: Dagger 2 Injeção de dependências no mundo Android

VAMOS AO CÓDIGO

Page 50: Dagger 2 Injeção de dependências no mundo Android

OBRIGADO

Page 51: Dagger 2 Injeção de dependências no mundo Android

PERGUNTAS?

[email protected] ‣ @CLERTONLEAL ‣ HTTPS://GITHUB.COM/CLERTONLEAL/DAGGER-TALK


Recommended