قاعده جانشانی لیسکوف

اصل برنامه نویسی شیءگرا

تعویض‌پذیری یک اصل در برنامه نویسی شیءگرا است که می‌گوید در یک برنامهٔ رایانه‌ای ، اگر S زیرنوع T باشد، امکان جایگزینی نمونه‌های نوع T با نمونه‌های نوع S وجود دارد. یعنی بدون این که هیچکدام از ویژگی‌های مطلوب برنامه (اعم از درستی، ماهیت کار انجام شده توسط برنامه و ...) تغییر کند؛ می‌توان یک شیء از نوع T با هر شیءای از نوع S را جایگزین کرد. به بیان رسمی‌تر، اصل جایگزینی لیسکوف (LSP) تعریف خاصی از یک رابطهٔ زیرنوعی به نام رابطهٔ (قوی) زیرنوعی رفتاری است، که در ابتدا توسط باربارا لیسکوف در یک سخنرانی در کنفرانسی در سال ۱۹۷۸ با عنوان انتزاع داده‌ها و سلسله مراتب معرفی شد. این قاعده یک رابطهٔ معنایی است (نه صرفاً نحوی)، زیرا هدف آن تضمین قابلیت جانشانی انواع در یک ساختار سلسله‌مراتبی است. باربارا لیسکوف و جینت وینگ به طور خلاصه در مقاله‌ای منتشر شده در سال ۱۹۹۴ توضیح دادند:

باربارا لیسکوف

نیازمندی‌های زیرنوع: اگر یک ویژگی قابل اثبات برای انواع از نوع باشد؛ آنگاه برای تمام هایی از نوع که زیرنوعی از است؛ باید صحیح باشد.

در همان مقاله، لیسکوف و وینگ منظور خود را از ساختار «انوع رفتاری» به‌وسیلهٔ گسترشی از منطق Hoare - که شباهت خاصی به «طراحی براساس قرارداد» برترند میر دارد- به تفصیل شرح داده‌اند که در آن تعامل با زیرنوع‌ها به شکل پیش‌شرط‌ها، پس‌شرط‌ها و ناوردا توضیح داده می‌شود.

اصل ویرایش

مفهوم لیسکوف از یک «زیرنوع رفتاری» مفهومی از جایگزینی برای اشیا را تعریف می‌کند. یعنی اگر S زیرنوع T باشد، ممکن است اشیاء از نوع T در یک برنامه با اشیاء از نوع S جایگزین شوند؛ به شکلی که هیچ یک از خصوصیات مطلوب آن برنامه (مانند درستی) تغییر پیدا نکند.

رابطهٔ زیرنوعیِ رفتاری یک مفهوم قوی‌تر از زیرنوعی معمولی توابع تعریف شده در نظریهٔ نوع‌ها است؛ که فقط به پادوردایی انواع آرگومان‌ها و هم‌وردایی نوع برگشتی متکی است. زیرنوعیِ رفتاری به‌طور کلی تصمیم‌ناپذیر است: اگر q ویژگیِ «متد x همیشه خاتمه می‌یابد» باشد؛ آنگاه تأیید این ویژگی برای برخی انواع S که زیرنوع T هستند برای یک برنامهٔ رایانه‌ای (مانند یک مترجم) ناممکن است (حتی در صورتی که ویژگی فوق برای T صحیح باشد). با این وجود این اصل در طراحی سلسله مراتب اشتقاق مفید است.

اصل لیسکوف برخی نیازمندی‌های استاندارد را برای امضای انواع در زبان‌های برنامه‌نویسی جدید شیءگرا الزام می‌کند (معمولاً در سطح کلاس‌ها و نه انواع. برای دیدن تمایز بین این دو مراجعه کنید به زیرنوع نامی و ساختاری):

  • پادوردایی آرگومان‌های متدها در زیرنوع.
  • هم‌وردایی نوع بازگشتی در زیرنوع.
  • هیچ exception جدیدی نباید توسط زیرنوع صادر شود، به‌جز آن دسته exception های خود زیرنوع استثنا هستند که توسط متدهای زیرنوع صادر شده باشد.

