SOLID: Принцип подстановки Барбары Лисков/ LSP (The Liskov Substitution Principle)

SOLID: Принцип подстановки Барбары Лисков/ LSP (The Liskov Substitution Principle)

Sergey Nemchinskiy

3 года назад

114,935 Просмотров

Ссылки и html тэги не поддерживаются


Комментарии:

Radikovich KZ
Radikovich KZ - 28.08.2023 21:04

А как на счет предпочитайте композицию наследованию?

Ответить
kreo debunk
kreo debunk - 26.07.2023 23:27

если вам не понятно то это не значит что "всем" не будет понятно. В формулировке Липскоу это свойство звучит абсолютно точно и должно быть понятно любому програмисту, в отличии от огульной словестной интерпретации мартина

Ответить
Олег Паламарчук
Олег Паламарчук - 18.07.2023 12:03

Паттерн Proxy порушує принцип "The Liskov Substitution Principle"? Адже ми змінюємо роботу базового класу для додавання додаткової логіки.

Ответить
botswanna ngonga
botswanna ngonga - 23.05.2023 18:44

Это для чего тогда наследование, если потомок можно закинуть в код работающий с родителем? Ну, давай приведи пример!

Ответить
A V
A V - 16.05.2023 19:53

И что делать с квадратом? 😅

Ответить
TalkerTube
TalkerTube - 20.04.2023 14:14

С квадратом все вроде понятно что так получается криво. А как отнаследовать квадрат, иак чтобы он: а) не нарушал LSP, б) оставался квадратом и в) не превращался в прямоугольник?

Ответить
telephon3208
telephon3208 - 20.03.2023 15:27

про TTD интересно

Ответить
Belarusian In UK
Belarusian In UK - 16.03.2023 11:21

Мое дБ должна быть сделана с помощью мок апи, например mockito, jmock, easymock, etc Не надо самим эти сроки писать, ТК их количество будет рочти постоянно. Эти сроки тоже могут баги иметь. И тоже надо тестить)))

Ответить
Kosee
Kosee - 05.03.2023 00:23

класс

Ответить
Алексей Вдовин
Алексей Вдовин - 28.02.2023 18:05

Сергей, математики любят глазами а не ушами :) Если бы Вы записали принцип в трактовке Барбары на языке формул я думаю было бы значительно более понятно, чем со слов.

Ответить
Michael Tikhonenko
Michael Tikhonenko - 24.02.2023 10:29

Разве mock не должен лежать в модуле test, недосягаемом для основного кода?

Ответить
Топят
Топят - 11.02.2023 01:38

Слава России

Ответить
Микола Задорожний
Микола Задорожний - 08.02.2023 16:32

Я знаю чому для Вас формулювання Барбари Лісков складне і заплутане! Все тому, що для Вас і квадрат - це не прямокутник!)
Дякую за відео. Приклад з квадратом підірвав мій мозок.

Ответить
Vadim Sokhatsky
Vadim Sokhatsky - 23.01.2023 23:44

Сергей, спасибо! С вашими видео обучение программированию становится сплошным кайфом!

Ответить
AI is Live
AI is Live - 06.01.2023 15:15

Я рукожоп на Си... )))

Ответить
robbie azreal
robbie azreal - 31.12.2022 18:26

НАЗВАНИЕ SOLID -- это сексизм! 😂
ПРАВИЛЬНОЕ НАЗВАНИЕ -- SOSID
Substitution Principle вместо The Liskov Substitution Principle

Ответить
Alexander Smirnov
Alexander Smirnov - 15.12.2022 21:34

как реализовать принцип барбары лисков LSP в языках в кот нет наследования go?

Ответить
Eli Golin
Eli Golin - 23.11.2022 19:11

