چند هفته قبل، بالاخره تصمیم گرفتم که در یک پروژه واقعی، از Dagger 2 استفاده کنم. با توجه به اینکه من به طور معمول در برابر وسوسه استفاده از کتابخانهها و فریمورکها مقاومت میکنم، این مورد خاص را میتوانم یک استثنا بنامم. تجربه شخصی من در این زمینه، بسیار مثبت بود. به همین دلیل تصمیم گرفتم درباره آنچه آموختم، مطلبی بنویسم.
Dagger چیست؟
اگر با مفهوم تزریق وابستگی یا Dependency Injection آشنایی دارید، کافی است بدانید Dagger یک فریمورک تزریق وابستگی است که برای استفاده در پروژههای اندرویدی توسعه داده شده است. در صورتی که این عبارت برای شما بیگانه است، در اینجا به طور خلاصه توضیح میدهم:
برای اینکه یک کلاس بتواند وظیفهاش را انجام دهد، وابستگیها یا نیازمندیهایی دارد که باید به نحوی پاسخ داده شود. فرض کنیم کلاسی به نام Phone
داریم که به کلاس Battery
وابسته است. حال پرسش این است که این وابستگی چگونه باید پاسخ داده شود؟ یک روش این است که خودِ شیء Phone
یک نمونه از کلاس Battery
بسازد و از آن استفاده کند. اما به دلایل مختلف – که از حوصله این بحث خارج است – بهتر است این روش به کار گرفته نشود.
public class Phone{
private battery mBatery ;
public Phone(){
mBattery = new Battery();
}
تزریق وابستگی یک روش دیگر برای پاسخ دادن به این پرسشی است که در بند قبل مطرح شد. در تزریق وابستگی، خودِ شیء Phone
نباید یک نمونه از Battery
را ایجاد کرده یا به نحوی آن را پیدا کند. زیرا این کار باعث میشود ارتباط تنگاتنگی بین این دو کلاس به وجود بیاید. در عوض، باید ابتدا وابستگیهای کلاسِ وابسته (در اینجا Phone
) را مشخص کرد و سپس آنها را خارج از آن کلاس تأمین نمود. وقتی که شیء Battery
به عنوان یک وابستگی به دست Phone
برسد، در واقع یک تزریق رخ داده است. برای اینکه جدا کردن اشیاء و تزریق کردن وابستگیهایشان به سادگی صورت پذیرد، میتوان از فریمورکهای مختلفی استفاده کرد که Dagger یکی از آنهاست.
تاریخچه Dagger
زبان جاوا سالهاست که با مفهوم تزریق وابستگی رابطه تنگاتنگی دارد. از این رو، فریمورکهای مختلفی برای پیروی از این الگو طراحی شده اند. اما هیچکدام قادر به برآوردن نیازمندیهای پلتفرم اندروید نبودهاند. توسعهدهندگان Square با در نظر داشتن نیازمندیهای اندروید و با الهام گرفتن از فریمورکهای موجود، Dagger را تولید کردند که با استقبال خوبی مواجه شد.
Dagger 2 که در حال حاضر توسط گوگل مدیریت میشود، از همان نسخه اولیه منشعب شده است. در این فریمورک، برای شناسایی اشیاء وابسته، تزریق وابستگیها و ایجاد گراف اشیاء از Annotation Processing استفاده میشود. پردازش Annotarionها در زمان همگردانی (کامپایل) صورت میپذیرد. در نتیجه، سرعت اجرای برنامه کاهش نمییابد.
چرا تزریق وابستگی؟
بیگمان به دنبال دلایلی هستید که شما را مجاب به استفاده از Dagger کند. در اینجا من به چند مزیت استفاده از تزریق وابستگی اشاره میکنم:
- از آنجایی که وابستگی اجزای برنامه از خود آن اجزاء جدا میشود، میتوان در پروژههای دیگر دوباره از آن اجزاء استفاده کرد.
- بعضی وقتها لازم است فقط یک یا چند نمونه محدود از یک کلاس در برنامه وجود داشته باشد. مثلاً فرض کنید در یک آموزشگاه، مقرر شده که پیش از شروع هر جلسه درسی، یک تختهپاککن در اختیار افراد قرار یگیرد و پس از پایان جلسه، آن تختهپاککن دور انداخته شود. بنابراین ما هنگام آغاز شدن یک جلسه، باید یک شیء جدید از تختهپاککن بسازیم. در طول برگزاری جلسه، هر فردی که بخواهد تخته را تمیز کند، تنها به همان تختهپاککن دسترسی دارد و با پایان یافتن جلسه، عمر تختهپاککن هم به پایان میرسد. به کمک Dagger ما میتوانیم چرخه حیات اشیاء تختهپاککن را به راحتی مدیریت کنیم. این کار یک مزیت مهم دیگر هم دارد: افراد کلاس از چرخه حیات تختهپاککنها مطلع نخواهند شد! در عین حال وابستگیِ آنها تأمین میشود و در هنگام آغاز هر کلاس، خیالشان در مورد تختهپاککن راحت است.
- فرض کنید یک کلاس به پنج کلاس دیگر وابسته است و هر کدام از آن کلاسها به چند کلاس دیگر وابستگی دارند. در صورت استفاده از Dagger، ترتیب ایجاد شدن اشیاء به طور کامل توسط این فریمورک مدیریت میشود. بنابراین اگر بخواهید برخی از این کلاسها را تغییر دهید، از بروز برخی خطاهای احتمالی پیشگیری میشود.
- Dagger باعث میشود وابستگیهای تودرتو حذف شوند. فرض کنید چند شیء به طور سلسله مراتبی به یکدیگر وابستهاند؛ مثلاً A به B، B به C و C به D وابستگی دارد. در جریان اجرای برنامه، یک نمونه از شیء D در اختیار A قرار میگیرد. برای اینکه وابستگی شیء C تأمین شود، A ناچار میشود از طریق شیء B، شیء D را به دست C برساند. در نتیجه، یک ارتباط ناخواسته بین B و D به وجود میآید (B به D احتیاجی ندارد، اما به اجبار به آن وابسته میشود). به کمک Dagger میتوان وابستگی شیء C را بدون دخالت B تأمین کرد.
- تنها چیزی که برای اشیاء وابسته اهمیت دارد، این است که وابستگیهایشان تأمین شود. بنابراین ما میتوانیم به جای استفاده از اشیاء واقعی، وابستگی اشیاء را توسط چند شیء جعلی تأمین کنیم و بدین وسیله، عملکرد آنها را بیازماییم.
ممکن است برخی از ویژگیهای مثبتی که در بالا اشاره شد، برای شما ملموس و قابلدرک نباشد. با این حال دلسرد نشوید و برای بهکارگیری Dagger شجاع باشید. بعد از اینکه نحوه استفاده از آن را آموختید، دوباره این نوشته را مطالعه کنید تا زوایای پنهان Dagger بیش از پیش برایتان روشن شود.
برای آشنایی با نحوه بهکارگیری Dagger در پروژههای اندرویدی، این مطلب را بخوانید.
دیدگاهتان را بنویسید