آشنایی با Dependency Injection

Dependency Injection تزریق وابستگی دیزاین پترن در اندروید الگوی طراحی design pattern آموزش فارسی android java و جاوا

سطح آموزش: #متوسط

تعریف Dependency Injection

تزریق وابستگی (Dependency Injection) یکی از الگوهای طراحی در در برنامه‌نویسی شیء گرا (Object Oriented Programming) ست. در این الگو ما وابستگی بین اشیاء رو کاهش میدیم در نتیجه تست و توسعه ساده‌تر میشه.

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

نحوه استفاده از Dependency Injection

فرض کنید یک کلاس User داریم. کلاس کاربر از یکسری پارامتر تشکیل شده. یکی از این پارامتر ها Contact هست. کلاس Contact انواع مختلفی داره که هر کودوم پارامترهای متفاوتی دارن و ما فعلا کاری بهش نداریم. در حالت کلی کلاس User به شکل زیر تعریف میشه:

در این حالت کد مشکلی نداره و به خوبی کار میکنه اما مشکل اینجاست که بین دو کلاس Contact و User اتصال محکمی وجود داره. این اتصال باعث شده برای ایجاد یک نمونه از کلاس User ناچار باشیم دقیقا بدونیم به چه نوعی از Contact احتیاج داریم(مثلا اینجا SimpleContact). از اونجایی که ممکنه انواع مختلفی از contact وجود داشته باشه و حتی شاید ما در آینده بخوایم انواع Contact رو تغییر بدیم، این ارتباط قوی بین دو کلاس مشکل ساز خواهد شد. و ما ناچار خواهیم بود با هربار تغییر در ساختار به سراغ تک تک کلاس‌هایی که تحت تاثیر قرار میگیرن بریم و مطمئن شیم مشکلی پیش نمیاد.

اما میشه با یک تغییر ساده ارتباط بین این دو کلاس رو تا حد مناسبی کاهش داد.

الان در کد بالا دیگه مهم نیست چه نوعی از Contact داریم. فقط کافیه موقع ساخت هر نمونه contact مربوطه رو به constuctor بفرستیم.

این نمونه‌ای که مثال زدم Constructor Injection بود. چون ما وابستگی رو به constructor کلاس تزریق کردیم. منظور از تزریق وابستگی هم اینه که الان اگر ما بخوایم یک نمونه User بسازیم این نمونه وابسته به Contact هست و باید contact مربوطه رو هم همزمان بسازیم. اما در حالت قبلی چنین وابستگی‌ای وجود نداشت و همین مسئله تست رو دشوار می‌کرد.

اعلام وابستگی

تا اینجا یک مشکل رو حل کردیم. اما یک مسئله جدیدی به وجود اومده. قبلا اگر میخواستیم یک نمونه از User بسازیم کافی بود بگیم:

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

همونطوری که مشخصه به وضوح استفاده از کلاس User پیچیده‌تر شده. ضمن اینکه در یک برنامه واقعی قطعا با کلاس‌های یک پارامتری و ساده روبرو نیستیم. ممکنه sub class ها هم خودشون ورودی‌ها و DIهایی داشته باشن که برنامه‌نویسی رو سخت‌تر و کد رو کثیف‌تر میکنه.

به علاوه از این به بعد اگر تغییری در dependency بدیم بایستی هرجایی از User نمونه گرفته‌ایم رو پیدا کنیم و تغییر بدیم.

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

کتابخانه Dagger 2

برای DI (ـDependency Injection) کتابخونه‌های مختلفی هست که بهترینشون Dagger هست که توسط square توسعه داده شده و در حال حاضر توسط گوگل پشتیبانی میشه. در آینده راجع به Dagger 2 بیشتر صحبت میکنیم ولی فعلا برای آشنایی میتونید از اینجا و اینجا شروع کنید.

نتیجه‌گیری

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

برای نوشتن این پست و پست‌های بعدی که به DI مربوط خواهند بود از این مقالات کمک گرفتم: + + + + + +

پی‌نوشت: این پست مقدمه‌ای برای آموزش Dragger هست که به طور عملی این پترن رو توی پروژه‌های اندروید اضافه می‌کنیم.

6 دیدگاه برای “آشنایی با Dependency Injection

  1. بسیار عالی بود. قبلاً بدون اینکه بدونم، از این تکنیک استفاده میکردم تا کار خودم رو در هنگام اعمال تغییرات در کلاس ها راحت کنم و به نظرم این الگو خیلی جاها میتونه به کار بیاد. تشکر

پاسخ دهید

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