Я постараюсь привести пример проблематики соблюдения LSP принципа.
Допустим у вас есть класс Human. У этого класса есть такие поля как; пол, возраст, рост, вес и тд..
Теперь представим что у нас есть класс Student. В этом классе добавляется название колледжа, номер курса, и специальность.
Согласитесь что наследование студента от человека выглядит довольно безобидным и естественным. Ещё представим что в текущей версии кода есть метода которая вычисляет налог "социального страхования" для любого человека, и основана она только на возрасте человека.
Понятно что в текущей версии кода, LSP принцип соблюдается для этой методы.
А теперь представим что в будущем закон изменился и теперь студенты освобождены от оплаты налогов. С этого момента LSP принцип нарушен.
проблема здесь на самом деле глубокая и заключается она в том что если B наследует от A, то требуется доказать математически что B является A.
Дело в том что наследование Student от Human основывается на нашем естественном восприятии но в то же время плохо определено в математическом смысле.
Вся сложность LSP является в том что наследование должно быть корректно не только в текущей версии кода, но и во всех (неизвестно на сегодня) будущих его версиях.
Когда домейн классов находится в математической плоскости нам легче создать корректное наследование, но к сожалению это лишь малая часть всех проблем которыми мы занимаемся.
Отсюда вытекает общий антипаттерн наследования.

Ответить
Eli Golin
Eli Golin - 23.11.2022 18:30

По моей оценке вся суть проблемы была не раскрыта.
Наследование как "анти паттерн", основана на сложности соблюдение LSP принципа.
Пройдёмся по примерам в этом ролике:
1. Здесь Сергей рассказывает как плохо нарушать LSP принцип и к чему это может привести. Но дело не в том что его нельзя явно нарушать (это и так понятно), а в том что его очень сложно соблюдать.
2. Сергей здесь спасибо вам за альтернативное определение LSP (оно добавляет глубины понимания!) хотя по моей оценке примеры всё равно слабы.
3. По моей оценке этот пример вообще не об этом. Здесь проблема не в соблюдении или несоблюдении LSP, а в отсутствии инкапсуляции. Это был хороший пример того что лучше писать иммутабильные классы а setters/getters могут раскрыть зачастую внутреннюю структуру класса.
С точки зрения наследования - это как раз один из немногих примеров где наследование является корректным. Наследования квадрата от прямоугольника является математически правильным и хорошо обоснованным с точки зрения качеств квадрата по отношению к качествам прямоугольника.Если бы состояние этих классов задавалось только при помощи конструктора, то никакой проблемы не было бы.

Ответить
Ivan Buzyumov
Ivan Buzyumov - 22.10.2022 18:37

тільки я не зрозумів все, окрім прикладів? Хоча і ті не повністю

Ответить
Maksym Tkachuk
Maksym Tkachuk - 14.10.2022 17:28

А про рукожопа було обідно....

Ответить
OnlyProgramming
OnlyProgramming - 12.10.2022 07:59

Как я раньше не зnull об этом?

Ответить
Rio Mc Boo
Rio Mc Boo - 27.09.2022 12:41

Вот все говорят о наследовании классов. А что на счет интерфейсов? Или сама суть интерфейсов в том, что нам плевать на детали внутри реализуемых методов?

Ответить
Kotan HP
Kotan HP - 26.09.2022 14:34

Хорошее видео, жду такое же про Оксимирона

Ответить
Stricken174
Stricken174 - 01.09.2022 21:07

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

Ответить
Andrew The blade thrower
Andrew The blade thrower - 28.07.2022 23:50

фломастеры засохшие, надо бы обновить. И пора переходить на мел и доску, или вайтборд. Бумага, огромные листы тратятся на пару бедненьких схемок, больно смотреть.

Ответить
Евгений Сулоев
Евгений Сулоев - 24.06.2022 13:58

Наконец-то я понял этот принцип)

Ответить
Oleksandr Protchenko
Oleksandr Protchenko - 12.06.2022 21:49

Або це просто вже 100те відео про Лісков і я нарешті зрозумів, або це найкраще з тих відео що я бачив і я зрозумів =))

Ответить
Aleksandr Savvopulo
Aleksandr Savvopulo - 07.06.2022 20:15

Писать юнит тесты на слой БД с моком той самой БД не имеет абсолютно никакого смысла. Это вредная, бесполезная работа. Что мы тестируем? как работает мок БД? Как ОРМ умеет собирать запросы в бд?
Вот именно. Тест слоя работы с БД только через интеграционные тесты.

Ответить
Ростик Назаренко
Ростик Назаренко - 02.06.2022 14:44

Дуже вам дякую за пояснення. Все просто і зрозуміло )

Ответить
Callsign Office
Callsign Office - 26.05.2022 17:44

