وارونگی کنترل یا Inversion of Control چیست؟

👈 IoC یا Inversion of Control در واقع یک اصل در طراحی نرم افزار است به این صورت که یک آبجکت وابسته به آبجکت دیگر است و از بیرون کنترل میشه.در ادامه توضیحات همراه باشید.


👁 بازدید : 111

1403/1/24 | 13:40 : تاریخ 📆


موضوع Inversion of Control (IoC) در واقع یک اصول در طراحی نرم افزار است(یا بهتر بگیم یک تکنیک است) به این صورت که یک آبجکت چه در Compile Time و چه در RunTime وابسته به آبجکت دیگر است و از بیرون کنترل میشود.

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

حالا بزارید همین مثال رو روی کلاس بررسی کنیم:

کلاس A پدر هست و با یک سری اهداف مشخص که یکی از اون ها آموزش به فرزند.

کلاس B که مدرسه هست و تمام هدفش آموزش به فرزندان

کلاس C که فرزند شما هست و هدفش یادگیری

پس میتونیم بگیم کلاس C به کلاس B مستقیما وابسته هست و کلاس B هم به کلاس A مستقیما وابسته هست.

مثل کد زیر:

class Father
{
    public void Teach() { Console.WriteLine("Teach To My Kid"); }
}
class School
{
    public School()
    {
        var father = new Father();
        father.Teach();
    }
    public void Learn() { }

}
class Children
{
    public Children()
    {
        var school = new School();
        school.Learn();
    }
}

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

اما روش بالا استفاده زیادی از رم میبره  و به اصطلاح برامون کاست داره و

اینکه کلاس ها مستقیما به هم وابسته اند فرضا اگر کلاس A یا همون پدر

متدی به نام Work بهش اضافه بشه در این صورت هنگام نمونه سازی

از کلاس B اجباراً یک نمونه هم از کلاس A ساخته میشه که ممکنه

هیچ نیازی به متد Work نداشته باشیم!

اینجاست که مفهموم وارونگی وابستگی وارد بازی میشه.

یعنی کلاس B وA به یک اینترفس(یا رابط) وابسته باشن و این کلاس ها بتونن متدهای خودشون رو

به درستی اجرا کنن و کاری به متدها فیلدها یا پراپرتیهای همدیگه نداشته باشن.

مثل کد زیر:

interface ISchool
{
    void Teach();
}

class Father : ISchool
{
    public void Work() {}

    public void Teach()
    {
        Console.WriteLine("I Will Teach You!");
    }
}

class School
{
    private readonly ISchool _school;
    public School(ISchool _school)
    {
        this._school = _school;
    }
    public void Teach() 
    { 
        this._school.Teach();
    }
}

گراف وابستگی

کلاس Father اجازه داره تا متدهای اینترفیس  ISchool  را  پیاده‌سازی و

در run time   فراخوانی کند، اما School باید در compile time به یک

اینترفیس(ISchool) که توسط Father کنترل می‌شه وابسته باشه

(به این ترتیب، وابستگی‌های معمول معکوس میشن). در run time   ، جریان اجرای برنامه بدون تغییر باقی میمونه، اما اینترفیس هر کلاس با همون کلاس قابل پیوند هست یا به اصطلاح با هم coupled  میشن.

 

 

 

 

 

نتیجه گیری:
وارونگی وابستگی یک بخش کلیدی در ساختن نرم افزار هست، چرا که نرم افزار ما رو تست پذیر میکنه و نگهداری و توسعه کد رو برامون راحتتر میکنه و از طرفی یک برنامه ماژولار در اختیار داریم. 

توجه: تزریق وابستگی  یک دیزاین پترن هست که با پیروی از اصل وارونگی وابستگی امکان پذیر می شود.

موضوع Inversion of Control (IoC) در واقع یک اصول در طراحی نرم افزار است(یا بهتر بگیم یک تکنیک است) به این صورت که یک آبجکت چه در Compile Time و چه در RunTime وابسته به آبجکت دیگر است و از بیرون کنترل میشود.

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

حالا بزارید همین مثال رو روی کلاس بررسی کنیم:

کلاس A پدر هست و با یک سری اهداف مشخص که یکی از اون ها آموزش به فرزند.

کلاس B که مدرسه هست و تمام هدفش آموزش به فرزندان

کلاس C که فرزند شما هست و هدفش یادگیری

پس میتونیم بگیم کلاس C به کلاس B مستقیما وابسته هست و کلاس B هم به کلاس A مستقیما وابسته هست.

مثل کد زیر:

class Father
{
    public void Teach() { Console.WriteLine("Teach To My Kid"); }
}
class School
{
    public School()
    {
        var father = new Father();
        father.Teach();
    }
    public void Learn() { }

}
class Children
{
    public Children()
    {
        var school = new School();
        school.Learn();
    }
}

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

اما روش بالا استفاده زیادی از رم میبره  و به اصطلاح برامون کاست داره و

اینکه کلاس ها مستقیما به هم وابسته اند فرضا اگر کلاس A یا همون پدر

متدی به نام Work بهش اضافه بشه در این صورت هنگام نمونه سازی

از کلاس B اجباراً یک نمونه هم از کلاس A ساخته میشه که ممکنه

هیچ نیازی به متد Work نداشته باشیم!

اینجاست که مفهموم وارونگی وابستگی وارد بازی میشه.

یعنی کلاس B وA به یک اینترفس(یا رابط) وابسته باشن و این کلاس ها بتونن متدهای خودشون رو

به درستی اجرا کنن و کاری به متدها فیلدها یا پراپرتیهای همدیگه نداشته باشن.

مثل کد زیر:

interface ISchool
{
    void Teach();
}

class Father : ISchool
{
    public void Work() {}

    public void Teach()
    {
        Console.WriteLine("I Will Teach You!");
    }
}

class School
{
    private readonly ISchool _school;
    public School(ISchool _school)
    {
        this._school = _school;
    }
    public void Teach() 
    { 
        this._school.Teach();
    }
}

گراف وابستگی

کلاس Father اجازه داره تا متدهای اینترفیس  ISchool  را  پیاده‌سازی و

در run time   فراخوانی کند، اما School باید در compile time به یک

اینترفیس(ISchool) که توسط Father کنترل می‌شه وابسته باشه

(به این ترتیب، وابستگی‌های معمول معکوس میشن). در run time   ، جریان اجرای برنامه بدون تغییر باقی میمونه، اما اینترفیس هر کلاس با همون کلاس قابل پیوند هست یا به اصطلاح با هم coupled  میشن.

 

 

 

 

 

نتیجه گیری:
وارونگی وابستگی یک بخش کلیدی در ساختن نرم افزار هست، چرا که نرم افزار ما رو تست پذیر میکنه و نگهداری و توسعه کد رو برامون راحتتر میکنه و از طرفی یک برنامه ماژولار در اختیار داریم. 

توجه: تزریق وابستگی  یک دیزاین پترن هست که با پیروی از اصل وارونگی وابستگی امکان پذیر می شود.

هنوز دیدگاهی ثبت نشده

تمامی‌حقوق‌مادی‌ومعنوی‌این‌سایت‌برای‌یادمیگیریم‌محفوظ است.