مقالات

آموزش معماری Clean در Mvvm – ترولرن

معماری Clean در Mvvm بر اساس اصول تفکیک مسئولیت طراحی شده است و به شما کمک می‌کند تا کدهایتان را به قسمت‌های جداگانه و مستقل تقسیم کنید. این معماری شامل سه لایه اصلی است: لایه دامنه (Domain Layer)، لایه داده (Data Layer) و لایه نمایش (Presentation Layer).

 

 

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

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

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

معماری Clean در اندروید

معماری Clean Architecture یک الگوی معماری برای توسعه برنامه‌های اندروید است که به منظور جدا کردن و مجزا سازی لایه‌های مختلف برنامه و داشتن یک ساختار قابل تست و قابل تغییر ارائه می‌شود. این الگو بر اصول SOLID و اصول معماری Clean تأکید دارد.

در معماری Clean Architecture، برنامه به چندین لایه تقسیم می‌شود که هر لایه وظیفه خاص خود را دارد. این لایه‌ها عبارتند از:

  • لایه پرزنتر (Presenter)

این لایه مسئولیت ارتباط با رابط کاربری و دریافت و ارسال داده‌ها را دارد. پرزنتر نقش میانی بین لایه‌های دیگر را ایفا می‌کند و از لایه دامنه (Domain) جدا شده است.

  • لایه دامنه (Domain)

این لایه شامل قوانین کسب و کار، منطق و عملکرد اصلی برنامه است. در این لایه، موجودیت‌ها، استفاده‌کنندگان و اصول کسب و کار تعریف می‌شوند. لایه دامنه باید مستقل از لایه‌های دیگر و قابل تست باشد.

  • لایه داده (Data)

در این لایه، ارتباط با منابع داده مانند پایگاه داده، فایل‌ها، شبکه و … برقرار می‌شود. هدف اصلی این لایه، انتزاع و جدا کردن این منابع از سایر لایه‌هاست. لایه داده وابستگی به لایه دامنه دارد و با استفاده از ریپوزیتوری‌ها (Repositories) داده‌ها را به لایه دامنه ارائه می‌دهد.

با استفاده از معماری Clean، امکان تست و قابلیت اطمینان بالا در برنامه‌ها فراهم می‌شود. همچنین، امکان تغییرات در لایه‌های مختلف بدون تأثیر روی سایر لایه‌ها فراهم می‌شود. این معماری به توسعه‌دهندگان کمک می‌کند تا نگرانی‌های فنی را از بین ببرند و بر روی منطق کسب و کار متمرکز شوند.

معماری Clean در Mvvm

معماری Clean در ترکیب با الگوی طراحی MVVM (Model-View-ViewModel) مورد استفاده قرار می‌گیرد، که این ترکیب به عنوان Clean MVVM مشهور است. Clean MVVM یک الگوی معماری برای توسعه برنامه‌های اندروید است که از تفکیک دقیق بین وظایف لایه‌ها و جدا کردن لگیک کسب و کار از رابط کاربری استفاده می‌کند.

در Clean MVVM، لایه‌های معماری Clean (پرزنتر، دامنه و داده) با الگوی طراحی MVVM ترکیب می‌شوند. الگوی MVVM شامل سه لایه است:

  • مدل (Model)

لایه مدل شامل داده‌ها و منطق کسب و کار است. این لایه به عنوان مدیریت داده و انجام عملیات بر روی آن عمل می‌کند. مدل مسئولیت‌هایی مانند دریافت و ذخیره داده را بر عهده دارد.

  • نمایش (View)

لایه نمایش مربوط به رابط کاربری است. این لایه مسئول نمایش داده‌ها و دریافت ورودی‌های کاربر است. در این لایه، اکتیویتی (Activity) یا فرگمنت (Fragment) وجود دارد که با کمک داده‌هایی که از ViewModel دریافت می‌کند، رابط کاربری را نمایش می‌دهد.

  • مدل‌نما (ViewModel)

لایه مدل‌نما مسئول تبدیل داده‌ها بین لایه مدل و لایه نمایش است. این لایه، داده‌های لازم را از لایه مدل دریافت کرده و به صورت مناسب برای نمایش در رابط کاربری آن‌ها را آماده می‌کند. همچنین، در صورت نیاز به اعمال تغییرات روی داده‌ها، این لایه وظیفه انجام آن را به لایه مدل می‌دهد.

