کوین (Koin) چیست؟ Dependency Injection در فریمورک کوین کاتلین

  • حسین کرمی
  • 25 اسفند 1400
Dependency Injection with koin framework

در این مقاله، شما یاد خواهید گرفت که تزریق وابستگی (Dependecy Injection) چیست، اهمیت آن در اپلیکیشن‌های اندرویدی چقدر است، چه روش‌های برای انجام تزریق وابستگی (DI) وجود دارد و اینکه چگونه از تزریق وابستگی در اپلیکیشن‌های اندرویدی استفاده کنیم.

ممکن است به این مقاله علاقه‌مند باشید: توسعه اپلیکیشن موبایل با کاتلین یا فلاتر؟

مفهوم تزریق وابستگی (Dependency Injection)

برای درک بهتر مفهوم وابستگی در برنامه‌نویسی، اجازه دهید دو کلاس A و B را در نظر بگیریم که به شکل زیر تعریف شده است:

class A { var b: B? = null } class B {}

به کد بالا دقت کنید. همانطور که می‌بینید، کلاس A به کلاس B وابسته است و هرگونه تغییر در کلاس B می‌تواند کلاس A را نیز تحت تاثیر خود قرار دهد.

این روش تعریف کلاس A می‌تواند مشکلاتی به همراه داشته باشد:

  • اگر تغییری در سازنده (Constructor) کلاس B اتفاق بیفتد، کلاس A را نیز باید تغییر دهیم و هر کجا که از کلاس B استفاده شده باشد، باید آن‌ها را به روز‌رسانی کنیم تا مشکل کد ما حل شود
  • حتما باید برای متغیر b فقط از کلاس B استفاده کنیم و نمی‌توانیم از کلاس دیگری به جای آن استفاده کنیم

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

 

تزریق وابستگی (Dependecy Injection) چیست؟

برای حل مشکل وابستگی کلاس‌ها از مفهوم تزریق وابستگی (DI) استفاده می‌کنند. Dependency Injection تکنیکی است که امکان ایجاد یک شی وابسته در خارج از کلاس را فراهم می کند و آن را به روش های مختلف در دسترس کلاس قرار می‌دهد. به کمک این روش وابستگی‌ها در جایی خارج از کلاس اصلی تعریف می‌شود و بنابراین هرگونه تغییر در آن کلاس موجب تغییر در کلاس وابسته نخواهد شد. از این فریمورک می‌توان در پلتفرم‌های مختلف مانند پروژه اندروید و Ktor استفاده کرد.

بیشتر بخوانید: کاربرد Ktor در کاتلین چیست؟

 

فریمورک Kotlin Koin چیست؟

حال که به اهمیت تزریق وابستگی پی بردیم، می‌توانیم به کمک فریمورک‌های مختلفی این کار را انجام دهیم. یکی از فریمورک‌های پر‌طرفدار Koin است. کوین یک DSL کم حجم، ساده و آسان برای یادگیری است. این فریمورک بسیار هوشمند و قوی ساخته شده است و به برنامه‌نویسان کمک می‌کند که به ساده‌ترین روش Dependency Injection را به کمک زبان کاتلین انجام دهند.

بیشتر بخوانید: Coroutines چیست؟ آموزش کوروتین در اندروید

 

مقایسه Koin با Dagger

همانطور که احتمالا می‌دانید، Dagger نیز یک DI در زبان جاوا است که استفاده‌های بسیار گسترده‌ای در این زبان دارد. واقعیت این است که هر فریمورکی معایب و مزایای خود را دارد و این دو فریمورک نیز از این قاعده مستثنا نیستند و هر کدام کاستی‌هایی را به همراه دارد. از نظر من استفاده از Koin می‌تواند بسیار راحت‌تر و ساده‌تر باشد. کدنویسی به کمک فریمورک کم حجم Koin بسیار ساده‌تر از Dagger است. برای نوشتن یک تزریق وابستگی ساده در Dagger باید کد بسیار زیادی نسبت به Koin بنویسید. همچنین Koin کد اضافی نیز تولید نمی‌کند. بنابراین پیشنهاد می‌کنیم از Koin به جای Dagger استفاده کنید.

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

بیشتر بخوانید: آموزش اندروید استودیو (Android Studio)

 

مراحل پیاده‌سازی Kotlin Koin

 

1. افزودن وابستگی‌های مورد به gradle

