مقالات

مقایسه معماری های MVVM و MVI در اندروید– ترولرن

معماری های MVVM و MVI هر دو مدل‌های معماری برنامه‌نویسی هستند که برای توسعه برنامه‌های اندروید استفاده می‌شوند.، هرکدام با ویژگی‌ها و مزایا خاص خود.هرکدام از این مدل‌ها مزایا و چالش‌های خود را دارند و انتخاب بین آنها بستگی به نیازها و ترجیحات پروژه متغیر است. در ادامه، به مقایسه این دو معماری خواهیم پرداخت.

 

 

“ما را در اینستاگرام دنبال کنید”

در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد مقایسه معماری های MVVM و MVI ،صحبت کنیم. پس با سایت ترولرن همراه باش.

“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”

مقایسه معماری های MVVM و MVI در اندروید

توسعه برنامه‌های اندروید نیازمند انتخاب یک معماری موثر و مناسب است. دو مدل شناخته شده در این زمینه MVVM (Model-View-ViewModel) و MVI (Model-View-Intent) هستند. در ادامه، به مقایسه این دو مدل معماری خواهیم پرداخت.

MVVM (Model-View-ViewModel)

  •  Model (مدل):

MVVM، مسئولیت نگهداری داده‌ها و انجام عملیات مربوط به داده را به Model اختصاص می‌دهد. این کلاس نیز وضعیت برنامه را نگه داری می‌کند.

  •  View (نما):

نما در MVVM نمایش اطلاعات به کاربر و دریافت ورودی‌ها را بر عهده دارد. این بخش بیشترین وظایف گرافیکی و نمایشی را انجام می‌دهد.

  •  ViewModel (مدل-نما):

ViewModel به عنوان میانجی بین Model و View عمل می‌کند. این کلاس مسئول اعلان تغییرات در داده‌ها به View است و از مکانیزم‌هایی مانند LiveData یا RxJava برای اطلاع از تغییرات استفاده می‌کند.

  • Binding (پیوند):

MVVM از Data Binding یا مکانیزم‌های مشابه برای پیوند مستقیم داده‌ها بین Model و View استفاده می‌کند.

 

 

MVI (Model-View-Intent)

  • Model (مدل):

مدل در MVI مشابه MVVM عمل می‌کند اما با تأکید بر یکپارچگی بیشتر و مدیریت یکپارچه‌تر وضعیت برنامه.

  •  View (نما):

View در MVI تنها وظیفه نمایش و دریافت ورودی‌ها را دارد و اطلاعات جاری را از Model درخواست می‌دهد.

  •  Intent (اراده):

Intent نمایانگر اقدامات کاربر است که به Model ارسال می‌شود. این اقدامات از طریق Intent به Model ارسال شده و سپس وضعیت به‌روزرسانی می‌شود.

  •  Unidirectional Data Flow (جریان داده یک‌سو):

MVI با تأکید بر جریان داده یک‌سو و یکپارچگی، مدیریت وضعیت را ساده‌تر می‌کند و داده از Model به View وارد شده و اطلاعات از View به Model نمی‌رود.

 

 

مقایسه

  • پیچیدگی

MVVM ممکن است پیچیدگی بیشتری داشته باشد به دلیل وجود دومین‌هایی مانند ViewModel و Binding. MVI با تاکید بر یکپارچگی بیشتر ممکن است ساده‌تر باشد.

  • مدیریت وضعیت

MVVM معمولاً از LiveData یا RxJava برای مدیریت وضعیت استفاده می‌کند. MVI با تأکید بر جریان داده یک‌سو و یکپارچگی، مدیریت وضعیت را ساده‌تر می‌کند.

  • تست‌پذیری

MVI به دلیل ساختار یکپارچه‌تر و جریان داده یک‌سو، تست‌پذیری بهتری دارد. MVVM نیز تست‌پذیر است اما ممکن است به دلیل پیچیدگی بیشتر، نیاز به تلاش بیشتری داشته باشد.

مثال برای معماری MVVM (Model-View-ViewModel) با زبان کاتلین

