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

  Рет қаралды 112,534

Sergey Nemchinskiy

Sergey Nemchinskiy

Күн бұрын

SOLID принцип LSP: Принцип подстановки Барбары Лисков (The Liskov Substitution Principle) объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы.
Курсы для новичков:
JAVA - bit.ly/2CeYIhM
JAVA Start - bit.ly/2DU0IMJ
Инструментарий JAVA - bit.ly/33MKksj
Automation QA (Java) - bit.ly/2F1EQj9
ANDROID - bit.ly/30KeMSf
C#/.NET - bit.ly/2FeBPMN
C# START - bit.ly/3in99PC
PYTHON - bit.ly/2DU0HbD
FRONT-END - bit.ly/3ackHCB
WORDPRESS Developer - bit.ly/3aeE8e2
SALESFORCE Developer - bit.ly/2DU0Onz
UI/UX дизайн - bit.ly/30KvTmJ
Project management - bit.ly/3ah1RdI
Обучение на проекте - bit.ly/3iqfsSG
Продвинутые курсы для состоявшихся девелоперов:
GRASP and GoF Design patterns - bit.ly/2DuKo5z
Enterprise patterns - bit.ly/3fOPre2
Сайт Foxminded: bit.ly/30HAAxO
Foxminded в ФБ: / foxmindedco
FoxmindEd в Instagram: / foxminded.ua
Foxminded в VK: foxminded
Мой Telegram: t.me/nemchinskiyOnBusiness
Мой блог: www.nemchinsky.me
1. На основе работы Роберта Мартина (дяди Боба). Акроним SOLID предложен Michael Feathers
2. SOLID (сокр. от англ. single responsibility, open-closed, Liskov substitution, interface segregation и dependency inversion)
1. SRP Принцип единственной ответственности (The Single Responsibility Principle) - Каждый класс должен иметь одну и только одну причину для изменений.
2. OCP Принцип открытости/закрытости (The Open Closed Principle) - программные сущности … должны быть открыты для расширения, но закрыты для модификации
3. LSP Принцип подстановки Барбары Лисков (The Liskov Substitution Principle) объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы
4. ISP Принцип разделения интерфейса (The Interface Segregation Principle) много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения
5. DIP Принцип инверсии зависимостей (The Dependency Inversion Principle) Зависимость на Абстракциях. Нет зависимости на что-то конкретное
0:00 вступление Сергея Немчинского
0:22 формулировка LSP Робертом Мартином и Барбарой Лисков
2:53 принцип подстновки Барбары Лисков на примерах
5:40 LSP в формулировке Герба Саттера и Андрея Александреску
8:25 еще пример на картинке
11:35 про соблюдение LSP

