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

امروزه استفاده و پیاده سازی معماری های برنامه نویسی جزو اولویت های برنامه نویسان حرفه ای میباشد از همین رو در چندین سال گذشته معماری هایی مانند MVC , MVP , معماری MVVM و Clean architecture وارد توسعه اپلیکیشن های اندروید شده اند.از همین رو برای اینکه اپلیکیشنی قوی , گسترش پذیر و قابل تست داشته باشیم میبایستی معماری مناسبی برای اپلیکیشن پیاده سازی کنیم.
انواع معماری های برنامه نویسی در اندروید
(MVVM (Model, View, View Model
(MVP (Model, View, Presenter
(MVC (Model, View, Controller
آشنایی با معماری MVVM در اندروید
معماری MVVM یک الگوی معماری سه لایه بر پایه Model – View – ViewModel هست . شرکت گوگل به این معماری دل ( عشق ) ورزیده و کامپوننت هایی تحت عنوان android.arch برای آن منتشر کرده است .

مزیت های استفاده از معماری MVVM
- اجزای UI بطور کامل از منطق برنامه جدا هستند.
- منطق برنامه از عملیات دیتابیسی جدا هستند.
- خوانایی و فهم کد بسیار ساده تر می شود.
- مدیریت life cycle events کمتر برعهده برنامه نویس است. مثلا وقتی کاربر در حالت (state) مشخصی از برنامه خارج می شود و چند ساعت بعد دوباره برمی گردد، برنامه در همان حالتی است که کاربر آنرا ترک نموده است. به عبارت بهتر راه حل جایگزین استفاده از onSaveInstanceState است.
معماری MVVM چیست ؟
MVVM مخفف Model، View، ViewModel میباشد.
Model، View، ViewModel یک الگوی معماری برنامه است که توسط جان گاسمن که به عنوان جایگزینی برای الگوهای MVC و MVP هنگام استفاده از Data Binding پیشنهاد شده است. MVVM یک الگوی طراحی معماری نرم افزار است که جداسازی رابط کاربری از business logic و مدل داده (Data model) برنامه را بهبود می دهد.
مدل (Model)
لایه مدل می تواند شامل دسترسی به داده ها , دیتابیس , مدل ها و Repository ها باشد .مدل یه لایه ارائه دهنده و بروز رسانی اطلاعات است .
دادهها را میتوان از منابع مختلف بازیابی کرد، به عنوان مثال:
- RestFull API
- SQLite db
- Handles broadcast
- Shared Preferences
- Firebase
Model از View یا ViewModel اطلاعی ندارد و به طور مستقل کار میکند. اگر یک برنامهی که قبلاً بر اساس الگوی MVC یا MVP ساخته شده است، به MVVM منتقل کنید ، لایهی Model به احتمال زیاد نیازی به تغییر نخواهد داشت چون وابسته به لایه های دیگر نبوده و براحتی قابل انتقال می باشد.
ویو (View)
ویو همان صفحه ای است که کاربر آن را می بیند(UI) که در اپلیکیشن های اندروید XML میباشد که در اکتیویتی و فرگمنت قابل استفاده می باشند.در معماری MVVM لایه View و مدل ارتباطی با هم ندارند و View با ViewModel در ارتباط است.
در View میتوان کارهای زیر را انجام داد:
- نمایش منو ها Menu
- مجوز ها Permissions
- رویداد ها Event Listener
- نمایش دیالوگ ها
- نمایش Toast و SnackBar
- Working with Android View and Widget
- Start Activities
- و تمام کارهای مرتبط با Context
ویو مدل (ViewModel)
ViewModel شما اطلاعاتی است که View به آنها نیاز دارد.همانطور که از نام آن مشخص است ٰViewModel پل ارتباطی ما بین View و Model است. روال کار به این صورت است که مدل دیتا ها را واکشی میکند و در اختیار ViewModel قرار می دهد و سپس ViewModel آن را در View نمایش می دهد. کلاس های ViewModel بصورت POJO هستند که میتوانند بطور مستقل نیز اجرا شوند و قابل تست هستند
از جمله مزایای ViewModel می توان به موارد زیر اشاره کرد :
- استفاده مجدد از کد (Code reuse)
- تست نویسی آسان
- Bind کردن دیتاها به UI
- قابلیت نگه داری آسان
وظایف ViewModel :
- نمایش اطلاعات
- منتشر کردن وضعیت دیتاها مانند ProgressBar , نمایش خطاها و …
- مدیریت نمایش/مخفی نمودن کنترل ها
- مدیریت Validation کنترل ها
- اجرای متدهای Model
- نمایش اطلاعات خروحی Model در View
ViewModel ها فقط باید دربارهی Context اطلاعات داشته باشد. Context میتواند شامل موارد زیر باشند :
- اجرای اکتیویتی جدید start Activity
- Bind کردن سرویس ها
- ارسال سرویس های Broadcast
- Register کردن سرویس های Broadcast
- استفاده از منابع Resource
کارهایی که نباید در ViewModel انجام داد شامل موارد زیر است :
- نمایش دیالوگ ها Dialog
- Start کردن اکتیویتی ها
- inflate کردن لایوت ها برای View ها
تفاوت MVVM با MVP:
- لایه ViewModel بجای لایه Presenter در لایه میانی است.
- Presenter متصل به View است اما ViewModel متصل به View نیست.
- Presenter و View رابطه 1 به 1 دارند.
- ViewModel اطلاعی ندارد که View در حال گوش دادن به آن است.
دو مدل پیاده سازی معماری MVVM در اندروید :
- DataBinding
- RxJava
Data Binding در اندروید از جمله کتابخانه های مشهور در JetPack اندروید میباشد که به منظور اتصال دادن داده ها بطور مستقیم در Xml Layout است. حتما پیشنهاد میشود قبل از اینکه معماری MVVM را شروع کنید با کتابخانه DataBinding آشنا شوید.
مثال : ما در این مثال قصد داریم یک صفحه ورود کاربران را پیاده سازی کنیم و در صورتی که کاربر اطلاعات را وارد نکرد و یا اینکه ایمیل معتبر را وارد نکرد با پیغام ها مواجه شود و در صورت درست بودن اطلاعات پیغام خوش آمد گویی نمایش داده می شود
چگونه ممکن است به برخی از کلاس ها بدون داشتن مرجع از آن اطلاع داده شود؟
- با استفاده از Two Way Data Binding
- با استفاده از LiveData
- با استفاده از RxJava
از جمله موارد مهم قابل اشاره این است که دیگر نیازی به استفاده از interface و یا کتابخانه هایی مانند EventBus نیست و LiveData اینکار را برعهده می گیرد.
پیادهسازی یک مثال عملی MVVM با کاتلین :
در این مثال، یک اپلیکیشن ساده برای نمایش لیست کاربران از طریق MVVM پیادهسازی میکنیم.
1. اضافه کردن وابستگیها
در فایل build.gradle (Module: app)
, موارد زیر را اضافه کنید:
dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
implementation "androidx.recyclerview:recyclerview:1.3.2"
}
2. ایجاد کلاس Model
یک کلاس دادهای برای کاربران ایجاد میکنیم:
data class User(val id: Int, val name: String)
3. ایجاد Repository برای مدیریت دادهها
class UserRepository {
fun getUsers(): List<User> {
return listOf(
User(1, "علی"),
User(2, "زهرا"),
User(3, "محمد")
)
}
}
4. ایجاد ViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class UserViewModel : ViewModel() {
private val repository = UserRepository()
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>> get() = _users
fun fetchUsers() {
_users.value = repository.getUsers()
}
}
5. ایجاد فایل XML Layout برای نمایش لیست کاربران
در res/layout/activity_main.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
6. ایجاد Adapter برای RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class UserAdapter(private val users: List<User>) : RecyclerView.Adapter<UserAdapter.UserViewHolder>() {
class UserViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val nameTextView: TextView = view.findViewById(android.R.id.text1)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false)
return UserViewHolder(view)
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
holder.nameTextView.text = users[position].name
}
override fun getItemCount(): Int = users.size
}
7. مقداردهی اولیه در Activity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
class MainActivity : AppCompatActivity() {
private val userViewModel: UserViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
userViewModel.users.observe(this) { users ->
recyclerView.adapter = UserAdapter(users)
}
userViewModel.fetchUsers()
}
}
نتیجهگیری
در این مقاله، معماری MVVM را در اندروید با کاتلین بررسی کردیم و یک مثال عملی برای نمایش لیست کاربران پیادهسازی نمودیم. این معماری باعث بهبود ساختار کد، افزایش خوانایی و کاهش وابستگی بین اجزا میشود. استفاده از LiveData و ViewModel به بهبود عملکرد و مدیریت بهتر چرخه حیات کمک میکند.
دیدگاهتان را بنویسید