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 złożonych z wielu modułów.

Rosnący problem z bazą kodu

W stale rosnącej bazie kodu skalowalność, czytelność i ogólna jakość kodu z czasem często się zmniejsza. Wynika to z tego, że baza kodu rośnie, a użytkownicy zarządzający nią nie podejmowali aktywnych działań mających na celu wyegzekwowanie struktury łatwej w utrzymaniu. Modularyzacja to sposób uporządkowania bazy kodu w sposób, który ułatwia konserwację i pozwala uniknąć takich problemów.

Na czym polega modularyzacja?

Modularyzacja polega na organizowaniu bazy kodu w luźno sprzężone i samodzielnie zawarte w nich części. Każda część to moduł. Każdy moduł jest niezależny i służący słusznym celu. Dzieląc problem na mniejsze i łatwiejsze do rozwiązania podproblemy, upraszczasz projektowanie i utrzymywanie dużego systemu.

Rysunek 1. Wykres zależności dla przykładowej bazy kodu złożonej z wielu modułów

Zalety modularyzacji

Modularyzacja ma wiele zalet, ale z jednej strony koncentruje się na poprawie łatwości obsługi i ogólnej jakości bazy kodu. W tabeli poniżej znajdziesz podsumowanie ich kluczowych korzyści.

Korzyści Podsumowanie
Możliwość wielokrotnego użytku Modularyzacja zapewnia możliwość udostępniania kodu i tworzenia wielu aplikacji w ramach tych samych podstaw. Moduły są w praktyce elementami składowymi. Aplikacje powinny przedstawiać ich sumę jako osobne moduły. Funkcje dostępne w konkretnym module mogą, ale nie muszą być włączone w konkretnej aplikacji. Na przykład :feature:news może być częścią pełnej wersji aplikacji do obsługi smaku wersji demonstracyjnej, ale nie może być jej częścią.
Ścisła kontrola widoczności Moduły umożliwiają łatwe kontrolowanie tego, co jest udostępniane innym częściom bazy kodu. Aby uniemożliwić używanie interfejsu poza modułem, możesz oznaczyć go jako internal lub private.
Wyświetlanie z możliwością dostosowania Play Feature Delivery wykorzystuje zaawansowane możliwości pakietów aplikacji, dzięki czemu możesz udostępniać określone funkcje aplikacji warunkowo lub na żądanie.

Powyższe korzyści są osiągalne tylko za pomocą modułowej bazy kodu. Opisane poniżej korzyści można uzyskać, stosując inne metody, ale modularyzacja może pomóc w ich egzekwowaniu w jeszcze większym stopniu.

Korzyści Podsumowanie
Skalowalność W ściśle sprzężonej bazie kodu jedna zmiana może wywołać serię modyfikacji w pozornie niepowiązanych częściach kodu. Projekt o prawidłowo modułowej strukturze uwzględnia zasadę rozdziału potencjalnych problemów i ogranicza liczbę powiązań. Dzięki temu współtwórcy zyskują większą autonomię.
Własność Oprócz zapewnienia autonomii moduły mogą też służyć do egzekwowania odpowiedzialności. Moduł może mieć wyznaczonego właściciela, który odpowiada za obsługę kodu, naprawianie błędów, dodawanie testów i sprawdzanie zmian.
Hermetyzacja Herbata oznacza, że każda część kodu powinna mieć jak najmniejszą ilość informacji o innych częściach. Wyizolowany kod jest bardziej czytelny i zrozumiały.
Testowalność Testowalność określa, jak łatwo jest przetestować kod. Testowalny kod to taki, w którym komponenty można łatwo przetestować w izolacji.
Czas kompilacji Niektóre funkcje Gradle, takie jak kompilacja przyrostowa, pamięć podręczna kompilacji czy kompilacja równoległa, mogą wykorzystywać modułowość do poprawy wydajności kompilacji.

Częste problemy

Szczegółowość bazy kodu odzwierciedla zakres, w jakim składa się ona z modułów. Bardziej szczegółowa baza kodu ma więcej mniejszych modułów. Projektując modułową bazę kodu, należy wybrać odpowiedni poziom szczegółowości. Weź pod uwagę rozmiar bazy kodu i jej względną złożoność. Zbyt szczegółowe podejście sprawi, że nadmiarowość będzie uciążliwe, a zbyt ogólne zmniejszenie korzyści płynących z modularyzacji.

Oto kilka częstych problemów:

  • Zbyt szczegółowa: każdy moduł niesie ze sobą pewne nakłady pracy: zwiększona złożoność kompilacji i schematyczny kod. Złożona konfiguracja kompilacji utrudnia utrzymanie ich spójności w różnych modułach. Zbyt obszerny, powtarzalny kod tworzy uciążliwe zasady i trudne w utrzymaniu. Jeśli nadmiarowość oznacza ulepszenia skalowalności, warto rozważyć skonsolidowanie niektórych modułów.
  • Zbyt duże ziarnistość: jeśli Twoje moduły rozwiną się, możesz uzyskać kolejny monolit z innym monolitem i brakiem korzyści, jakie oferuje modułowalność. Na przykład w małym projekcie wystarczy umieścić warstwę danych w jednym module. Jednak w miarę rozwoju konieczne może być podzielenie repozytoriów i źródeł danych na osobne moduły.
  • Zbyt złożone: modułowe porządkowanie projektu nie zawsze jest dobrym rozwiązaniem. Czynnikiem dominującym jest rozmiar bazy kodu. Jeśli nie spodziewasz się, że Twój projekt przekroczy określony próg, skalowalność ani czas kompilacji nie będą miały zastosowania.

Czy modularyzacja to dla mnie odpowiednia technika?

Jeśli chcesz korzystać z możliwości wielokrotnego użytku, ścisłej kontroli nad widocznością lub korzystania z Play Feature Delivery, niezbędne jest wprowadzenie modularyzacji. Jeśli nie, a jednocześnie chcesz uzyskać lepszą skalowalność, własność, hermetyzację lub czasy kompilacji, warto rozważyć modularyzację.

Próbki