ابتدا Dependecy‌های مورد نیاز را به پروژه اضافه کنید. توجه داشته باشید که برای دانلود این وابستگی‌ها باید از repository (مخزن) mavenCentral استفاده کنید.

// Koin Core features implementation "io.insert-koin:koin-core:$koin_version" // Koin Test features testImplementation "io.insert-koin:koin-test:$koin_version"
// Koin main features for Android implementation "io.insert-koin:koin-android:$koin_version" // No more koin-android-viewmodel, koin-android-scope, koin-android-fragment // Java Compatibility implementation "io.insert-koin:koin-android-compat:$koin_version" // Jetpack WorkManager implementation "io.insert-koin:koin-androidx-workmanager:$koin_version" // Navigation Graph implementation "io.insert-koin:koin-androidx-navigation:$koin_version" // Jetpack Compose implementation "io.insert-koin:koin-androidx-compose:$koin_version"
// Koin for Ktor implementation "io.insert-koin:koin-ktor:$koin_version" // SLF4J Logger implementation "io.insert-koin:koin-logger-slf4j:$koin_version"

 

2. تعریف کلاس‌ها و وابستگی‌ها

اکنون کلاس‌های اصلی و وابسته خود را تعریف کنید. ما از این تعاریف کلاس‌ها استفاده می‌کنیم که Student را به Course وابسته می‌کند.

class Student(private val course: Course) { fun doWork(): String = "task: ${course.study()}" } class Course { fun study(): String = "I am studying..." }

 

3. تعریف ماژول Koin

کوین از ماژول‌ها برای تعریف وابستگی‌ها استفاده می‌کند. یک ماژول به شکل زیر بسازید:

val appModule = module { single { Course() } factory { Student(get()) } }
  • تابع module همانطور که از اسمش پیداست، برای ساخت یک ماژول استفاده می‌شود
  • single برای ساخت یک singleton استفاده می‌شود. به این معنا که فقط یکبار از آن آبجکت ساخته می‌شود و هر کجا که نیاز به بازگرداندن آن باشد، همان را برمی‌گرداند و یک آبجکت جدید برای آن ایجاد نمی‌کند
  • تابع factory برعکس تابع single، وظیفه ساخت instance‌های جدید در هر زمانی که نیاز به بازگردانی یک آبجکت از آن کلاس باشد را انجام می‌دهد. به زبان ساده، هر زمان که آبجکتی از آن کلاس در factory خواسته شود، یک آبجکت جدید (instance) برای آن ساخته می‌شود و بازگردانی می‌شود.

 

4. اجرای Koin

اجرای Koin بسیار ساده است. کافیست کد زیر را در کلاس اصلی اپلیکیشن خود صدا بزنید:

startKoin(this, listOf(appModule))

 

اجرای Koin در پروژه اندروید (اندروید استودیو)
برای تعریف appModule و همچنین اجرای Koin در اندروید، کافیست این کد را در کلاس Application که اصلی‌ترین کلاس شما در پروژه است و وظیفه نگهداری اکتیویتی‌ها و سرویس‌ها و سایر تنظیمات کلی اپلیکیشن را دارد، قرار دهید.

 

ما از تابع startKoin برای شروع کار Koin استفاده کردیم. تمام شد! حال می‌توانید به راحتی آبجکتی از کلاس Student را به شکل زیر بسازیم:

val student: Student by inject() binding.student.text = student.doWork()

 

نتیجه گیری

در این مقاله، با مفهوم Dependency Injection آشنا شدیم و با فریمورک Koin که یک فریمورک تزریق وابستگی به زبان کاتلین است، آشنا شدیم. ما متوجه شدیم که چقدر استفاده و کار با فریمورک کوین آسان است. همچنین متوجه شدیم که Dependency Injection چگونه می‌تواند به ما در ساخت اپلیکیشن‌های با ثبات‌تر کمک کند. Koin یک فریمورک بسیار کم حجم و ساده در یادگیری است که می‌تواند در توسعه اپلیکیشن‌های شما کمک بسزایی کند. ما در این مقاله مبانی استفاده از کوین را توضیح دادیم و امیدواریم در آینده بتوانید از قابلیت‌های آن در پروژه‌های خود استفاده کنید.

1 نظر
در بحث پیرامون این مقاله شرکت کنید...
ارسال نظر :
پاسخ به