برنامه‌نویسی اندروید

آموزش معماری MVVM در اندروید

آموزش معماری MVVM در اندروید

معماری MVVM (Model–View–ViewModel) یکی از مهم‌ترین و پرکاربردترین الگوهای طراحی در توسعه اپلیکیشن‌های اندروید است که توسط Google به‌طور رسمی در قالب Android Architecture Components پشتیبانی می‌شود. اگر می‌خواهید اپلیکیشن‌هایی تمیز، قابل تست و مقیاس‌پذیر بسازید، یادگیری MVVM تقریباً ضروری است.

در این مقاله، به‌صورت کامل و قدم‌به‌قدم MVVM را یاد می‌گیریم و در انتها یک مثال عملی هم پیاده‌سازی می‌کنیم.

معماری برنامه نویسی MVVM

انواع معماری های برنامه نویسی در اندروید

(MVVM (Model, View, View Model

(MVP (Model, View, Presenter

(MVC (Model, View, Controller

معماری MVVM چیست؟

 

MVVM مخفف سه بخش است:

  • Model → مدیریت داده‌ها (API، دیتابیس، …)
  • View → رابط کاربری (Activity / Fragment / Compose)
  • ViewModel → واسط بین View و Model

هدف اصلی این معماری:
👉 جدا کردن منطق برنامه از UI

آشنایی با معماری MVVM در اندروید

معماری MVVM یک الگوی معماری سه لایه بر پایه Model – View – ViewModel هست . شرکت گوگل به این معماری دل ( عشق ) ورزیده و کامپوننت هایی تحت عنوان android.arch برای آن منتشر کرده است .

مزیت های استفاده از معماری MVVM

  • اجزای UI بطور کامل از منطق برنامه جدا هستند.
  • منطق برنامه از عملیات دیتابیسی جدا هستند.
  • خوانایی و فهم کد بسیار ساده تر می شود.
  • مدیریت life cycle events کمتر برعهده برنامه نویس است. مثلا وقتی کاربر در حالت (state) مشخصی از برنامه خارج می شود و چند ساعت بعد دوباره برمی گردد، برنامه در همان حالتی است که کاربر آنرا ترک نموده است. به عبارت بهتر راه حل جایگزین استفاده از onSaveInstanceState است.معماری MVVM در اندروید

 اجزای معماری MVVM

1. Model

مدل مسئول داده‌هاست. این داده‌ها می‌توانند از منابع مختلف بیایند:

  • API (مثل Retrofit)
  • دیتابیس (Room)
  • فایل محلی

📌 مثال:

data class User(
    val id: Int,
    val name: String
)

2. View

View همان UI است که کاربر می‌بیند:

  • Activity
  • Fragment
  • یا Jetpack Compose

وظیفه View:

  • نمایش داده‌ها
  • ارسال event به ViewModel

📌 نکته مهم:
❌ View نباید منطق بیزینسی داشته باشد

3. ViewModel

ViewModel مغز اصلی اپلیکیشن است.

وظایف:

  • گرفتن داده از Model
  • آماده‌سازی داده برای UI
  • مدیریت state

📌 ویژگی مهم:
ViewModel به lifecycle وابسته نیست → از بین نمی‌رود هنگام rotation

 جریان داده در MVVM

View → ViewModel → Model
                 ↓
View ← ViewModel ← Model

 ابزارهای مهم MVVM در اندروید

1. ViewModel

از کتابخانه:

androidx.lifecycle.ViewModel

2. LiveData

برای مدیریت داده‌های reactive

LiveData<T>

3. StateFlow (مدرن‌تر)

جایگزین LiveData در پروژه‌های جدید

4. Retrofit

برای API

5. Room

برای دیتابیس

🛠 مثال عملی MVVM (نمایش لیست کاربران)

 هدف:

دریافت لیست کاربران از API و نمایش در UI

1. اضافه کردن dependencyها

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1"
implementation "com.squareup.retrofit2:retrofit:2.9.0"

2. Model (API + Data)

API Interface:

interface ApiService {
    @GET("users")
    suspend fun getUsers(): List<User>
}

3. Repository (بین Model و ViewModel)

class UserRepository(private val api: ApiService) {

    suspend fun getUsers(): List<User> {
        return api.getUsers()
    }
}

4. ViewModel

class UserViewModel(private val repository: UserRepository) : ViewModel() {

    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users

    fun fetchUsers() {
        viewModelScope.launch {
            try {
                val result = repository.getUsers()
                _users.value = result
            } catch (e: Exception) {
                // handle error
            }
        }
    }
}

5. View (Activity)

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: UserViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val api = Retrofit.Builder()
            .baseUrl("https://example.com/")
            .build()
            .create(ApiService::class.java)

        val repository = UserRepository(api)

        viewModel = ViewModelProvider(
            this,
            ViewModelFactory(repository)
        )[UserViewModel::class.java]

        viewModel.users.observe(this) { users ->
            // update UI
            println(users)
        }

        viewModel.fetchUsers()
    }
}

6. ViewModelFactory

class ViewModelFactory(
    private val repository: UserRepository
) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return UserViewModel(repository) as T
    }
}

 نسخه مدرن با StateFlow

class UserViewModel(private val repository: UserRepository) : ViewModel() {

    private val _users = MutableStateFlow<List<User>>(emptyList())
    val users = _users.asStateFlow()

    fun fetchUsers() {
        viewModelScope.launch {
            _users.value = repository.getUsers()
        }
    }
}

 مزایای MVVM

✔ جدا شدن UI از logic
✔ تست‌پذیری بالا
✔ نگهداری آسان
✔ مناسب برای پروژه‌های بزرگ
✔ سازگار با Jetpack Compose

⚠️ معایب MVVM

❌ پیچیدگی بیشتر نسبت به MVC
❌ نیاز به boilerplate code
❌ یادگیری اولیه سخت‌تر

 نکات حرفه‌ای

✔ از Repository Pattern همیشه استفاده کن
✔ از StateFlow به جای LiveData در پروژه‌های جدید استفاده کن
✔ از Hilt (DI) برای تزریق وابستگی‌ها استفاده کن
✔ UI را کاملاً dumb نگه دار

 MVVM + Clean Architecture

در پروژه‌های حرفه‌ای، MVVM با Clean ترکیب می‌شود:

Presentation (ViewModel)
Domain (UseCase)
Data (Repository)

جمع‌بندی

معماری MVVM یکی از بهترین انتخاب‌ها برای توسعه اندروید مدرن است. با استفاده از این معماری:

  • کد تمیزتر می‌شود
  • تست راحت‌تر می‌شود
  • توسعه تیمی بهتر انجام می‌شود

اگر در حال یادگیری اندروید هستی، MVVM را حتماً به‌صورت عملی تمرین کن، چون تقریباً در تمام پروژه‌های واقعی استفاده می‌شود.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *