آموزش

اصل تعویض لیسکوف ، سومین اصل جامد

کلاس های کودک هرگز نباید بر روی ها تأثیر بگذارد یا تغییر دهد defiعبارات نوع کلاس والد.

مفهوم این اصل توسط باربارا لیسکوف در کنفرانس اصلی در سال 1987 معرفی شد و بعداً در مقاله ای به همراه جانت وینگ در سال 1994 منتشر شد. defiمتن اصلی به شرح زیر است:

بگذارید q (x) یک ویژگی قابل اثبات بر روی اشیا x x از نوع T باشد. سپس q (y) باید برای اشیا y y از نوع S که S یک نوع فرعی از T است قابل اثبات باشد.

بعداً با انتشار اصول جامد رابرت سی. مارتین در کتاب توسعه نرم افزار چابک، اصول، الگوها و تمرین ها و سپس انتشار مجدد در نسخه سی شارپ کتاب اصول چابک، الگوها و تمرینات در سی شارپ، defiبه عنوان اصل جایگزینی لیسکوف شناخته شد.

این ما را به defiاطلاعات ارائه شده توسط رابرت سی مارتین: انواع فرعی باید با انواع پایه خود قابل تعویض باشند.

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

وسیله نقلیه کلاس {

    تابع startEngine () {

        // عملکرد پیش فرض موتور

    }

 

    عملکرد تسریع () {

        // قابلیت پیش فرض شتاب

    }

}

با توجه به کلاس Vehicle - می تواند انتزاعی باشد - و دو پیاده سازی:

کلاس کلاس خودرو را گسترش می دهد {

    تابع startEngine () {

        $ this-> engIgnition ()؛

        والد :: startEngine ()؛

    }

 

    تابع خصوصی engIgnition () {

        // روش جرقه زنی

    }

}

 

کلاس ElectricBus وسیله نقلیه را گسترش می دهد {

    عملکرد تسریع () {

        $ this-> افزایش ولتاژ ()؛

        $ this-> connectIndividualEngines ()؛

    }

 

    افزایش عملکرد خصوصی ولتاژ () {

        // منطق الکتریکی

    }

 

    عملکرد خصوصی connectIndividualEngines () {

        // منطق اتصال

    }

}

راننده کلاس {

    عملکرد برو (وسیله نقلیه $ v) {

        $ v-> startEngine ()؛

        $ v-> تسریع ()؛

    }

}

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

که ما را به یک پیاده سازی ساده از الگوی طراحی روش الگو می رساند همانطور که از آن در OCP استفاده کردیم.

همچنین ممکن است به اصل دوم SOLID علاقه مند باشید: https: //bloginnovazione.en / open-closed-second-solid-principle / 3906 /

بر اساس تجربه قبلی ما با اصل باز / بسته ، می توانیم نتیجه بگیریم که اصل تعویض لیسکوف با OCP ارتباط نزدیک دارد. در واقع ، "نقض LSP نقض پنهان OCP است" (رابرت سی. مارتین) ، و الگوی طراحی روش الگو یک نمونه کلاسیک از احترام و اجرای LSP است ، که به نوبه خود یکی از راه حل های رعایت با OCP.

نمونه ای از نقض LSP

مستطیل کلاس {

    $ topLeft خصوصی؛

    عرض خصوصی $؛

    قد خصوصی $؛

 

    مجموعه عملکرد عمومی ارتفاع ($ ارتفاع) {

        $ this-> height = $ height؛

    }

 

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

    عملکرد عمومی getHeight () {

        بازگشت $ this-> قد؛

    }

 

    تابع عمومی setWidth ($ عرض) {

        $ این-> عرض = $ عرض ؛

    }

 

    تابع عمومی getWidth () {

        بازگشت $ this-> عرض؛

    }

}

بیایید با یک شکل اولیه هندسی ، یک مستطیل شروع کنیم. این فقط یک شی داده ساده با تنظیم کننده ها و گیرنده ها برای عرض و ارتفاع است. تصور کنید که برنامه ما کار می کند و قبلاً روی چندین مشتری مستقر شده است. اکنون آنها به ویژگی جدیدی نیاز دارند. آنها باید بتوانند مربع ها را دستکاری کنند.

