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

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

Принцип подстановки Барбары Лисков (англ. Liskov Substitution Principle, LSP) в объектно-ориентированном программировании является специфичным определением подтипа предложенным Барбарой Лисков в 1987 году на конференции в основном докладе под названием Абстракция данных и иерархия [1].

В последующей статье[2] Лисков кратко сформулировала свой принцип следующим образом:

Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.

Роберт С. Мартин определил[3] этот принцип так:

Функции которые используют базовый тип должны иметь возможность использовать подтипы базового типа не зная об этом.

Таким образом, идея Лисков о «подтипе» даёт определение понятия замещения — если S является подтипом T, тогда объекты типа T в программе могут быть замещены объектами типа S без каких либо изменений желательных свойств этой программы (например, корректность).

Этот принцип является важнейшим критерием для оценки качества принимаемых решений при построении иерархий наследования. Сформулировать его можно в виде простого правила: тип S будет подтипом Т тогда и только тогда, когда каждому объекту oS типа S соответствует некий объект oT типа T таким образом, что для всех программ P, реализованных в терминах T, поведение P не будет меняться, если oT заменить на oS.

Более простыми словами можно сказать, что поведение наследуемых классов не должно противоречить поведению, заданному базовым классом, т.е. поведение наследуемых классов должно быть ожидаемым для кода, использующего переменную базового типа.

Саттер и Александреску в своём руководстве по использованию Си++ для выражения этого принципа также используют фразу "подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс". По мнению данных авторов, публичное наследование в Си++ можно употреблять только тогда, когда оно удовлетворяет принципу Лисков. Приватное наследование, по их же мнению, дозволено использовать для доступа к protected части базы и перекрытия виртуальных методов. В любом же ином случае, т.е. для всего лишь повторного использования кода из базы, наследование применять нельзя.

Основания: использование публичного наследования для повторного использования кода приводит к тому, что внешний мир начинает считать класс Derived разновидностью класса Base, и возможно появление кода, явно использующего этот факт. Такое сильно сужает простор для манёвра архитектора в дальнейшем поддержании и рефакторинге класса Derived.

Содержание

Проектирование по контракту

Принцип подстановки (замещения) Лисков имеет близкое отношение к методологии проектирования по контракту, и ведет к некоторым ограничениям на то, как контракты могут взаимодействовать с наследованием:

  • Предусловия не могут быть усилены в подклассе.
  • Постусловия не могут быть ослаблены в подклассе.

Также, принцип LSP подразумевает, что методы подкласса не могут генерировать никаких дополнительных исключений, кроме тех, которые сами являются подклассами исключений, генерируемых методами надкласса. См. Ковариантность и контравариантность и типы данных.

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

В данном контектсте принцип подстановки можно переформулировать следующим образом:

Функции, которые используют ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом.

Принцип Барбары Лисков заставляет задуматься о том, что такое «декларация типа» в терминах объектно-ориентированного языка программирования, который мы используем. Достаточно ли нам описать интерфейс объекта с помощью обычного абстрактного класса со списком методов, типами параметров и возвращаемого значения? Каким образом мы можем декларировать требования к значениям параметров метода и свойства, которыми будет обладать возвращаемое значение? Как нам описать исключения, которые может сгенерировать метод во время выполнения? Как нам описать изменение состояния объекта на разных этапах его жизненного цикла?

Задавая себе эти вопросы и находя ответы, можно спроектировать систему, которая действительно будет удовлетворять принципу подстановки Барбары Лисков.

См. также

  • SOLID – буква "L" в аббревиатуре означает Принцип подстановки Барбары Лисков (англ. Liskov Substitution Principle)

Примечания

  1. Liskov, Barbara Data abstraction and hierarchy (4 октября 1987). Проверено 23 марта 2008.
  2. Liskov, Barbara; Wing, Jeannette Behavioral Subtyping Using Invariants and Constraints (PS) (July 1999). Проверено 5 октября 2006.
  3. Martin, Robert The Liskov Substitution Principle (PS). Проверено 5 октября 2006.

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Принцип подстановки Лисков" в других словарях:

  • Принцип подстановки Барбары Лисков — (англ. Liskov Substitution Principle, LSP) в объектно ориентированном программировании является специфичным определением подтипа предложенным Барбарой Лисков в 1987 году на конференции в основном докладе под названием Абстракция данных и… …   Википедия

  • Лисков, Барбара — Барбара Лисков Barbara Jane Liskov Дата рождения: 7 ноября 1939(1939 11 07) (73 года) Страна …   Википедия

  • Layered Service Provider — Эта статья  об многоуровневом поставщике услуг. О принципе подстановки Лисков см. Принцип подстановки Барбары Лисков. LSP (Layered Service Provider, англ. многоуровневый поставщик услуг) технология Windows sockets версии… …   Википедия

  • SOLID (объектно-ориентированное программирование) — У этого термина существуют и другие значения, см. Solid. SOLID это аббревиатура пяти основных принципов дизайна классов в объектно ориентированном проектировании  Single responsibility, Open closed, Liskov substitution, Interface segregation …   Википедия

  • LSP — Аббревиатура LSP может обозначать: Принцип подстановки Барбары Лисков (Liskov substitution principle) Layered Service Provider Список зна …   Википедия

  • Суперкласс (информатика) — В информатике суперклассом или родительским классом называют класс, на основе которого создаются другие классы. Классы, полученные на основе суперкласса, называются дочерними классами, производными классами или подклассами. Суперкласс позволяет… …   Википедия

  • Переопределение метода — (англ. Method overriding) в объектно ориентированном программировании одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из… …   Википедия

  • Суперкласс (программирование) — Основная статья: Наследование (программирование) В программировании суперклассом или родительским классом называют класс, на основе которого создаются другие классы. Классы, полученные на основе суперкласса, называются дочерними классами,… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»