Mempertimbangkan modularisasi proyek Android

Diterbitkan: 2019-08-21

Ketika sebuah proyek mencapai skala tertentu, maka pengerjaan lebih lanjut dalam satu modul menjadi kurang efektif. Modularisasi itu kemudian menjadi solusi yang efektif.

4 keuntungan dari modularisasi

Sebelum memutuskan tentang modularisasi, ada baiknya untuk mengetahui dengan jelas apa yang terlibat. Keuntungan dari struktur proyek android modular meliputi:

Isolasi kode yang lebih baik

Setiap modul dapat mengekspos antarmuka API publiknya dan menyembunyikan detail implementasi. Dengan satu modul, Anda tidak dapat sepenuhnya yakin bahwa implementasinya tersembunyi dengan baik (terutama di Kotlin, di mana pengubah visibilitas paket tidak tersedia).

Evaluasi teknologi baru yang lebih mudah

Saat Anda membuat modul, Anda dapat memeriksa pola arsitektur baru atau pustaka baru tanpa memengaruhi modul lainnya.

Mengurangi waktu pembangunan proyek

Memodifikasi modul memerlukan pembangunan kembali modul itu dan modul lain yang bergantung padanya. Lihat cara kerjanya dengan membaca dokumentasi ini: Pengembang Android. Konfigurasi ketergantungan

Pekerjaan yang lebih nyaman

Menjadi lebih mudah untuk menganalisis/men-debug/memperbaiki potongan kode yang lebih kecil dan terisolasi. Selain itu, orientasi pengembang baru akan berjalan lebih cepat.

Manfaat ini terdengar cukup untuk meyakinkan Anda untuk memulai proses modularisasi, tetapi bagaimana Anda memulainya?

#1: Identifikasi modul Anda dan hubungannya

Ada dua pendekatan untuk mengenali modul Anda: berdasarkan fitur dan lapisan.

Di bawah modul fitur, Anda dapat memahami beberapa area aplikasi yang tersedia untuk pengguna (misalnya login, dasbor, profil, dll.). Area ini dapat terdiri dari satu layar atau aliran layar yang mencakup beberapa proses. Modul jenis ini tidak dapat bergantung pada modul dari jenis yang sama.

Setelah mengidentifikasi fitur, Anda pasti perlu mengekstrak fungsionalitas umum yang diperlukan oleh beberapa atau bahkan semua modul. Modul tersebut dapat bertanggung jawab untuk lapisan arsitektur terpisah (seperti penyimpanan persisten, jaringan, navigasi, komponen UI ...) atau logika bisnis pemrosesan beberapa data yang digunakan oleh serangkaian fitur. Modul semacam itu biasanya disebut library . Modul perpustakaan dapat membangun pohon ketergantungan.

Selain modul fitur dan pustaka, ada juga kebutuhan satu modul untuk mengelola koneksi horizontal antara modul lain (lebih lanjut tentang ini di poin berikutnya). Modul ini akan berisi kelas aplikasi khusus dan pengaturan injeksi ketergantungan. Tidak ada modul lain yang dapat bergantung pada modul ini, tetapi modul ini bergantung pada semua modul lain dalam proyek.

Modul dan hubungannya dalam aplikasi

Dengan mempertimbangkan definisi di atas, hierarki modul dapat terlihat seperti ini:

#2: Pengaturan injeksi ketergantungan

Terlepas dari ketergantungan antar modul proyek, Anda juga harus mengatur dependensi belati. Dagger menawarkan dua cara untuk mendeklarasikan ketergantungan: subkomponen dan ketergantungan komponen .

Ketergantungan subkomponen belati mengharuskan orang tua untuk menyatakan semua anak tanggungan. Di antara modul proyek, hubungan semacam ini tidak akan berfungsi, karena membalikkan arah ketergantungan modul proyek. Tetapi dapat digunakan dalam modul proyek yang terpisah.

Ketergantungan komponen dagger lebih fleksibel karena anak dapat menyatakan bahwa itu tergantung pada orang tua. Ini memungkinkan untuk menggunakan ketergantungan semacam ini antara modul proyek yang terpisah.

Pada titik tertentu Anda mungkin menemukan lebih dari satu modul membutuhkan pengetahuan yang terbatas tentang modul lain. Contoh yang sangat bagus dari ini adalah navigasi antar modul fitur. Menyediakan hubungan semacam ini sering disebut ketergantungan horizontal . Untuk membuat saluran komunikasi ini antara modul terpisah diperlukan modul tambahan dengan antarmuka yang menjelaskan komunikasi ini dan modul yang akan mengikat implementasi ke antarmuka yang dideklarasikan.

Pengaturan ketergantungan modul proyek untuk mengelola ketergantungan horizontal disajikan pada gambar di bawah ini:

Pengaturan ketergantungan modul proyek

Contoh kode untuk hubungan semacam itu disediakan dalam proyek di akhir artikel.

#3: Penyiapan gradle

Setiap modul proyek memiliki gradle.build, yang hampir sama kecuali dependensi dan plugin tambahan yang diterapkan. Jadi, bagus untuk mengekstrak konfigurasi berulang ke satu file gradle di root direktori proyek. File semacam itu juga dapat mendaftarkan tugas gradle umum untuk menjalankan analisis kode statis atau menjalankan pengujian unit.

Cuplikan kode dari pengaturan umum tersebut ditemukan di sini:

 afterEvaluate { project -> def isAndroid = project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application') setupModule(isAndroid) setupCommonTestDependencies(isAndroid) setupCommonTasks(isAndroid) } def setupModule(isAndroid) { if (isAndroid) { android { compileSdkVersion projectCompileSdk defaultConfig { minSdkVersion projectMinSdk targetSdkVersion projectTargetSdk } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } lintOptions { abortOnError true checkReleaseBuilds false checkAllWarnings true warningsAsErrors true def lintBaseline = file("quality/lint-baseline.xml") if (lintBaseline.exists()) baseline lintBaseline } } } else { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } def setupCommonTestDependencies(isAndroid) { dependencies { testImplementation "junit:junit:${junitVersion}" testImplementation "org.assertj:assertj-core:${assertJVersion}" testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:${mockitoKotlinVersion}" if (isAndroid) { androidTestImplementation "androidx.test.ext:junit:${axTestJUnitVersion}" androidTestImplementation "androidx.test.espresso:espresso-core:${axEspressoLibVersion}" } } } def setupCommonTasks(isAndroid) { if (isAndroid) { tasks.register("unitTest") { task -> task.dependsOn(testDebugUnitTest) } } else { tasks.register("unitTest") { task -> task.dependsOn(test) } } }

Kesimpulan

Artikel ini bukanlah panduan lengkap atau lengkap untuk memodulasi proyek Android. Tapi saya pikir ini menangani aspek yang harus Anda pertimbangkan saat memulai modularisasi proyek.

Sepotong kode untuk menunjukkan ketergantungan horizontal ditemukan di tautan.

Ingin membangun aplikasi asli untuk Android? Pilih Miquido!