مفهوم این اصل توسط باربارا لیسکوف در کنفرانس اصلی در سال 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-> تسریع ()؛
}
}
که ما را به یک پیاده سازی ساده از الگوی طراحی روش الگو می رساند همانطور که از آن در OCP استفاده کردیم.
همچنین ممکن است به اصل دوم SOLID علاقه مند باشید: https: //bloginnovazione.en / open-closed-second-solid-principle / 3906 /
بر اساس تجربه قبلی ما با اصل باز / بسته ، می توانیم نتیجه بگیریم که اصل تعویض لیسکوف با OCP ارتباط نزدیک دارد. در واقع ، "نقض LSP نقض پنهان OCP است" (رابرت سی. مارتین) ، و الگوی طراحی روش الگو یک نمونه کلاسیک از احترام و اجرای LSP است ، که به نوبه خود یکی از راه حل های رعایت با OCP.
مستطیل کلاس {
$ 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
Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیتهای پزشکی قانونی و اصلاحی را ارائه میدهد…
تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…
CMA انگلستان در مورد رفتار Big Tech در بازار هوش مصنوعی هشداری صادر کرده است. آنجا…
فرمان "خانه های سبز" که توسط اتحادیه اروپا برای افزایش بهره وری انرژی ساختمان ها تدوین شده است، روند قانونی خود را با…