مقالات

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

 

در اینجا یک کد نمونه وجود دارد که معماری 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)
ایجاد UserRepository interface:
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 رو یاد بگیری  دوره ژنرال اندوید ما رو از دست نده…

برای مطالعه بیشتر درباره کاتلین اینجا کلیک کن.

 

‫5/5 ‫(3 نظر)
محمد زارع

از سال 94 بصورت جدی وارد عرصه برنامه نویسی اندروید شدم، در شرکت‌ها و استارت‌آپ‌های زیادی مشغول به کار بوده و تجربه کسب کرده ام و در این سایت قصد دارم این تجربه را به اشتراک بگذارم

View Comments

Recent Posts

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید: راهنمای جامع و کاربردی

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید یکی از مهم‌ترین فاکتورهایی است که برای کاربران در دنیای امروز…

3 ماه ago

سوالات مصاحبه‌ی استخدامی کاتلین همراه با جواب(قسمت چهارم)

مصاحبه‌ی استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

4 ماه ago

سوالات مصاحبه استخدام زبان کاتلین همراه با جواب(قسمت سوم)

مصاحبه استخدام زبان کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه…

4 ماه ago

سوالات مصاحبه استخدام کاتلین همراه با جواب(قسمت دوم)

مصاحبه استخدام کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

4 ماه ago

سوالات مصاحبه استخدامی کاتلین همراه با جواب(قسمت اول)

مصاحبه استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

5 ماه ago

نوتیفیکیشن در اندروید: نحوه کار با آن در کاتلین

نوتیفیکیشن در اندروید امروزه یکی از قابلیت‌های مهم و پرکاربرد در اپلیکیشن‌های اندروید هستند. با…

5 ماه ago