در زندگی واقعی ، در هندسه ، مربع شکل خاصی از مستطیل است. بنابراین می توانیم سعی کنیم یک کلاس Square را گسترش دهیم که یک کلاس Rectangle را گسترش دهد. غالباً گفته می شود كه كلاس كودك كلاس والدین است و این عبارت حداقل در نگاه اول با LSP مطابقت دارد.

مربع مربع مستطیل را گسترش می دهد {

    مجموعه عملکرد عمومی ارتفاع (مقدار $) {

        $ this-> width = $ value؛

        $ this-> height = $ value؛

    }

 

    تابع عمومی setWidth (مقدار $) {

        $ this-> width = $ value؛

        $ this-> height = $ value؛

    }

}

یک مربع مستطیل با عرض و ارتفاع برابر است و ما می توانیم مانند مثال قبلی یک اجرای عجیب را انجام دهیم. ما می توانیم هر دو تنظیم کننده را نادیده بگیریم تا ارتفاع و عرض را تنظیم کنیم. اما این چگونه بر کد مشتری تأثیر می گذارد؟

مشتری کلاس {

    عملکرد areaVerifier (مستطیل $ r) {

        $ r-> setWidth (5) ؛

        $ r-> setHeight (4)؛

        if ($ r-> area ()! = 20) {

            استثنای جدید را پرتاب کنید ('منطقه بد!')؛

        }

        بازگشت واقعی؛

    }

}

می توان یک کلاس کلاینت را تصور کرد که مساحت مستطیل را بررسی کرده و در صورت غلط بودن یک استثنا را ایجاد کند.

ناحیه عملکرد () {

    بازگشت $ این-> عرض * $ این-> ارتفاع؛

}

ما بدیهی است که روش فوق را برای تأمین منطقه به کلاس Rectangle خود اضافه کردیم.

کلاس LspTest گسترش PHPUnit_Framework_TestCase {

    test testRectangleArea () {

        $ r = مستطیل جدید ()؛

        $ c = مشتری جدید ()؛

        $ this-> assertTrue ($ c-> areaVerifier ($ r))؛

    }

}

و ما با ارسال یک شی مستطیل خالی به منطقه چک کننده، یک تست ساده ایجاد کردیم و تست با موفقیت انجام شد. اگر کلاس ما مربع است defiبه درستی nished، ارسال آن به areaVerifier() Client نباید عملکرد آن را مختل کند. به هر حال، مربع به هر مفهوم ریاضی یک مستطیل است. اما آیا کلاس ماست؟

Test TestSquareArea () {

    $ r = میدان جدید ()؛

    $ c = مشتری جدید ()؛

    $ this-> assertTrue ($ c-> areaVerifier ($ r))؛

}

بنابراین، کلاس Square ما بالاخره یک مستطیل نیست. قوانین هندسه را زیر پا می گذارد. شکست می خورد و اصل جایگزینی لیسکوف را نقض می کند.

Ercole Palmeri

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

مقالات اخیر

مداخله نوآورانه در واقعیت افزوده، با یک بیننده اپل در پلی کلینیک کاتانیا

یک عمل جراحی چشم با استفاده از نمایشگر تجاری Apple Vision Pro در پلی کلینیک کاتانیا انجام شد…

3 می 2024

مزایای رنگ آمیزی صفحات برای کودکان - دنیایی از جادو برای همه سنین

توسعه مهارت های حرکتی ظریف از طریق رنگ آمیزی، کودکان را برای مهارت های پیچیده تری مانند نوشتن آماده می کند. رنگ کردن…

2 می 2024

آینده اینجاست: چگونه صنعت کشتیرانی اقتصاد جهانی را متحول می کند

بخش دریایی یک قدرت واقعی اقتصادی جهانی است که به سمت یک بازار 150 میلیاردی حرکت کرده است.

1 می 2024

ناشران و OpenAI توافق نامه هایی را برای تنظیم جریان اطلاعات پردازش شده توسط هوش مصنوعی امضا می کنند.

دوشنبه گذشته، فایننشال تایمز از قراردادی با OpenAI خبر داد. FT مجوز روزنامه نگاری در سطح جهانی خود را صادر می کند…

آوریل 30 2024

نوآوری را به زبان خود بخوانید

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

ما را دنبال کنید