Projekt z wieloma modułami Gradle jest nazywany projektem wielomodułowym. Ten przewodnik zawiera sprawdzone metody i zalecane wzorce tworzenia aplikacji na Androida składających się z wielu modułów.
Problem z rosnącą bazą kodu
W stale rosnącej bazie kodu skalowalność, czytelność i ogólna jakość kodu często z czasem maleją. Wynika to ze zwiększenia rozmiaru bazy kodu bez podejmowania przez osoby odpowiedzialne za jej utrzymanie aktywnych działań w celu wymuszenia struktury, którą można łatwo utrzymywać. Modularyzacja to sposób strukturyzacji bazy kodu, który zwiększa łatwość utrzymania i pomaga uniknąć tych problemów.
Co to jest modularność?
Modularyzacja to praktyka organizowania bazy kodu w luźno powiązane i samodzielne części. Każda część jest modułem. Każdy moduł jest niezależny i służy do określonego celu. Dzieląc problem na mniejsze i łatwiejsze do rozwiązania podproblemy, zmniejszasz złożoność projektowania i utrzymywania dużego systemu.

Korzyści z modularyzacji
Modularyzacja przynosi wiele korzyści, ale wszystkie sprowadzają się do poprawy łatwości utrzymania i ogólnej jakości bazy kodu. W tabeli poniżej znajdziesz podsumowanie najważniejszych korzyści.
Korzyści | Podsumowanie |
---|---|
Możliwość ponownego wykorzystania | Modularyzacja umożliwia udostępnianie kodu i tworzenie wielu aplikacji na tej samej podstawie. Moduły to w zasadzie elementy składowe. Aplikacje powinny być sumą funkcji, które są zorganizowane jako osobne moduły. Funkcje, które zapewnia dany moduł, mogą być włączone lub wyłączone w określonej aplikacji. Na przykład :feature:news może być częścią pełnej wersji aplikacji na zegarek, ale nie wersji demonstracyjnej. |
Ścisła kontrola widoczności | Moduły umożliwiają łatwe kontrolowanie, co udostępniasz innym częściom bazy kodu. Wszystko poza interfejsem publicznym możesz oznaczyć jako internal lub private , aby uniemożliwić używanie tego poza modułem. |
Dostawa z możliwością dostosowania | Play Feature Delivery korzysta z zaawansowanych funkcji pakietów aplikacji, dzięki czemu możesz dostarczać określone funkcje aplikacji warunkowo lub na żądanie. |
Korzyści z modularyzacji można osiągnąć tylko w przypadku modułowej bazy kodu. Poniższe korzyści można osiągnąć za pomocą innych technik, ale modularyzacja może pomóc w ich jeszcze większym wzmocnieniu.
Korzyści | Podsumowanie |
---|---|
Skalowalność | W przypadku ściśle powiązanego kodu pojedyncza zmiana może wywołać kaskadę zmian w pozornie niezwiązanych częściach kodu. Prawidłowo podzielony na moduły projekt będzie zgodny z zasadą rozdzielenia odpowiedzialności, a tym samym ograniczy powiązania. Zwiększa to autonomię współtwórców. |
Własność | Oprócz umożliwienia autonomii moduły mogą też służyć do egzekwowania odpowiedzialności. Moduł może mieć dedykowanego właściciela, który jest odpowiedzialny za utrzymywanie kodu, naprawianie błędów, dodawanie testów i sprawdzanie zmian. |
Hermetyzacja | Enkapsulacja oznacza, że każda część kodu powinna mieć jak najmniejszą wiedzę o innych częściach. Wyodrębniony kod jest łatwiejszy do odczytania i zrozumienia. |
Możliwość testowania | Testowalność określa, jak łatwo jest testować kod. Testowalna baza kodu to taka, w której komponenty można łatwo testować osobno. |
Czas kompilacji | Niektóre funkcje Gradle, takie jak przyrostowe kompilowanie, pamięć podręczna kompilacji czy kompilowanie równoległe, mogą wykorzystywać modułowość do zwiększania wydajności kompilacji. |
Typowe problemy
Granularność bazy kodu to stopień, w jakim składa się ona z modułów. Bardziej szczegółowa baza kodu ma więcej mniejszych modułów. Podczas projektowania modułowej bazy kodu musisz określić poziom szczegółowości. Aby to zrobić, weź pod uwagę rozmiar bazy kodu i jej względną złożoność. Zbyt szczegółowe podziały zwiększą obciążenie, a zbyt ogólne zmniejszą korzyści z modularyzacji.
Oto kilka typowych pułapek:
- Zbyt szczegółowe: każdy moduł wiąże się z pewnym narzutem w postaci zwiększonej złożoności kompilacji i powtarzalnego kodu. Złożona konfiguracja kompilacji utrudnia zachowanie spójności konfiguracji w różnych modułach. Zbyt duża ilość kodu szablonowego powoduje, że baza kodu jest nieporęczna i trudna w utrzymaniu. Jeśli narzut niweluje ulepszenia dotyczące skalowalności, rozważ scalenie niektórych modułów.
- Zbyt ogólne: jeśli moduły stają się zbyt duże, możesz skończyć z kolejnym monolitem i stracić korzyści, jakie daje modułowość. Na przykład w małym projekcie można umieścić warstwę danych w jednym module. Jednak w miarę rozwoju aplikacji może być konieczne rozdzielenie repozytoriów i źródeł danych na osobne moduły.
- Zbyt skomplikowane: nie zawsze warto dzielić projekt na moduły. Dominującym czynnikiem jest rozmiar bazy kodu. Jeśli nie spodziewasz się, że Twój projekt przekroczy określony próg, korzyści związane ze skalowalnością i czasem kompilacji nie będą miały zastosowania.
Czy modularyzacja jest odpowiednią techniką dla mnie?
Jeśli potrzebujesz możliwości ponownego użycia, ścisłej kontroli widoczności lub chcesz korzystać z Play Feature Delivery, modułowość jest dla Ciebie koniecznością. Jeśli nie, ale nadal chcesz korzystać z większej skalowalności, własności, hermetyzacji lub krótszego czasu kompilacji, warto rozważyć modułowość.
Próbki
- Now in Android – w pełni funkcjonalna aplikacja na Androida z modułową architekturą.
- Przykładowa architektura wielomodułowa