در MVVM، بیایید یک نمونه ساده از یک لیست محصول با استفاده از Android ViewModel و LiveData ایجاد کنیم.

Model:

data class Product(val id: Int, val name: String, val price: Double)

ViewModel:

class ProductViewModel : ViewModel() {
    private val _products = MutableLiveData<List<Product>>()
    val products: LiveData<List<Product>> get() = _products

    init {
        // در اینجا ممکن است اطلاعات از یک منبع داده خارجی گرفته شود
        loadProducts()
    }

    private fun loadProducts() {
        // شبیه‌سازی دریافت اطلاعات از یک منبع داده خارجی
        val productList = listOf(
            Product(1, "محصول 1", 29.99),
            Product(2, "محصول 2", 39.99),
            Product(3, "محصول 3", 49.99)
        )

        _products.value = productList
    }
}

View:

class ProductActivity : AppCompatActivity() {
    private lateinit var productViewModel: ProductViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_product)

        productViewModel = ViewModelProvider(this).get(ProductViewModel::class.java)

        val productAdapter = ProductAdapter()

        val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = productAdapter

        productViewModel.products.observe(this, Observer {
            productAdapter.submitList(it)
        })
    }
}

مثال برای معماری MVI (Model-View-Intent) با زبان کاتلین

حالا به عنوان یک مثال از MVI، یک سناریو ساده مثل افزودن محصول به سبد خرید را بررسی می‌کنیم.

Model:

data class ShoppingCart(val products: MutableList<Product> = mutableListOf())

View:

class ShoppingCartActivity : AppCompatActivity() {
    private lateinit var viewModel: ShoppingCartViewModel
    private val productAdapter = ProductAdapter()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_shopping_cart)

        viewModel = ViewModelProvider(this).get(ShoppingCartViewModel::class.java)

        val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = productAdapter

        viewModel.state.observe(this, Observer { state ->
            productAdapter.submitList(state.products)
        })

        val addButton: Button = findViewById(R.id.add_button)
        addButton.setOnClickListener {
            viewModel.processIntent(ShoppingCartIntent.AddProduct(Product(4, "محصول 4", 59.99)))
        }
    }
}

Intent:

sealed class ShoppingCartIntent {
    data class AddProduct(val product: Product) : ShoppingCartIntent()
}

ViewModel:

class ShoppingCartViewModel : ViewModel() {
    private val _state = MutableLiveData<ShoppingCart>()
    val state: LiveData<ShoppingCart> get() = _state

    init {
        _state.value = ShoppingCart()
    }

    fun processIntent(intent: ShoppingCartIntent) {
        when (intent) {
            is ShoppingCartIntent.AddProduct -> addProduct(intent.product)
        }
    }

    private fun addProduct(product: Product) {
        val currentState = _state.value ?: return
        val updatedProducts = currentState.products.toMutableList().apply { add(product) }
        _state.value = currentState.copy(products = updatedProducts)
    }
}

در این مثال، MVVM برای نمایش یک لیست محصولات استفاده شده است، در حالی که MVI برای مدیریت وضعیت یک سبد خرید و افزودن محصول به آن استفاده شده است. هرکدام از معماری‌ها دارای الگوها و استفاده‌های خاص به نیازهای پروژه می‌پردازند.

نتیجه‌گیری

انتخاب بین MVVM و MVI بستگی به نیازها و ترجیحات پروژه دارد. MVVM با ابزارهایی مانند Data Binding ارتباط بین View و ViewModel را سهل‌تر می‌کند، درحالی‌که MVI با تاکید بر یکپارچگی و جریان داده یک‌سو، مدیریت وضعیت را ساده‌تر می‌کند. هر دو مدل معماری مزایا و معایب خود را دارند و انتخاب بین آنها نیازمند توجه به جزئیات پروژه و تجربه توسعه‌دهنده است.

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

 

 

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

Recent Posts

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

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

4 ماه ago

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

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

4 ماه ago

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

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

4 ماه ago

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

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

5 ماه ago

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

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

5 ماه ago

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

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

5 ماه ago