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

Поделиться
HTML-код
  • Опубликовано: 3 июн 2024
  • В этом видео мы обсудим пять принципов 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 года назад +1

    Друзья, в код закралась довольно глупая ошибка. Она никак не мешает пониманию принципов SOLID (то есть сами объяснения остаются прежними), но баг весьма досадный. Вот небольшой коммит, в котором сделаны нужные исправления (суть в том, что иначе просто будет печататься одно и то же время, хотя в ряде случаев вам может потребоваться печатать именно одинаковое время, если произошло сразу много событий в один момент) github.com/bodrovis-learning/Python-SOLID-video/commit/2f98a12d55f10252aa6fa46bac8e75dc1fdb1878 Спасибо коллеге Rebbit13 за внимательность! Кстати, разделитель можно тоже хранить в формате: github.com/bodrovis-learning/Python-SOLID-video/commit/220bf6d872033d77ca19698d3608886c3475e3a6

  • @user-vh7hv4xj1s
    @user-vh7hv4xj1s 21 день назад +1

    Большое - Спасибо , отлично объяснили

  • @smokibits4365
    @smokibits4365 2 года назад +2

    Eto bojestvenno, osobenno posle kursow posmotret mnenie i primeri drugogo prepod. Laik i podpiska!

  • @suhanoves
    @suhanoves 2 года назад +15

    Очень круто, спасибо! Когда уходишь от абстрактных размышлений к реальной реализации на любимом языке сразу всё становится понятным

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  2 года назад +2

      Безусловно :)

    • @koshakpoc2876
      @koshakpoc2876 2 года назад

      @@IlyaBodrovKrukowski имеет ли место использовать оператор super(), ведь в классах нового стиля он может нарушить логику программы при подмешивании классов и множественном наследовании ромбовидной формы ?
      как вы считаете не лучше ли явно задавать родительские классы ?

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  2 года назад

      @@koshakpoc2876 Особо проблем в этом не вижу, если честно. Если логика выстроено корректно, то всё должно быть ок

  • @pashhty
    @pashhty 2 года назад +6

    Самое понятное объяснение из всех мной увиденных, спасибо

  • @user-nj2mw5ts3r
    @user-nj2mw5ts3r Год назад +3

    Спасибо Вам большое. У Вас очень здорово получилось объяснить все и на практике и в теории, таким образом, что все сразу становится понятно. Редко где такое встретишь. Успехов Вам!

  • @yeravl
    @yeravl 2 года назад +4

    Лучшее видео про SOLID на примере python! Кратко и понятно! Спасибо, освежил знания перед собеседованием.

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  2 года назад

      Благодарю! Удачного собеседования :)

  • @sayomortal
    @sayomortal 4 месяца назад +1

    Лучшее объяснение что я видел, огромное спасибо

  • @aston585
    @aston585 8 месяцев назад +1

    Круто! Спасибо

  • @mlpython1089
    @mlpython1089 2 года назад +1

    Спасибо. Полезный материал.

  • @Priboy313
    @Priboy313 2 года назад +5

    Очень приятное объяснение, спасибо большое за видео!

  • @paveltws4406
    @paveltws4406 Год назад +2

    Отличное видео, большое спасибо
    С такими примерами, понимание неизбежно)

  • @user-ri3lr6uv1e
    @user-ri3lr6uv1e 2 года назад +2

    Большое спасибо. Самое понятное и не растянутое пояснение по SOLID на простых примерах да еще на Python. Лайк, подписка, как говорится )

  • @pilina_
    @pilina_ Год назад +2

    Спасибо огромное за Ваш труд, очень полезное видео! За приятный голос и понятные примеры отдельная благодарность)

  • @user-dy5oj8bx8q
    @user-dy5oj8bx8q Год назад

    Одно из лучших объяснений на ютубе. Спасибо

  • @antoniopripizduchi858
    @antoniopripizduchi858 2 года назад +1

    Каждый раз когда вы переписывали код я получал тот самый программистерский кайф от чистоты и в общем крутости кода. Примеры очень хорошие, создаётся понимание где это можно использовать. Самое главное что все очень понятно. Благодарю за хорошее видео

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  2 года назад

      Благодарю! Да, в этом и правда есть свой кайф

  • @goodevening2144
    @goodevening2144 Год назад +1

    Илья, спасибо! Самое понятное и наглядное объяснение солида! Спасибо за труды!!! Побольше бы таких видосов. За исходники - отдельная благодарность.

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  Год назад +1

      На здоровье

    • @goodevening2144
      @goodevening2144 Год назад +1

      ​@@IlyaBodrovKrukowski Илья, Вы могли бы сделать, в таком же стиле, ещё одно видео про популярные паттерны с использованием питона? Я думаю, что общественность будет безгранично рада такому контенту. Спасибо за внимание.

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  Год назад

      @@goodevening2144 Можно подумать в эту сторону, но тут надо понять, какие из них "популярные"

  • @user-xn2hb5qk9m
    @user-xn2hb5qk9m 2 года назад +1

    Шикарное видео, спасибо большое!

  • @Karaku228
    @Karaku228 Год назад +1

    Огромное спасибо! Отличное объяснение!

  • @BaraBarinov
    @BaraBarinov Год назад +1

    Thank you so much

  • @user-wo5pr8rk9n
    @user-wo5pr8rk9n 2 года назад +1

    Спасибо за урок!

  • @Developer_python_
    @Developer_python_ Год назад +1

    The best!!!!!

  • @trankov
    @trankov Год назад +1

    Боже мой, ну наконец-то кто-то понятно объяснил за вменяемое время. Мартин пишет про Java, и как это всё применить к Python, надо додумывать самому. А так как это две разные планеты, никогда не знаешь, правильно ты додумал или неправильно. И проверить свои догадки до этого видео было негде. Особенно на понимание DI кучу времени потратил, потому что в Python такое гибкое наследование, что из Java-примеров непонятно, нужен ли DI в Python вообще в принципе (нужен, конечно).

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  Год назад

      Рад, что теперь ситуация прояснилась

  • @erikkaramian8005
    @erikkaramian8005 Год назад +1

    Респект за видео! Очень качественный контент

  • @user-dv7jb2xi8d
    @user-dv7jb2xi8d 2 года назад +1

    отличное видео, спасибо

  • @wandos777
    @wandos777 2 года назад +1

    Спасибо тебе огромное!!! Просто невероятное спасибо! Просто спас мой мозг) Пытался смотреть другие источники, но там на других языках и постоянно пытался понять, как это реализуется на Python просто улетел в далекий космос к далеким друзьям) респект за прекрасную интерпретацию на моем языке)

  • @AlexPInv
    @AlexPInv 2 года назад +1

    Спасибо!

  • @artyomvakhrushev850
    @artyomvakhrushev850 Год назад +1

    Спасибо тебе большое за такие понятные примеры, уже смотрел очень много видео и читал не одну статью по солид, понимал только первые 2 принципа SRP и OCP, но вот остальные 3 вообще непонятны и только после просмотра этого видео до меня наконец доперли все принципы! Спасибо тебе огромное еще раз. п.с. огромная проблема многих объяснений и видео в каких-то совсем абстрактных примерах, которые только больше запутывают и демотивируют(

  • @david_shiko
    @david_shiko 2 года назад +2

    Спасибо за видео!
    4:30. Для больших проектов это безусловно так, но для среднего проекта я бы в случае необходимости создал 2-ой класс, который имеет свою комбинацию "формат", "текст" и т.п.
    По фактту это будет паттерн "фабрика" или service layer (не уверен), но зато весь процесс, данные и логика в 1-м месте.
    Вообще прочитав "Чистую архитектуру" я понял, что большинство советов годятся только для компилируемых языков, а пайтон... он изначально вышел хорошо)).
    Очень много оверхеда в пропорции к пейлоду у пайтона получается если досконально следовать SOLID.

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  2 года назад +1

      Не без этого, поэтому я и упоминаю, что следовать принципам до буквы не стоит :) Спасибо за подробный комментарий!

    • @izzzanaaami
      @izzzanaaami 2 года назад

      Именно поэтому я начал изучать Java, но потом понял, что Python лучше. Как говори автор "не стоит полностью следовать правилам, это вредно"

  • @lev145it5
    @lev145it5 2 года назад +1

    Спасибо

  • @ivanklutru
    @ivanklutru 2 года назад +1

    Несколько дней не мог понять эту инверсию зависимостей, скачал примеры из видео и вроде понял. Как-то все подозрительно просто получается :)

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  2 года назад

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

    • @smokibits4365
      @smokibits4365 2 года назад +1

      Ne prosto kogda probuesh pochinit kod po principam. Sovetuyu poprobovat)

  • @whiterabbit6211
    @whiterabbit6211 2 года назад +1

    Лайк, подписка, колокольчик, коммит )

  • @unstoppableharrison140
    @unstoppableharrison140 2 месяца назад

    А как лучше всего следовать второму принципу:
    1. В __init__ захардкодить префикс и сделать новый класс с наследованием первого (как в примере из видео)
    или же
    2. в __init__ префикс брать из параметра при инициализации класса, т.е. при инициализации класса передавать нужный префикс?
    Предполагаю, что вариант 1 более наглядный, простой и потенциально меньше ошибок в себе скрывает, но хотелось бы уточнить у более опытных разработчиков

  • @dmitriy5885
    @dmitriy5885 Год назад +1

    Книга: "Чистая архитектура", там Роберт Мартин говорит о SOLID. Возможно и в "Чистый код" Роберт Мартин говорит о SOLID, но, признаюсь, я её пока не читал

  • @gost-dev
    @gost-dev Год назад

    14:22 . с этим префиксом " _ " amout будет ломатся - если будут передаваться именные, а не позиционные параметры
    На позиционные всегда расчитывать - опасная затея

  • @nurislamaskaruly6393
    @nurislamaskaruly6393 2 года назад +2

    в последем примере можно будет создать единый интерфейс Printer который будет реализовывать метод write. и наследуясь от принтера, классы Fileprinter и TerminalPrinter обязаны будут реализовывать метод write

  • @VasyaIT
    @VasyaIT 7 месяцев назад +1

    Привет, спасибо большое
    Скажи пожалуйста, как ты сделал так, чтобы у тебя подставлялось self в метод класса автоматически?
    Что за плагин в vscode? Или настройка какая-то?
    Спасибо

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  7 месяцев назад

      На здоровье! Да у меня ничего такого не установлено, кроме pylance и python для VS Code, так что думаю, это их проделки

  • @ivankurban669
    @ivankurban669 Год назад +2

    Я начинающий, есть вопрос. 9:12 Непонятно зачем в методе init класса CustomerLogger нужен super() , если и без него все также работает, по крайней мере вывод такой же. Зачем делегировать родителю инициализацию атрибута format, если следующей строчкой мы все ровно этот атрибут переопределяем.
    class CustomerLogger(Logger):
    def __init__(self):
    # super().__init__()
    self.format = '%Y-%b-%d ::'

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  Год назад +1

      Для сохранения цепочки наследования - в будущем родитель может делать какие-то дополнительные манипуляции

    • @ivankurban669
      @ivankurban669 Год назад +1

      @@IlyaBodrovKrukowski Спасибо, очень полезная инфа.

  • @petr_khramov
    @petr_khramov Год назад

    На 22:41 не понял, что значит инстанцировать? Ведь под notifier как бы понимается экземпляр класса FilePrinter, TerminalPrinter или другого, который передается в качестве аргумента. И у этого экземпляра вызывается метод write().
    В общем notifier().write(...) наверно и правильно, но до конца я не понял почему. Потому что notifier - это не потенциальный экземпляр одного из вышеобъявленных классов, а экземпляр класса type?

    • @user-de3op9hs4p
      @user-de3op9hs4p 4 месяца назад

      notifier - это просто аргумент функции. Мы в него можем засунуть что угодно. Чтобы получить экземпляр класса, у которого есть метод write(), нам нужно сам класс передать как параметр в notifier, а затем в методе log создать его экземпляр с помощью ().

  • @hulitolku
    @hulitolku Год назад

    А что плохого в одном но унивресальном классе, вместо десяти маленьких?

  • @cosinix
    @cosinix 2 года назад

    ОРУ, спасибо, очень смешной рофл

  • @user-zw8ik7dl4t
    @user-zw8ik7dl4t Год назад

    Solid - это как метод 5S, все принципы известны до них, и использовалось ещё с машинных кодов или логика взята из оптимизации СУБД подходящих для sql, просто один очень... Человек якобы это структурировать и сказал, что то он всё придумал...
    На самом деле, как и 5S - Solid в своей разработке может быть избыточна очень часто и в пустую тратит ресурсы. ( или например задачу должен выполнять специалист, но не должен напрягать этим руководителя или иного специалиста...
    И не создавать другим дополнительную работу.
    Вы должны, если на этапе тестирования или использования создать такой экземпляр наследуемого класса, что сам другой специалист в процессе объявления его будет создавать требования но в автоматическом режиме, в виде принимаемых входных полей.
    Есть ещё одно правило, что касается - Солид, но его туда не включили, потому, что человек не обладал не знанием и не опытом в этой области или считал это избыточным.
    Например - 3 правило противоречит (хотя например тот же sql говорит что всё должно быть максимально оптимизировано), но даже есть исключения...
    3 правило нарушает правило - программа или процедура должна быть максимальна собрана и продумана в своей многозадачности - а пытаться обращаться например к различным потомкам одиночным образом, что бы получить один результат - это извините, надуманная глупость.
    Потом на 3 наследовании окажется, что забыли указать тип покрытия животного, - чешуя, шерсть или волосы... И опять начнется?
    Дальше я на стал пока смотреть (4 и 5)

  • @dmitriynekrasov3098
    @dmitriynekrasov3098 Год назад

    по поводу single responsibility не понял одного: зачем нам класс с единственным методом, если можно просто написать обычную функцию?

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  Год назад

      Можно, в принципе. Просто раз уж мы говорим об ООП, то и используем везде классы. В более сложных случаях это был бы класс побольше, но главное тут то, что он должен решать определённую задачу, а не много задач сразу - суть в этом. Но если можно что-то сделать проще, то переусложнять код, конечно, не стоит

    • @dmitriynekrasov3098
      @dmitriynekrasov3098 Год назад +1

      @@IlyaBodrovKrukowski спасибо вам за ответ и ваш труд

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  Год назад

      @@dmitriynekrasov3098

  • @roofspirit5248
    @roofspirit5248 2 года назад +1

    SOLID SNAKE получается... MGS референс

  • @djbaldey
    @djbaldey 8 месяцев назад

    LSP нарушится если вызывать dog.eat(amount=3). Параметры у методов нельзя делать с разными именами!

  • @romanbush5164
    @romanbush5164 2 года назад +1

    Первый не очень пример, зачем делать класс с один методом минимум 3 я думаю нужно, максимум 4)) ну или 6 если нельзя поделить логично

  • @ChelovegII
    @ChelovegII Год назад +2

    Мне одному кажется, что solid плодит кучу сущностей? Может это и полезно в проектах с 1000000 строк кода, но имхо для более малых проектов большинство этих принципов бесполезны

    • @IlyaBodrovKrukowski
      @IlyaBodrovKrukowski  Год назад

      Вы правы, как я и говорил в видео (хотя, может и не в этом ) не стоит просто следовать правил для того, чтобы им следовать. Нужно понимать, зачем это нужно. Так что да, если это маленький проект, то в целом применять весь арсенал solid часто смысла нет. Но иметь его ввиду стоит

  • @boborustamov8661
    @boborustamov8661 2 года назад

    Спасибо!