تزریق وابستگی ( Dependency Injection ) چیست ؟
سلام دوستان در این مقاله به مبحث Dependency Injection می پردازیم و به صورت تخصصی در مورد تزریق وابستگی ( Dependency Injection ) چیست ؟ بحث خواهیم کرد در ادامه با ما همراه باشید تا علت و هدف اصلی استفاده از Dependency Injection یا تزریق وابستگی را یاد گیرید. در مورد مبحث Dagger پیرامون Dependency Injection یا تزریق وابستگی مفصل توضیح دادیم که در ادامه لینک مربوط به آن را برای شما قرار میدهیم در ادامه با مبحث Dependency Injection یا تزریق وابستگی یا به اختصار DI با ما همراه باشید.
لینک مربوط به مقاله قبلی
Dependency Injection چیست ؟
زمانی که اولین بار درباره dependency injection یا تزریق وابستگی شنیدم فکر کردم شاید هیچوقت کاربرد نداشته باشد ! و به آن شکل کاربرد اصلی آن را متوجه نشده بودم یک جمله بسیار جالب در مورد Dependency Injection یا تزریق وابستگی شنیدم که به نظرم کل مفهوم را یکدفعه منتقل می کند که در ادامه برای شما قرار میدهم
متن انگلیسی
“Dependency Injection” is a 25-dollar term for a 5-cent concept.
ترجمه متن بالا
یک معیار 25 دلاری برای یک مفهوم 5 سنتی است.
حالا معنی جمله بالا یعنی چی ؟ !
یعنی نمیشه گفت که تزریق وابستگی یک واژه یا یک Concept بد است و حتی نمیشه گفت یک Concept خوب است اگر به درستی استفاده شود یعنی به درستی درک شده باشد و پیاده سازی شده باشد یک مفهوم خوب و در صورتی که بد استفاده شده باشد یک مفهوم فوق العاده بد خواهد داشت.
تزریق وابستگی به معنای ساده یعنی چه ؟
اصلا نباید با هر چیزی به صورت سخت رفتار کرد چرا باید لقمه را دور سرمان بچرخانیم ! تزریق وابستگی به معنای دادن یک شی به متغیرهای نمونه آن است. اگر متوجه این جمله شدید به صورت کامل Dependency Injection یا تزریق وابستگی را یاد گرفتید (چند بار بخوانید متوجه می شوید.)
در ادامه سه بخش مطرح می شود که هر کدام دارای یک نام خواهند بود.
هدف از Dependency Injection یا تزریق وابستگی چیست ؟
استفاده از DI یک آینده نگری است. همه ما میدانیم که احتمال تغییرات در سورس همیشه وجود دارد. پس نحوه کد نویسی در بهترین حالت خود, با کمترین تغییرات در آینده بیشترین کارایی را فراهم می نماید. در حالت های کد نویسی آشفته و بی برنامه ممکن است کوچکترین تغییری نیازمند بررسی و تغییر چندین کلاس و چندین فایل و چندین ماژول باشد. اما با برنامه ریزی این تغییرات به حداقل خود خواهد رسید علاوه بر آن مدیریت تغییرات را برای شما آسوده تر خواهد کرد.
کلاس شامل یکسری تابع یا متد هست همانند زیر خب بیایید بهشون بگیم dependencies یا وابستگی بیشتر برنامه نویس ها آنها را متغیر نام گذاری می کنند اگر یکم برنامه نویس پیشرفته ای باشند به آنها instance variables یا متغیر های نمونه نیز می گویند.
1 2 3 4 5 6 7 8 9 10 11 | public class Example { private DatabaseThingie myDatabase; public Example() { myDatabase = new DatabaseThingie(); } public void DoStuff() { ... myDatabase.GetData(); ... } } |
اسم بخش بالا را Dependency Non-Injection یک کلاس بدون تزریق وابستگی قرار میدهیم در بالا فقط یک کلاس ساختیم تمامی نام ها و نوع ها تست است و به صورت واقعی نمی باشد.
در بالا یک وابستگی به نام myDatabase داریم که در ورودی Constructor تعریف شده است.
حالا کلاس زیر را در نظر بگیرید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Example { private DatabaseThingie myDatabase; public Example() { myDatabase = new DatabaseThingie(); } public Example(DatabaseThingie useThisDatabaseInstead) { myDatabase = useThisDatabaseInstead; } public void DoStuff() { ... myDatabase.GetData(); ... } } |
در بالا یک متد یا وابستگی یا Dependency به نام Example ایجاد کردیم که ورودی آن از نوع دادهای DatabaseThingie است زمانی که این وابستگی صدا زده شود myDatabase پر خواهد شد و به گونه ای تزریق به کلاس صورت خواهید گرفت.
اسم بخش بالا را Dependency Injection قرار میدهیم.
حالا می خواهیم نحوه استفاده از Dependency Injection را یاد گیرید مثال زیر را ببینید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class ExampleTest { TestDoStuff() { MockDatabase mockDatabase = new MockDatabase(); Example example = new Example(mockDatabase); example.DoStuff(); mockDatabase.AssertGetDataWasCalled(); } } public class Example { private DatabaseThingie myDatabase; public Example() { myDatabase = new DatabaseThingie(); } public Example(DatabaseThingie useThisDatabaseInstead) { myDatabase = useThisDatabaseInstead; } public void DoStuff() { ... myDatabase.GetData(); ... } } |
در بالا ابتدا از کلاس Example یک نمونه یا Instance ساختیم سپس مثلا از مقدار دیتابیس را به آن فرستادیم (خود آن دیتابیس نیز یک کلاس سفارشی بوده مثلا فرض کنید یک کلاس Data Model بوده (قبلا این بخش را توضیح داده ایم سرچ کنید در سایت ) ) با این کار اگر فرض کنیم دیتا ها در ون متغیر هایی لود شده سپس یک کار انجام می شود به طور مثال یکسری اطلاعات به سمت سرور پاس داده خواهد شد یا دریافت می شود.
بیشتر مواقع این کلاس ها را به صورت جداگانه ایجاد می کنند یعنی بخش Example در یک کلاس جداگانه قرار خواهد گرفت تا سهولت استفاده را به ارمغان آورد.
مثلا کد زیر را مشاهده کنید. کد زیر بدون تزریق وابستگی نوشته شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class A { private B b; public A() { this.b = new B(); // A *depends on* B } public void DoSomeStuff() { // Do something with B here } } public static void Main(string[] args) { A a = new A(); a.DoSomeStuff(); } |
در بالا A همیشه به B وابسطه است.
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class A { private B b; public A(B b) { this.b = b; } public void DoSomeStuff() { // Do something with B here } } public static void Main(string[] args) { B b = new B(); A a = new A(b); a.DoSomeStuff(); } |
در بالا دو تا مزیت داریم اول اینکه می توانیم کلاس B را خودمان New کنیم و به متغیر های آن مقدار دهی کنیم سپس آن را در Constructor کلاس A وارد کنیم و در نهایت بروی a یکسری اعمال را انجام دهیم دو اینکه در کلاس شما کدهای اصلی را دارید و کنترل اصلی را همیشه در main در دست می گیرید.
هرچند trace برنامه بسیار مشکل می شود ولی از نظر ساختار درست پیش رفته اید.
Advantages
مزایای تزریق وابستگی ( Dependency Injection )
- dependency injection نیاز به compile مجدد کد ها وجود ندارد و در زمان اجرا compile می شوند.
- کاهش کد های مورد استفاده در یک کلاس
- توسعه کدها به صورت آنلاین و استفاده از آنها در برنامه (کاری که اپلیکیشن Google Play انجام میدهد.)
- اتصال بین یک کلاس و وابستگی آن را کاهش می دهد
Disadvantages
معایت تزریق وابستگی ( Dependency Injection )
- trace یا خواندن کد را به شدت سخت می کند چون تمامی کدها در یک بخش قرار ندارند هر کدام در کلاس های جداگانه قرار دارند.
- نیازمند تجربه جهت پیاده سازی (در صورتی که توانایی بالا در نوشتن کد وجود نداشته باشد به گونه ای به یک عیب در برنامه تبدیل خواهد شد. )
- مدیریت تزریق وابستگی بسیار پیچیده است.
این مقاله نیز به پایان رسید.
موفق و موید باشید.
عالی و مفید …ممنون
اول صفحه تا اواسط صفحه ناامید شدم چون نمیفهمیدم 🙁
ولی در
مثال دومی کلاس A , B – را به ساده ترین وجه ممکن توضیح داده بودید. و برای بنده مبتدی کاملا مناسب بود که بفهمم اصلا چی هست و به چه درد میخوره !!
ممنون