مقالات

آموزش معماری 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 تلاش می‌کند تا کد را سازماندهی کرده و از تنش‌ها و وابستگی‌های غیرضروری جلوگیری کند، می‌تواند به بهترین شکل ممکن کیفیت و قابلیت توسعه پروژه‌های اندرویدی را تضمین کند.

و همچنین ممنون میشم از طریق ستاره‌های این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.

‫0/5 ‫(0 نظر)
عاطفه امیری

Recent Posts

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

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

4 ماه ago

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

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

4 ماه ago

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

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

4 ماه ago

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

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

5 ماه ago

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

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

5 ماه ago

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

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

5 ماه ago