طی چند تا پُست قراره به زبان روان و خودمانی بیاموزیم چطور دَگِر رو در پروژه اندروید خودمون بیاریم؟
زبان استفاده شده در این آموزش کاتلین هست و همه چیز در این آموزش از این کُدلب گوگل اومده! پس اگر زبانتون خوبه پیشنهاد میکنم کُدلب اصلی رو بخونید وگرنه همین پست رو ادامه بدید.
بهتره اشاره کنم که بیشتر بخشها ترجمه مستقیم نیست و برداشت خود من از مفاهیمه.
پس با من همراه بشید.
قبل از آنکه بخواهید با دَِگر آشنا بشید باید با مفهوم تزریق وابستگی یا دِپندِنسی اینجکشن-Dependency Injection آشنا بشید، سپس در مورد یکی از ابزارهای این کار که دَگِر - Dagger هست صحبت خواهیم کرد. ازین پس بجای عبارت تزریق وابستگی(Dependency Injection) از اختصار آن یعنی DI در این نوشتار استفاده خواهم کرد.
در دنیای نرم افزار، وابستگی به این معنی هست که کلاس A داره از کلاس B استفاده میکنه. همین!
کلاس A به کلاس B وابسته است در نتیجه کلاس B میشه وابستگیه کلاس A و هروقت کلاس A به کلاس B نیاز داشته باشه باید اون رو بسازه.
مثلا یک کلاس داریم به نام User که یک فیلد داره از جنس کلاس Address. پس کلاس User به کلاس Address وابسته است و User باید کلاس Address رو بسازه تا بتونه ازش استفاده کنه. در دنیای شیگرایی معمولا کلاسها برای انجام دادن وظایفشون به کلاسهای دیگه وابسته هستن.
تا اینجا فهمیدیم وابستگی معنیش چیه. حالا بریم سراغ تزریق اون.
فرض کنید شما انسانی هستید که می خواید تو یک خونه مستقل زندگی کنید و کار زیادی به آدم ها نداشته باشید. اما انسان موجودی اجتماعی هست با کلی نیازمندی. یعنی نمی تونیم بگیم مستقل باش و هیچ نیازمندی نداشته باش. برای مثال میخوایم غذا بخوریم و احتیاج به نان داریم.
آیا منطقیه یک نانوا توی خونمون بیاریم و کلی هزینه کنیم برای ایجاد نانوایی یا بهتره زنگ بزنیم اسنپ برامون نون بفرسته؟
آیا منطقیه برای تهیه پوشاک تو خونه خیاط بیاریم و چرخ خیاطی و دنگ و فنگ یا آنلاین برامون لباس بیارن؟ و بهمین ترتیب بقیه نیازمندی ها... غیرمنطقیه که بخواهیم خودمون وسایل رفع نیازمندی ها رو فراهم کنیم، چون کار هزینهبر و پیچیدهای هست. اگر من بخواهم فردا برم یه خونه دیگه زندگی کنم برام سخته !
راهحل منطقی اینه که نیازمندیها از بیرون برامون تامین بشه و ما فقط استفاده کنیم !
حالا تامین نیازمندیها میتونه حتی ساده ترم بشه. به این صورت که خودمون زنگ نزنیم به این و اون تا برامون تامین کنن، یکی رو استخدام کنیم که کار تامین نیازمندیها رو برامون انجام بده.
خیلی زندگی زیبا میشه مگه نه؟?
تو دنیای نرم افزار هم، میشه همینقدر زندگی رو قشنگ کرد. شما یک کلاس هستید با چند تا وابستگی:
تزریق وابستگی یعنی این وابستگیها خارج از کلاس شما ایجاد بشه و به شما پاس داده بشه. ایده اینه که کلاسها مسئول ساخت وابستگیهاشون نباشن.
فرض کنید شما یک کلاس Car هستید که دو تا فیلد Engine و Wheels دارید. اگر خود کلاس Car مسئول ساخت این دو تا وابستگی باشه، موقع نیاز باید Engine رو بسازه. ساخت موتور یک ماشین هم که کاری راحتی نیست، خودش کلی نیازمندی و ملاحظات داره و در واقع کار پر هزینهای هست. ساخت چرخها هم به همین ترتیب. اما وقتی تزریق وابستگی داشته باشیم موتور و چرخ ها خارج از کلاس Car ساخته میشن و براش ارسال میشن و کلاس Car دیگه دغدغه ساخت موتور، چرخ ها و هزینه شونو نداره.
هنگام تامین وابستگیها، می تونید دستی از روی وابستگیها نمونه بسازید و به کلاس نیازمند بفرستید (منوآل DI ) یا از یک ابزاری بخواید این کارو براتون انجام بده!
منوآل DI رو میتونید برای پروژههای کوچک استفاده کنید و حتما یکبار این تست رو انجام بدید! اما وقتی پروژه بزرگ میشه، راستش تامین وابستگیها سخت میشه :)
از اینجا منوآل رو امتحان کنید.
وقتی پروژه بزرگ میشه مجبورید کلی کد بویلرپلیت (بویلرپلیت چیه؟ اینجا رو بخون) مثلا فکتوریها رو بنویسید که مستعد خطا میشه و کلی مدیریتها رو دستی انجام بدید و ....خب چه کاریه؟ بیاییم از فریمورک دَگِر درخواست کنیم اینکارو برامون انجام بده.
یه چیز مهم هم تو ذهنتون داشته باشید که DI به چه درد میخوره؟
کاتلین بلد باشید و مفهوم DI و مزایای استفاده از Dagger در برنامه اندرویدی رو بدونید
برای شروع به بخش دوم کُد لب بروید:
کُدلَبِ استفاده از دَگر در برنامه اندرویدی (2-شروع)