|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
||||||
Принцип подстановки Барбары Лисков19.06.2021, 12:22. Показов 4104. Ответов 25
Не понятен пример применения принципа ООП на python:
Главная идея, стоящая за Liskov Substitution Principle в том, что для любого класса клиент должен иметь возможность использовать любой подкласс базового класса, не замечая разницы между ними, и следовательно, без каких-либо изменений поведения программы при выполнении. Это означает, что клиент полностью изолирован и не подозревает об изменениях в иерархии классов. Более формально: Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T. Проще говоря, это значит, что подкласс, дочерний класс должны соответствовать их родительскому классу или супер классу.
Тщательное обдумывание новых классов в соответствии с LSP помогает нам расширять иерархию классов правильно. Также, LSP способствует OCP. Рассказали бы своими словами, в чем фича данного примера?
0
|
||||||
| 19.06.2021, 12:22 | |
|
Ответы с готовыми решениями:
25
Принцип подстановки принцип подстановки Лисков и open/close - одно и то же? |
|
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
|
||||||
| 19.06.2021, 13:10 | ||||||
|
Как-то так:
2
|
||||||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
||
| 19.06.2021, 13:39 [ТС] | ||
|
Arsegg, ни чуть не прояснили картину) еще несколько штрихов и другой шедевральный код...
Добавлено через 2 минуты Arsegg, при выполнении каких конкретно выражений можно понять соблюдается данный принцип или нет? Добавлено через 7 минут и что конкретно означает запись в качестве аргумента функции (feline: Feline). Данная запись используется для указания типа аргумента, а в данном случае?
0
|
||
|
Автоматизируй это!
|
|
| 19.06.2021, 13:51 | |
|
AlexMarkov, для меня принцип Варвары Лисковой означет лишь что наследник должен иметь те же методы что и родитель и эти методы должны быть совместимы с родительским. Условно говоря, если метод Мяу родителя просто в консоль писал слово, то у наследника он не должен возвращать инт и ничего не писать в консоль. Потому что юзер, использующий этот метод, но вызвавший его на наследнике ожидал выполнения определенного контракта, а ему вдруг совсем новое поведение.
2
|
|
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
||
| 19.06.2021, 14:05 [ТС] | ||
|
Welemir1, проще "ето" хорошо как и все гениальное, ну вот "извилинки че то не шевелятся", надо бы как при прокачке мышцы, ну сами понимаете, на преодолении собственных возможностей все прокачивается и на примерах из реала
0
|
||
|
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
|
|
| 19.06.2021, 14:07 | |
|
AlexMarkov, если кратко, как я его понимаю, то подклассы должны быть ковариантны с его суперклассом. Т. е. в переопределяемых методах наследника:
1) Не должен расширяться/меняться выходной тип метода: метод (родителя) возвращает int, а ты возвращаешь float в наследнике;2) Не должен расширяться тип бросаемых исключений/появляться новые: метод (родителя) ничего не бросает, а ты в наследнике кидаешь ValueError;3) Не должно меняться поведение метода: например, наследник класса Feline не должен квакать (Feline.meow).P. S. На Java это проще понять, имхо.
2
|
|
| 19.06.2021, 14:38 | |
|
Не по теме: Arsegg, да в джаве на уровне языка все это если верно помню и по исклочениям и по возвращаеммому типу...
0
|
|
| 19.06.2021, 16:08 | |
|
Не по теме: Welemir1, а как на проде (проекта на Python) разруливают программирование по контракту (интерфейсы) без
0
|
|
| 19.06.2021, 16:16 | |
|
Не по теме: Arsegg, здравым смыслом и аннотациями +докой. Кроме того наследование не так широко уж и используется, прям каких то больших иерархий я не видел (как в джаве), а вот диспатч вообще редко вижу, больше в статьях про то, зачем он нужен. В жизни никогда не видел его применения.
0
|
|
| 19.06.2021, 18:13 | |||
|
не могу согласится с тем, что Возьмем еще, более контрастный пример.Рассмотрим суперкласс "Живое существо". Судя Вашей логике, подкласс "Комар" должен иметь возможность использовать подкласс "Человек"? И тот и другой являются подклассами суперкласса "живое существо". И общее между ними, может быть только то, что является общим для всех живых существ. Но глубже копать не могу, так как мне не совсем понятно, что значит "должен иметь возможность использовать подкласс". Однако комментарии к теме освежили в моей памяти некоторые соображения, которые я высказывал где то на каком то форуме. Кликните здесь для просмотра всего текста
Дело в том, что классы и подклассы в питоне, не соответствуют строго классическим понятиям классов в науке.
В классическом понятии подкласс родительского класса не может заменять значения атрибутов родительского класса, а только добавлять новые атрибуты, и добавлять значения атрибутов, если наличие атрибута в родительском классе есть, но его значение не определено (None). В питоне же мы в подклассе можем изменять значение атрибута, которое задано в родительском классе. И это отличие нужно учитывать. Что еще важно. Не возможно точно смоделировать все многообразие деревьев классов для любого реального объекта мышления человека. Возьмем для примера такой объект, как "яблоко". Начнем перечислять классы, которым принадлежит объект "яблоко". Фрукт, продукт, плод растения, шар, сырье для фруктового салата, сырье для сока, и еще много классов, для чего яблоко является сырьем, сорт яблока, яблоко зрелое, яблоко падалица, яблоко дикое. Если подумать, можно еще много придумать разновидностей (подклассов) яблок. Поэтому я пришел к выводу, что полностью смоделировать мышление человека не возможно, никаких вычислительных мощностей не хватит. Не говоря уже о нечеткой логике и вероятностях при мышлении. Мозг конечно, это сверх совершенное произведение созданное природой. Поэтому я не боюсь реального "Восстания машин". Человек никогда не создаст ничего совершеннее, чем создала природа. Мозг так и не изучен до конца. Не исключаю, что в нем происходят процессы на уровне атомов и межатомных полей. Человек описал, но до сих пор не может осознать двуликость ядерных частиц, когда электрон одновременно описывается и как частица и как волновая сущность. И все таки приближенно (примитивно) можно с помощью ООП моделировать человеческое мышление. И именно отталкиваясь (идя) от реального мышления можно с помощью ООП в питоне моделировать (упрощенно) это мышление. Поэтому при решении задач, оперирующих реальными объектами, необходимо решать задачу используя свой интеллект и логику, и опираясь на свое мышление при решении задачи, описывать мыслительный алгоритм ее решения, Заттем основываясь на использованных объектах своего мышления применить ООП, что бы описать этот процесс мышления (хоть и упрощенно) для построения цифровой модели. Именно такую цифровую модель мышления человека я и называю искусственным интеллектом ИИ. Именно по этой причине, не смотря на всю пользу, я не считаю нейронные сети относящимися к ИИ. То просто мощная технология, для обработки больших массивов данных. Технология востребованная и очень нужная, но не являющаяся ИИ, так как не моделирует процесс человеческого мышления, в котором есть отражение объектов реального мира, при этом с нечеткими связями (ассоциациями) и с формируемыми мозгом объектами, такими, как например классы, которых в реальном мире нет, а формируются только в мозгу человека.
1
|
|||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
|
| 19.06.2021, 19:13 [ТС] | |
|
УВ.Viktorrus, я не любитель присваивать себе чужие записи, ну думаю вопрос был бы не понятен,
если не был бы приведен весь текст рассматриваемой статьи( репозитория) на github, скорее всего это не качественный перевод, я не вникал в суть приведенного текста, мне интересен был пример. Так как на Хабре в статье о принципах solid ничего кроме примеров на Javascript не нашел. То что нейронные сети не являются ИИ "ежу понятно", если он, этот "еж" хоть одну книжку по информатике и математике прочитал.)) Добавлено через 8 минут Ну тему не считаю закрытой, так как никто так и не ответил на вопрос: " В чем фича данного примера?". Интерпретация данного кода, а лучше кода который предоставил ув. Arsegg. Добавлено через 8 минут на Java и PHP))Добавлено через 11 минут Можно вечно идти торетическим методом познания действительности, не приложив и долю к решению задач из реального мира, ради чего, собственно, вся эта "вакханалия" и затевалась. Именно поэтому на данном этапе развития информационных систем правильнее все таки называть программный продукт "Приложением". Приложением к реальной жизни, помогающим или упращающим какую-либо монотонную повторяющуюся задачу. Я не знаю, может крупные корпорации уже на другом этапе развития, ну мне от этого "тук тук кто-там" как почтальону Печкину до велосипеда.
0
|
|
|
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
|
||
| 19.06.2021, 19:18 | ||
Piece, а не с к каждой его конкретной реализацией: Pawn, Knight, Bishop и т. д.Если ты напишешь свою реализацию интерфейса Piece Например, Piece.move(position) будет None значение и т. п.P. S.
1
|
||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
|
| 19.06.2021, 19:23 [ТС] | |
|
Общество предано забвению коммерческим интересам не имеющим ни малейшего отношения к достижению конечной цели: в поисках истины не забывать, что истинным признают, только то что будет принято всем обществом, до последнего индивидуума.
Добавлено через 3 минуты Arsegg, т.е. я был прав это просто аннотация?
0
|
|
|
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
|
||
| 19.06.2021, 19:27 | ||
|
Можно утверждать, что анноташки - сайд эффект, но не более того, т. к. LSP не про это...
1
|
||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
|
| 19.06.2021, 19:37 [ТС] | |
про блэкджек с куртизанками, что-ли?
0
|
|
| 19.06.2021, 19:59 | |
|
Arsegg, То есть это что то типа реализации аналогий? Когда объекты из разных областей ведут себя аналогично, если сравнивать их поведение абстрактно?
То есть создается какой то универсальный интерфейс, который описывает аналогичное поведение объектов различных классов. Вроде это и называется полиморфизмом. Когда используется одна логика поведения для разных сущностей. Или я не правильно понял? Скажу честно, подробно разбираться с технологией Liskov Substitution Principle мне не хочется, так как не вижу в ней необходимость для меня. Если я правильно понял сущность, то такая технология важна для тех, кто клепает программы серийно, и находя аналогию с другой задачей, использует уже написанный код, той другой задачи, если он написан с использованием технологии Liskov Substitution Principle.
1
|
|
|
|
|||
| 19.06.2021, 20:32 | |||
|
Допустим, имеется класс "живое существо", и у него есть метод "дышать". И он на выходе даёт CO2. Ну, так сложилось исторически. Так вот, этот принцип гласит, что все подклассы строго должны выдыхать углекислый газ, а если вдруг ваше существо выдохнет NO2 - это косяк.
4
|
|||
|
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
|
||||
| 19.06.2021, 20:56 | ||||
|
Если ты полагаешься на имплементацию интерфейса (абстрактного класса, в т. ч. наследника abc.ABC), значит ты делаешь что-то не так.P. S. Проблема тут в том, что в Python'е с его утиной типизацией недостаточно средств для показательного выражения данного принципа в коде. P. P. S. Еще один пример LSP тут.
1
|
||||
| 20.06.2021, 04:26 | ||
0
|
||
|
|
|
| 20.06.2021, 09:39 | |
|
1
|
|
| 20.06.2021, 09:39 | |
|
Помогаю со студенческими работами здесь
20
Cобытийность. Принцип использования и принцип работы событий в jQ и GCT Подстановки подстановки Подстановки Отображение подстановки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|