علاوه بر الزامات امضا، زیرنوع باید تعدادی الزامات رفتاری را نیز برآورده کند. این الزامات با زبانی مشابه آنچه در طراحی براساس قرارداد استفاده شده است؛ به جزئیات توصیف شده‌اند. این توصیف به قواعد محدود کننده برای وراثت منجر می‌شود:

  • پیش‌شرط‌ها را نمی توان در یک زیرنوع تقویت کرد.
  • پس‌شرط‌ها نمی‌توانند در یک زیرنوع تضعیف شوند.
  • ناوردا های نوع والد باید در زیرنوع حفظ شوند.
  • محدودیت تاریخ (قانون تاریخ): اشیاء فقط از طریق متدهای خودشان (به‌طریق کپسوله‌سازی) قابل تغییر هستند. از آنجایی که زیرنوع‌ها می‌توانند توابع عضوی داشته باشند که در نوع والد وجود ندارد؛ ایجاد این توابع عضو ممکن است باعث تغییر وضعیت در زیرنوع شود به‌طوری که در نوع والد مجاز نیست. محدودیت تاریخ این امر را ممنوع می‌کند. این محدودیت عنصر جدیدی بود که توسط لیسکوف و وینگ معرفی شد. برای یک مثال از نقض این محدودیت؛ می‌توان تعریف یک نقطهٔ قابل تغییر به عنوان زیرنوع از یک نقطهٔ تغییرناپذیر نام برد. این یک نقض محدودیت تاریخ است، زیرا در تاریخ نقطهٔ تغییرناپذیر، وضعیت بعد از ایجاد همیشه یکسان است، بنابراین نمی‌تواند به طور کلی تاریخچه‌ای از یک نقطهٔ قابل تغییر را در برگیرد. متغیرهای اضافه شده به زیرنوع می‌توانند با خیال راحت تغییر داده شوند زیرا از طریق توابع عضو نوع والد قابل مشاهده نیستند. بنابراین، می‌توان نوع دایره‌ای با مرکز ثابت اما شعاع قابل تغییر را از نوع نقطهٔ غیرقابل تغییر بدون نقض LSP مشتق کرد.

سرچشمه‌ها ویرایش

قوانین مربوط به پیش‌شرط‌ها و پس‌شرط‌ها مشابه با قوانینی است که توسط برتراند مایر در کتابش که در سال ۱۹۸۸ با نام ساخت نرم‌افزار شیءگرا معرفی شده است. هر دو مایر، و بعد از وی پیر امریکا، که اولین بار اصطلاح «انواع رفتاری» را به کار بردند، به اثبات نظری تعاریف برخی از مفاهیم انواع رفتاری پرداختند. با این حال تعاریف آن‌ها مفهوم استعار را که ممکن است در زبان‌های برنامه‌نویسی با پشتیبانی از اشاره‌گر و مرجع وجود داشته باشد مدنظر قرار نمی‌دهد. در نظر گرفتن استعار، پیشرفت اصلی لیسکوف و وینگ (۱۹۹۴) بوده است و یک ماده اصلی آن «محدودیت تاریخ» است. طبق تعاریف مایر و آمریکا، یک «نقطهٔ متغیر» می‌تواند یک زیرنوع رفتاری از «نقطهٔ تغییرناپذیر» باشد، در حالی که LSP این امر را ممنوع می‌کند.

جستارهای وابسته ویرایش

منابع ویرایش

کتابشناسی ویرایش

منابع کلی

  • Gary T. Leavens and Krishna K. Dhara, Concepts of Behavioral Subtyping and a Sketch of Their Extension to Component-Bases Systems in Gary T. Leavens, Murali Sitaraman, (ed.) Foundations of component-based systems, Cambridge University Press, 2000 شابک ‎۰−۵۲۱−۷۷۱۶۴−۱. This paper surveys various notions of behavioral subtyping, including Liskov and Wing's.
  • {{cite conference}}: Empty citation (help) An updated version appeared as CMU technical report: Liskov, Barbara; Wing, Jeannette (July 1999). "Behavioral Subtyping Using Invariants and Constraints" (PS). Retrieved 2006-10-05. The formalization of the principle by its authors.
  • Reinhold Plösch, Contracts, scenarios and prototypes: an integrated approach to high quality software, Springer, 2004, شابک ‎۳−۵۴۰−۴۳۴۸۶−۰. Contains a gentler introduction to behavioral subtyping in its various forms in chapter 2.
  • Robert C. Martin, The Liskov Substitution Principle, C++ Report, March 1996. An article popular in the object-oriented programming community that gives several examples of LSP violations.
  • Kazimir Majorinc, Ellipse-Circle Dilemma and Inverse Inheritance, ITI 98, Proceedings of the 20th International Conference of Information Technology Interfaces, Pula, 1998, ISSN 1330-1012. This paper discusses LSP in the mentioned context.

منابع خاص

پیوند به بیرون ویرایش