در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش اصول SOLID در برنامه نویسی قسمت 3 : Liskov Substitute

در ادامه توضیحات قواعد SOLID، قاعده LSP یا Liskov Substitution Principal را بررسی می کنیم. اگر بخواهیم این قاعده رو توضیح دهیم اینطور می توان توضیح داد: «فرض کنید کلاس C از کلاس B مشتق شده است، بر اساس قاعده LSP، در هر قسمت از برنامه که شئ ای از نوع B استفاده شده است، باید بتوان شئ ای از نوع C را جایگزین کرد، بدون اینکه تغییری در روند اجرای برنامه رخ دهد یا پیغام خطایی دریافت کنیم!» جا افتادن مفهوم این قاعده کمی دشوار است، اما سعی می کنیم با مثالی ساده از پیچیدگی این موضوع کم کنیم و بتوانیم توضیح شفافی از LSP ارائه دهیم. ابتدا حالتی را پیاده سازی می کنیم که قاعده LSP را نقض می کند و در قدم بعدی کد را اصلاح می کنیم که مطابق قاعده LSP باشد. کد زیر را در نظر بگیرید:

public class CollectionBase
{
    public int Count { get; set; }
}

public class Array : CollectionBase
{
        
}

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

CollectionBase collection = new Array();
var items = collection.Count;

در حقیقت، شئ Array داخل متغیری از نوع CollectionBase قرار داده شده است. خوب تا اینجا مشکلی نیست، اما فرض کنید قرار است کلاس های دیگری از CollectionBase مشتق شوند که قابلیت اضافه کردن آیتم را دارند، کلاس Array به دلیل اینکه طول ثابتی دارد نمی توان به آن آیتم جدیدی اضافه کرد. کد بالا را به صورت زیر تغییر می دهیم:

public class CollectionBase
{
    public int Count { get; set; }

    public virtual void Add(object item)
    {
            
    }
}

public class List : CollectionBase
{
    public override void Add(object item)
    {
        // add item to list
    }
}

public class Array : CollectionBase
{
    public override void Add(object item)
    {
        throw new InvalidOperationException();
    }
}

دقت کنید، متد Add را داخل CollectionBase تعریف کردیم، کلاس List از متد Add پشتیبانی می کند اما کلاس آرایه به دلیلی که بالا گفتیم زمان فراخوانی متد Add، ایجاد خطا می کنید:

CollectionBase array = new Array();
CollectionBase list = new List();
list.Add(2); // works
array.Add(3); // throw exception

کد بالا بدون مشکل کامپایل می شود، اما زمانی که برنامه اجرا شود، زمان اضافه کردن آیتم به آرایه پیغام خطا دریافت می کنیم، با این اوصاف کد بالا قاعده LSP را نقض کرده! زیرا همانطور که در بالا گفتیم در صورت استفاده از کلاس پایه به عنوان Data Type و قرار دادن شئ ای از نوع فرزند در آن، برنامه بدون مشکل باید کار کند. راه حل این مشکل چیست؟ به روش های مختلف می توان مشکل را حل کرد، اما در اینجا مکانیزم استفاده از interface ها را مطرح می کنیم، برای رفع مشک، کد بالا را به صورت زیر تغییر می دهیم:

public interface IList
{
    void Add(object item);
}

public class CollectionBase
{
    public int Count { get; set; }
}

public class List : CollectionBase, IList
{
    public void Add(object item)
    {
        // add item to list
    }
}

public class Array : CollectionBase
{
}

همانطور که مشاهده می کنید در کد بالا، متد Add، به جای تعریف در کلاس CollectionBase، داخل یک interface به نام IList تعریف شده و کلاس List این interface را پیاده سازی کرده است. با این کار، دیگر امکان فراخوانی متد Add برای کلاس Array وجود ندارد. کد بالا مبتنی بر قاعده LSP است و دیگر آن را نقض نمی کند. در قسمت بعدی در مورد IS یا Interface Segregation صحبت خواهیم کرد. ITPRO باشید
#قاعده_liskov_substitution_در_solid #تکنیک_های_برنامه_نویسی #نکات_برنامه_نویسی #قواعد_solid
عنوان
1 آموزش اصول SOLID در برنامه نویسی قسمت 1 : مقدمه و SRP رایگان
2 آموزش اصول SOLID در برنامه نویسی قسمت 2 : Open Closed رایگان
3 آموزش اصول SOLID در برنامه نویسی قسمت 3 : Liskov Substitute رایگان
4 آموزش اصول SOLID در برنامه نویسی قسمت 4: Interface Segregate رایگان
5 آموزش اصول SOLID در برنامه نویسی قسمت 5 : Dependency Inverse رایگان
زمان و قیمت کل 0″ 0
3 نظر
max_ali007

با سلام

اصل Liskov substitution که می گوید یک شی در برنامه شما باید قابلیت جایگزینی با شی‌ از کلاسی که از آن مشتق شده است را بدون ایجاد مشکل در برنامه داشته باشد. به نظر میاد قضیه polymorphism را نقض می کند. آیا طبق این اصل کلاس هایی که به صورت polymorphism هستن و override شده اند با اصل Liskov substitution سازگار نیست؟

حسین احمدی

دقیقاً متوجه نشدم، منظورتون از نقض Polymorphism چی هست؟

max_ali007

منظورم این هست که اگر ما یک کلاس داشته باشیم به نام A که متدهایی virtual داشته باشه و کلاسهای B,C فرزندهای کلاس A باشند ومتدهای کلاس A را override کرده باشند این اصل Liskov substitution را نقض می کند؟

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....