Принцип замены Лискова
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Октябрь 2018 г. ) |
ТВЕРДЫЙ |
---|
Принципы |
Принцип замены Лискова ( LSP ) — это частное определение отношения подтипирования , называемое сильным поведенческим подтипированием , которое было первоначально представлено Барбарой Лисков докладе на конференции 1987 года в программном под названием «Абстракция данных и иерархия» . Он основан на концепции «заменяемости» — принципе объектно-ориентированного программирования, гласящем, что объект (например, класс ) может быть заменен подобъектом (например, классом, расширяющим первый класс), не нарушая при этом программа. Это семантическое, а не просто синтаксическое отношение, поскольку оно призвано гарантировать семантическую совместимость типов в иерархии, в частности типов объектов. Барбара Лисков и Жаннетт Винг кратко описали этот принцип в статье 1994 года следующим образом: [1]
Требование подтипа : Пусть быть доказуемым свойством объектов типа Т. Тогда должно быть верно для объектов типа S , где S — подтип T .
Символически:
То есть, если S подтипирует T, то, что справедливо для T-объектов, справедливо и для S-объектов.В той же статье Лисков и Винг подробно изложили свое понятие поведенческого подтипирования в расширении логики Хоара , которое имеет определенное сходство с замыслом Бертрана Мейера по контракту в том, что оно рассматривает взаимодействие подтипирования с предусловиями , постусловиями и инвариантами .
Принцип
[ редактировать ]Понятие Лискова о поведенческом подтипе определяет понятие взаимозаменяемости объектов; то есть, если S является подтипом T , то объекты типа T в программе могут быть заменены объектами типа S без изменения каких-либо желательных свойств этой программы (например, корректности ).
Поведенческое подтипирование — более сильное понятие, чем типичное подтипирование функций, определенных в теории типов , которая опирается только на контравариантность типов параметров и ковариацию возвращаемого типа. Поведенческое подтипирование в общем неразрешимо : если q является свойством «метод для x всегда завершается », то программа (например, компилятор) не может проверить, что оно справедливо для некоторого подтипа S из T , даже если q действительно выполняется. для Т. Тем не менее, этот принцип полезен при рассуждениях о построении иерархий классов.
Принцип замены Лискова налагает некоторые стандартные требования к сигнатурам , которые были приняты в новых объектно-ориентированных языках программирования (обычно на уровне классов, а не типов; см. в номинальных и структурных подтипах различия ):
- Контравариантность типов параметров метода в подтипе.
- Ковариация типов возвращаемых методов в подтипе.
- Новые исключения не могут быть созданы методами подтипа, за исключением случаев, когда они являются подтипами исключений, созданных методами супертипа.
Помимо требований к подписи, подтип должен соответствовать ряду поведенческих условий. Они подробно описаны в терминологии, напоминающей методологию проектирования по контрактам , что приводит к некоторым ограничениям на то, как контракты могут взаимодействовать с наследованием :
- Предусловия не могут быть усилены в подтипе.
- Постусловия не могут быть ослаблены в подтипе.
- Инварианты не могут быть ослаблены в подтипе.
- Ограничение истории («правило истории»). Объекты считаются модифицируемыми только посредством их методов ( инкапсуляция ). Поскольку подтипы могут вводить методы, отсутствующие в супертипе, введение этих методов может допускать изменения состояния в подтипе, которые недопустимы в супертипе. Ограничение истории запрещает это. Это был новый элемент, введенный Лисковым и Вингом. Нарушение этого ограничения можно продемонстрировать, определив изменяемую точку как подтип неизменяемой точки . Это нарушение ограничения истории, поскольку в истории неизменяемой точки состояние после создания всегда остается одним и тем же, поэтому оно не может включать историю изменяемой точки вообще. Однако поля, добавленные в подтип, можно безопасно изменять, поскольку они не наблюдаются с помощью методов супертипа. Таким образом, можно определить круг с неизменяемым центром и изменяемым радиусом как подтип неизменяемой точки, не нарушая ограничения истории.
Происхождение
[ редактировать ]Правила пред- и постусловий идентичны правилам, введенным Бертраном Мейером в его книге 1988 года « Объектно-ориентированное построение программного обеспечения» . И Мейер, и позже Пьер Америка, который первым использовал термин «поведенческое подтипирование» , дали теоретико-доказательные определения некоторых понятий поведенческого подтипирования, но их определения не учитывали псевдонимы , которые могут возникать в языках программирования, поддерживающих ссылки или указатели. . Учет псевдонимов был основным улучшением, сделанным Лисковым и Вингом (1994), а ключевым компонентом является ограничение истории. Согласно определениям Мейера и Америки, изменяемая точка будет поведенческим подтипом неизменяемой точки, тогда как принцип замены Лискова запрещает это.
См. также
[ редактировать ]- Задача круг-эллипс
- Композиция важнее наследования
- Доработка программы
- Ссылочная прозрачность
- Введите подпись
- SOLID – буква «L» в слове «SOLID» означает принцип замены Лискова.
Ссылки
[ редактировать ]- ^ Лисков, Варвара; Винг, Жаннетт (1 ноября 1994 г.). «Поведенческое понятие подтипирования» . Транзакции ACM в языках и системах программирования . 16 (6): 1811–41. дои : 10.1145/197320.197383 . S2CID 999172 .
Библиография
[ редактировать ]Конкретные ссылки
[ редактировать ]- Лисков, Б. (1987). Основной доклад — абстракция данных и иерархия . OOPSLA '87: Приложение к материалам по системам, языкам и приложениям объектно-ориентированного программирования (Дополнение) . стр. 17–34. дои : 10.1145/62138.62141 . ISBN 0897912667 . Программная речь, в которой Лисков впервые сформулировал этот принцип.
- Мейер, Б. (1988). Объектно-ориентированное построение программного обеспечения . Прентис Холл. ISBN 0-13-629031-0 .
Общая ссылка
[ редактировать ]- Ливенс, Гэри Т .; Дхара, Кришна К. (2000). «Концепции поведенческого подтипирования и эскиз их распространения на компонентные системы». В Ливенсе, Гэри Т.; Ситараман, Мурали (ред.). Основы компонентных систем . Издательство Кембриджского университета. ISBN 0-521-77164-1 . В этой статье рассматриваются различные понятия поведенческих подтипов, в том числе Лискова и Винга.
- Лисков, Б.Х. ; Винг, Дж. М. (ноябрь 1994 г.). «Поведенческое понятие подтипирования» . АКМ Транс. Программа. Ланг. Сист. 16 (6): 1811–41. дои : 10.1145/197320.197383 . S2CID 999172 .
Появилась обновленная версия: Лисков, Варвара ; Винг, Жаннетт (июль 1999 г.). Поведенческое подтипирование с использованием инвариантов и ограничений (технический отчет). Университет Карнеги-Меллон. КМУ-КС-99-156. Формализация принципа его авторами. - Плёш, Рейнхольд (2004). Контракты, сценарии и прототипы: комплексный подход к качественному программному обеспечению . Спрингер. ISBN 3-540-43486-0 . В главе 2 содержится более мягкое введение в поведенческие подтипы в их различных формах.
- Мартин, Роберт К. (март 1996 г.). «Принцип замены Лискова» (PDF) . Отчет С++ . Архивировано из оригинала (PDF) 28 ноября 2015 г. Статья, популярная в сообществе объектно-ориентированного программирования, в которой приводится несколько примеров нарушений LSP.
- Майорен, Казимир. «Дилемма эллипса-округа и обратное наследование» . ITI 98, Материалы 20-й Международной конференции по интерфейсам информационных технологий, Пула, 1998 г. Интерфейсы информационных технологий, 2009. Iti '09. Материалы 31-й Международной конференции ITI 2009 г. стр. 627–632. ISSN 1330-1012 . OCLC 894960131 . В данной статье LSP обсуждается в упомянутом контексте.
Внешние ссылки
[ редактировать ]- Норвелл, Т.С. «Принцип замены Лискова» (PDF) . Мемориальный инженерно-технический университет .
- Самохин, Вадим (06.06.2018). «Принцип замены Лискова» . Середина .
- «Проектирование классов SOLID: принцип замены Лискова» . Том Даллинг . 21 ноября 2009 г.
- Джобаер, Абу (31 мая 2023 г.). «ЛСП: Принцип замены Лискова» . Стартап . Середина.