“ما را در اینستاگرام دنبال کنید”
در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد معماری Clean در Mvvm، صحبت کنیم. پس با سایت ترولرن همراه باش.
“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”
معماری Clean Architecture یک الگوی معماری برای توسعه برنامههای اندروید است که به منظور جدا کردن و مجزا سازی لایههای مختلف برنامه و داشتن یک ساختار قابل تست و قابل تغییر ارائه میشود. این الگو بر اصول SOLID و اصول معماری Clean تأکید دارد.
در معماری Clean Architecture، برنامه به چندین لایه تقسیم میشود که هر لایه وظیفه خاص خود را دارد. این لایهها عبارتند از:
این لایه مسئولیت ارتباط با رابط کاربری و دریافت و ارسال دادهها را دارد. پرزنتر نقش میانی بین لایههای دیگر را ایفا میکند و از لایه دامنه (Domain) جدا شده است.
این لایه شامل قوانین کسب و کار، منطق و عملکرد اصلی برنامه است. در این لایه، موجودیتها، استفادهکنندگان و اصول کسب و کار تعریف میشوند. لایه دامنه باید مستقل از لایههای دیگر و قابل تست باشد.
در این لایه، ارتباط با منابع داده مانند پایگاه داده، فایلها، شبکه و … برقرار میشود. هدف اصلی این لایه، انتزاع و جدا کردن این منابع از سایر لایههاست. لایه داده وابستگی به لایه دامنه دارد و با استفاده از ریپوزیتوریها (Repositories) دادهها را به لایه دامنه ارائه میدهد.
با استفاده از معماری Clean، امکان تست و قابلیت اطمینان بالا در برنامهها فراهم میشود. همچنین، امکان تغییرات در لایههای مختلف بدون تأثیر روی سایر لایهها فراهم میشود. این معماری به توسعهدهندگان کمک میکند تا نگرانیهای فنی را از بین ببرند و بر روی منطق کسب و کار متمرکز شوند.
معماری Clean در ترکیب با الگوی طراحی MVVM (Model-View-ViewModel) مورد استفاده قرار میگیرد، که این ترکیب به عنوان Clean MVVM مشهور است. Clean MVVM یک الگوی معماری برای توسعه برنامههای اندروید است که از تفکیک دقیق بین وظایف لایهها و جدا کردن لگیک کسب و کار از رابط کاربری استفاده میکند.
در Clean MVVM، لایههای معماری Clean (پرزنتر، دامنه و داده) با الگوی طراحی MVVM ترکیب میشوند. الگوی MVVM شامل سه لایه است:
لایه مدل شامل دادهها و منطق کسب و کار است. این لایه به عنوان مدیریت داده و انجام عملیات بر روی آن عمل میکند. مدل مسئولیتهایی مانند دریافت و ذخیره داده را بر عهده دارد.
لایه نمایش مربوط به رابط کاربری است. این لایه مسئول نمایش دادهها و دریافت ورودیهای کاربر است. در این لایه، اکتیویتی (Activity) یا فرگمنت (Fragment) وجود دارد که با کمک دادههایی که از ViewModel دریافت میکند، رابط کاربری را نمایش میدهد.
لایه مدلنما مسئول تبدیل دادهها بین لایه مدل و لایه نمایش است. این لایه، دادههای لازم را از لایه مدل دریافت کرده و به صورت مناسب برای نمایش در رابط کاربری آنها را آماده میکند. همچنین، در صورت نیاز به اعمال تغییرات روی دادهها، این لایه وظیفه انجام آن را به لایه مدل میدهد.
از مزایای استفاده از معماری Clean MVVM میتوان به جدا کردن مسئولیتها، قابلیت تست بالا، قابلیت گسترش و قابلیت نگهداری برنامه اشاره کرد. این معماری به توسعهدهندگان اجازه میدهد تا منطق کسب و کار را از رابط کاربری جدا کنند و تغییرات در هر لایه را به آسانی اعمال کنند. همچنین، الگوی MVVM از Data Binding و LiveData که ابزارهایی برای ایجاد ارتباط میان ViewModel و View هستند، بهره میبرد که توسعه برنامه را سادهتر میکند.
با توجه به معماری Clean، لایه Domain (دامنه) یکی از لایههای اصلی معماری است که مسئولیتهای مهمی را در بر دارد. لایه دامنه به عنوان میانجی بین لایههای داده (Data) و لایههای نمایش (Presentation) عمل میکند و تمرکز اصلی آن در برقراری قواعد کسب و کار و منطق دامنهای برنامه است.
در لایه دامنه، عملکرد و منطق کسب و کار برنامه تعریف میشود. این لایه باید مستقل از جزئیات پیادهسازی فنی، مانند پایگاه داده یا رابط کاربری، باشد و به جای آن، تمرکز خود را بر روی اصول و قواعد کسب و کار دارد.
نمونهای از مسئولیتهای لایه دامنه عبارتند از:
لایه دامنه مسئول تعریف مدلها و انتزاعات مرتبط با دامنه برنامه است. این مدلها باید قوانین مرتبط با دامنه را نشان دهند و تنها اطلاعات مورد نیاز را در بر داشته باشند.
لایه دامنه میتواند قواعد کسب و کار مرتبط با برنامه را تعریف کند. این قواعد میتوانند شامل محاسبات مرتبط با دامنه، محدودیتها، الگوها و سیاستهای کسب و کار باشند.
لایه دامنه میتواند انتزاعاتی را تعریف کند که واسطی بین لایه داده و لایه نمایش هستند. این انتزاعات مسئول برقراری ارتباط با لایه داده برای دریافت و ذخیره دادهها و همچنین به لایه نمایش ارائه دادن دادههای مناسب هستند.
با استفاده از لایه دامنه، جدا سازی مشخص و واضحی بین قواعد کسب و کار و لایههای دیگر معماری Clean ایجاد میشود. این تمرکز بر دامنه به توسعهدهندگان اجازه میدهد تا منطق کسب و کار را به طور مستقل از جزئیات پیادهسازی به راحتی تست و تغییر دهند و برنامه را قابل گسترش و نگهداری کنند.
ابتدا، در لایه دامنه مدلهای دامنه را تعریف میکنیم:
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) طراحی شده است و برای پوشه بندی آن میتوانید به روش زیر عمل کنید:
در این پوشه، فایل اصلی برنامه قرار میگیرد و نیز پوشههای مربوط به لایههای دیگر در این پوشه ایجاد میشوند.
در این پوشه، کدهای مربوط به لایه داده قرار میگیرد. شامل کلاسهای مرتبط با دسترسی به پایگاه داده، شبکه و منابع دادهای دیگر است. میتوانید این پوشه را به زیرمجموعههایی مانند local (برای دسترسی به پایگاه داده محلی) و remote (برای دسترسی به سرویسهای وب) تقسیم کنید.
در این پوشه، کدهای مربوط به لایه دامنه قرار میگیرد. شامل مدلها، قراردادها (interfaces) و UseCase ها است. میتوانید این پوشه را به زیرمجموعههایی مانند models (برای تعریف مدلها) و usecases (برای تعریف UseCase ها) تقسیم کنید.
در این پوشه، کدهای مربوط به لایه نمایش قرار میگیرد. شامل Activity ها، Fragment ها، ViewModel ها و رابط کاربری است. میتوانید این پوشه را به زیرمجموعههایی مانند activities و fragments (برای قرار دادن فعالیتها و فرگمنتها) و viewmodels (برای قرار دادن ViewModel ها) تقسیم کنید.
در این پوشه، کدهای مربوط به Dependency Injection (DI) قرار میگیرد. شامل ماژولها و کدهای مربوط به تنظیم وابستگیها است.
در این پوشه، کدهای کمکی مانند کلاسهای کمکی یا ابزارهای کمکی قرار میگیرد.
این پوشهبندی فقط یک راهنمایی است و شما میتوانید آن را بر اساس نیازهای خود تغییر دهید. هدف اصلی این است که از طریق تفکیک مسئولیتها، کد را سازماندهی کنید و قابلیت خواندن، نگهداری و توسعهپذیری را بهبود دهید.
در نتیجه، معماری Clean یک رویکرد موثر برای سازماندهی و توسعهی نرمافزارهاست. با تفکیک مسئولیتها و استفاده از لایهبندی معماری، کد شما به صورت منظم و قابل نگهداری خواهد بود. این معماری به شما امکان میدهد قوانین کسب و کار را در لایه دامنه متمرکز کنید و تعامل با منابع داده را در لایه داده مدیریت کنید. همچنین، لایه نمایش به شما امکان ارائه اطلاعات به کاربر و دریافت ورودی از او را میدهد. با استفاده از معماری Clean، میتوانید بهبودهای قابل ملاحظهای در خوانایی کد، قابلیت تست و قابلیت توسعه برنامههای خود داشته باشید.
و همچنین ممنون میشم از طریق ستارههای این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.
دوره آموزشی کاتلین پیشرفته میتواند مهارتهای شما را با بهرهگیری از ابزارها و فناوریهای مدرن…
مزیتهای کاتلین نسبت به سایر زبانهای برنامه نویسی اندروید این است که سایر زبانها، از…
بهینهسازی عملکرد اپلیکیشنهای اندروید یکی از مهمترین فاکتورهایی است که برای کاربران در دنیای امروز…
مصاحبهی استخدامی کاتلین یک فرصت برای ارزیابی مهارتها و تواناییهای یک برنامهنویس در توسعه اپلیکیشنهای…
مصاحبه استخدام زبان کاتلین یک فرصت برای ارزیابی مهارتها و تواناییهای یک برنامهنویس در توسعه…
مصاحبه استخدام کاتلین یک فرصت برای ارزیابی مهارتها و تواناییهای یک برنامهنویس در توسعه اپلیکیشنهای…