Couteaux contre annotations : Dagger et Butter Knife VS Android Annotations

Share Button

Introduction

Chez iD.apps, deux équipes cohabitent: les pro-Android Annotations (AA), et les pro-Dagger/Butter Knife. Nous utilisons l’une ou l’autre solution, mais à chaque nouveau projet, on se re-pose la question : AA ou DG/BK. Nous avons essayé ici de trouver une réponse au débat.

Mais à quoi ça sert ?

Butter Knife est une librairie d’injection de ressources basée sur le système d’annotations Java. Le principe est simple, il suffit d’annoter tous les membres et méthodes d’une classe que l’on souhaite injecter : ce sont généralement des vues, implémentation de clic, de sélection, etc. Quand une classe est annotée, Butter Knife va générer un injecteur pour cette classe. Il suffira de faire un appel à ButterKnife.bind(…) pour injecter tous les membres ou listeners souhaités.

Cela permet d’épurer le code, souvent répétitif (et polluant ?!) de vos classes Android. Finis les findViewById dans vos activités, finis les setOnClickListener dans vos fragments : toutes ces lignes de codes tapées encore et encore sont maintenant générées pour vous à la compilation.

Dagger sert lui aussi à faire de l’injection de dépendances, mais est plutôt complémentaire à Butter Knife, en se basant sur des modules et des composants. Là où Butter Knife gère vos vues et listeners, Dagger va s’occuper de vos singletons et autres modules plus orientés “métier”. Le tout ayant pour objectif de simplifier la vie des développeurs.

Android Annotations suit les mêmes objectifs, mais a une manière de fonctionner bien à lui . En effet, toutes les classes annotées par Android Annotations sont sous-classées par génération, et c’est la classe fille générée qui est à instancier à la place de la classe mère qui a été codée.

On peut ainsi faire appel à nos vues et ressources dans la classe d’origine grâce à des annotations comme @AfterViews et @AfterInject, qui sont respectivement appelée après l’injection des vues et après l’injection des dépendances.

AndroidAnnotation promet de gérer pour vous :

  • l’injection de composants Android (activités, fragment, services, receiver),

  • l’injection de vues,

  • l’injection de dépendances,

  • la gestion d’événements,

  • la gestion des préférences,

  • le multi-threading.

Non contente de tout cet attirail, AndroidAnnotations s’essaye également à l’injection de bibliothèques tierces (OrmLite, Otto, Dagger, RoboGuice, Parceler).

 

Que font Dagger et Butter Knife de bien ?

 

Ces deux librairies ont vraiment pour but la simplicité. Avec Butter Knife, vous n’aurez pas de sous-classes générées, de bugs étranges ou d’options de compilation exotiques. Une dépendance Gradle, un ButterKnife.bind sur votre activité/fragment/vue, et hop, vous pouvez commencer à injecter vos vues et ressources. On a vraiment une impression de facilité très agréable. Et comme son périmètre d’action est relativement limité, vous pourrez très rapidement apprendre à vous en servir.

En somme, Butter Knife fait une seule chose, mais le fait bien !

Dagger va lui être très utile à partir du moment où votre projet va gagner en complexité. Fini le code spaghetti, les helpers qui sortent de nul part, et les dépendances injectées à la main de manière totalement anarchique.

Avec Dagger, basé sur la JSR 330, vous allez pouvoir définir des interfaces (annotés @Component) qui donneront des indications sur ce qui est injecté, et des modules (@Module) qui définiront comment votre dépendance va être injecté. Le tout se base ensuite sur la génération de code à la compilation pour finir le travail.

Dagger simplifie également le test unitaire : il est très facile de changer les composants injectés en fonction du besoin. Par exemple, un composant faisant des appels Webservices dans votre application peut être remplacé par une implémentation renvoyant des mocks dans vos tests unitaires (elle est pas belle, la vie ?)

 

Que fait Android Annotations de bien ?

Android Annotations fait beaucoup de choses, peut-être même trop. Il suffit d’aller voir la liste des annotations disponibles pour s’en rendre compte.  Mais c’est aussi pour ça qu’on l’aime !

AA vous offre plus de choix, mais ajoute donc de fait une lourdeur supplémentaire en faisant tant de choses. C’est aussi à vous de déterminer ce qui vous sera utile ou non. Certaines personnes aiment par exemple l’utiliser pour gérer les SharedPreferences, alors que d’autres non. Là où AA prend tout son sens, c’est en premier lieu pour l’injection de vues, et de ressources en général. Là-dessus, il est plus complet que Butter Knife. J’aime particulièrement l’annotation @AnimationRes, très pratique.

AA gère également la création de Bean, qui vous permettront de vous servir des annotations dans n’importe quelle classe. Cela peut au passage vous aider à créer un singleton facilement, pour gérer vos calls réseaux, votre gestion de la base de données… Tout ce qui peut se passer en background en somme.

En parlant d’asynchronisme, voilà un autre point fort d’AA : la gestion des opérations dans un thread à part et le retour dans l’UI thread. Vous souhaitez faire une opération en background ? Utilisez l’annotation @Background. Vous souhaitez revenir dans l’UI thread? Qu’à cela ne tienne, @UIThread est là pour ça !

Pour moi il s’agit d’une véritable killer feature, et l’un des arguments les plus solides face à Dagger et Butter Knife. Bien sûr, il existe plein de librairies pour faire de l’asynchronisme (Bolts par exemple), mais il est vrai que la simplicité d’AA sur ce sujet est sans égal ou presque.

 

En conclusion ?

Du coup, qu’est-ce qui est le mieux ? Quel est le plus avantageux ? La réponse n’est pas simple. En fait, chacun y trouvera son compte. Certains aimeront la toute puissance d’Android Annotations, qui suffira à elle seule à combler bon nombre de besoins, et d’autres préféreront l’atomicité et le contrôle de Butter Knife et Dagger. Certains auront peur de cet effet “boite noire” d’Android Annotations, où tout le cycle d’injection est caché dans le code généré, alors que d’autre reprocheront à Butter Knife son manque de fonctionnalités ou à Dagger une prise en main ardue et une mise en place un peu lourde.

Mais s’il fallait faire un choix, il serait le suivant : Android  Annotations répond parfaitement au besoin d’une petite application, car il permet de faire énormément de choses en très peu de temps ; par contre, dans le cas d’une application complexe, en constante évolution, peut-être faut-il plutôt vous tourner vers Butter Knife et Dagger, afin de limiter la quantité de code généré, et ainsi garder un contrôle plus complet sur votre code.

 

Pour en savoir plus

Dagger 2 : http://google.github.io/dagger/

Butter Knife : http://jakewharton.github.io/butterknife/

Android Annotations : http://androidannotations.org/

Présentation sur Dagger : http://fr.slideshare.net/pyricau/sharper-better-faster-dagger-droidcon-sf

 

Share Button

Une réflexion au sujet de « Couteaux contre annotations : Dagger et Butter Knife VS Android Annotations »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *