Koin vs dagger 2 vs Hilt: از کدام یک باید استفاده کنیم؟ ☕

آیا تا به حال در مورد تزریق وابستگی شنیده اید؟ اگر قبلاً آن را نشنیده اید ، بیایید تزریق وابستگی (DI) را به ساده ترین روش ممکن تجزیه کنیم.
تصور کنید که در حال ساختن یک دستگاه قهوه هستید. به جای اینکه دستگاه لوبیای قهوه و آب خود را ایجاد کند ، آنها را از خارج تهیه می کنید. به این ترتیب ، می توانید به راحتی انواع مختلف لوبیا یا منابع آب را بدون بازسازی کل دستگاه عوض کنید.
در برنامه نویسی ، تزریق وابستگی (DI) به همان روش کار می کند. به جای اینکه یک کلاس وابستگی های خاص خود را ایجاد کند ، از بیرون تزریق می شوند. این باعث می شود کد شما انعطاف پذیرتر ، قابل آزمایش و مدیریت آسان تر شود. چارچوب های اندرویدی مانند خنجر 2با چلوبوت سکه به خودکار سازی این روند کمک کنید ، بنابراین لازم نیست همه چیز را به صورت دستی منتقل کنید.
این سه چارچوب محبوب DI هستند که در توسعه اندرویدی مورد استفاده قرار می گیرند. آنها به مدیریت ایجاد شیء و وضوح وابستگی کمک می کنند ، و باعث می شود کد پاک کننده ، مدولار تر و نگهداری آن آسان تر شود. بیایید عمیق در میان این سه مورد غرق شویم و آنها را با عملکرد ، قابلیت استفاده و پشتیبانی جامعه مقایسه کنیم.
عمل
هنگام مقایسه Koin ، Dagger 2 و Hilt برای تزریق وابستگی در توسعه اندرویدی ، عملکرد نقش اساسی دارد. Dagger 2 یک چارچوب تزریق وابستگی در زمان کامپایل است ، به این معنی که در زمان ساخت کد ایجاد می کند و منجر به عملکرد بهینه زمان اجرا با حداقل سربار می شود. Hilt ، که در بالای Dagger 2 ساخته شده است ، ضمن ساده سازی تنظیمات خود ، همان مزایای زمان کامپایل را حفظ می کند. از طرف دیگر ، Koin یک چارچوب تزریق وابستگی به زمان اجرا است که از یاکنندگان بازتاب و خدمات استفاده می کند و آن را کمی کندتر از Dagger 2 و Hilt ، به ویژه در برنامه های در مقیاس بزرگ ، می کند. در حالی که تفاوت ممکن است برای برنامه های کوچکتر قابل توجه نباشد ، می تواند عملکرد را در نمودارهای وابستگی پیچیده تر تأثیر بگذارد.
بگذارید بگوییم ما یک برنامه “سلام جهان” را با استفاده از آنها نشان می دهیم و این نتیجه است:
از تصویر بالا می توانیم نتیجه بگیریم:
-
سکه: زمان کامپایل Koin سریعترین است زیرا در درجه اول به بازتاب کوتلین متکی است و شامل تولید کد گسترده نمی شود.
-
خنجر 2: زمان کامپایل Dagger 2 به دلیل فرآیند تولید کد ، حتی برای یک برنامه ساده ، به طور قابل توجهی طولانی تر است.
-
چلوب: هیلت ، که در Dagger 2 ساخته شده است ، همچنین شامل تولید کد است ، اما اغلب برای اندروید بهینه تر است و ممکن است زمان کامپایل کمی سریعتر از Raw Dagger 2 در یک پروژه بسیار کوچک داشته باشد.
قابلیت استفاده
از نظر قابلیت استفاده ، Koin ساده ترین اجرای است و به حداقل کد دیگ بخار با DSL ساده برای تعریف وابستگی نیاز دارد. Dagger 2 به دلیل رویکرد مبتنی بر حاشیه نویسی پیچیده تر است و نیاز به دانش مؤلفه ها ، ماژول ها و کد تولید شده دارد. هیلت با معرفی حاشیه نویسی مانند ، پیچیدگی Dagger 2 را ساده می کند @HiltAndroidApp
وت @Inject
، مدیریت تزریق وابستگی در حالی که هنوز هم از اعتبار سنجی کامپایل استفاده می کند ، آسانتر می شود.
پشتیبانی و مستندات جامعه
با توجه به پشتیبانی و مستندات جامعه ، Dagger 2 سالهاست که در اکوسیستم اندرویدی به طور گسترده ای پذیرفته شده است و مستندات گسترده ای دارد. هیلت ، به عنوان یک کتابخانه رسمی Androidx ، از پشتوانه قوی Google و راهنماهای جامع بهره می برد. Koin ، در حالی که در بین توسعه دهندگان کوتلین محبوب است ، جامعه ای کوچکتر اما رو به رشد دارد. مستندات آن واضح است اما به اندازه پیشنهادات Google گسترده نیست. در نهایت ، Dagger 2 و Hilt برای پروژه های حساس به عملکرد و در مقیاس بزرگ ترجیح داده می شوند ، در حالی که Koin یک انتخاب عالی برای توسعه دهندگان است که به دنبال سادگی و ادغام سریع تر هستند.
در زیر اجرای مثال Koin ، Dagger 2 و Hilt:
اجرای کوین
// Define a module
val appModule = module {
single { UserRepository() }
}
// Start Koin
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
modules(appModule)
}
}
}
// Inject dependency
class MyViewModel(private val repository: UserRepository)
اجرای خنجر 2
// Define a module
@Module
class AppModule {
@Provides
fun provideUserRepository(): UserRepository {
return UserRepository()
}
}
// Define a component
@Component(modules = [AppModule::class])
interface AppComponent {
fun inject(activity: MainActivity)
}
// Inject dependency
class MainActivity : AppCompatActivity() {
@Inject lateinit var repository: UserRepository
}
اجرای هیلت
// Define a module
@InstallIn(SingletonComponent::class)
@Module
object AppModule {
@Provides
fun provideUserRepository(): UserRepository {
return UserRepository()
}
}
// Inject dependency
@HiltAndroidApp
class MyApplication : Application()
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var repository: UserRepository
}
عاقلانه انتخاب کنید که از چه چارچوبی می خواهید استفاده کنید ، این سه گانه دارای جوانب مثبت و منفی هستند. شما می توانید آن را بر اساس نیاز خود انتخاب و پیاده سازی کنید. برنامه نویسی مبارک 🙂
مستندات:
خنجر 2
چلوب
سکه