15.08.2025

15.08.2025

Android

Android

5 min

5 min

Perbedaan arsitektur MVC, MVP, MVVM, dan MVI

Perbedaan arsitektur MVC, MVP, MVVM, dan MVI

1. MVC (Model–View–Controller)

Konsep
  • Model: Menyimpan data dan logika bisnis.

  • View: Menampilkan data ke pengguna.

  • Controller: Menangani interaksi pengguna dan mengatur alur data antara Model dan View.

Karakteristik
  • Paling sederhana dan mudah dipahami.

  • Sering membuat Controller terlalu besar (God Class) dalam Android.

Contoh Singkat
class MainActivity : AppCompatActivity() {
    val model = UserModel()

    fun onButtonClick() {
        val data = model.getUser()
        view.showData(data)
    }
}

2. MVP (Model–View–Presenter)

Konsep
  • Model: Logika bisnis dan data.

  • View: UI yang hanya menampilkan data.

  • Presenter: Menghubungkan View dan Model, mengatur logika aplikasi.

Karakteristik
  • View lebih bersih, tidak memuat logika.

  • Presenter lebih mudah dites (unit testing).

Contoh Singkat
interface MainView {
    fun showUser(name: String)
}

class MainPresenter(val view: MainView) {
    fun loadUser() {
        val user = UserModel().getUser()
        view.showUser(user.name)
    }
}

3. MVVM (Model–View–ViewModel)

Konsep
  • Model: Data dan logika bisnis.

  • View: UI.

  • ViewModel: Menyediakan data ke View dan menangani logika UI menggunakan LiveData/StateFlow.

Karakteristik
  • Menggunakan data binding atau observable untuk sinkronisasi data.

  • Minim interaksi langsung antara View dan ViewModel.

Contoh Singkat
class MainViewModel : ViewModel() {
    val userName = MutableLiveData<String>()

    fun loadUser() {
        userName.value = UserModel().getUser().name
    }
}

4. MVI (Model–View–Intent)

Konsep
  • Model: State tunggal yang mewakili UI.
  • View: Menampilkan state dan mengirim intent (aksi pengguna).

  • Intent: Representasi aksi pengguna.

  • Reducer: Mengubah state berdasarkan intent.

Karakteristik
  • Cocok untuk aplikasi kompleks dengan banyak perubahan state.

  • Semua state UI tersentralisasi dan terprediksi.

Contoh Singkat
data class MainState(val name: String = "")

sealed class MainIntent {
    object LoadUser : MainIntent()
}

class MainViewModel : ViewModel() {
    val state = MutableStateFlow(MainState())

    fun handleIntent(intent: MainIntent) {
        when (intent) {
            is MainIntent.LoadUser -> state.value = MainState("Andi")
        }
    }
}
Tabel Perbandingan

Arsitektur

Kelebihan

Kekurangan

Cocok Untuk

MVC

Sederhana, mudah dipahami

Controller cepat membengkak

Proyek kecil / belajar

MVP

View bersih, mudah dites

Presenter bisa membengkak

Proyek menengah

MVVM

Sinkronisasi otomatis, minim boilerplate

Butuh pembelajaran LiveData/Flow

Proyek kecil–besar

MVI

State terpusat, mudah diprediksi

Lebih kompleks & verbose

Aplikasi kompleks

Create a free website with Framer, the website builder loved by startups, designers and agencies.