Пікірлер: 435
@-ebaka
@-ebaka 3 жыл бұрын
Роберт что-то непонятное сказал, то ли дело Барбара
@6598335
@6598335 3 жыл бұрын
XDXDXD
@user-pl9hn7mg1q
@user-pl9hn7mg1q 2 жыл бұрын
Математически чёткое описание всегда более точное, чем словесное описание. Например, Правила Ассоциативноти и Дистрибутивности и звучат лучше...
@vadimsokhatsky2748
@vadimsokhatsky2748 Жыл бұрын
Сергей, спасибо! С вашими видео обучение программированию становится сплошным кайфом!
@masterbedroom594
@masterbedroom594 3 жыл бұрын
Сергей, выражаю вам искреннюю благодарность
@user-wq4yh7bl7g
@user-wq4yh7bl7g 3 жыл бұрын
Классное видео, спасибо за детальное и простое объяснение, хотелось бы еще послушать про паттерн pipeline.
@stakhovskiy
@stakhovskiy 3 жыл бұрын
Август месяц на дворе, а его все еще зовут Сергей Немчинский. Хосспаде! Спасибо за видео 😄Лайк.
@z1zzz
@z1zzz 3 жыл бұрын
А в чём прикол?
@igorost795
@igorost795 2 жыл бұрын
Попрошу! Сергей "тутромбик" Немчинский!
@TheHosuwisp
@TheHosuwisp 3 жыл бұрын
Математический вариант Барбары все разложил по полочкам, а то так много воды и ничего не понятно.
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
ахаха. Ну, рад за вас :)
@ffconsole3467
@ffconsole3467 3 жыл бұрын
Попався, математiк
@fakerliar6599
@fakerliar6599 3 жыл бұрын
Тоже объяснение Барбары показалось более простым и понятным, хотя не математик. Может это потому что я женщина?:D
@murationametisation4347
@murationametisation4347 2 жыл бұрын
Чувак, и мне показалось вариант Барбары намного ясный и простой. Но задело то, что автор видео так обобщает, "всем непонятно". Бро, как раз таки и понятно. Это может для гуманитариев проблема понять из-за боязни математики.
@lindx2533
@lindx2533 2 жыл бұрын
странно что ты за этим вариантом полез на ютьюб к немчинскому
@sergekim5499
@sergekim5499 3 жыл бұрын
Спасибо большое, Сергей!)
@samuro2ua
@samuro2ua 3 жыл бұрын
Сергей, тема разработки через тестирование очень интересна! Как и SOLID. Спасибо.
@Snake19S
@Snake19S 3 жыл бұрын
Сергей, вы такой живчик в этом видео. Отлично получилось!
@demidovmaxim1008
@demidovmaxim1008 3 жыл бұрын
Большое спасибо за выпуск!!!
@wandos777
@wandos777 2 жыл бұрын
Супер, Сергей) Спасибо большое за видео, однозначно лайк!)
@user-vv5vt3di5l
@user-vv5vt3di5l Жыл бұрын
Дуже вам дякую за пояснення. Все просто і зрозуміло )
@user-us5uf9tt8i
@user-us5uf9tt8i 3 жыл бұрын
надо! про тест фёст надо про нуль из методов и ДОСКУ МАРКЕРНУЮ! НАДО!
@Asmaers
@Asmaers 3 жыл бұрын
и про красную футболку!
@VitaliyZlobin
@VitaliyZlobin 3 жыл бұрын
доску особенно, уши режет
@kspshnik
@kspshnik 3 жыл бұрын
дададад! и про TDD и про null надонадонадо!
@user-it1qb3oi9b
@user-it1qb3oi9b 3 жыл бұрын
Доска как раз под бумагой. Приглядись)
@dmitriykozyrev8835
@dmitriykozyrev8835 3 жыл бұрын
Сразу лайк, спасибо тебе большое!
@andrey7829
@andrey7829 3 ай бұрын
Очень понятно объясняете - супер, спасибо
@sfoxer
@sfoxer 3 жыл бұрын
Лучший препод =) Что бы мы без вас делали)
@andrew_golubev
@andrew_golubev 3 жыл бұрын
Качество стало на порядок лучше, так держать!
@user-uf9kn1lg2s
@user-uf9kn1lg2s 3 жыл бұрын
Спасибо большое за видео!
@YuretsUA
@YuretsUA 3 жыл бұрын
Очень доступное объяснение, особенно в разрезе примеров. Сразу вспомнил где я уже наговнокодил...
@BukasovMaxim
@BukasovMaxim 3 жыл бұрын
Я бы еще добавил, что при оверрайде неабстрактных методов, новый метод должен уметь принимать параметры в таком же диапазоне или шире (но ни в коем случае не уже), а при возвращении значений - в таком же диапазоне или уже (но ни в коем случае не шире). Например в каком-то классе есть метод, который умеет принимать число от 1 до 100 и возвращать от 1 до 10. Если его заоверрайдить так, что новый будет уметь принимать 0..200, а возвращать 3..5 - существующий клиентский код будет доволен. А вот если переписать так, что новый метод умеет принимать только 1..50 или вдруг возвращает 0..20 - то существующий клиентский код может быть неприятно удивлён. Также можно было бы еще сказать, что список выбрасываемых исключений можно сокращать, а исключения - конкретизировать, а вот наоборот - добавлять новые или расширять существующие - нельзя. Но с контролируемыми исключениями компилятор Джавы в этом плане сам подскажет, что можно, а что нет, а неконтролируемые... на то они и неконтролируемые :)
@vladzaiko5012
@vladzaiko5012 3 жыл бұрын
что то я не уверен что вы правильно написалали, если базовый класс возвращал от 1 до 10, а наследник будет возвращать от 3 до 5 а это ведь нарушение принципов о которых говорит Сергей - наследник не может возвращать меньше чем базовый класс. Базовый класс будет ожидать что при определенных параметрах вернется 10, а наследник вернет максимум 5 и все сломается.
@BukasovMaxim
@BukasovMaxim 3 жыл бұрын
@@vladzaiko5012 Представьте, что есть клиентский код, который умеет разговаривать на английском, французском и немецком. Есть базовый компонент, который иногда выдаёт клиенту что-то на английском, а иногда - на немецком. Клиент понимает эти сообщения от компонента. Если заменим этот компонент на новый, который будет выдавать сообщения только на английском (т.е. сузим диапазон возвращаемых значений), то клиентский код всё еще будет понимать эти сообщения. А вот если новый компонент вдруг заговорит на японском (т.е. расширим диапазон возвращаемых значений), то клиентский код сломается - потому что клиентский код не знает, что делать с сообщениями на японском.
@vladzaiko5012
@vladzaiko5012 3 жыл бұрын
@@BukasovMaxim так в том то и дело что клиентский код, который работает с базовым классом он не знает о функционале на японском языке, который уже появился в наследниках, он не может его вызвать и сломаться.
@BukasovMaxim
@BukasovMaxim 3 жыл бұрын
@@vladzaiko5012 Речь не о новых методах. Речь о старых методах, которые в новых компонентах вдруг начали выдавать на выход то, что старые компоненты не выдавали. Пример: батарейка (как компонент). Допустим у нас есть электрическая схема (клиент), которой нужно питание +5В +/-10% (т.е. от 4.5 до 5.5 - будет работать). Если у нас есть батарейка, которая выдаёт +5В +/- 5% (т.е. от 4.75 до 5.25), то все ОК, схема будет работать и не сгорит (потому что при замене компонентов выходные диапазоны можно сужать без проблем). Но если мы вставим батарейку +5В +/-20%, то она может дать или слишком мало (и схема не заработает) или слишком много (и схема сгорит). Поэтому, при подмене компонентов, расширять возвращаемый диапазон - нельзя (можно только сужать). Входной диапазон - наоборот: сужать нельзя (чтобы клиент не послал в компонент что-то такое, что он не поймёт), а расширять - можно (чтобы компонент был не глупее, чем его предок).
@catmother8368
@catmother8368 2 жыл бұрын
@@BukasovMaxim спасибо за отличное объяснение! А что, если у нас есть класс User и класс Admin, который является наследником от User? Допустим, в User есть метод, вохвращающий все права пользователей. User будет возвращать стандартные разрешения типа редактировать аккаунт и проч. Но у Admin нужно будет расширять этот список. Верно ли я понимаю, что в данном случае произойдёт нарушение принципа LSP? Как этого избежать? Не лучше ли выделить отдельный класс с правами, чтобы не нарушать SRP?
@jossefal1957
@jossefal1957 3 жыл бұрын
Хорошее объяснение, как обычно лайк
@user-is4ji8mr7j
@user-is4ji8mr7j 3 жыл бұрын
Давно ждал!
@yuriyfedoryshyn5206
@yuriyfedoryshyn5206 3 жыл бұрын
looking forward to a TDD video))
@LeoMrakobes
@LeoMrakobes 3 жыл бұрын
@Sergey Nemchinskiy уже раньше обещал про "почему нельзя возвращать null"
@newprim1
@newprim1 2 жыл бұрын
Это самое лучшее объяснение принципа Лисков, что я встречал! Подписка однозначно
@user-hv8rh8nk9d
@user-hv8rh8nk9d 3 жыл бұрын
Отлично. Про тесты видео нужно
@user-wt1tp2ff3h
@user-wt1tp2ff3h 3 жыл бұрын
TDD - ДА! Про return null - ДА! Спасибо за видео!
@alexeydeyev4970
@alexeydeyev4970 3 жыл бұрын
Очень интересно про Test First!!! В топ!!
@ntvisigoth
@ntvisigoth 3 жыл бұрын
@Sergey Nemchinskiy: Мужик, здоровья тебе! Отличное пояснение! ;)
@gomer3894
@gomer3894 3 жыл бұрын
спасибо за видео!
@whoiam6395
@whoiam6395 2 жыл бұрын
Спасибо огромное!!! В 3х словах рассказал то что я не смог понять ни в одном видео до этого.
@whoiam6395
@whoiam6395 2 жыл бұрын
А я их пересмотрел штук 10
@user-ns7uz5dt4h
@user-ns7uz5dt4h 3 жыл бұрын
TDD интересно. С удовольствием послушаю.
@kotanhp3115
@kotanhp3115 Жыл бұрын
Хорошее видео, жду такое же про Оксимирона
@xdef42
@xdef42 3 жыл бұрын
Я не использую наследование, я имплементирую интерфейсы, и занимаюсь агрегацией и композицией
@nanvlad
@nanvlad 3 жыл бұрын
Ты сраный рукожоп по версии Немчинского)) Я тоже агрегирую и композирую с интерфейсами + ещё дженерики
@alexeydeyev4970
@alexeydeyev4970 3 жыл бұрын
Имплементирование можно с натяжкой отнести к наследованию.
@grommaks
@grommaks 3 жыл бұрын
аналогично
@makaroningable
@makaroningable 3 жыл бұрын
Я наследую только абстрактные классы где имплементирую основное поведение, частично переопределяемое в классах наследниках. Но вот так чтоб в чистом виде унаследоваться от другого конкретного класса - такого тоже нет.
@woodzimierz9621
@woodzimierz9621 3 жыл бұрын
@@makaroningable есть товарищи, которые отрицают любую форму наследования
@bumer7721
@bumer7721 3 жыл бұрын
Об ACID интересно послушать. А за SOLID благодарю)
@maxlich9139
@maxlich9139 3 жыл бұрын
было, Владимир Кузнецов рассказывал.
@bumer7721
@bumer7721 3 жыл бұрын
@@maxlich9139 Дякую! Шукатиму.
@siclbear
@siclbear Жыл бұрын
Наконец-то я понял этот принцип)
@alokym86
@alokym86 Жыл бұрын
Я знаю чому для Вас формулювання Барбари Лісков складне і заплутане! Все тому, що для Вас і квадрат - це не прямокутник!) Дякую за відео. Приклад з квадратом підірвав мій мозок.
@Madeniath
@Madeniath 3 жыл бұрын
Про TDD интересно было бы посмотреть.
@Oleksii_Leshchenko
@Oleksii_Leshchenko 3 жыл бұрын
про то, как оно в жизни
@sofiatopalidi9403
@sofiatopalidi9403 2 жыл бұрын
Я вас обожаю. Вы один из самых интересных и умных людей, которых я знаю) спасибо за знания и ваш юмор ☺️
@user-wd7mz4ys5o
@user-wd7mz4ys5o Жыл бұрын
Або це просто вже 100те відео про Лісков і я нарешті зрозумів, або це найкраще з тих відео що я бачив і я зрозумів =))
@SergeyNemchinskiy
@SergeyNemchinskiy Жыл бұрын
я просто умею объяснять :)
@NikolayMishin
@NikolayMishin 2 жыл бұрын
Самый сложный принцип, я вечно сыплюсь на нем))) но объяснение с прямоугольником и квадратом просто огонь! Спасибо 🙏
@yuriytheone
@yuriytheone 11 ай бұрын
Ты сыпишься, потому что Solid ложны. Каждый принцип ложен! Давай про Srp. Когда ты создаёшь дочерний класс, ты его создаёшь именно таким, какой нужен именно в твоём коде. И именно с таким интерфейсом, который нужен твоему софту. Далее Ocp - ты не только можешь менять код метода, но и должен если это нужно для оптимизации. Да, представь себе Ocp тоже ложен. Далее Lsp - зачем тебе порождать наследников и закидывать в какой либо метод работающий с классом родителем. Ну, вот ты и не можешь объяснить... У немчи6ского яйц нет признать, Solid - фуфло.
@nataliia9346
@nataliia9346 3 жыл бұрын
Хотелось бы с таким классным объяснением и примерами послушать о Паттернах Программирования :)
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
эм.... Ну вот же оно: foxminded.com.ua/grasp-gof-design-patterns-advanced-on-line-course/
@Brick87Game87
@Brick87Game87 3 жыл бұрын
супер, спасибо!
@UnrealSPh
@UnrealSPh 3 жыл бұрын
Возможно, описание самой Барбары станет более понятным, если понимать когда она его предложила и как выглядели ассоциации типов в ЯП в то время, так как *спойлер* наследование не единственный способ ассоциации классов, а скорее частный случай. Насчёт использования наследования вы скорее всего заблуждаетесь, но причина заблуждения это легаси информация, которую из года в год перевыпускают в требованиях к коду. Если вы боретесь с копипастингом кода в проекте, то для этого больше подходит композиция кода. А если и методология разработки у вас не waterfall, то n-ступенчатая иерархия наследования превратит процесс изменения кода в ад (не забываем, что классы содержат ещё и стейты). Наследование сильный инструмент, но его главное назначение в продуктах, которые должны иметь жёсткую структуру иерархии, а так же максимально долгое время жизни самой иерархии. Напрмер фреймворки. Там наследование чувствует себя хорошо.
@dmitrinikolaev6986
@dmitrinikolaev6986 3 жыл бұрын
Про TDD было бы очень интересно послушать!
@alexeiceglei9841
@alexeiceglei9841 3 жыл бұрын
Юнит тесты интересны очень, особенно какие то хитрости, типо того же test first
@TheDaslord
@TheDaslord 3 жыл бұрын
Сергей, спасибо за видео! Пожалуйста, снимите видео про возврат null, очень интересно, сам постоянно так делаю.
@woodzimierz9621
@woodzimierz9621 3 жыл бұрын
Про TDD очень интересно.
@victortamanov
@victortamanov 3 жыл бұрын
Про TDD интересно будет посмотреть.
@dmytromarchuk3023
@dmytromarchuk3023 3 жыл бұрын
Ставлю лайк відразу! "Виріс" на відосах Сергія про Design Patterns, Clean Code, etc
@immortal-spirit-13
@immortal-spirit-13 3 жыл бұрын
Своеобразный парень :) Но мне очень нравится как он доносит, и он реально умный. Спасибо за видео. 👍
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
спасибо :)
@makskors5002
@makskors5002 2 жыл бұрын
TDD очень интересно!
@mashinostroitel
@mashinostroitel 3 жыл бұрын
Спасибо :)
@user-zu6hg3un6d
@user-zu6hg3un6d 3 жыл бұрын
Ах**нно) наконец то понял в чём фишка этого принципа
@dmitry_shelemekh
@dmitry_shelemekh 3 жыл бұрын
Крутотенюшка!
@vanilla1006
@vanilla1006 3 жыл бұрын
TDD, буду рад выслушать
@AnnaIsHere
@AnnaIsHere 3 жыл бұрын
Хотелось бы больший упор на "как надо" вместо "как не надо"
@Gusto20000
@Gusto20000 2 жыл бұрын
Просто берете как не надо и делаете не так и будет как надо
@fractalzombie
@fractalzombie 2 жыл бұрын
С опытом придёт.
@user-dd1di2fv6i
@user-dd1di2fv6i 2 жыл бұрын
@@Gusto20000 и если это приходится объяснять, то, наверное, лучше никак не надо ;)
@screamer8932
@screamer8932 Жыл бұрын
@@Gusto20000 Часто бывает 101 способ как не надо и только парочку как надо. Кск би так убегая от плохого 98 способа не попасть в 86))
@user-bd3fv1jp3i
@user-bd3fv1jp3i 4 күн бұрын
что касаемо lsp то что бы его не нарушать нужно просто придерживаться ооп. Надо постараться что бы его нарушить.
@eligolin9947
@eligolin9947 Жыл бұрын
По моей оценке вся суть проблемы была не раскрыта. Наследование как "анти паттерн", основана на сложности соблюдение LSP принципа. Пройдёмся по примерам в этом ролике: 1. Здесь Сергей рассказывает как плохо нарушать LSP принцип и к чему это может привести. Но дело не в том что его нельзя явно нарушать (это и так понятно), а в том что его очень сложно соблюдать. 2. Сергей здесь спасибо вам за альтернативное определение LSP (оно добавляет глубины понимания!) хотя по моей оценке примеры всё равно слабы. 3. По моей оценке этот пример вообще не об этом. Здесь проблема не в соблюдении или несоблюдении LSP, а в отсутствии инкапсуляции. Это был хороший пример того что лучше писать иммутабильные классы а setters/getters могут раскрыть зачастую внутреннюю структуру класса. С точки зрения наследования - это как раз один из немногих примеров где наследование является корректным. Наследования квадрата от прямоугольника является математически правильным и хорошо обоснованным с точки зрения качеств квадрата по отношению к качествам прямоугольника.Если бы состояние этих классов задавалось только при помощи конструктора, то никакой проблемы не было бы.
@olexkov4643
@olexkov4643 3 жыл бұрын
Интересно все !!!!
@romansharpe1131
@romansharpe1131 3 жыл бұрын
Есть 2 класса Pistol и Rifle. Оба должны стрелять и перезаряжаться, значит выносим эту логику в класс Weapon и наследуемся от него. Появлятся новое оружие Knife, которое тоже атакует (стреляет) и также наследуется от Weapon. Теперь нож и стреляет, и перезаряжается. Реализуем LSP: между классами Weapon -> Pistol/Rifle делаем прослойку Gun и выносим туда логику перезарядки, а в Weapon оставляем только атаку/стрельбу. В итоге получаем: Weapon -> Gun -> Pistol/Rifle и Weapon -> Knife
@JackFastGame
@JackFastGame 3 жыл бұрын
Что делать, если к такому пришли только после написания кода? Например, нужно было сделать пистолет и ружьё, написали классы: Weapon -> Pistol, Weapon -> Rifle, а потом заказчик добавил в ТЗ нож. Что теперь делать?
@romansharpe1131
@romansharpe1131 3 жыл бұрын
​@@JackFastGame по нормальному неплохо было бы продумать все это заранее. Здесь же я привел свой пример, как выглядит LSP на практике.
@0imax
@0imax 3 жыл бұрын
@@JackFastGame Если код был написан правильно, то другие классы обращались к оружию через интерфейс Weapon и знать не знали, что там внутри. Тогда, если расширить структуру наследования от Weapon, как в комментарии выше, для внешнего кода работа этого класса не изменится.
@denisbielishev
@denisbielishev 3 жыл бұрын
Будет интересно услышать про GRASP и GoF
@AndriySydorka
@AndriySydorka 3 жыл бұрын
Дядя Сережа, росскажи про Test first!
@Lammax2012
@Lammax2012 3 жыл бұрын
TDD - очень интересно!!!
@chocolazerboom7389
@chocolazerboom7389 3 жыл бұрын
Чёт прямо больно, что такие листы бумаги тратятся на то, что можно нарисовать на доске и стереть
@ESTechnonet
@ESTechnonet 8 ай бұрын
А еще больно - звук маркера скрипучий.
@Chat-Mayevskogo
@Chat-Mayevskogo 3 жыл бұрын
Я себе тоже такую футболочку взял, тока черную, чтоб прям в тему последних времен было) Это когда джаву в js тоже будут компилить, наверное)
@MrLobash
@MrLobash 3 жыл бұрын
не ну тут лайк))
@Zlobusz
@Zlobusz 3 жыл бұрын
Программирую на php в Symfony. На самом деле крайне редко приходится использовать наследование. Чаще фреймворк предоставляют интерфейсы, чем абстрактные классы. А наследоваться от какой-то конкретной реализации - тоже не совсем приятно. Поэтому случаев наследования можно по пальцам одной руки пересчить. Но принцип постановки Лисковой зашёл. Спасибо! Теперь бы про инверсию зависимости послушать)
@alexeyb5830
@alexeyb5830 Жыл бұрын
потому, что ооп это не про наследование. В чистой архитектуре про это написано. Ооп это про полиморфизм. Старину Боба видимо не всего Немчинский читал, либо читал и не понял.
@radikovichkz2470
@radikovichkz2470 8 ай бұрын
А как на счет предпочитайте композицию наследованию?
@HaiIag
@HaiIag 3 жыл бұрын
Я таки дочекався )
@dmitriimolchanov4971
@dmitriimolchanov4971 2 жыл бұрын
На примере mock, можно ведь для неиспользуемых методов оставить имплементацию парент класса, если это, конечно, не абстрактый класс или мы не имплеменим интерфейс. Хотя тут уже тогда нарушение как раз второго принципа-необходимо использовать интерфейс, или я что-то упустил?)
@samirsalimkhanov3554
@samirsalimkhanov3554 3 жыл бұрын
Надо убрать бумагу между маркером и доской, потом писать. Я так думаю))) спаисбо за видос
@YuretsUA
@YuretsUA 3 жыл бұрын
Это нарушает 1-й принцип SLP, каждому объекту своя зона ответственности, доска для того, чтобы бумагу удерживать, и бумага не рвалась под фломастером. А бумага уже для отображения текстовой информации, так что тут все грамотно...
@user-td1ny2mg8q
@user-td1ny2mg8q 3 жыл бұрын
Можно видео про TDD, и про кидание нулей в методах, плис))
@igor_knv
@igor_knv 3 жыл бұрын
Понравился пример про квадрат и прямоугольник. Кто-кого расширяет.
@zapplay
@zapplay 3 жыл бұрын
Хотелось бы увидеть видео о том почему нельзя возвращать null
@dmitrypichugin7449
@dmitrypichugin7449 3 жыл бұрын
Спасибо за фразу о не использующих наследование. Добавил себе в цитаты :)
@maxlich9139
@maxlich9139 3 жыл бұрын
Клевое видео. Единственное что Сергей не рассказал: что тогда делать-то, если твоя реализация не поддерживает данный метод базового класса? Я такое видел и не только в тестах и моках (и там да, бросались эксепшены; и вроде бы это даже было в каких-то известных либах)
@user-mr1ii2wn2w
@user-mr1ii2wn2w 3 жыл бұрын
Про tdd очень интересно, расскажите)
@user-hp5yw6gn6w
@user-hp5yw6gn6w 3 жыл бұрын
ну круто я понял как делать не надо ,а как делать надо сам разберусь спасибо лайк щищ
@halgerdka9287
@halgerdka9287 3 жыл бұрын
про пример с квадратом. что мешает переопределить только метод getSquare() return a*a ? и вообще не трогать b
@r2d2925
@r2d2925 3 жыл бұрын
Мне интересно о тдд, но желательно пример живой разработки, так как писать тесты которые падают перед программированиям меня немного смущает.
@eb6006
@eb6006 3 жыл бұрын
Про TDD интересно, запишите пож-ста
@Telemahk
@Telemahk 2 жыл бұрын
По итогу - надо квадрат наследовать от прямоугольника или правильнее новый класс делать?
@user-em8ns3nw7n
@user-em8ns3nw7n 3 жыл бұрын
Спасибо. Только с квадратом как быть? Разве при наследовании у него не разумно переопределить метод подсчета площади?
@danilakapitanov7044
@danilakapitanov7044 3 жыл бұрын
Проблема не столько с определением площади, сколько с установкой сторон в клиентском коде. Правильным решением является создание абстрактного класса Figure с методом вычисления площади, от которого наследуется отдельно Rect и отдельно Square и реализуют метод вычисления площади. При этом для клиентского кода логика работы по установке сторон Rect и Square становится разная. Т.е. прямоугольник и квадрат по сути это разные сущности, как ,например, прямоугольник и круг.
@alexanderbelov6892
@alexanderbelov6892 2 жыл бұрын
@@danilakapitanov7044 Раз уж речь про клиентский код работы с фигурами, то характеристики фигур должны прописываться при создании, и отсутствовать методы их изменения, которые будут разными для разных фигур. К примеру для фигур могут быть методы get_square() для площади, и scale() для изменения размера. Но никак не изменения характеристик описывающих фигуру по отдельности. Для изменения фигуры с другими сторонами нужно создать новую фигуру, а предыдущую удалить.
@user-dd1di2fv6i
@user-dd1di2fv6i 2 жыл бұрын
Я вот чет не понял, что плохого в примере с квадратом ) Ну, перезаписал он сторону с 10 на 5, ну, посчитал он площадь 25. Так она такая и есть в его случае ) Одинаковый интерфейс родителя и наследника никак не означает одинакового результата. Если он одинаковый всегда, - нахрена наследовали-то? )
@gromovoy1987
@gromovoy1987 3 жыл бұрын
Харизматичный
@kyryloshamraiev6289
@kyryloshamraiev6289 2 жыл бұрын
Очень наглядное объяснение. Проще говоря, нужно наследовать большее от меньшего, а не наоборот. Все станет на свои места, если считать, что квадрат - это частный случай прямоугольника, а не его наследник. Именно такой подход применят учёные. Потому обьяснение Барбары и не понятно программистам с ООП профдеформацией. :)
@RomanL321
@RomanL321 5 ай бұрын
ООП профдеформация это интересно))) всё под неё пытаются подтянуть, иногда усложняя код до нельзя...
@tislambek
@tislambek 3 жыл бұрын
Можете расказать в следующем видео о проекты спринга
@Mr43046721
@Mr43046721 3 жыл бұрын
Про ТДД можно видео)) и про другие драйвен девелопмент
@user-te1uc6fd9f
@user-te1uc6fd9f 3 жыл бұрын
Это вообще из другой оперы, но я бы послушал про DDD domain driven design, что такое bounded context и как его правильно определять
@Leonardo-gd2iz
@Leonardo-gd2iz 3 ай бұрын
Дайте кто нибудь ссылку. плиз, где это примером в джаве объясняют) на кубиках и схемах ничего не понял)
@vladyarets3596
@vladyarets3596 2 жыл бұрын
1:16 ну нафиг)) Как это прочитать получилось?!) 1:50 а не. вот тут нафиг, дяде Бобу спасибо огромнейшее!
@FrolovDaniil
@FrolovDaniil 3 жыл бұрын
Можно ещё про DRY, KISS, YAGNI
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
уже в планах
@FrolovDaniil
@FrolovDaniil 3 жыл бұрын
@@SergeyNemchinskiy Смотрю Вас из интереса уже наверное больше года, когда ещё начинал знакомиться с Java, сейчас вообще Python разработчик. Так вот качество видосов стало на порядок выше, видно, что развиваетесь. Так держать! Пожалуйста, подумайте по поводу маркерной доски, а то эти шуршания маркера по бумаге некоторых приводят в ужас (меня например).
@alexei3366
@alexei3366 3 жыл бұрын
можете записать видео почему метод не должен возвращать null?
@woodzimierz9621
@woodzimierz9621 3 жыл бұрын
Интересует на сколько сейчас актуально Eclipse RCP разработка? Сейчас вообще кто ни будь десктопы разрабатывает?
@kosee4008
@kosee4008 Жыл бұрын
класс
@AAAnatoly
@AAAnatoly 3 жыл бұрын
Юнит-тесты очень интересны. По сути, я самоучка, и до юнит-тестов не дошёл, а начинать страшно
@YoungT18
@YoungT18 3 жыл бұрын
Такая же ситуация, но успокаиваю себя тем что джуну вроде как не обязательно наличие в стеке этой технологии и в будущем я смогу уже на реальном проекте это изучить
@kisurov
@kisurov 3 жыл бұрын
Ничего там нет страшного
@pgriggs1299
@pgriggs1299 3 жыл бұрын
@@YoungT18 Mockito и JUnit обязательно нужно знать джуну, также будет в разы круче, если код, например, в пет-проектах будет протестирован, потому что не протестированный код = нерабочий код
@r2d2925
@r2d2925 3 жыл бұрын
Что сложного, вызвал метод, передал тестов данные, и сравнял с заранее верным ответом. Это примитив, но смысл таков. Модульные тесты сложнее, но тоже эмалируешь роботу кода и сравниваешь с подготовленным ответом.
@John_602nd
@John_602nd 3 жыл бұрын
Ничего страшного совершенно, с ними другая проблема, что их ленятся писать. В Java все юнит тесты: @Before, @Test, assert(Equals/That/...) Если прочитать как это работает, то... Это в целом всё. А прочитать можно в первой же статье в гугле по запросу "Java UnitTest"
@dmytromarchuk3023
@dmytromarchuk3023 3 жыл бұрын
Про TDD цікаво, запишіть відео
@VoroninPavel
@VoroninPavel 3 жыл бұрын
Хе-хе, люблю этот пример с квадратом и прямоугольником. Только он еще веселее. Если ввести иммутабельность с втиле старого доброго ФП и после вызова любого "мутирующего" метода возвращать экземпляро нового объекта, то квадрат-таки можно сделать проямоугольником, не нарушая принципы ООП ;-)
@kosatchev
@kosatchev 3 жыл бұрын
Принцип на примере семьи Хилтон: class Hilton { Money manageHotel(Hotel h) { Money m = makeCustomersHappy(c); return m; } } class Paris extends Hilton { @Override Money manageHotel(Hotel h){ Money m = sellHotel(h); return m; } }
@torrvic1156
@torrvic1156 2 жыл бұрын
Отличная шутка про ведение бизнеса 😂
@homo-ergaster
@homo-ergaster 3 жыл бұрын
Вот что интересно, базовые классы Java нарушают LSP совершенно без стеснения. Попробуйте, например, сделать так: Map map = Map.of("a", 10, "b", 20); map.put("c", 30); и охренейте от того, что вам прилетит Exception в Runtime. При том что вся эта лабуда прекрасно скомпилируется. Когда-то налип с этим делом по незнанию, пришлось в довольно большом пакете искать где я делал Map.of и переделывать на new HashMap.
Правильные методы по Clean Code
28:29
Sergey Nemchinskiy
Рет қаралды 77 М.
Monster dropped gummy bear 👻🤣 #shorts
00:45
Yoeslan
Рет қаралды 12 МЛН
когда одна дома // EVA mash
00:51
EVA mash
Рет қаралды 11 МЛН
Принцип подстановки Лисков. SOLID для React
15:26
Михаил Непомнящий
Рет қаралды 11 М.
Какими должны быть Классы по Clean Code?
11:50
Sergey Nemchinskiy
Рет қаралды 20 М.
Принцип хорошего кода DRY (dont repeat yourself)
16:20
Sergey Nemchinskiy
Рет қаралды 70 М.
Monster dropped gummy bear 👻🤣 #shorts
00:45
Yoeslan
Рет қаралды 12 МЛН