موضوع مقاله: قاعده جانشانی لیسکوف | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # قاعده جانشانی لیسکوف | مقدمه: یعنی بدون این که هیچکدام از ویژگی‌های مطلوب برنامه (اعم از درستی، ماهیت کار انجام شده توسط برنامه و ...) تغییر کند؛ می‌توان یک شیء از نوع T با هر شیءای از نوع S را جایگزین کرد. | ## بخش 1: قاعده جانشانی لیسکوف | به بیان رسمی‌تر، اصل جایگزینی لیسکوف (LSP) تعریف خاصی از یک رابطهٔ زیرنوعی به نام رابطهٔ (قوی) زیرنوعی رفتاری است، که در ابتدا توسط باربارا لیسکوف در یک سخنرانی در کنفرانسی در سال ۱۹۷۸ با عنوان انتزاع داده‌ها و سلسله مراتب معرفی شد. این قاعده یک رابطهٔ معنایی است (نه صرفاً نحوی)، زیرا هدف آن تضمین قابلیت جانشانی انواع در یک ساختار سلسله‌مراتبی است. باربارا لیسکوف و جینت وینگ به طور خلاصه در مقاله‌ای منتشر شده در سال ۱۹۹۴ توضیح دادند: نیازمندی‌های زیرنوع: اگر یک ویژگی قابل اثبات برای انواع از نوع باشد؛ آنگاه برای تمام هایی از نوع که زیرنوعی از است؛ باید صحیح باشد. در همان مقاله، لیسکوف و وینگ منظور خود را از ساختار «انوع رفتاری» به‌وسیلهٔ گسترشی از منطق Hoare - که شباهت خاصی به «طراحی براساس قرارداد» برترند میر دارد- به تفصیل شرح داده‌اند که در آن تعامل با زیرنوع‌ها به شکل پیش‌شرط‌ها، پس‌شرط‌ها و ناوردا توضیح داده می‌شود. اصل مفهوم لیسکوف از یک «زیرنوع رفتاری» مفهومی از جایگزینی برای اشیا را تعریف می‌کند. یعنی اگر S زیرنوع T باشد، ممکن است اشیاء از نوع T در یک برنامه با اشیاء از نوع S جایگزین شوند؛ به شکلی که هیچ یک از خصوصیات مطلوب آن برنامه (مانند درستی) تغییر پیدا نکند. رابطهٔ زیرنوعیِ رفتاری یک مفهوم قوی‌تر از زیرنوعی معمولی توابع تعریف شده در نظریهٔ نوع‌ها است؛ که فقط به پادوردایی انواع آرگومان‌ها و هم‌وردایی نوع برگشتی متکی است. زیرنوعیِ رفتاری به‌طور کلی تصمیم‌ناپذیر است: اگر q ویژگیِ «متد x همیشه خاتمه می‌یابد» باشد؛ آنگاه تأیید این ویژگی برای برخی انواع S که زیرنوع T هستند برای یک برنامهٔ رایانه‌ای (مانند یک مترجم) ناممکن است (حتی در صورتی که ویژگی فوق برای T صحیح باشد). | ## بخش 2: قاعده جانشانی لیسکوف | اصل لیسکوف برخی نیازمندی‌های استاندارد را برای امضای انواع در زبان‌های برنامه‌نویسی جدید شیءگرا الزام می‌کند (معمولاً در سطح کلاس‌ها و نه انواع. برای دیدن تمایز بین این دو مراجعه کنید به زیرنوع نامی و ساختاری): پادوردایی آرگومان‌های متدها در زیرنوع. این الزامات با زبانی مشابه آنچه در طراحی براساس قرارداد استفاده شده است؛ به جزئیات توصیف شده‌اند. این توصیف به قواعد محدود کننده برای وراثت منجر می‌شود: پیش‌شرط‌ها را نمی توان در یک زیرنوع تقویت کرد. محدودیت تاریخ (قانون تاریخ): اشیاء فقط از طریق متدهای خودشان (به‌طریق کپسوله‌سازی) قابل تغییر هستند. از آنجایی که زیرنوع‌ها می‌توانند توابع عضوی داشته باشند که در نوع والد وجود ندارد؛ ایجاد این توابع عضو ممکن است باعث تغییر وضعیت در زیرنوع شود به‌طوری که در نوع والد مجاز نیست. برای یک مثال از نقض این محدودیت؛ می‌توان تعریف یک نقطهٔ قابل تغییر به عنوان زیرنوع از یک نقطهٔ تغییرناپذیر نام برد. این یک نقض محدودیت تاریخ است، زیرا در تاریخ نقطهٔ تغییرناپذیر، وضعیت بعد از ایجاد همیشه یکسان است، بنابراین نمی‌تواند به طور کلی تاریخچه‌ای از یک نقطهٔ قابل تغییر را در برگیرد. | ## بخش 3: قاعده جانشانی لیسکوف | متغیرهای اضافه شده به زیرنوع می‌توانند با خیال راحت تغییر داده شوند زیرا از طریق توابع عضو نوع والد قابل مشاهده نیستند. بنابراین، می‌توان نوع دایره‌ای با مرکز ثابت اما شعاع قابل تغییر را از نوع نقطهٔ غیرقابل تغییر بدون نقض LSP مشتق کرد. سرچشمه‌ها قوانین مربوط به پیش‌شرط‌ها و پس‌شرط‌ها مشابه با قوانینی است که توسط برتراند مایر در کتابش که در سال ۱۹۸۸ با نام ساخت نرم‌افزار شیءگرا معرفی شده است. هر دو مایر، و بعد از وی پیر امریکا، که اولین بار اصطلاح «انواع رفتاری» را به کار بردند، به اثبات نظری تعاریف برخی از مفاهیم انواع رفتاری پرداختند. با این حال تعاریف آن‌ها مفهوم استعار را که ممکن است در زبان‌های برنامه‌نویسی با پشتیبانی از اشاره‌گر و مرجع وجود داشته باشد مدنظر قرار نمی‌دهد. در نظر گرفتن استعار، پیشرفت اصلی لیسکوف و وینگ (۱۹۹۴) بوده است و یک ماده اصلی آن «محدودیت تاریخ» است. | ## جمع‌بندی | طبق تعاریف مایر و آمریکا، یک «نقطهٔ متغیر» می‌تواند یک زیرنوع رفتاری از «نقطهٔ تغییرناپذیر» باشد، در حالی که LSP این امر را ممنوع می‌کند.