Принцип підстановки Лісков

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Принцип підстановки Лісков (англ. Liskov Substitution Principle, LSP) в об'єктно-орієнтованому програмуванні — це спеціальне визначення підтипу, запропоноване Барбарою Лісков в 1987 році на конференції в доповіді під назвою Абстракція даних та ієрархія[1].

У наступній статті [2] Лісков сформулювала свій принцип так:

Нехай q (x) є властивістю вірною для об'єктів x деякого типу T. Тоді q(y) також має бути вірним для об'єктів y типу S, де  S  — підтип типу T.

Таким чином ідея Лісков про «підтип» визначає поняття заміщення — якщо S підтип T, тоді об'єкти типу T в програмі можуть бути заміщені об'єктами типу S без будь-яких змін бажаних властивостей цієї програми (наприклад, коректність).

Цей принцип — найважливіший критерій для оцінки якості ухвалених рішень при побудові ієрархій успадкування. Сформулювати його можна у вигляді простого правила: тип S буде підтипом Т тоді і тільки тоді, коли кожному об'єктові o1 типу S відповідає певний об'єкт o2 типу T таким чином, що для всіх програм P, реалізованих в термінах T, поведінка P не зміниться, якщо o1 замінити на o2.

Проектування за контрактом[ред.ред. код]

Принцип підстановки (заміни) Лісков має близьке відношення до методології проектування за контрактом, і веде до деяких обмежень на те як контракти можуть взаємодіяти з успадкуванням:

Також, з принципу LSP випливає, що методи підкласу не можуть викидати жодних додаткових винятків крім тих, які самі є підкласами винятків які викидає методи надкласу. Див. коваріантність і контрваріантність і типи даних.

Функція, що обробляє ієрархію класів з порушеннями принципу Лісков, використовує посилання на базовий клас, але також вимушена мати інформацію про підклас. Така функція також порушує принцип відкритості/закритості оскільки її необхідно змінювати в разі появи нових похідних класів.

У цьому контексті принцип заміщення Лісков можна переформулювати так:

Функції, які використовують посилання на базові класи, повинні мати можливість використовувати об'єкти похідних класів, не знаючи про це.

Посилання[ред.ред. код]

  1. Liskov, Barbara (1987-10-04). «Data abstraction and hierarchy». Процитовано 2008-03-23. 
  2. Liskov, Barbara; Wing, Jeannette (July 1999). «Behavioral Subtyping Using Invariants and Constraints» (PS). Архів оригіналу за 2012-08-31. Процитовано 2006-10-05. 

Дивіться також[ред.ред. код]