Przewodnik po modularyzacji aplikacji na Androida

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.

Ilustracja 1. Graf zależności przykładowej bazy kodu z wieloma modułami

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