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

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

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

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

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

معماری MVVM در اندروید چیست؟معماری MVVM در اندروید

معماری MVVM (Model-View-ViewModel) یکی از محبوب‌ترین الگوهای طراحی نرم‌افزار در توسعه اپلیکیشن‌های اندرویدی است که با هدف جداسازی منطق برنامه از رابط کاربری ایجاد شده است. این معماری باعث می‌شود کدها ساختاریافته‌تر، قابل نگهداری‌تر و تست‌پذیرتر باشند.

در معماری MVVM، برنامه به سه بخش اصلی تقسیم می‌شود:

  • Model: مسئول مدیریت داده‌ها و منطق کسب‌وکار است. این بخش می‌تواند شامل APIها، پایگاه داده و Repositoryها باشد.
  • View: شامل رابط کاربری برنامه مانند Activity، Fragment یا Composableها در Jetpack Compose است. View تنها وظیفه نمایش اطلاعات به کاربر و دریافت تعاملات او را بر عهده دارد.
  • ViewModel: به عنوان واسط بین Model و View عمل می‌کند. ViewModel داده‌ها را از Model دریافت کرده و به شکلی مناسب برای نمایش در View آماده می‌کند. همچنین تغییرات داده را مدیریت کرده و از بین رفتن اطلاعات هنگام تغییر وضعیت صفحه (مانند چرخش دستگاه) جلوگیری می‌کند.

یکی از مهم‌ترین مزایای MVVM در اندروید، استفاده از کامپوننت‌های Jetpack مانند ViewModel، LiveData و StateFlow است که مدیریت داده‌ها و بروزرسانی رابط کاربری را بسیار ساده‌تر می‌کنند.

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

(MVVM (Model, View, View Model

(MVP (Model, View, Presenter

(MVC (Model, View, Controller

معماری MVVM در برابر MVP

معماری MVVM در برابر MVP

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

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

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

  • جداسازی کامل منطق برنامه از رابط کاربری
  • افزایش خوانایی و نگهداری کدها
  • تست‌پذیری بهتر بخش‌های مختلف برنامه
  • مدیریت آسان داده‌ها و وضعیت صفحه
  • سازگاری کامل با معماری‌های مدرن اندروید
  • مناسب برای پروژه‌های کوچک و بزرگ

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

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

پیاده‌سازی MVVM و Clean Architecture در اندروید

 اجزای معماری معماری 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 در اندروید

آشنایی با Design Pattern MVVM در اندروید

آشنایی با Design Pattern 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 و معماری Clean Architecture

در پروژه‌های حرفه‌ای، معماری MVVM معمولاً به تنهایی استفاده نمی‌شود و با Clean Architecture ترکیب می‌شود. این ترکیب باعث می‌شود کدها ساختارمندتر، مقیاس‌پذیرتر و نگهداری آن‌ها در پروژه‌های بزرگ بسیار آسان‌تر باشد.

در معماری MVVM ساده، ViewModel ممکن است مستقیماً با Repository ارتباط برقرار کند. اما با بزرگ‌تر شدن پروژه، وابستگی‌ها افزایش یافته و مدیریت منطق کسب‌وکار دشوار می‌شود. Clean Architecture این مشکل را با تقسیم پروژه به لایه‌های مستقل حل می‌کند.

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

ساختار پوشه‌ها در یک پروژه حرفه‌ای

ساختار پوشه‌ها در یک پروژه حرفه‌ای

ساختار پوشه‌ها در یک پروژه حرفه‌ای


جمع‌بندی

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

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

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

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

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