Принцип объектно-ориентированного программирования
Принцип подстановки Лисков ( LSP ) — это особое определение отношения подтипирования , называемого сильным поведенческим подтипированием , которое было первоначально введено Барбарой Лисков в докладе на конференции 1987 года под названием «Абстракция данных и иерархия» . Он основан на концепции «заменяемости» — принципе в объектно-ориентированном программировании, утверждающем, что объект (такой как класс ) может быть заменен подобъектом (таким как класс, который расширяет первый класс) без нарушения программы. Это семантическое, а не просто синтаксическое отношение, поскольку оно призвано гарантировать семантическую совместимость типов в иерархии, в частности типов объектов. Барбара Лисков и Жанетт Винг кратко описали этот принцип в статье 1994 года следующим образом: [1]
Требование подтипа : Пусть — свойство, доказуемое для объектов типа T. Тогда должно быть истинным для объектов типа S, где S — подтип T.
Символично:
То есть, если S подтипирует T, то то, что справедливо для T-объектов, справедливо и для S-объектов. В той же статье Лисков и Винг подробно изложили свое понятие поведенческого подтипирования в расширении логики Хоара , которое имеет определенное сходство с конструкцией по контракту Бертрана Мейера , поскольку оно рассматривает взаимодействие подтипирования с предусловиями , постусловиями и инвариантами .
Принцип
Понятие поведенческого подтипа Лисков определяет понятие заменяемости объектов; то есть, если S является подтипом T , то объекты типа T в программе могут быть заменены объектами типа S без изменения каких-либо желаемых свойств этой программы (например, корректности ).
Поведенческое подтипирование является более сильным понятием, чем типичное подтипирование функций, определенных в теории типов , которая опирается только на контравариантность типов параметров и ковариантность возвращаемого типа. Поведенческое подтипирование в общем случае неразрешимо : если q — это свойство «метод для x всегда завершается », то программа (например, компилятор) не может проверить, что оно выполняется для некоторого подтипа S из T , даже если q выполняется для T. Тем не менее, этот принцип полезен при рассуждениях о дизайне иерархий классов.
Принцип подстановки Лисков налагает некоторые стандартные требования на сигнатуры , которые были приняты в новых объектно-ориентированных языках программирования (обычно на уровне классов, а не типов; см. номинальное и структурное подтипирование для получения информации о различии):
Новые исключения не могут быть выброшены методами подтипа, за исключением случаев, когда они являются подтипами исключений, выброшенных методами супертипа.
В дополнение к требованиям подписи, подтип должен соответствовать ряду поведенческих условий. Они подробно описаны в терминологии, напоминающей методологию проектирования по контракту , что приводит к некоторым ограничениям на то, как контракты могут взаимодействовать с наследованием :
Ограничение истории («правило истории»). Объекты считаются изменяемыми только через свои методы ( инкапсуляция ). Поскольку подтипы могут вводить методы, которых нет в супертипе, введение этих методов может допускать изменения состояния в подтипе, которые недопустимы в супертипе. Ограничение истории запрещает это. Это был новый элемент, введенный Лисковым и Вингом. Нарушение этого ограничения можно проиллюстрировать, определив изменяемую точку как подтип неизменяемой точки . Это нарушение ограничения истории, потому что в истории неизменяемой точки состояние всегда одинаково после создания, поэтому оно не может включать историю изменяемой точки в целом. Однако поля, добавленные к подтипу, можно безопасно изменять, поскольку они не наблюдаются через методы супертипа. Таким образом, можно определить круг с неизменяемым центром и изменяемым радиусом как подтип неизменяемой точки, не нарушая ограничения истории.
Происхождение
Правила пред- и постусловий идентичны тем, которые ввел Бертран Мейер в своей книге 1988 года Object-Oriented Software Construction . И Мейер, и позже Пьер Америка, который был первым, кто использовал термин поведенческое подтипирование , дали определения некоторых понятий поведенческого подтипирования на основе теории доказательств , но их определения не учитывали псевдонимы , которые могут возникать в языках программирования, поддерживающих ссылки или указатели. Учет псевдонимов был основным улучшением, сделанным Лисковым и Вингом (1994), и ключевым компонентом является ограничение истории. Согласно определениям Мейера и Америки, изменяемая точка была бы поведенческим подтипом неизменяемой точки, тогда как принцип подстановки Лисков запрещает это.
SOLID – «L» в «SOLID» обозначает принцип подстановки Лисков.
Ссылки
^ Лисков, Барбара; Винг, Жанетт (1994-11-01). «Поведенческое понятие подтипирования». Труды ACM по языкам и системам программирования . 16 (6): 1811–41. doi : 10.1145/197320.197383 . S2CID 999172.
Библиография
Конкретные ссылки
Лисков, Б. (1987). Основной доклад — абстракция данных и иерархия . OOPSLA '87: Приложение к Трудам по объектно-ориентированным системам программирования, языкам и приложениям (Приложение) . стр. 17–34. doi :10.1145/62138.62141. ISBN 0897912667.Программный доклад, в котором Лисков впервые сформулировал этот принцип.
Ливенс, Гэри Т.; Дхара, Кришна К. (2000). «Концепции поведенческого подтипирования и набросок их расширения для компонентно-базовых систем». В Ливенс, Гэри Т.; Ситараман, Мурали (ред.). Основы компонентно-базовых систем . Cambridge University Press. ISBN 0-521-77164-1.В данной статье рассматриваются различные концепции поведенческого подтипирования, в том числе концепции Лискова и Уинга.
Лисков, Б. Х.; Винг , Дж. М. (ноябрь 1994 г.). «Поведенческое понятие подтипирования». ACM Trans. Program. Lang. Syst. 16 (6): 1811–41. doi : 10.1145/197320.197383 . S2CID 999172. Появилась обновленная версия: Лисков, Барбара ; Винг, Жанетт (июль 1999 г.). Поведенческое подтипирование с использованием инвариантов и ограничений (технический отчет). Университет Карнеги-Меллона. CMU-CS-99-156.Формализация принципа его авторами.
Plösch, Reinhold (2004). Контракты, сценарии и прототипы: комплексный подход к высококачественному программному обеспечению . Springer. ISBN 3-540-43486-0.Содержит более мягкое введение в поведенческое подтипирование в его различных формах в главе 2.
Мартин, Роберт С. (март 1996 г.). "Принцип подстановки Лисков" (PDF) . Отчет по C++ . Архивировано из оригинала (PDF) 2015-11-28.Популярная в сообществе объектно-ориентированного программирования статья, в которой приводится несколько примеров нарушений LSP.
Majorinc, Kazimir. "Дилемма эллипса-круга и обратное наследование". ITI 98, Труды 20-й Международной конференции по интерфейсам информационных технологий, Пула, 1998. Интерфейсы информационных технологий, 2009. Iti '09. Труды 31-й Международной конференции Iti 2009. стр. 627–632. ISSN 1330-1012. OCLC 894960131.В данной статье рассматривается LSP в упомянутом контексте.
Внешние ссылки
Норвелл, Т. С. "Принцип подстановки Лисков" (PDF) . Мемориальный инженерный университет .
Самохин, Вадим (2018-06-06). "Принцип подстановки Лисков". Medium .
«Проектирование классов SOLID: принцип подстановки Лисков». Том Даллинг . 21 ноября 2009 г.
Джобаер, Абу (2023-05-31). "LSP: Принцип подстановки Лисков". Стартап . Medium.