این پست بخش اول از یه مطلب نسبتا بلندتر در مورد تزریق وابستگی یا همون dependency injection خودمونه(نمیدونم کی خودمونی شدیم باهاش ولی به هر روی). برای اینکه پست زیادی طولانی نشه و خوندنش خارج از حوصله نباشه و همینطور زمان لازم برای نوشتن رو تقسیم و مدیریت کنم تصمیم گرفتم این مطلب رو به چندتا پست کوچیکتر تبدیل کنم تا بیشتر جای مانور داشته باشم. تو بخش اول این مطلب مختصرا میگم اصلا تزریق وابستگی چی هست. تو پستای بعدی راجع به این خواهم نوشت که چرا و چه زمانی از تزریق وابستگی استفاده میکنیم. راجع به مفهومی به نام کانتینر(container) خواهم نوشت. تو بخشای بعدی چندتا مثال همراه با کد هم برای درک بهتر تو پیادهسازی میذارم.
با این مقدمه میرم سر اصل مطلب!
خب بیاین ببینیم اصلا وابستگی یعنی چی؟! وقتی کلاس A نیاز داشته باشه از یک سری از متدای کلاس B استفاده کنه میگیم کلاس A به کلاس B وابستهس. بنابراین قبل از این که بتونیم از متدای یه کلاس استفاده کنیم باید یه نمونه از اون کلاس ایجاد کنیم. مثلا اینجا کلاس A میتونه یه نمونه از کلاس B بسازه و داستان رو پیش ببره. حالا اگه کار ساختن نمونه از B رو یکی دیگه بعهده بگیره و نمونه ساخته شده رو پاس بده به A تا A بتونه ازش استفاده کنه بهش میگیم تزریق وابستگی.
به زبون سادهتر!
به جای اینکه اجازه بدی کلاس A یه نمونه از کلاس B رو داخل خودش بسازه خودت یه نمونه از کلاس B رو بساز و پاس بده بهش.
توضیحات بالا رو یه قیاس بکنم با دنیای واقعی؛ مثلا تولید کننده ماشین برای ساخت ماشیناش نیاز داره به باتری و تایر و امثالهم. حالا تولید کننده ماشین میتونه کار ساخت باتری و تایر و این داستانها رو بسپره به یه کارخونهی دیگه و اون کارخونهی ثانی باتری رو بسازه و بده به کارخونه اول. اینجوری دیگه کارخونه ماشین نیازی نداره باتریها رو خودش بسازه.
مثال زیر نشون میده اگه بدون تزریق وابستگی پیش بریم باید چیکار کنیم:
- اپلیکیشن به کلاس A نیاز داره.
- اپلیکیشن یه نمونه از کلاس A میسازه.
- اپلیکیشن کلاس A رو فراخونی میکنه.
.......+ کلاس A به کلاس B نیاز داره.
.......+ کلاس A یه نمونه از کلاس B میسازه.
.......+ کلاس A کلاس B رو فراخونی میکنه.
....... .......* کلاس B به کلاس C نیاز داره.
....... .......* کلاس B یه نمونه از کلاس C میسازه.
....... .......* کلاس B کاری که باید رو انجام میده.
حالا همین کار رو یه بار دیگه با تزریق وابستگی اگر انجام بدیم فرایند به این شکل میشه:
- اپلیکیشن به کلاس A نیاز داره که A خودش به B نیاز داره که اونم خودش به C نیاز داره.
- اپلیکیشن یه نمونه از C ایجاد میکنه.
- اپلیکیشن یه نمونه از B ایجاد میکنه و C رو بهش پاس میده.
- اپلیکیشن یه نمونه از A ایجاد میکنه و B رو بهش پاس میده.
- اپلیکیشن کلاس A رو فراخونی میکنه.
.......+ کلاس A کلاس B رو فراخونی میکنه.
....... .......* کلاس B کاری که باید رو انجام میده.
در حقیقت اینجا اومدیم و طبق تعریف کار ساخت کلاس B و C رو گذاشتیم به عهده اپلیکیشن و نمونه ها رو پاس دادیم به کلاسهایی که بهشون نیاز د اشتن. اتفاقی که اینجا افتاده اینه که کنترل وابستگی رو از کلاسی که فراخونی میکنه (A) به کلاسی که فراخونی میشه (B) معکوس کردیم که به این پترن میگن وارونگی کنترل (Inversion of Control). با این روش کنترل نسبتا کاملی روی وابستگیها خواهیم داشت و تو بخشای بعدی با مثال توضیح خواهم داد که کنترلمون روی اپلیکیش با این روش چه تغییری خواهد کرد.
** پایان بخش اول **