آموزش

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

کلاس های کودک هرگز نباید بر روی ها تأثیر بگذارد یا تغییر دهد 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

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

مقالات اخیر

Veeam دارای جامع ترین پشتیبانی از باج افزار، از محافظت تا پاسخ و بازیابی است

Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیت‌های پزشکی قانونی و اصلاحی را ارائه می‌دهد…

آوریل 23 2024

انقلاب سبز و دیجیتال: چگونه تعمیر و نگهداری پیش‌بینی‌کننده صنعت نفت و گاز را متحول می‌کند

تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…

آوریل 22 2024

تنظیم کننده ضد انحصار بریتانیا هشدار BigTech را در مورد GenAI به صدا در می آورد

CMA انگلستان در مورد رفتار Big Tech در بازار هوش مصنوعی هشداری صادر کرده است. آنجا…

آوریل 18 2024

کاسا گرین: انقلاب انرژی برای آینده ای پایدار در ایتالیا

فرمان "خانه های سبز" که توسط اتحادیه اروپا برای افزایش بهره وری انرژی ساختمان ها تدوین شده است، روند قانونی خود را با…

آوریل 18 2024

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

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

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