Guide de modularisation des applications Android

Un projet comportant plusieurs modules Gradle est appelé "projet multimodule". Ce guide comprend les bonnes pratiques et les modèles recommandés pour développer des applications multimodules Android.

Le problème du codebase croissant

Dans un codebase en croissance constante, l'évolutivité, la lisibilité et la qualité globale du code diminuent souvent au fil du temps. Ce phénomène s'explique par l'augmentation de la taille du codebase sans que ses responsables de maintenance ne prennent des mesures actives pour appliquer une structure facile à entretenir. La modularisation est un moyen de structurer votre codebase de manière à améliorer son entretien et à éviter ces problèmes.

Qu'est-ce que la modularisation ?

La modularisation est une pratique qui consiste à organiser un codebase en parties faiblement couplées et autonomes. Chaque partie est un module. Chaque module est indépendant et remplit un objectif clair. En divisant un problème en sous-problèmes plus petits et plus faciles à résoudre, vous réduisez la complexité de la conception et de la maintenance d'un système volumineux.

Figure 1. Graphique de dépendance d'un exemple de codebase multimodule

Avantages de la modularisation

Les avantages de la modularisation sont nombreux, bien qu'ils soient chacun axés sur l'amélioration de l'entretien et de la qualité globale d'un codebase. Le tableau ci-dessous résume les principaux avantages.

Avantage Résumé
Réutilisation La modularisation permet de partager du code et de créer plusieurs applications à partir de la même base. Les modules sont des composants fondamentaux. Les applications doivent être une somme de leurs fonctionnalités, sous forme de modules distincts. Les fonctionnalités fournies par un module donné peuvent être activées ou non dans une application spécifique. Par exemple, :feature:news peut faire partie du type de version complet et de l'application Wear, mais ne peut pas faire partie du type de version de démonstration.
Contrôle strict de la visibilité Les modules vous permettent de contrôler facilement ce que vous exposez à d'autres parties de votre codebase. Tous les éléments, à l'exception de votre interface publique, peuvent être marqués comme internal ou private afin d'éviter qu'ils ne soient utilisés en dehors du module.
Diffusion personnalisable Play Feature Delivery utilise les fonctionnalités avancées des app bundles, ce qui vous permet de proposer certaines fonctionnalités de votre application de manière conditionnelle ou à la demande.

Les avantages ci-dessus ne sont atteignables qu'avec un codebase modularisé. Les avantages suivants peuvent être obtenus avec d'autres techniques, mais la modularisation peut vous aider à les appliquer davantage encore.

Avantage Résumé
Évolutivité Dans un codebase à couplage fort, une seule modification peut déclencher une série de modifications dans des parties du code qui ne semblent pas liées. Un projet correctement modularisé respectera le principe de séparation des préoccupations et limitera donc le couplage. Les contributeurs bénéficieront ainsi d'une plus grande autonomie.
Propriété En plus d'activer l'autonomie, les modules peuvent également être utilisés pour renforcer la responsabilité. Un module peut avoir un propriétaire dédié chargé d'entretenir le code, de corriger les bugs, d'ajouter des tests et d'examiner les modifications.
Encapsulation L'encapsulation signifie que chaque partie de votre code ne doit contenir que le minimum de connaissances possible sur les autres éléments. Le code isolé est plus facile à lire et à comprendre.
Testabilité La testabilité définit la facilité de test de votre code. Un code testable est un code qui permet de tester facilement des composants de façon isolée.
Durée de la compilation Certaines fonctionnalités de Gradle, comme la compilation incrémentielle, le cache de compilation ou la compilation parallèle, peuvent exploiter la modularité pour améliorer les performances de compilation.

Écueils les plus courants

La précision de votre codebase est la mesure dans laquelle elle se compose de modules. Un codebase plus précis comporte davantage de modules plus petits. Lorsque vous concevez un codebase modularisé, vous devez choisir un niveau de précision. Pour ce faire, tenez compte de la taille de votre codebase et de sa complexité relative. Si vous privilégiez la précision, l'aperçu général peut être surchargé ; si vous la négligez, vous réduisez les avantages de la modularisation.

Quelques écueils courants :

  • Précision trop fine : chaque module entraîne une surcharge de l'aperçu général, ce qui se traduit par une complexité de compilation accrue et un code récurrent. Une configuration de compilation complexe complique la cohérence des configurations entre les modules. Une quantité excessive de code récurrent entraîne un codebase fastidieux et difficile à entretenir. Si l'aperçu général nuit à l'amélioration de l'évolutivité, vous devriez envisager de regrouper certains modules.
  • Précision trop faible : à l'inverse, si vos modules deviennent trop volumineux, vous risquez de vous retrouver avec un bloc énorme et de ne pas profiter des avantages de la modularité. Par exemple, dans un petit projet, vous pouvez placer la couche de données dans un seul module. Toutefois, au fur et à mesure de sa croissance, il peut être nécessaire de scinder des dépôts et des sources de données en modules autonomes.
  • Précision trop complexe : il n'est pas toujours logique de modulariser votre projet. Un facteur déterminant est la taille du codebase. Si votre projet ne devrait pas dépasser un certain seuil, vous ne bénéficierez pas de l'évolutivité et des gains de durée de compilation.

La modularisation est-elle la solution idéale pour moi ?

Si vous voulez bénéficier de la réutilisation, d'un contrôle strict de la visibilité ou de l'utilisation de Play Feature Delivery, une modularisation est nécessaire. Si ce n'est pas le cas, mais que vous souhaitez tout de même bénéficier d'une évolutivité, d'une propriété, d'un encapsulation ou d'une durée de compilation améliorées, envisagez une modularisation.

Exemples