آموزش معماری Clean در MVI – ترولرن
معماری Clean در MVI ، MVI به عنوان یک الگوی معماری جهت ساخت برنامههای قابل تست، قابل نگهداری و مقیاسپذیر در اندروید مطرح است. Clean Architecture، که توسط رابرت مارتین معرفی شده است، اصولی را برای جدا کردن لایههای مختلف برنامه ارائه میدهد. این مقاله به بررسی مبانی Clean MVI، از جمله Model که مسئولیت دادهها و منطق کسب و کار را دارد، View که برای نمایش اطلاعات به کاربر و دریافت ورودی از او مسئول است، و Intent که به عنوان واسط بین Model و View عمل میکند، میپردازد.
“ما را در اینستاگرام دنبال کنید”
در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد معماری Clean در MVI، صحبت کنیم. پس با سایت ترولرن همراه باش.
“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”
معماری Clean در MVI
مهمترین مبحث در MVI (Model-View-Intent) مربوط به معماری Clean میتواند شامل سه بخش اصلی باشد: Model، View، و Intent. در زیر، هرکدام از این بخشها را به صورت خلاصه بررسی میکنیم.
-
Model
در Model، کدها و کلاسها قرار دارند که مسئولیت دادهها، منطق کسب و کار، و تغییرات برنامه را دارند. این بخش باید بیوابسته باشد و از هر گونه وابستگی به بخشهای دیگر بپرهیزد. از اصول SOLID (تشکیل شده از پنج اصل اولیه برنامهنویسی شیءگرا) میتوان برای پیادهسازی مدلهای Clean استفاده کرد.
-
View
View باید تنها مسئول نمایش دادهها و دریافت ورودی از کاربر باشد. این بخش باید حداقل منطق را داشته باشد و از لحاظ منطق کسب و کار به صورت کامل به Presenter یا ViewModel وابسته باشد. این امکان را فراهم میکند تا تغییرات در منطق کسب و کار به سرعت اعمال شوند.
-
Intent
Intent به عنوان واسط بین View و Model عمل میکند. این شامل درخواستها و وقایعی است که از طریق View به Model ارسال میشود. Intent باید ساده و بیوابسته به لایههای دیگر باشد. این میتواند به وسیله یک الگوی Observer برای گوش دادن به تغییرات Model استفاده شود.
Clean Architecture
Clean Architecture سعی دارد تا کد را به قسمتهای قابل تست، قابل نگهداری و انعطافپذیر تقسیم کند. این معماری در لایههای مختلف مانند Entities، Use Cases، Interface Adapters و Frameworks & Drivers تقسیم میشود. هر لایه به تعدادی اصل مسئولیت دارد و وابستگیها از لایههای بیرونی به لایههای درونی هستند.
برای اجرای این معماری در اندروید، ممکن است از روشهای مختلفی مانند استفاده از ViewModel یا استفاده از روشهای تزریق وابستگی مثل Dagger استفاده کنید.
مزایا
-
تستپذیری بالا
از طریق جدا سازی لایهها، تست کردن هر قسمت به صورت مستقل و آسانتر میشود.
-
نگهداری آسان
افزایش قابلیت نگهداری از طریق جدا کردن وظایف به لایههای مختلف.
-
انعطافپذیری بیشتر
امکان تغییر در یک لایه بدون تأثیر بر سایر لایهها.
چالشها
-
پیچیدگی اضافی
برخی از پروژهها ممکن است از حد کاربردی این معماری بگذرند و باعث پیچیدگی اضافی شوند.
-
تعداد بیشتری از کلاسها و فایلها
به دلیل تقسیم کد به لایهها، ممکن است تعداد فایلها و کلاسها افزایش یابد.
به طور کلی، استفاده از MVI و Clean Architecture در اندروید میتواند باعث افزایش کیفیت و قابلیت توسعه پروژه شود. البته، باید توجه داشت که هر پروژه ممکن است نیازها و شرایط مختلفی داشته باشد، بنابراین انتخاب معماری باید با توجه به نیازها و اهداف خاص پروژه صورت گیرد.
یک مثال ساده برای درک بهتر معماری Clean در MVI
یک مثال کامل از MVI با استفاده از kotlin ، Coroutines ، Flow و Use Case ارائه خواهم داد. در این مثال از یک برنامه مدیریت لیست کاربران استفاده میشود.
- Model:
// Model data class User(val id: String, val name: String) // Repository class UserRepository { private val userList = mutableListOf<User>() suspend fun addUser(user: User) { // شبیهسازی عملیات ذخیرهسازی delay(500) userList.add(user) } suspend fun getUserList(): List<User> { // شبیهسازی عملیات دریافت اطلاعات از منبع داده delay(500) return userList.toList() } }
- Use Case:
// Use Case class AddUserUseCase(private val userRepository: UserRepository) { suspend fun execute(id: String, name: String) { val newUser = User(id, name) userRepository.addUser(newUser) } }
- View:
// Intent interface UserListIntent { fun onAddUserClicked(id: String, name: String) } // View class UserListView(private val intentListener: UserListIntent) { fun showUserList(userList: List<User>) { // نمایش لیست کاربران در ویو } fun getUserInput(): Pair<String, String> { // دریافت اطلاعات از ورودی کاربر برای افزودن کاربر جدید } fun setIntentListener() { // تنظیم گوش دادن به رویدادها // مثلاً: زمانی که دکمه افزودن کاربر جدید فشرده میشود val (id, name) = getUserInput() intentListener.onAddUserClicked(id, name) } }
- Presenter:
// Presenter class UserListPresenter( private val view: UserListView, private val addUserUseCase: AddUserUseCase ) : UserListIntent { private val _userListState = MutableStateFlow<List<User>>(emptyList()) val userListState: StateFlow<List<User>> = _userListState init { view.setIntentListener(this) observeUserList() } private fun observeUserList() { viewModelScope.launch { userRepository.getUserListFlow() .collect { userList -> _userListState.emit(userList) } } } override fun onAddUserClicked(id: String, name: String) { viewModelScope.launch { addUserUseCase.execute(id, name) } } }
در این مثال، از MutableStateFlow برای نگهداری وضعیت لیست کاربران استفاده شده است. همچنین از viewModelScope برای اجرای عملیات مربوط به Coroutines در ViewModel استفاده شده است.
توجه داشته باشید که در اینجا از delay(500) برای شبیهسازی زمان انجام عملیات (مانند افزودن کاربر یا دریافت لیست) استفاده شده است. در یک برنامه واقعی، شما باید این جا به جای delay از توابع مستقیم دسترسی به پایگاه دادهها یا شبکه استفاده کنید.
در نهایت، این مثال به شما یک الگوی کلی از چگونگی استفاده از MVI، Coroutines، و Flow در یک برنامه اندروید را نشان داد.
حرف آخر
در نتیجه، استفاده از معماری Clean در الگوی Model-View-Intent (MVI) در اندروید به طور گستردهای میتواند به بهبود قابلیت تست، قابل نگهداری، و مقیاسپذیری برنامهها کمک کند. این الگو از اصول Clean Architecture برای جدا کردن لایههای مختلف برنامه و تشویق به استفاده از اصول SOLID در پیادهسازی Model، View، و Intent بهره میبرد. با تلفیق Clean Architecture با ویژگیهای Kotlin، این معماری توانسته است به توسعهدهندگان اندروید یک چارچوب مفید و قدرتمند برای پروژههای متنوع را ارائه دهد. از آنجایی که Clean MVI تلاش میکند تا کد را سازماندهی کرده و از تنشها و وابستگیهای غیرضروری جلوگیری کند، میتواند به بهترین شکل ممکن کیفیت و قابلیت توسعه پروژههای اندرویدی را تضمین کند.
و همچنین ممنون میشم از طریق ستارههای این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.
دیدگاهتان را بنویسید