(питання НЕ від програміста) Чи можуть класи-нащадки мати атрибути і методи (або якісь приховані властивості), яких немає в батьківському класі?
Справа в тому, що з одного боку квадрат - це лише окремий випадок прямокутника, а з іншого боку квадрат фактично має приховану властивість (в загальному сенсі, НЕ в сенсі атрибут класу), якої немає у прямокутника - що у нього суміжні сторони жорстко пов'язані (рівні) між собою.

Ответить
Das Kleine Krokodil
Das Kleine Krokodil - 18.05.2022 17:49

Так какое решение с квадратом:?

Ответить
Vadim Veksler
Vadim Veksler - 04.05.2022 00:23

То есть, по вашим словам, тот кто не использует наследование и ООП, обязательно является рукажопом и пишет процедурный код?) Солид не всегда про ООП, можно его также применять на фукциональном программировании, и там нет наследования, но и принцип Барбары Лисков не только, как я понимаю, про классы и наследования в ООП...

Ответить
Алексей
Алексей - 08.04.2022 04:25

А что с квадратом делать?

Ответить
Papricka
Papricka - 31.03.2022 23:06

Супер, Сергей) Спасибо большое за видео, однозначно лайк!)

Ответить
Andrey Panchenko
Andrey Panchenko - 04.03.2022 20:20

Прямоугольник расширяет квадрат, а не наоборот. Там само наследование не туда

Ответить
Kyrylo Shamraiev
Kyrylo Shamraiev - 06.02.2022 14:50

Очень наглядное объяснение. Проще говоря, нужно наследовать большее от меньшего, а не наоборот. Все станет на свои места, если считать, что квадрат - это частный случай прямоугольника, а не его наследник. Именно такой подход применят учёные. Потому обьяснение Барбары и не понятно программистам с ООП профдеформацией. :)

Ответить
Кирилл Че
Кирилл Че - 03.02.2022 01:55

Кстати, очень логична формулировка именно Барбары, с точки зрения теории типов…

Ответить
Victor Klimov
Victor Klimov - 01.02.2022 17:51

Авторка🤦‍♂️

Ответить
Torrvic
Torrvic - 25.01.2022 21:59

Я просто офигеваю от того, какой Сергей потрясающий интеллектуал. Мне страшно смотреть его видео. Страшно от того, что голова может лопнуть от обилия деталей, но потом трясущейся рукой тянусь и нажимаю кнопку начала просмотра, а потом инфа кое-как укладывается под отличную и ровную мелодию под методичный голос Сергея…
P.S. короче, как тупой я понял принцип LSP главным образом в том, что не должен наследуемый класс делать больше, чем его основной класс.

Ответить
Макс 523
Макс 523 - 23.01.2022 21:05

OK!

Ответить
Val1n0R Mayar
Val1n0R Mayar - 22.01.2022 19:33

Когда встал вопрос о unit тестах, я засмеялся хахахахаха

Ответить
Roman Ryaboshtan
Roman Ryaboshtan - 09.01.2022 05:16

Привет, можете дать совет? Что вы делаете, когда у вас баг и ни в какую не можете его исправить, а у вас ещё другой функционал нужно реализовать и время поджимает. У меня как раз сейчас такая ситуация.?

Ответить
Nikita
Nikita - 06.01.2022 18:44

Последний раз наследовался год назад
Сраный процедурщик (с)

Ответить
Ambassador of logic
Ambassador of logic - 02.01.2022 01:51

Короче, если я правильно понял, этот принцип можно объяснить так: все реализации методов родителя должны быть взаимозаменяемы относительно этих же методов из других дочерних классов, а то бог Яхве, спустивший нам с небес 5 священных заповедей SOLID, сделает нам атата.

Ответить
Maks Akulov
Maks Akulov - 17.12.2021 04:05

Интересно как его зовут спустя год после выхода видео

Ответить
Maksym Bezrodnyi
Maksym Bezrodnyi - 10.12.2021 11:03

Нужны новые фломастеры

Ответить
Vitaliy Sokolov
Vitaliy Sokolov - 09.12.2021 19:15

Это как сначало клас точка, потом линия, потом допустим тот самый прямоугольник(аналитическая геометрия), дальше в сторону усложнения, потомок дополняет родительский класс а не наоборот

Ответить