از مزایای استفاده از معماری Clean MVVM می‌توان به جدا کردن مسئولیت‌ها، قابلیت تست بالا، قابلیت گسترش و قابلیت نگهداری برنامه اشاره کرد. این معماری به توسعه‌دهندگان اجازه می‌دهد تا منطق کسب و کار را از رابط کاربری جدا کنند و تغییرات در هر لایه را به آسانی اعمال کنند. همچنین، الگوی MVVM از Data Binding و LiveData که ابزارهایی برای ایجاد ارتباط میان ViewModel و View هستند، بهره می‌برد که توسعه برنامه را ساده‌تر می‌کند.

لایه Domain

با توجه به معماری Clean، لایه Domain (دامنه) یکی از لایه‌های اصلی معماری است که مسئولیت‌های مهمی را در بر دارد. لایه دامنه به عنوان میانجی بین لایه‌های داده (Data) و لایه‌های نمایش (Presentation) عمل می‌کند و تمرکز اصلی آن در برقراری قواعد کسب و کار و منطق دامنه‌ای برنامه است.

در لایه دامنه، عملکرد و منطق کسب و کار برنامه تعریف می‌شود. این لایه باید مستقل از جزئیات پیاده‌سازی فنی، مانند پایگاه داده یا رابط کاربری، باشد و به جای آن، تمرکز خود را بر روی اصول و قواعد کسب و کار دارد.

نمونه‌ای از مسئولیت‌های لایه دامنه عبارتند از:

  • تعریف مدل‌ها و انتزاعات

لایه دامنه مسئول تعریف مدل‌ها و انتزاعات مرتبط با دامنه برنامه است. این مدل‌ها باید قوانین مرتبط با دامنه را نشان دهند و تنها اطلاعات مورد نیاز را در بر داشته باشند.

  • قواعد کسب و کار

لایه دامنه می‌تواند قواعد کسب و کار مرتبط با برنامه را تعریف کند. این قواعد می‌توانند شامل محاسبات مرتبط با دامنه، محدودیت‌ها، الگوها و سیاست‌های کسب و کار باشند.

  • انتزاعات

لایه دامنه می‌تواند انتزاعاتی را تعریف کند که واسطی بین لایه داده و لایه نمایش هستند. این انتزاعات مسئول برقراری ارتباط با لایه داده برای دریافت و ذخیره داده‌ها و همچنین به لایه نمایش ارائه دادن داده‌های مناسب هستند.

با استفاده از لایه دامنه، جدا سازی مشخص و واضحی بین قواعد کسب و کار و لایه‌های دیگر معماری Clean ایجاد می‌شود. این تمرکز بر دامنه به توسعه‌دهندگان اجازه می‌دهد تا منطق کسب و کار را به طور مستقل از جزئیات پیاده‌سازی به راحتی تست و تغییر دهند و برنامه را قابل گسترش و نگهداری کنند.

 

 

یک مثال ساده برای درک بهتر معماری Clean در Mvvm

ابتدا، در لایه دامنه مدل‌های دامنه را تعریف می‌کنیم:

data class User(val id: String, val name: String, val email: String)

سپس، قراردادهای لایه دامنه را تعریف می‌کنیم. این قراردادها انتزاعاتی هستند که لایه داده و لایه نمایش براساس آنها ارتباط برقرار می‌کنند:

interface UserRepository {
    suspend fun getUsers(): List<User>
}

interface UserUseCase {
    suspend fun getUsers(): List<User>
}

سپس، در لایه دامنه، از قراردادهای لایه دامنه استفاده می‌کنیم و UseCase را تعریف می‌کنیم:

class UserUseCaseImpl(private val userRepository: UserRepository) : UserUseCase {
    override suspend fun getUsers(): List<User> {
        return userRepository.getUsers()
    }
}

در نهایت، در لایه نمایش، از UseCase برای دریافت کاربران استفاده می‌کنیم:

class UserViewModel(private val userUseCase: UserUseCase) : ViewModel() {
    private val _users = mutableStateOf<List<User>>(emptyList())
    val users: State<List<User>> = _users

    fun loadUsers() {
        viewModelScope.launch {
            try {
                val userList = userUseCase.getUsers()
                _users.value = userList
            } catch (e: Exception) {
                // مدیریت خطا
            }
        }
    }
}

