آموزش معماری MVVM در اندروید
معماری MVVM در اندروید مخفف Model-View-ViewModel است و یکی از معماریهای محبوب برای توسعه نرمافزارهای اندرویدی است. در این معماری، کدها به 3 بخش Model، View و ViewModel تقسیم میشوند.
در این مقاله از سری مقالات کاتلین می خواهیم شما را با معماری MVVM در اندروید آشنا کنیم.
در ادامه به توضیحات جامع معماری MVVM در اندروید و روش های پیاده سازی آن میپردازیم، پس با سایت ترولرن همراه باش.
“قبل از شروع مقاله، بگم که اگر قصد دارید صفر تا صد معماری MVVM در اندروید رو با جدیدترین تکنولوژی ها یاد بگیرین، از دوره ژنرال اندروید غافل نشید.”
تاریخچه معماری MVVM در اندروید
معماری MVVM در اندروید، یکی از معماریهای محبوب برای توسعه نرمافزارهای اندرویدی است که از اوایل دهه 2010 میلادی شکل گرفته است. این معماری در واقع از معماری Model-View-Controller (MVC) الهام گرفته شده است.
در سال 2011، Google برای اولین بار معماری MVVM را به صورت رسمی در زبان برنامهنویسی Java در بستر اندروید معرفی کرد. این معماری به صورت پیشفرض در کتابخانه دادههای Android در دسترس بود و توسعهدهندگان میتوانستند از آن استفاده کنند.
اما با ورود نسخه جدید Android Studio و اضافه شدن کامپوننت Data Binding، استفاده از معماری MVVM به صورت گستردهتری در اندروید رایج شد. Data Binding به توسعهدهندگان امکان میدهد تا به راحتی دادهها را به View و ViewModel متصل کنند و این امر باعث میشود که پیادهسازی معماری MVVM در اندروید به صورت سادهتری امکانپذیر باشد.
در حال حاضر، MVVM به عنوان یکی از معماریهای محبوب برای توسعه اپلیکیشنهای اندرویدی شناخته شده است و توسعهدهندگان میتوانند با استفاده از آن، کدهایی سازمانیافتهتر، قابل توسعتر و قابل نگهداریتر برای اپلیکیشنهای خود پیادهسازی کنند.
معماری MVVM
همانطور که گفته شد در این معماری، کدها به 3 بخش Model، View و ViewModel تقسیم میشوند.
Model
این بخش شامل دادهها و منطق کسب و کار است.
View
این بخش شامل تمامی عناصر رابط کاربری (UI) است، از جمله دکمهها، فیلدهای ورودی، لیستها و غیره.
ViewModel
این بخش به عنوان میانلایه میان Model و View عمل میکند. ViewModel مسئول ارتباط بین دادهها و رابط کاربری است و همچنین مسئول انجام عملیات منطق کسب و کار بر روی دادهها میباشد.
به طور کلی، MVVM به عنوان یک معماری مدل-نمایش-کنترل یا Model-View-Controller (MVC) با چیدمان معکوس (Inversion of Control) شناخته میشود.
این معماری به توسعهدهندگان امکان میدهد تا کدهای خود را به صورت ماژولار و قابل تست طراحی کنند.
با استفاده از MVVM، توسعهدهندگان میتوانند کدهای خود را به صورت قابل توسعه و قابل نگهداری طراحی کنند.
همچنین، این معماری میتواند بهبود قابل توجهی در عملکرد و پایداری نرمافزار ایجاد کند، زیرا تفکیک دادهها و منطق کسب و کار از رابط کاربری، تست و نگهداری کدها را سادهتر میکند. همچنین، با استفاده از این معماری، توسعهدهندگان میتوانند به صورت جداگانه بر روی هر بخش از کد کار کنند، که این امر همکاری بین چندین توسعهدهنده را سادهتر میکند.
همانطور که در نمودار بالا مشاهده میشود، بخشهای مختلف در این معماری کاملا از هم مجزا هستند و ارتباط بین این اجزاء را میتوانیم با استفاده از flow یا LiveData برقرار کنیم.
مزایای MVVM
معماری MVVM در اندروید دارای مزایای زیادی است که در ادامه به برخی از آنها اشاره میکنم:
1. جداسازی وظایف
با استفاده از معماری MVVM در اندروید، وظایف مختلف اپلیکیشن، از جمله منطق کسب و کار، دادهها و رابط کاربری، به صورت مجزا پیادهسازی میشوند. این امر باعث میشود که کد قابل خواندنتر و قابل نگهداریتر باشد.
2. قابلیت تست
با تفکیک وظایف، تست کردن کد آسانتر میشود. به عنوان مثال، با داشتن ViewModel جداگانه، میتوانیم آن را به صورت مجزا تست کنیم، بدون اینکه نیاز باشد رابط کاربری را شبیهسازی کنیم.
3. افزایش قابلیت توسعه
با استفاده از معماری MVVM در اندروید، توسعهدهندگان میتوانند به راحتی به برنامههای پیچیدهتر تغییر دهند. با توجه به اینکه وظایف مختلف به صورت مجزا پیادهسازی شدهاند، تغییر در یکی از بخشها، بدون تاثیر بر سایر بخشها امکانپذیر است.
4. افزایش قابلیت نگهداری
با توجه به جداسازی وظایف و استفاده از قالب MVVM، کد به صورت سازمانیافتهتر و خواناتر خواهد بود. این امر باعث میشود که نگهداری برنامه آسانتر و کمهزینهتر باشد.
5. افزایش کارایی
استفاده از ViewModel در معماری MVVM در اندروید، باعث میشود که اپلیکیشن با سرعت بیشتری بارگذاری شود، زیرا ViewModel به عنوان میانلایه بین View و Model عمل میکند و دادههای لازم را برای View فراهم میکند.
6. کاهش خطا
با جدایی منطق کسب و کار از رابط کاربری، احتمال وقوع خطاها کاهش مییابد. این امر باعث میشود که اپلیکیشن پایدارتر و کارآمدتر باشد.
در اینجا یک کد نمونه وجود دارد که معماری MVVM اندروید را با استفاده از Kotlin، Jetpack Compose، Hilt برای تزریق وابستگی، دیزاین پترن ریپازیتوری، ViewModel و Flow برای مدیریت ناهمزمان داده ها نشان می دهد. این مثال از LiveData استفاده نمی کند و به جای آن بر جریان های Kotlin متکی است.
چون این روش بیشتر مورد علاقه من است و با وجود flow دیگر استفاده از لایودیتا را دوست ندارم!
ابتدا اجازه دهید وابستگی های لازم را در فایل های Gradle ایجاد کنیم.
// Add the Hilt plugin dependencies { ... classpath 'com.google.dagger:hilt-android-gradle-plugin:<hilt_version>' }
در build.gradle سطح برنامه:
apply plugin: 'kotlin-kapt' // Add the Hilt plugin apply plugin: 'dagger.hilt.android.plugin' dependencies { // Hilt implementation 'com.google.dagger:hilt-android:<hilt_version>' kapt 'com.google.dagger:hilt-android-compiler:<hilt_version>' // Jetpack Compose implementation 'androidx.compose.ui:ui:<compose_version>' implementation 'androidx.compose.material:material:<compose_version>' implementation 'androidx.compose.runtime:runtime:<compose_version>' implementation 'androidx.compose.runtime:runtime-livedata:<compose_version>' // Kotlin Flows implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:<coroutines_version>' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:<coroutines_version>' }
حالا بیایید به سراغ پیاده سازی کد برویم.
data class User(val id: Int, val name: String)
interface UserRepository { fun getUsers(): Flow<List<User>> }
Implement کردنUserRepository:
class UserRepositoryImpl : UserRepository { override fun getUsers(): Flow<List<User>> { // Simulate fetching users from a data source (e.g., database or API) return flow { // Fetch users val users = fetchUsersFromDataSource() // Emit users emit(users) } } private suspend fun fetchUsersFromDataSource(): List<User> { // Fetch users from the data source delay(2000) // Simulate network/database delay // Return a list of users return listOf( User(1, "John Doe"), User(2, "Jane Smith"), User(3, "Alice Johnson") ) } }
ViewModel را ایجاد کنید:
class UserViewModel @ViewModelInject constructor( private val userRepository: UserRepository ) : ViewModel() { private val _users = MutableStateFlow<List<User>>(emptyList()) val users: StateFlow<List<User>> get() = _users.asStateFlow() init { getUsers() } private fun getUsers() { viewModelScope.launch { userRepository.getUsers() .catch { /* Handle error */ } .collect { users -> _users.value = users } } } }
ماژول Hilt را تنظیم کنید:
@Module @InstallIn(ApplicationComponent::class) object AppModule { @Provides fun provideUserRepository(): UserRepository = UserRepositoryImpl() }
ایجاد رابط کاربری Composable:
@Composable fun UserListScreen(userViewModel: UserViewModel) { val users by userViewModel.users.collectAsState() Scaffold( topBar = { AppBar(title = { Text("User List") }) }, content = { Column( modifier = Modifier.padding(16.dp) ) { Text("User List", style = MaterialTheme.typography.h4) Spacer(modifier = Modifier.height(16.dp)) if (users.isNotEmpty()) { UserListView(users) } else { Text("Loading...") } } } ) } @Composable fun UserListView(users: List<User>) { LazyColumn { items(users) { user -> Text(text = user.name) } } } @Composable fun AppBar(title: @Composable () -> Unit) { TopAppBar( title = title, backgroundColor = MaterialTheme.colors.primary ) }
نقطه ورود Hilt را در کلاس Application خود تنظیم کنید:
@HiltAndroidApp class MyApplication : Application()
تمام! شما یک معماری Android MVVM را با استفاده از Kotlin، Jetpack Compose، Hilt، دیزاین پترن ریپازیتوری، ViewModel و Flow برای مدیریت ناهمزمان داده ها پیاده سازی کرده اید. میتوانید از UserListScreen قابل تنظیم در Activity خود یا Compose برای نمایش لیست کاربران استفاده کنید. به یاد داشته باشید که Hilt را در اکتیویتی خود نیز مقداردهی اولیه کنید:
@AndroidEntryPoint class MainActivity : AppCompatActivity() { // Your activity code }
حرف آخر
معماری MVVM در اندروید یکی از پر استفاده ترین و پرکاربردترین معماریها در توسعه نرمافزارهای اندروید است. با استفاده از MVVM، میتوانید کدهای خود را به راحتی سازماندهی کنید و بهبود قابل توجهی در کیفیت و قابلیت نگهداری برنامهی خود داشته باشید.
همچنین با استفاده از ابزارهایی مانند Data Binding ، LiveData و flow میتوانید به راحتی دادههای خود را به View متصل کنید و به کاربر نمایش دهید. در نهایت، با استفاده از Dependency Injection، میتوانید کدهای خود را بسیار بهتر و قابلیت توسعه بیشتری داشته باشید.
اگه میخوای خیلی حرفه ای معماری MVVM رو یاد بگیری دوره ژنرال اندوید ما رو از دست نده…
برای مطالعه بیشتر درباره کاتلین اینجا کلیک کن.
درباره محمد زارع
از سال 94 بصورت جدی وارد عرصه برنامه نویسی اندروید شدم، در شرکتها و استارتآپهای زیادی مشغول به کار بوده و تجربه کسب کرده ام و در این سایت قصد دارم این تجربه را به اشتراک بگذارم
نوشته های بیشتر از محمد زارع
5 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.