انجمن برنامه نویسان البرز

تبلیغات

تزریق وابستگی در سی شارپ به روش سامورایی!

تزریق وابستگی در سی شارپ به روش سامورایی!


این مقاله در رابطه با تزریق وابستگی ها به روش سامورایی در سی شارپ است. تزریق وابستگی یا همان Dependency Injection مقوله ای است که پیش از این در مقاله کاربرد Interface در سی شارپ به آن پرداخته ایم. در این مقاله قصد داریم با یک مثال سامورایی! این موضوع را بیشتر توضیح بدهیم. اما قبل از هر چیز ذکر این نکته ضروری است که این مقاله، برگردان فارسی یک مقاله انگلیسی از لینک زیر است:

Dependency Injection By Hand

به دلیل انگلیسی بودن این مقاله، حیفم آمد که آنرا به فارسی ترجمه نکنم.

فرض کنید شما در حال نوشتن یک بازی به نام نینجا هستید! که در آن جنگجوهای شجاع، برای به دست آوردن شرافتشان، با اهریمن میجنگند! قبل از هر چیزی باید برای جنگجوهایمان یک سلاح مناسب تهیه کنیم. یک شمشیر یا به انگلیسی Sword چطور است؟ بیایید دست به کار بشویم:


class Sword 
{
    public void Hit(string target)
    {
        Console.WriteLine("Chopped {0} clean in half", target);
    }
}

احتمالا کد این کلاس گویای همه چیز هست. یک کلاس Sword ساخته ایم که یک متد hit -ضربه زدن- دارد و هروقت آنرا فراخوانی کنیم، ضربه زده خواهد شد و target یا همان هدفمان نصف میشود!

بسیار خوب. این از سلاح. حالا باید سامورایی را بسازیم: برای حمله به دشمنان، کلاس سامورایی باید یک متد حمله یا Attack داشته باشد که وقتی آنرا فراخوانی کنیم، سامورایی ما با شمشیرش، هدف را نصف کند.


class Samurai
{
    readonly Sword sword;
    public Samurai() 
    {
        this.sword = new Sword();
    }

    public void Attack(string target)
    {
        this.sword.Hit(target);
    }
}

بسیار خوب. حالا کافی است که سامورایی را بسازیم و بجنگیم!


class Program
{
    public static void Main() 
    {
        var warrior = new Samurai();
        warrior.Attack("the evildoers");
    }
}

در این کد ما با evildoers میجنگیم و او را با شمشیر نصف میکنیم. خوب حالا فرض کنید بخواهیم سامورایی ما با سلاح دیگری به غیر از شمشیر بجنگد! مثلا با شوریکن(نیغه برنده شبیه ستاره)

در این صورت باید کلاس سامورایی را به کل تغییر بدهیم. چرا که در کلاس سامورایی از کلاس شمشیر استفاده کرده ایم. پس هر بار که نینجای ما بخواهد با یک سلاح جدید بجنگد، باید کلاس سامورایی را تغییر بدهیم. وقتی یک کلاس به یک کلاس دیگر وابستگی داشته باشد، میگوییم این دو کلاس Tightly Coupled هستند. مثل سامورایی و شمشیر. طبیعتا ما این نوع وابستگی ها را دوست نداریم. چون مجبورمان میکنند کدمان را تغییر بدهیم. برای از بین بردن این وابستگی ها، از interfaceها استفاده میکنیم. بیایید یک interface به نام سلاح(weapon) بسازیم:


interface IWeapon
{
    void Hit(string target);
}

حالا کلاس شمشیر، را به این interface متصل میکنیم یا اصطلاحا آنرا Implement میکنیم:


class Sword : IWeapon
{
    public void Hit(string target) 
    {
        Console.WriteLine("Chopped {0} clean in half", target);
    }
}

حالا سامورایی را طوری تغییر میدهیم که به جای یک شمشیر، از یک سلاح استفاده کند:


class Samurai
{
    readonly IWeapon weapon;
    public Samurai() 
    {
        this.weapon = new Sword();
    }

    public void Attack(string target) 
    {
        this.weapon.Hit(target);
    }
}

حالا سامورایی ما میتواند از سلاح های مختلفی استفاده کند. فقط یک جای کارمیلنگد. ما هنوز هم از شمشیر، در کلاس سامورایی استفاده کرده ایم : this.weapon = new Sword();
پس باید کلاس سامورایی را یک کمی بهتر کنیم. کافی است که سلاح مورد نظر را از طریق constructor به سامورایی بدهیم:


class Samurai
{
    readonly IWeapon weapon;
    public Samurai(IWeapon weapon) 
    {
        this.weapon = weapon;
    }

    public void Attack(string target) 
    {
        this.weapon.Hit(target);
    }
}

حالا فقط کافی است که سلاح مورد نظرمان را از طریق constructor به سامورایی تزریق کنیم. قبل از این، اجازه بدهید یک سلاح جدید به غیر از شمشیر هم بسازیم:


class Shuriken : IWeapon
{
    public void Hit(string target)
    {
        Console.WriteLine("Pierced {0}'s armor", target);
    }
}

حالا یک ارتش سامورایی با سلاح های مختلف میسازیم و به evildoers حمله میکنیم. حاضرید؟


class Program
{
    public static void Main() 
    {
        var warrior1 = new Samurai(new Shuriken());
        var warrior2 = new Samurai(new Sword());
        warrior1.Attack("the evildoers");
        warrior2.Attack("the evildoers");
    }
}



کلمات کلیدی :

نظر بدهید

8 دیدگاه برای “تزریق وابستگی در سی شارپ به روش سامورایی!

  • Ahad Pirayi گفته
    10 اکتبر 17

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

    • علیرضا صبوئی گفته
      10 اکتبر 17

      زنده باشید. تشکر اصلی را باید از نویسنده مقاله انگلیسی کنیم 🙂

  • صابر گفته
    10 اکتبر 17

    با سلام در کل اصل موضوع رو متوجه شدم اما فکر میکنم استفاده کردنش توی برنامه ها به تجربه بیشتری نیاز داره
    البته به عنوان یه مبتدی اینو میگم

    • علیرضا صبوئی گفته
      10 اکتبر 17

      همینکه دغدغه یادگیریشو دارید، عالیه. برای اطلاعات بیشتر، به درس استفاده از interface در سی شارپ مراجعه کنید. در سایت سرچش کنید هستش

  • اسماعیلی گفته
    10 اکتبر 17

    بسیار عالی بود لذت بردم از انتقال ساده مفاهیم پیچیده

  • مهدی نوروزی گفته
    10 اکتبر 17

    واقعأ جالب بود وخیلی زیبا وقابل فهم مطلب تزریق وابستگی رو توضیح دادید.
    مرسی

  • سامان گفته
    10 اکتبر 17

    سلام و درود،
    ممنون ازمقالتون استفاده کردم و درکمو بالاتر بر
    امیدوارم که موفق باشید

    • علیرضا صبوئی گفته
      10 اکتبر 17

      ممنون از لطفت سامان عزیزم