Принципы SOLID | На примере Python

  Рет қаралды 21,617

Ilya Krukowski

Ilya Krukowski

Күн бұрын

В этом видео мы обсудим пять принципов SOLID на примере языка Python и посмотрим, как переписать программный код с использованием этих принципов.
Таймкоды:
00:00 Введение
00:45 Кто придумал SOLID?
01:40 Принцип Single responsibility (SRP)
05:10 Принцип Open-closed (OCP)
09:13 Принцип Liskov substitution (LSP)
14:35 Принцип Interface segregation (ISP)
18:29 Принцип Dependency inversion (DIP)
23:25 Заключение
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: / @ilyabodrovkrukowski
Аккаунт Ethereum (ETH): 0x719C2d2bcC155c85190f20E1Cc3710F90FAFDa16
Boosty: boosty.to/bodrovis
Patreon: / bodrovis
DonationAlerts: www.donationalerts.com/r/bodr...
Исходный код: github.com/bodrovis-learning/...
Канал Telegram: t.me/dev_in_ruby_colors
Наш чат в Telegram: t.me/joinchat/MxYT6-01eeA1NTYy
Мой сайт: bodrovis.tech
Музыкальный сюрприз: • Dog & Butterfly - Hear...

Пікірлер: 95
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Друзья, в код закралась довольно глупая ошибка. Она никак не мешает пониманию принципов SOLID (то есть сами объяснения остаются прежними), но баг весьма досадный. Вот небольшой коммит, в котором сделаны нужные исправления (суть в том, что иначе просто будет печататься одно и то же время, хотя в ряде случаев вам может потребоваться печатать именно одинаковое время, если произошло сразу много событий в один момент) github.com/bodrovis-learning/Python-SOLID-video/commit/2f98a12d55f10252aa6fa46bac8e75dc1fdb1878 Спасибо коллеге Rebbit13 за внимательность! Кстати, разделитель можно тоже хранить в формате: github.com/bodrovis-learning/Python-SOLID-video/commit/220bf6d872033d77ca19698d3608886c3475e3a6
@user-vh7hv4xj1s
@user-vh7hv4xj1s 29 күн бұрын
Большое - Спасибо , отлично объяснили
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 29 күн бұрын
@suhanoves
@suhanoves 2 жыл бұрын
Очень круто, спасибо! Когда уходишь от абстрактных размышлений к реальной реализации на любимом языке сразу всё становится понятным
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Безусловно :)
@koshakpoc2876
@koshakpoc2876 2 жыл бұрын
@@IlyaBodrovKrukowski имеет ли место использовать оператор super(), ведь в классах нового стиля он может нарушить логику программы при подмешивании классов и множественном наследовании ромбовидной формы ? как вы считаете не лучше ли явно задавать родительские классы ?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@@koshakpoc2876 Особо проблем в этом не вижу, если честно. Если логика выстроено корректно, то всё должно быть ок
@smokibits4365
@smokibits4365 2 жыл бұрын
Eto bojestvenno, osobenno posle kursow posmotret mnenie i primeri drugogo prepod. Laik i podpiska!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Спасибо большое!
@pashhty
@pashhty 2 жыл бұрын
Самое понятное объяснение из всех мной увиденных, спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
На здоровье!
@yeravl
@yeravl 2 жыл бұрын
Лучшее видео про SOLID на примере python! Кратко и понятно! Спасибо, освежил знания перед собеседованием.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Благодарю! Удачного собеседования :)
@user-nj2mw5ts3r
@user-nj2mw5ts3r Жыл бұрын
Спасибо Вам большое. У Вас очень здорово получилось объяснить все и на практике и в теории, таким образом, что все сразу становится понятно. Редко где такое встретишь. Успехов Вам!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Благодарю
@user-ri3lr6uv1e
@user-ri3lr6uv1e 2 жыл бұрын
Большое спасибо. Самое понятное и не растянутое пояснение по SOLID на простых примерах да еще на Python. Лайк, подписка, как говорится )
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Спасибо большое!
@antoniopripizduchi858
@antoniopripizduchi858 2 жыл бұрын
Каждый раз когда вы переписывали код я получал тот самый программистерский кайф от чистоты и в общем крутости кода. Примеры очень хорошие, создаётся понимание где это можно использовать. Самое главное что все очень понятно. Благодарю за хорошее видео
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Благодарю! Да, в этом и правда есть свой кайф
@sayomortal
@sayomortal 4 ай бұрын
Лучшее объяснение что я видел, огромное спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 4 ай бұрын
На здоровье
@pilina_
@pilina_ 2 жыл бұрын
Спасибо огромное за Ваш труд, очень полезное видео! За приятный голос и понятные примеры отдельная благодарность)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
На здоровье
@paveltws4406
@paveltws4406 Жыл бұрын
Отличное видео, большое спасибо С такими примерами, понимание неизбежно)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
На здоровье!
@Priboy313
@Priboy313 2 жыл бұрын
Очень приятное объяснение, спасибо большое за видео!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@goodevening2144
@goodevening2144 Жыл бұрын
Илья, спасибо! Самое понятное и наглядное объяснение солида! Спасибо за труды!!! Побольше бы таких видосов. За исходники - отдельная благодарность.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
На здоровье
@goodevening2144
@goodevening2144 Жыл бұрын
​@@IlyaBodrovKrukowski Илья, Вы могли бы сделать, в таком же стиле, ещё одно видео про популярные паттерны с использованием питона? Я думаю, что общественность будет безгранично рада такому контенту. Спасибо за внимание.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@@goodevening2144 Можно подумать в эту сторону, но тут надо понять, какие из них "популярные"
@user-dy5oj8bx8q
@user-dy5oj8bx8q Жыл бұрын
Одно из лучших объяснений на ютубе. Спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
На здоровье!
@aston585
@aston585 8 ай бұрын
Круто! Спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 8 ай бұрын
@mlpython1089
@mlpython1089 2 жыл бұрын
Спасибо. Полезный материал.
@wandos777
@wandos777 2 жыл бұрын
Спасибо тебе огромное!!! Просто невероятное спасибо! Просто спас мой мозг) Пытался смотреть другие источники, но там на других языках и постоянно пытался понять, как это реализуется на Python просто улетел в далекий космос к далеким друзьям) респект за прекрасную интерпретацию на моем языке)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
На здоровье
@user-xn2hb5qk9m
@user-xn2hb5qk9m 2 жыл бұрын
Шикарное видео, спасибо большое!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@Karaku228
@Karaku228 Жыл бұрын
Огромное спасибо! Отличное объяснение!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@erikkaramian8005
@erikkaramian8005 Жыл бұрын
Респект за видео! Очень качественный контент
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@user-wo5pr8rk9n
@user-wo5pr8rk9n 2 жыл бұрын
Спасибо за урок!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
на здоровье!
@BaraBarinov
@BaraBarinov Жыл бұрын
Thank you so much
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@artyomvakhrushev850
@artyomvakhrushev850 Жыл бұрын
Спасибо тебе большое за такие понятные примеры, уже смотрел очень много видео и читал не одну статью по солид, понимал только первые 2 принципа SRP и OCP, но вот остальные 3 вообще непонятны и только после просмотра этого видео до меня наконец доперли все принципы! Спасибо тебе огромное еще раз. п.с. огромная проблема многих объяснений и видео в каких-то совсем абстрактных примерах, которые только больше запутывают и демотивируют(
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
На здоровье
@user-dv7jb2xi8d
@user-dv7jb2xi8d 2 жыл бұрын
отличное видео, спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
На здоровье!
@trankov
@trankov Жыл бұрын
Боже мой, ну наконец-то кто-то понятно объяснил за вменяемое время. Мартин пишет про Java, и как это всё применить к Python, надо додумывать самому. А так как это две разные планеты, никогда не знаешь, правильно ты додумал или неправильно. И проверить свои догадки до этого видео было негде. Особенно на понимание DI кучу времени потратил, потому что в Python такое гибкое наследование, что из Java-примеров непонятно, нужен ли DI в Python вообще в принципе (нужен, конечно).
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Рад, что теперь ситуация прояснилась
@Developer_python_
@Developer_python_ Жыл бұрын
The best!!!!!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@AlexPInv
@AlexPInv 2 жыл бұрын
Спасибо!
@david_shiko
@david_shiko 2 жыл бұрын
Спасибо за видео! 4:30. Для больших проектов это безусловно так, но для среднего проекта я бы в случае необходимости создал 2-ой класс, который имеет свою комбинацию "формат", "текст" и т.п. По фактту это будет паттерн "фабрика" или service layer (не уверен), но зато весь процесс, данные и логика в 1-м месте. Вообще прочитав "Чистую архитектуру" я понял, что большинство советов годятся только для компилируемых языков, а пайтон... он изначально вышел хорошо)). Очень много оверхеда в пропорции к пейлоду у пайтона получается если досконально следовать SOLID.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Не без этого, поэтому я и упоминаю, что следовать принципам до буквы не стоит :) Спасибо за подробный комментарий!
@izzzanaaami
@izzzanaaami 2 жыл бұрын
Именно поэтому я начал изучать Java, но потом понял, что Python лучше. Как говори автор "не стоит полностью следовать правилам, это вредно"
@lev145it5
@lev145it5 2 жыл бұрын
Спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
На здоровье :)
@whiterabbit6211
@whiterabbit6211 2 жыл бұрын
Лайк, подписка, колокольчик, коммит )
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Спасибо!
@ivanklutru
@ivanklutru 2 жыл бұрын
Несколько дней не мог понять эту инверсию зависимостей, скачал примеры из видео и вроде понял. Как-то все подозрительно просто получается :)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Ну, там не сильно-то и сложно это. В прниципе, на YT есть ролики, где объясняются эти вопросы с теоретической точки зрения, тоже имеет смысл глянуть
@smokibits4365
@smokibits4365 2 жыл бұрын
Ne prosto kogda probuesh pochinit kod po principam. Sovetuyu poprobovat)
@dmitriy5885
@dmitriy5885 Жыл бұрын
Книга: "Чистая архитектура", там Роберт Мартин говорит о SOLID. Возможно и в "Чистый код" Роберт Мартин говорит о SOLID, но, признаюсь, я её пока не читал
@unstoppableharrison140
@unstoppableharrison140 2 ай бұрын
А как лучше всего следовать второму принципу: 1. В __init__ захардкодить префикс и сделать новый класс с наследованием первого (как в примере из видео) или же 2. в __init__ префикс брать из параметра при инициализации класса, т.е. при инициализации класса передавать нужный префикс? Предполагаю, что вариант 1 более наглядный, простой и потенциально меньше ошибок в себе скрывает, но хотелось бы уточнить у более опытных разработчиков
@gost-dev
@gost-dev Жыл бұрын
14:22 . с этим префиксом " _ " amout будет ломатся - если будут передаваться именные, а не позиционные параметры На позиционные всегда расчитывать - опасная затея
@VasyaIT
@VasyaIT 7 ай бұрын
Привет, спасибо большое Скажи пожалуйста, как ты сделал так, чтобы у тебя подставлялось self в метод класса автоматически? Что за плагин в vscode? Или настройка какая-то? Спасибо
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 7 ай бұрын
На здоровье! Да у меня ничего такого не установлено, кроме pylance и python для VS Code, так что думаю, это их проделки
@nurislamaskaruly6393
@nurislamaskaruly6393 2 жыл бұрын
в последем примере можно будет создать единый интерфейс Printer который будет реализовывать метод write. и наследуясь от принтера, классы Fileprinter и TerminalPrinter обязаны будут реализовывать метод write
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@SemyonKalyakulin
@SemyonKalyakulin 2 жыл бұрын
Я б его, наверное, назвал Notifier )
@ivankurban669
@ivankurban669 2 жыл бұрын
Я начинающий, есть вопрос. 9:12 Непонятно зачем в методе init класса CustomerLogger нужен super() , если и без него все также работает, по крайней мере вывод такой же. Зачем делегировать родителю инициализацию атрибута format, если следующей строчкой мы все ровно этот атрибут переопределяем. class CustomerLogger(Logger): def __init__(self): # super().__init__() self.format = '%Y-%b-%d ::'
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
Для сохранения цепочки наследования - в будущем родитель может делать какие-то дополнительные манипуляции
@ivankurban669
@ivankurban669 2 жыл бұрын
@@IlyaBodrovKrukowski Спасибо, очень полезная инфа.
@hulitolku
@hulitolku Жыл бұрын
А что плохого в одном но унивресальном классе, вместо десяти маленьких?
@cosinix
@cosinix 2 жыл бұрын
ОРУ, спасибо, очень смешной рофл
@petr_khramov
@petr_khramov Жыл бұрын
На 22:41 не понял, что значит инстанцировать? Ведь под notifier как бы понимается экземпляр класса FilePrinter, TerminalPrinter или другого, который передается в качестве аргумента. И у этого экземпляра вызывается метод write(). В общем notifier().write(...) наверно и правильно, но до конца я не понял почему. Потому что notifier - это не потенциальный экземпляр одного из вышеобъявленных классов, а экземпляр класса type?
@user-de3op9hs4p
@user-de3op9hs4p 4 ай бұрын
notifier - это просто аргумент функции. Мы в него можем засунуть что угодно. Чтобы получить экземпляр класса, у которого есть метод write(), нам нужно сам класс передать как параметр в notifier, а затем в методе log создать его экземпляр с помощью ().
@dmitriynekrasov3098
@dmitriynekrasov3098 Жыл бұрын
по поводу single responsibility не понял одного: зачем нам класс с единственным методом, если можно просто написать обычную функцию?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Можно, в принципе. Просто раз уж мы говорим об ООП, то и используем везде классы. В более сложных случаях это был бы класс побольше, но главное тут то, что он должен решать определённую задачу, а не много задач сразу - суть в этом. Но если можно что-то сделать проще, то переусложнять код, конечно, не стоит
@dmitriynekrasov3098
@dmitriynekrasov3098 Жыл бұрын
@@IlyaBodrovKrukowski спасибо вам за ответ и ваш труд
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
@@dmitriynekrasov3098
@user-zw8ik7dl4t
@user-zw8ik7dl4t Жыл бұрын
Solid - это как метод 5S, все принципы известны до них, и использовалось ещё с машинных кодов или логика взята из оптимизации СУБД подходящих для sql, просто один очень... Человек якобы это структурировать и сказал, что то он всё придумал... На самом деле, как и 5S - Solid в своей разработке может быть избыточна очень часто и в пустую тратит ресурсы. ( или например задачу должен выполнять специалист, но не должен напрягать этим руководителя или иного специалиста... И не создавать другим дополнительную работу. Вы должны, если на этапе тестирования или использования создать такой экземпляр наследуемого класса, что сам другой специалист в процессе объявления его будет создавать требования но в автоматическом режиме, в виде принимаемых входных полей. Есть ещё одно правило, что касается - Солид, но его туда не включили, потому, что человек не обладал не знанием и не опытом в этой области или считал это избыточным. Например - 3 правило противоречит (хотя например тот же sql говорит что всё должно быть максимально оптимизировано), но даже есть исключения... 3 правило нарушает правило - программа или процедура должна быть максимальна собрана и продумана в своей многозадачности - а пытаться обращаться например к различным потомкам одиночным образом, что бы получить один результат - это извините, надуманная глупость. Потом на 3 наследовании окажется, что забыли указать тип покрытия животного, - чешуя, шерсть или волосы... И опять начнется? Дальше я на стал пока смотреть (4 и 5)
@djbaldey
@djbaldey 9 ай бұрын
LSP нарушится если вызывать dog.eat(amount=3). Параметры у методов нельзя делать с разными именами!
@roofspirit5248
@roofspirit5248 2 жыл бұрын
SOLID SNAKE получается... MGS референс
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
@romanbush5164
@romanbush5164 2 жыл бұрын
Первый не очень пример, зачем делать класс с один методом минимум 3 я думаю нужно, максимум 4)) ну или 6 если нельзя поделить логично
@ChelovegII
@ChelovegII Жыл бұрын
Мне одному кажется, что solid плодит кучу сущностей? Может это и полезно в проектах с 1000000 строк кода, но имхо для более малых проектов большинство этих принципов бесполезны
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Жыл бұрын
Вы правы, как я и говорил в видео (хотя, может и не в этом ) не стоит просто следовать правил для того, чтобы им следовать. Нужно понимать, зачем это нужно. Так что да, если это маленький проект, то в целом применять весь арсенал solid часто смысла нет. Но иметь его ввиду стоит
@boborustamov8661
@boborustamov8661 2 жыл бұрын
Спасибо!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 жыл бұрын
:D
ELE QUEBROU A TAÇA DE FUTEBOL
00:45
Matheus Kriwat
Рет қаралды 36 МЛН
Cute Barbie Gadget 🥰 #gadgets
01:00
FLIP FLOP Hacks
Рет қаралды 41 МЛН
Uncle Bob’s SOLID Principles Made Easy 🍀 - In Python!
19:09
ArjanCodes
Рет қаралды 283 М.
Принципы SOLID / С Примерами На Python
12:36
PyLounge - программирование на Python и всё о IT
Рет қаралды 12 М.
Как работать с классами в Python и для чего они нужны
22:04
Senior Tester | Евгений Окулик
Рет қаралды 7 М.
10 признаков того, что вы новичок в Python
4:59
Просто о SOLID (Принципы SOLID)
15:54
webDev
Рет қаралды 214 М.