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

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

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

تزریق وابستگی یا Dependency injection 1350 500 حسین صداقت

تزریق وابستگی یا Dependency injection چیست؟ تزریق وابستگی یک تکنیک در برنامه نویسی است که باعث می شود کلاس های شما مستقل از وابسته هایشان عمل کنند. این امر با استفاده جدا کردن «استفاده از یک شی» از «ساخت آن شی» حاصل می شود. این تکنیک به برنامه نویسان کمک می کند که بتوانند دو اصل از اصول طراحی شی گرا یعنی  Dependency inversion principle  یا اصل وابستگی معکوس و Single responsibility principle یا اصل تک مسئولیتی  را بتوانند رعایت کنند.

Dependency injection یا تزریق وابستگی معکوس باعث می شود که کلاس های ما کمترین وابستگی را به هم داشته باشند و اصطلاحاً به یک معماری Loosely coupled برسیم.

در تزریق وابستگی ۴ نقش اصلی وجود دارد:

  1. شی service که مورد استفاده قرار می گیرد.
  2. شی client که از سرویس استفاده می کند.
  3. اینترفیس ها که نحوه استفاده client از service را مشخص می کند.
  4. injector که وظیفه ساخت شی سرویس و در اختیار Client قرار دادن را بر عهده دارد.

تعاریف

شی service: هر شیئی که قرار است سرویسی ارائه دهد به عنوان شی service شناخته می شود.

شی client: هر شیئی که از شی service استفاده می کند به عنوان شی client شناخته می شود.

Interface: اینترفیس چیزی است که client انتظار دارد service ها در اختیارش بگذارند. اینترفیس توسط سرویس پیاده سازی می شود و فرآیند injection توسط اینترفیس ها انجام می شود. اینترفیس ها کلاس های concrete نیستند یعنی در داخل خود اینترفیس، چیزی پیاده سازی نمی شود بلکه اینترفیس ها در سطح انتزاع یا Abstract می باشند.

Client نباید نسبت به نحوه پیاده سازی سرویس هایی که از آن استفاده می کند هیچ اطلاعاتی داشته باشد. اینترفیس ها رابط کلاس سرویس و client هستند و client ها فقط باید از اینترفیس ها و API (بخوانید متد) هایی اطلاع داشته باشند که یک سرویس در اختیار آن ها قرار می دهد.

Injector :Injector وظیفه معرفی سرویس ها به کلاینت را بر عهده دارد. Injector ها عموماً به صورت پکیج های خارجی در زبان های مختلف برنامه نویسی وجود دارند و لازم نیست برنامه نویس خودش یک injector توسعه دهد.

نمودار UML تزریق وابستگی


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

در زیر مثال ساده ای از Inject کردن، یک dependency را مشاهده می کنیم:

public class CoffeeApp {



               private CoffeeMachine coffeeMachine;

                              publicCoffeeApp(CoffeeMachine coffeeMachine) {

                               this.coffeeMachine = coffeeMachine;

               }



               public Coffee prepareCoffee(CoffeeSelection selection)

                                              throws CoffeeException {

                               Coffee coffee = this.coffeeMachine.brewFilterCoffee();

                               System.out.println("Coffee is ready!");

                               return coffee;

               }

}

همان طور که در کد بالا می بینید در کلاس coffeeApp که کلاینت ما است، کلاس CoffeeMachine تزریق شده است. Coffee ماشین یک interface است و هیچ پیاده سازی در آن وجود ندارد. همچنین کلاس service  ما Interface CoffeeMachine را پیاده سازی کرده است که در کد وجود ندارد.

همان طور که در کد مشخص است هیچ object ی به صورت مستقیم در کلاس client ما ایجاد نشده است. همچنین کلاس client ما صرفاً به یک اینترفیس وابسته است و هیچ کجا کلاس سرویس ما به طور مستقیم وارد کلاس client مان نشده است. این روش پیاده سازی باعث شده است که کمترین وابستگی بین کلاس های ما (کلاس سرویس و کلاس کلاینت) به وجود بیاید و همچنین تغییر در کلاس سرویس ما باعث تغییر در کلاس کلاینتمان نخواهد شد.

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

Subscribe for free resources and news updates.