در این مثال، لایه دامنه شامل قراردادها و UseCase است و UseCase از UserRepository در لایه داده استفاده می‌کند. در لایه نمایش، از UserUseCase برای دریافت کاربران استفاده می‌کنیم. این نحوه استفاده از لایه دامنه در مثال قبل را کامل می‌کند و به معماری Clean در MVVM با استفاده از Kotlin و Compose نزدیکتر است.

نحوه پوشه بندی این معماری چطور است؟

معماری Clean بر اساس اصول تفکیک مسئولیت (Separation of Concerns) طراحی شده است و برای پوشه بندی آن می‌توانید به روش زیر عمل کنید:

  • پوشه‌ی app

در این پوشه، فایل اصلی برنامه قرار می‌گیرد و نیز پوشه‌های مربوط به لایه‌های دیگر در این پوشه ایجاد می‌شوند.

  • پوشه‌ی data

در این پوشه، کدهای مربوط به لایه داده قرار می‌گیرد. شامل کلاس‌های مرتبط با دسترسی به پایگاه داده، شبکه و منابع داده‌ای دیگر است. می‌توانید این پوشه را به زیرمجموعه‌هایی مانند local (برای دسترسی به پایگاه داده محلی) و remote (برای دسترسی به سرویس‌های وب) تقسیم کنید.

  • پوشه‌ی domain

در این پوشه، کدهای مربوط به لایه دامنه قرار می‌گیرد. شامل مدل‌ها، قراردادها (interfaces) و UseCase ها است. می‌توانید این پوشه را به زیرمجموعه‌هایی مانند models (برای تعریف مدل‌ها) و usecases (برای تعریف UseCase ها) تقسیم کنید.

  • پوشه‌ی presentation

در این پوشه، کدهای مربوط به لایه نمایش قرار می‌گیرد. شامل Activity ها، Fragment ها، ViewModel ها و رابط کاربری است. می‌توانید این پوشه را به زیرمجموعه‌هایی مانند activities و fragments (برای قرار دادن فعالیت‌ها و فرگمنت‌ها) و viewmodels (برای قرار دادن ViewModel ها) تقسیم کنید.

  • پوشه‌ی di

در این پوشه، کدهای مربوط به Dependency Injection (DI) قرار می‌گیرد. شامل ماژول‌ها و کدهای مربوط به تنظیم وابستگی‌ها است.

  • پوشه‌ی utils

در این پوشه، کدهای کمکی مانند کلاس‌های کمکی یا ابزارهای کمکی قرار می‌گیرد.

این پوشه‌بندی فقط یک راهنمایی است و شما می‌توانید آن را بر اساس نیازهای خود تغییر دهید. هدف اصلی این است که از طریق تفکیک مسئولیت‌ها، کد را سازماندهی کنید و قابلیت خواندن، نگهداری و توسعه‌پذیری را بهبود دهید.

حرف آخر

در نتیجه، معماری Clean یک رویکرد موثر برای سازماندهی و توسعه‌ی نرم‌افزارهاست. با تفکیک مسئولیت‌ها و استفاده از لایه‌بندی معماری، کد شما به صورت منظم و قابل نگهداری خواهد بود. این معماری به شما امکان می‌دهد قوانین کسب و کار را در لایه دامنه متمرکز کنید و تعامل با منابع داده را در لایه داده مدیریت کنید. همچنین، لایه نمایش به شما امکان ارائه اطلاعات به کاربر و دریافت ورودی از او را می‌دهد. با استفاده از معماری Clean، می‌توانید بهبودهای قابل ملاحظه‌ای در خوانایی کد، قابلیت تست و قابلیت توسعه برنامه‌های خود داشته باشید.

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

 

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

Recent Posts

چگونه دوره آموزشی کاتلین پیشرفته می‌تواند مهارت‌های شما را ارتقاء دهد؟

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

4 ماه ago

مزیت‌های کاتلین نسبت به سایر زبان‌های برنامه نویسی اندروید

مزیت‌های کاتلین نسبت به سایر زبان‌های برنامه نویسی اندروید این است که سایر زبان‌ها، از…

4 ماه ago

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

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

10 ماه ago

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

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

10 ماه ago

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

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

10 ماه ago

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

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

11 ماه ago