فرشته ناجی
فرشته ناجی
خواندن ۴ دقیقه·۳ سال پیش

کُدلَب استفاده از دَگِر در برنامه اندرویدی(1-معرفی)

طی چند تا پُست قراره به زبان روان و خودمانی بیاموزیم چطور دَگِر رو در پروژه اندروید خودمون بیاریم؟

تزریق وابستگی
تزریق وابستگی

زبان استفاده شده در این آموزش کاتلین هست و همه چیز در این آموزش از این کُدلب گوگل اومده! پس اگر زبانتون خوبه پیشنهاد می‌کنم کُدلب اصلی رو بخونید وگرنه همین پست رو ادامه بدید.

بهتره اشاره کنم که بیشتر بخش‌ها ترجمه مستقیم نیست و برداشت خود من از مفاهیمه.

پس با من همراه بشید.

دَگِر چی هست؟

قبل از آنکه بخواهید با دَِگر آشنا بشید باید با مفهوم تزریق وابستگی یا دِپندِنسی اینجکشن-Dependency Injection آشنا بشید، سپس در مورد یکی از ابزارهای این کار که دَگِر - Dagger هست صحبت خواهیم کرد. ازین پس بجای عبارت تزریق وابستگی(Dependency Injection) از اختصار آن یعنی DI در این نوشتار استفاده خواهم کرد.

وابستگی - Dependency

در دنیای نرم افزار، وابستگی به این معنی هست که کلاس A داره از کلاس B استفاده می‌کنه. همین!

کلاس A به کلاس B وابسته است در نتیجه کلاس B میشه وابستگیه کلاس A و هروقت کلاس A به کلاس B نیاز داشته باشه باید اون رو بسازه.

مثلا یک کلاس داریم به نام User که یک فیلد داره از جنس کلاس Address. پس کلاس User به کلاس Address وابسته است و User باید کلاس Address رو بسازه تا بتونه ازش استفاده کنه. در دنیای شی‌گرایی معمولا کلاس‌ها برای انجام دادن وظایفشون به کلاس‌های دیگه وابسته هستن.

تا اینجا فهمیدیم وابستگی معنیش چیه. حالا بریم سراغ تزریق اون.

تزریق وابستگی (DI)دیگه چیه؟ چه اسم عجیبی!

فرض کنید شما انسانی هستید که می خواید تو یک خونه مستقل زندگی کنید و کار زیادی به آدم ها نداشته باشید. اما انسان موجودی اجتماعی هست با کلی نیازمندی. یعنی نمی تونیم بگیم مستقل باش و هیچ نیازمندی نداشته باش. برای مثال میخوایم غذا بخوریم و احتیاج به نان داریم.

آیا منطقیه یک نانوا توی خونمون بیاریم و کلی هزینه کنیم برای ایجاد نانوایی یا بهتره زنگ بزنیم اسنپ برامون نون بفرسته؟

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

راه‌حل منطقی اینه که نیازمندی‌ها از بیرون برامون تامین بشه و ما فقط استفاده کنیم !

حالا تامین نیازمندی‌ها می‌تونه حتی ساده ترم بشه. به این صورت که خودمون زنگ نزنیم به این و اون تا برامون تامین کنن، یکی رو استخدام کنیم که کار تامین نیازمندی‌ها رو برامون انجام بده.

خیلی زندگی زیبا میشه مگه نه؟?

تو دنیای نرم افزار هم، میشه همینقدر زندگی رو قشنگ کرد. شما یک کلاس هستید با چند تا وابستگی:

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

درک بهتر با یک مثال

فرض کنید شما یک کلاس Car هستید که دو تا فیلد Engine و Wheels دارید. اگر خود کلاس Car مسئول ساخت این دو تا وابستگی باشه، موقع نیاز باید Engine رو بسازه. ساخت موتور یک ماشین هم که کاری راحتی نیست، خودش کلی نیازمندی و ملاحظات داره و در واقع کار پر هزینه‌ای هست. ساخت چرخ‌ها هم به همین ترتیب. اما وقتی تزریق وابستگی داشته باشیم موتور و چرخ ها خارج از کلاس Car ساخته می‌شن و براش ارسال می‌شن و کلاس Car دیگه دغدغه ساخت موتور، چرخ ها و هزینه شونو نداره.

کی این وابستگی‌ها رو بسازه؟

هنگام تامین وابستگی‌ها، می تونید دستی از روی وابستگی‌ها نمونه بسازید و به کلاس نیازمند بفرستید (منوآل DI ) یا از یک ابزاری بخواید این کارو براتون انجام بده!

کدوم بهتره؟

منوآل DI رو می‌تونید برای پروژه‌های کوچک استفاده کنید و حتما یکبار این تست رو انجام بدید! اما وقتی پروژه بزرگ میشه، راستش تامین وابستگی‌ها سخت میشه :)

از این‌جا منوآل رو امتحان کنید.


چرا دَگِر استفاده کنیم؟

وقتی پروژه بزرگ می‌شه مجبورید کلی کد بویلرپلیت (بویلرپلیت چیه؟ اینجا رو بخون) مثلا فکتوری‌ها رو بنویسید که مستعد خطا میشه و کلی مدیریت‌ها رو دستی انجام بدید و ....خب چه کاریه؟ بیاییم از فریمورک دَگِر درخواست کنیم اینکارو برامون انجام بده.

  • دگر شما رو از شر نوشتن کلی کد بویلرپلیت خطا خیز خلاص می‌کنه.?
  • کد گراف اپلیکیشن (بعدا می فهمید چیه) رو براتون می‌نویسه، چیزی که مجبور بودید تو حالت دستی خودتون بنویسیدش تحت عنوان AppContainer
  • برای کلاس‌هایی که تو گراف اپلیکیشن هستن فکتوری می‌نویسه.
  • تصمیم می‌گیره چه وقت از روی یک تایپ نمونه جدید بسازه یا نمونه قبلی رو مجدد استفاده کنه?
  • در نهایت برای هر جریانی تو برنامه مثلا جریان لاگین یک کانتینر جدا می‌سازه و اینجوری می‌تونه آبجکت‌هایی که لازم نیستن رو از حافظه خارج کنه و پرفرمنس رو بهتر کنه.

یه چیز مهم هم تو ذهنتون داشته باشید که DI به چه درد میخوره؟

  • استفاده مجدد از کد راحت میشه
  • ریفکتور کد راحت میشه
  • کدمون قابلیت تست نوشتن پیدا می‌کنه

برای شروع این کُدلَب چی لازم دارید؟

کاتلین بلد باشید و مفهوم DI و مزایای استفاده از Dagger در برنامه اندرویدی رو بدونید

برای شروع به بخش دوم کُد لب بروید:

بعدی

کُدلَبِ استفاده از دَگر در برنامه اندرویدی (2-شروع)


dependency injectionتزریق وابستگیکاتلینdagger
برنامه نویس اندروید @NeshanMap
شاید از این پست‌ها خوشتان بیاید