Un progetto con più moduli Gradle è noto come progetto multimodulo. Questa guida include best practice e pattern consigliati per lo sviluppo di app Android multimodulo.
Il problema del codebase in crescita
In un codebase in continua crescita, la scalabilità, la leggibilità e la qualità complessiva del codice spesso diminuiscono nel tempo. Ciò è dovuto all'aumento delle dimensioni del codebase senza che i manutentori adottino misure attive per imporre una struttura facilmente gestibile. La modularizzazione è un modo per strutturare la tua base di codice in modo da migliorare la manutenibilità e contribuire a evitare questi problemi.
Che cos'è la modularizzazione?
La modularizzazione è una pratica di organizzazione di un codebase in parti debolmente accoppiate e autonome. Ogni parte è un modulo. Ogni modulo è indipendente e ha uno scopo chiaro. Dividendo un problema in sottoproblemi più piccoli e più facili da risolvere, riduci la complessità della progettazione e della manutenzione di un sistema di grandi dimensioni.

Vantaggi della modularizzazione
I vantaggi della modularizzazione sono molti, anche se tutti si concentrano sul miglioramento della manutenibilità e della qualità complessiva di un codebase. La tabella seguente riassume i vantaggi principali.
Vantaggio | Riepilogo |
---|---|
Riusabilità | La modularizzazione offre opportunità di condivisione del codice e di creazione di più app dalla stessa base. I moduli sono in realtà elementi costitutivi. Le app devono essere la somma delle loro funzionalità, organizzate come moduli separati. La funzionalità fornita da un determinato modulo può essere attivata o meno in una particolare app. Ad esempio, un :feature:news può far parte della versione completa e dell'app per indossabili, ma non della versione demo. |
Controllo rigoroso della visibilità | I moduli ti consentono di controllare facilmente ciò che esponi ad altre parti del tuo codebase. Puoi contrassegnare tutto tranne l'interfaccia pubblica come internal o private per impedirne l'utilizzo al di fuori del modulo. |
Pubblicazione personalizzabile | Play Feature Delivery utilizza le funzionalità avanzate degli app bundle, consentendoti di offrire determinate funzionalità della tua app in modo condizionale o on demand. |
I vantaggi della modularizzazione sono ottenibili solo con un codebase modulare. I seguenti vantaggi possono essere ottenuti con altre tecniche, ma la modularizzazione può aiutarti a applicarli in modo ancora più efficace.
Vantaggio | Riepilogo |
---|---|
Scalabilità | In una base di codice strettamente accoppiata, una singola modifica può attivare una cascata di alterazioni in parti di codice apparentemente non correlate. Un progetto correttamente modularizzato adotterà il principio di separazione delle responsabilità e quindi limiterà l'accoppiamento. In questo modo, i collaboratori hanno maggiore autonomia. |
Proprietà | Oltre a consentire l'autonomia, i moduli possono essere utilizzati anche per imporre la responsabilità. Un modulo può avere un proprietario dedicato responsabile della manutenzione del codice, della correzione dei bug, dell'aggiunta di test e della revisione delle modifiche. |
Incapsulamento | L'incapsulamento significa che ogni parte del codice deve avere la minima quantità possibile di informazioni sulle altre parti. Il codice isolato è più facile da leggere e comprendere. |
Testabilità | La testabilità indica la facilità con cui è possibile testare il codice. Una base di codice testabile è una base in cui i componenti possono essere testati facilmente in modo isolato. |
Ora build | Alcune funzionalità di Gradle, come la build incrementale, la cache della build o la build parallela, possono sfruttare la modularità per migliorare le prestazioni della build. |
Errori comuni
La granularità del codebase è la misura in cui è composto da moduli. Un codebase più granulare ha più moduli più piccoli. Quando progetti una base di codice modulare, devi decidere un livello di granularità. Per farlo, tieni conto delle dimensioni della tua base di codice e della sua relativa complessità. Una granularità troppo fine renderà il sovraccarico un peso, mentre una granularità troppo grossolana ridurrà i vantaggi della modularizzazione.
Ecco alcuni errori comuni:
- Troppo granulare: ogni modulo comporta un certo overhead sotto forma di maggiore complessità della build e codice boilerplate. Una configurazione di build complessa rende difficile mantenere la coerenza delle configurazioni tra i moduli. Troppo codice boilerplate risulta in una base di codice complessa e difficile da gestire. Se l'overhead contrasta i miglioramenti della scalabilità, ti consigliamo di consolidare alcuni moduli.
- Troppo granulare: al contrario, se i moduli diventano troppo grandi, potresti ritrovarti con un altro monolite e perdere i vantaggi offerti dalla modularità. Ad esempio, in un piccolo progetto è accettabile inserire il livello dati all'interno di un singolo modulo. Tuttavia, man mano che cresce, potrebbe essere necessario separare repository e origini dati in moduli autonomi.
- Troppo complesso: non sempre è opportuno modularizzare il progetto. Un fattore dominante è la dimensione del codebase. Se non prevedi che il tuo progetto superi una determinata soglia, i vantaggi in termini di scalabilità e tempo di compilazione non verranno applicati.
La modularizzazione è la tecnica giusta per me?
Se hai bisogno dei vantaggi della riusabilità, di un controllo rigoroso della visibilità o di utilizzare Play Feature Delivery, la modularizzazione è una necessità. In caso contrario, ma se vuoi comunque usufruire di una migliore scalabilità, proprietà, incapsulamento o tempi di compilazione, la modularizzazione è qualcosa da prendere in considerazione.
Campioni
- Now in Android: app per Android completamente funzionante con modularizzazione.
- Esempio di architettura multimodulo