Android-native

Improve your android code with modularization

Hello semuanya, kali ini kita akan membahas tentang modularization. Apa itu? Kenapa make itu? Langsung saja.. 😀 Bayangkan kita memiliki 2 aplikasi,...

Ikhwan Written by Ikhwan · 2 min read >

Hello semuanya, kali ini kita akan membahas tentang modularization. Apa itu? Kenapa make itu? Langsung saja.. 😀

Bayangkan kita memiliki 2 aplikasi, dengan scope project yang sama. Setiap aplikasi memiliki fitur yang unik dan fitur yang sama. Apa yang akan kita lakukan untuk fitur yang sama tersebut? Jika kita tidak menerapkan modularization, kita mungkin akan membuat code untuk fitur itu sekali, dan menggunakan kemampuan luar biasa kita yaitu copy paste untuk project lainnya

Lalu bagaimana dengan base class? Seperti BaseActivity, BaseFragment, dan lainnya? Apakah kita akan menggunakan skill kita yang tadi? Tentu saja kita bisa melakukannya. Tapi jika kita menggunakan modularization, ini akan membuat kita bekerja lebih mudah. Kita hanya membuat code di satu tempat, dan kita tinggal memanggil code tersebut dimanapun ketika dibutuhkan.

Menarik bukan? Apa? tidak? 🙁

Oke, bagaimana jika fitur tersebut memiliki bug? Tentu kita harus memperbaikinya di dua project yang berbeda bukan? Itu merepotkan. Dan bagaimana jika fitur ini digunakan oleh lebih dari 2 aplikasi dengan scope yang sama? Mau copy paste lagi?

Mulai kedengaran menarik bukan? Berpikir lah seperti itu, kumohon.. :3 haha

Oke mari mulai, yuk ngoding.


Schema

Kita harus menggambar schema (Gk langsung ngoding ternyata, haha). Ingat, ini sangat lah penting. Jika tidak dilakukan, kita akan binggung di pertengahan pengerjaan project. Tanpa schema, kita akan pusing dengan hubungan antara setiap modul atau malah membuat code yang sama di beberapa modul.

Di tulisan ini, kita akan membuat schema sederhana,

App module adalah module yang biasanya ada setelah kita membuat project pertama kali. Kita juga memiliki 2 module lainnya untuk fitur lainnya. Oke, ayo membuat project seperti biasanya

New project

Add new module

Oke, sekarang kita memiliki sebuah project baru, dan kita akan membuat module Fiture A. Kita bisa lakukan ini dengan click File Menu -> New -> New Module -> Choose Android Library -> Set Module Name -> Finish. Sekarang project kita akan seperti berikut:


Menghubungkan module

Selanjutnya, kita akan menghubungan module feature_a dengan app module. Bukan build.gradle di app module dan tambahkan dependencies baru seperti di bawah ini.

dependencies {  
   ....implementation project(':feature_a')
}

Sync project, dan sekarang app module dan feature_a module terlah tersambung. Lakukan cara yang sama dengan module feature_b.


Memanggil activity dari module yang berbeda

Sekarang kita akan membuat activity seperti biasanya di feature module. Bagaimana cara kita memanggil activity di module feature dari module app? Pertama, gunakan 2 button untuk berpindah dari app module ke activity-activity yang ada di feature module. Pastikan kita mengimport class yang akan digunakan dari module feature

package com.ikhwankoto.modularimport android.content.Intent

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.ikhwankoto.feature_a.FeatureAActivity
import com.ikhwankoto.feature_b.FeatureBActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      btn_a.setOnClickListener {
            startActivity(Intent(this,FeatureAActivity::class.java))
      }
      btn_b.setOnClickListener {
            startActivity(Intent(this,FeatureBActivity::class.java))
      }
    }
}

Jalankan project, dan hasilnya akan seperti dibawah ini

Sample Output

Selamat, sekarang kita mempunyai project dengan konsep modular.


Berbagi dependencies di antara module

Case selanjutnya, kita mempunyai depedencies di module feature_a, dan kita akan menggunakannya juga di app module. Kita akan menulis satu kali di build.gradle di module feature_a. Kita harus menambahkan dependecies dengan menggunakan api, bukan implementation. Jika kita menggunakan implementation, app module tidak akan bisa menggunakan library tersebut. Yuk coba. Kita akan menggunakan library Picasso dan library Glide untuk perbandingan

dependencies {
     ...
     implementation 'com.squareup.picasso:picasso:2.71828'
     
     api 'com.github.bumptech.glide:glide:4.9.0'
     annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}

Sync project. Sekarang yuk coba import library di activity yang ada di app module. Hasilnya akan terlihat seperti berikut.

Perbandingan

Kita bisa menggunakan library glide karena menggunakan api, bukan implementation. Di sisi lain, kita tidak bisa menggunakan library Picasso karena alasan yang sama.


Berpindah activity dari module yang tidak berkaitan

Ingin berpindah activity dari module feature_a ke module feature_b? Kita bisa melakukannya dengan code seperti dibawah ini:

var intent: Intent? = null
try {
    intent = Intent(this,
         Class.forName("com.ikhwankoto.feature_b.FeatureBActivity"))
    startActivity(intent)
} catch (e: ClassNotFoundException) {
    e.printStackTrace()
}

Perubahan schema?

Bagaimana jika nantinya kita ingin memisahkan feature_a dan feature_b tadi ke aplikasi yang berbeda? Oke, pertama kita ubah dahulu schema tadi. Schema sekarang akan seperti dibawah ini

Schema baru

Oke, kita akan membuat module baru untuk new app module dengan click File Menu -> New -> New Module -> Choose Phone & Tablet Module -> Setup -> Finish. Project kita akan terlihat seperti di bawah ini

Hubungan module feature_b dengan module new app dengan menambahkan dependencies. Jangan lupa untuk mengubah configurasi sebelum install atau membuat aplikasi.

Yay, sekarang kita telah membuat code kita lebih baik dengan modularization. Dynamic feature module? Kita akan bahas di tulisan yang lain.


Silahkan berkomentar untuk memberikan tanggapan. Kunjungi Github saya, untuk melihat sample project untuk tulisan ini. Terimakasih, telah meluangkan waktu untuk membaca tulisan ini.

https://github.com/IkhwanSI13/Sample_Modular

Bye-bye 😀

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *