آشنایی با تزریق وابستگی

سلام
امروز قصد داریم با یکی از مفاهیم مهم و بسیار بسیار کاربردی در برنامه نویسی شی گرا آشنا بشویم به نام Dependency Injection یا تزریق وابستگی.

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

خب به شکل ساده عرض کنم که تزریق وابستگی وظیفه ساختن اشیا و توزیع اونها به کلاسهای وابسته را عهده دار هست.
در واقع تزریق وابستگی مثل Vending Machines یا ماشینهای فروش کار میکند که حتما در مکانهایی مثل ایستگاههای مترو دیده اید. برای مثال در این دستگاه ها انواع آبمیوه ها تعبیه شده و شما با مراجعه به دستگاه و پرداخت مبلغ، حق انتخاب از بین محصولات داخل دستگاه خواهید داشت.
برای تزریق وابستگی ما به یک Container یا ظرف نیاز داریم که اطلاعات ساخت شی از کلاسها را در آن ثبت کنیم، که این اطلاعات ۳ دسته اصلی خواهند بود.

  • اطلاعات مربوط به کلاس مورد نظر اعم از جنس کلاس و …
  • اطلاعات مربوط به نحوه ساخت شی از کلاس مربوطه. بعنوان مثال اطلاعات کانکشن دیتابیس در کلاس دیتابیس
  • اطلاعات مربوط به Life-cycle یا طول عمر اشیا. در این قسمت تصمیم گیری های مربوط به زمان ساخته شدن شی، نگه داری شی ساخته، نحوه ایجاد شی (مثلا به ازای هر درخواست یک نمونه ساخته شود یا …) و مسائلی از این دست مدیریت میشود

پس نتیجه میگیریم که وظیفه اصلی Container یا ظرف، ساختن، نگه داری و تامین اشیا مورد نیاز است. پس از اینکه این اتفاقات در ظرف افتاد، Dependency Injection یا به اختصار DI وابستگیهای مورد نیاز هر کلاس را به آن تزریق میکند.

یک Vending Machine یا دستگاه فروش

چرا تزریق وابستگی مهم است؟

فرض کنیم که یک پروژه بزرگ داریم با کلی کلاس که صد در صد به هم وابستگی هایی هم دارند، بعنوان مثال تقریبا همه کلاسها نیاز به ارتباط با دیتابیس دارند، پس در حقیقت به سرویس یا کلاس دیتابیس ما وابستگی دارند. حال این نیاز چطور تامین میشود؟ احتمالا جواب این است که در زمان نیاز یک شی از کلاس دیتابیس میسازیم. جوابی درست اما در حقیقت غلط!
با اینکار عملا ما در هر دوره اجرای برنامه، مجبور هستیم چندین بار و چندین نمونه از کلاس دیتابیس شی بسازیم، که همه این اشیا به زمانی برای ساخته شدن احتیاج دارند که این هزینه زمانی را کاربر پرداخت میکند.
علاوه بر این اشیا ساخته شده به صورت مجزا در حافظه قرار گرفته و اینکه احتمالا قابلیت استفاده مجدد ندارند و واضح نیست که GC یا Garbage Collector چه رفتاری با این اشیا دارد، پس باعث هدر رفتن منابع میشوند. همچنین در کلاسی مانند کلاس دیتابیس این اشیا چندگانه میتواند باعث از دست رفتن یکپارچگی و ثبات در داده ها شود.
یکی دیگر از مهمترین نکات در مورد ایجاد تغییرات است، بدون تردید در آینده مجبور خواهیم شد تا امضای Constructor کلاسها را دست خوش تغییر قرار دهیم یا به طور کل از کلاس یا کتابخانه دیگری استفاده کنیم و این یعنی کل پروژه درگیر این تغییر و بروز رسانی خواهد شد، تازه آن زمان متوجه خواهیم شد که با چه دردسری مواجه هستیم. پس از اعمال تغییرات هم از گزند نا هماهنگی و باگهای ناشی از این تغییرات در امان نخواهیم بود. با این تفاسیر حتما باید فکر اعمال تغییرات را کاملا از ذهن بیرون کرد.
اگر بی انصاف نباشم بعضی از موارد مذکور راهکارهای خاص خود را دارند اما ممکن است آنها هم دچار ضعفهایی باشند. اما وقتی ما از تزریق وابستگی استفاده میکنیم، به این دلیل که عملیات ساخت آنها یکبار تعریف شده است، در صورت بروز هرگونه تغییر در امضای سازنده یا Constructor کلاس – به دلیل استفاده از کتابخانه یا کلاسی دیگر و … – فقط کافیست یک خط را در کل برنامه تغییر دهیم و نه هزاران خط! پس اگر روز قصد داشته باشیم که کلاس دیتابیس را با کلاس جدیدتری جایگزین کنیم به سادگی آب خوردن خواهد بود البته با رعایت اصول.
همینطور با توجه به کنترلی که ما در نحوه ایجاد و نگه داری اشیا داریم، هم میتوانیم از یک شی واحد بارها استفاده کنیم و هم یکپارچگی و ثبات داده ها را هم از دست نخواهیم داد.

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

موفق باشید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

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