Просто о SOLID (Принципы SOLID)

Поделиться
HTML-код
  • Опубликовано: 2 июн 2024
  • #YauhenK #webDev #ПростоО #SOLID
    Всех приветствую в новом видео касте «Просто о».
    Добро пожаловать в пилотный выпуск нового видеокаста, который я назвал «Просто о».
    В нём я постараюсь простыми словами объяснять сложные вещи, которые можно встретить в программировании и разработке.
    Например, SOLID, CI/CD, Agile, Scrum и Kanban, Mutable и Immutable, Critical Rendering Path, парадигмы ООП и ещё много чего интересного.
    И в сегодняшнем выпуске мы поговорим о таком принципе ООП, как SOLID.
    ✒ Timeline:
    ✔ 0:00 - Введение
    ✔ 0:59 - Общение сведения
    ✔ 2:23 - Принцип единой ответственности
    ✔ 4:42 - Принцип открытости и закрытости
    ✔ 7:16 - Принцип подстановки Барбары Лисков
    ✔ 10:11 - Принцип разделение интерфейсов
    ✔ 12:12 - Принцип инверсии зависимостей
    ✒ Полезные ссылки:
    ✔ Конспект лекции: github.com/YauhenKavalchuk/us...
    ✒ Полный список готовых и планируемых курсов:
    ✔ Trello: trello.com/b/R6rD7qq8
    ✒ Автор курса:
    ✔ RUclips: / yauhenkavalchuk
    ✔ Instagram: / yauhenkavalchuk
    ✔ Twitter: / yauhenkavalchuk
    ✔ VK: YauhenKavalchuk
    ✔ LinkedIn: / yauhenkavalchuk
    ✔ GitHub: github.com/YauhenKavalchuk
    ✔ VK (Группа): webdevcom
    ✒ Поддержать развитие канала: github.com/YauhenKavalchuk/yo...

Комментарии • 395

  • @alexandrkruglyak
    @alexandrkruglyak 4 года назад +56

    Принципы SOLID можно изучать вечно и каждый раз познавать что то новое, особенно когда применяешь часто на практике) Спасибо!

  • @user-tz8qo8tk8p
    @user-tz8qo8tk8p 4 года назад +17

    Евгений выражаю вам мою искреннюю благодарность за ваш труд! Как всегда все коротко, информативно, и разложенно по полочкам, лайк без вопросов!

  • @pavloskuibida6292
    @pavloskuibida6292 3 года назад +95

    то чувство когда ты джун, тебе нужно знать все, зашел сюда, поставил лайк и решил, что на собесе скажу просто как это расшифровывается)

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 года назад +7

      🤣

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

      Сегодня на собеседовании слил этот вопрос) три тим лида ржали с меня

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

      @@zakharkulbachenko3433 прошел собес?

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

      @@DENDYTWOO видимо он умер

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

      Я ЧУДОМ не зная почти ничего стал Джуниором, сейчас смотрю на остальные вакансии и жёстко дристаю понимая что я почти нихера не знал и попал на работу :). Сейчас хочу выучить ВСЁ по требованиям, набрать коммерческого опыта и жить спокойно

  • @Demasification
    @Demasification 4 года назад +11

    Спасибо! Может в будущих видео будет время рассказать о low, high level modules. Пока что нет четкого понятия. Супер что будут уроки по TypeScript!

  • @grommaks
    @grommaks 4 года назад +33

    Тема крутая. Однозначно лукас :)
    6:27 стрелочная функция getPrice не возвращает цену (нет return)
    10:51 какая цель иметь интерфес с геттерами для все моделей автомобилей. Только недавно на sOlid говорил же что ненадо так делать
    10:50 Класс реализует интерфейс. Интерфейс может наследовать другой интерфейс...
    12:00 Итого мы получили три независимых класса...хотя цель была разделить интерфейсы..
    Условно если у нас есть API ядро, которое ожидало этот класс с тремя методами, то теперь такого больше нет...
    Результат должен был быть
    class Foo implements BarInterface, BazInterface, BazzzInterface { ... }
    При условии что при плохой архитектуре было
    class Foo implements FooInterface { ... }
    где FooInterface это сумма методов и свойст из BarInterface, BazInterface, BazzzInterface
    Все остальное мне понравилось, и примеры интересные

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад +3

      Спасибо за детальные объяснения нюансов!

    • @12345_qwerty
      @12345_qwerty 4 года назад +2

      А в инверсии зависимостей так ли нужны два класса XmlHttpService и XmlHttpRequestService? Почему не реализовать один класс абстракцию с реализацией всего что нужно?

    • @grommaks
      @grommaks 4 года назад +3

      @@12345_qwerty Как я понимаю это был пример, который илюстрировал что зависимость от наследника - плохо.
      В супер классе могла быть логика, и могло быть еще несколько наследников...для примера все упрощено
      Однако с именами классов чересчур напутано...на то он и плохой пример, который нельзя делать в проекте :)

  • @user-qp8bt7gq4b
    @user-qp8bt7gq4b 3 года назад +3

    Отличное видео. Оно настолько минималистично, насколько это нужно, чтобы быть максимально понятным. Эталон. Спасибо.

  • @dmitryfokin5205
    @dmitryfokin5205 4 года назад +4

    Принцип инверсии зависимостей - хороший принцип, главное не увлекаться уровнями абстракций.

  • @user-lu8ul6rr9q
    @user-lu8ul6rr9q 4 года назад +3

    Спасибо коллега, побольше такого контента и если можно расскажи про CI/CD

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад

      Это следующее видео в этом плейлисте, проверяй!

  • @dmytrolambru2984
    @dmytrolambru2984 4 года назад +6

    Спасибо большое за видео!
    Можно было бы разбить на короткие, но более подробные видео как с паттернами, но это все мои хотелки ...
    Ждем продолжения серии ! :)

  • @engel8486
    @engel8486 4 года назад

    Отличное объяснение, хоть и с нюансами некоторыми) спасибо, жду ещё видео такого формата

  • @dmitryfokin5205
    @dmitryfokin5205 4 года назад +1

    Принцип подстановки Барбары Лисков - хороший принцип. На практике, обычно, соблюдается сам собой. В голове держать надо.

  • @quieteroks
    @quieteroks 4 года назад +93

    Все здорово, но принцип Лисков не раскрыт, как и проблема квадрат прямоугольник. В вашем примере проблема осталась.

    • @user-vd9eu5vh5f
      @user-vd9eu5vh5f 3 года назад

      Подскажите где посмотреть более корректный пример?

    • @MOLOKOKEFIR
      @MOLOKOKEFIR 3 года назад

      @@user-vd9eu5vh5f если найдешь скинь пожалуйста)

    • @artemtereza669
      @artemtereza669 3 года назад +10

      @@user-vd9eu5vh5f ota-solid.now.sh/

    • @artemtereza669
      @artemtereza669 3 года назад +5

      ota-solid.now.sh/

    • @justasid001
      @justasid001 3 года назад +1

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

  • @romanhrechuk7775
    @romanhrechuk7775 4 года назад

    Спасибо за Ваш труд! Жду с нетерпением следующее видео!

  • @albertrain7093
    @albertrain7093 4 года назад +121

    Наследовать машины от цены - это ООП курильщика ))) Они не являются ценами, они имеют цены. Соответственно грамотнее будет использовать композицию, или агрегацию вместо наследования :)

    • @dmytrokucheriavyi605
      @dmytrokucheriavyi605 4 года назад +4

      а еще лучше , если это Typescript, добавить интерфейс/абстактный клас, который будет содержать метод getPrice.

    • @Skyfauer
      @Skyfauer 4 года назад +1

      @@dmytrokucheriavyi605 А этого в этом видео разве не делает автор?

    • @alexeybobr4537
      @alexeybobr4537 3 года назад +5

      Согласен. Пример с ценами крайне неудачный

    • @user-tq9ho2dp5p
      @user-tq9ho2dp5p 3 года назад +3

      Это вполне нормальное решение, просто сделано чуть через жопу. В идеале создается интерфейс IPriceProcessable например, у него есть метод getPrice который и реализуется классом. Я правда хз, как с этим обстоят дела в TS.

    • @NonAmericanFood
      @NonAmericanFood 3 года назад

      @@user-tq9ho2dp5p в твоём случае ты о шарпе, так.

  • @sea-lucky7143
    @sea-lucky7143 8 месяцев назад +1

    Спасибо за видео. Было бы прикольно посмотреть все эти принципы в функциональном программирование)

  • @dizelvinable
    @dizelvinable 4 года назад

    Супер! Много читал/смотрел из разных источников. И мало что понимал. Теперь почти всё понял. Спасибо!)

  • @eugeniuszjarocki109
    @eugeniuszjarocki109 4 года назад +7

    Очень хорошая идея с данной рубрикой. Зачастую лень сидеть гуглить и разбираться в той или иной тематике (например, что такое REST, SOLID и тд) и хочется просто посмотреть короткий ролик. Будем ждать новых видео :)

  • @crashoverride9681
    @crashoverride9681 4 года назад

    Спасибо!

  • @user-wz1tn7fn4s
    @user-wz1tn7fn4s 4 года назад +4

    Спасибо, очень круто, думаю на repeat будет долго))) про ооп было бы тоже не плохо в таком формате:) огромное спасибо!

  • @Cleannetcode
    @Cleannetcode 3 года назад +2

    Спасибо, хорошое объяснение. В объяснении SOLID всегда возникает ряд неточностей, полный список примеров сложно привести. Главное чтобы люди улавливали суть, а еще лучше умели анализировать свой код на предмет нарушения и реализации SOLID

  • @denisklyachenko292
    @denisklyachenko292 3 года назад +1

    Очень неплохо. OCP вроде немного не о том, этот принцип говорит о том, что некоторые модули, чье API используется другими, должны закрываться для изменения, чтобы не влиять на тех, кто его использует. LSP - это из области контрактного программирования, если по-простому, то наследники должны расширять базовый класс, а не сужать или изменять его. Кстати, если квадрат и прямоугольник будут неизменяемыми, то наследование возможно. Для понимания SRP неплохо прочитать про Low coupling/ High cohesion, т.к. SRP именно эти принципы пытается описать другими словами.

  • @Andrew-strong
    @Andrew-strong 4 года назад +2

    Спасибо! Очень круто! Наберусь наглости и нескромно спрошу: а по SSR (в частности по Next.js) у тебя нет планов на курс?

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад +3

      Есть, возможно, даже в этом году появится курс

  • @Jorjeee
    @Jorjeee 4 года назад +1

    Супер , я вообще не знал что есть такие понятия. Случайно наткнулся та это видео. Спасибо большое))

  • @sfiirwuejnn
    @sfiirwuejnn 3 года назад

    В Liskov subtitution подразумевается же, что класс-наследник не должен менять при переопределении поведение метода родительского класса

  • @Rapterlol
    @Rapterlol 4 года назад

    Спасибо! Полезная информация!

  • @user-genderZi
    @user-genderZi 4 года назад

    Классно объяснил! Спасибо. Все очень понятно. Зачот!

  • @user-ve5xx8dr5l
    @user-ve5xx8dr5l 4 года назад +1

    Спасибо за полезное видео. Интересно также увидеть как можно реально применить принципы solid в проекте например на react.

    • @user-vk6te2eb4p
      @user-vk6te2eb4p 4 года назад +1

      Да какой там ооп в реакте? Какой solid? Я уже забыл, когда использовал последний раз слово class в реакте, создавая компонент. Все на функциях и хуках.
      Не, из пальца там, наверное, можно что-то высосать и с умным лицом задвигать об этом, используя непонятные слова.
      Но на реальных проектах в реальном мире, - я вас умоляю.

  • @klyukvach
    @klyukvach 2 дня назад

    спасибо!

  • @Elator11777
    @Elator11777 4 года назад

    Как раз то, что искал - спасибо!

  • @backend1937
    @backend1937 4 года назад

    У вас очень крутой канал, спасибо за ваш труд.
    У меня возник такой вопрос: В примере Open-closed, функция getPrice изначально выводила цену конкретного автомобиля, после применения на ней рефакторинга, метод стал выводить цены всех автомобилей, а как применить open-closed к задаче с выводом конкретной цены автомобиля?

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад

      А зачем вам тогда функция? У вас есть класс, который уже отдаёт цену

  • @alex330k47
    @alex330k47 3 года назад +1

    Для демонстрации принцыпа подстановки Лисков используется крайне спорный пример, обсуждаемый во многих форумах. Главная претензия к этому примеру в том, что нельзя наследовать квадрат от прямоугольника так как они используют разные параметры. От сюда вытекает нарушение принцыпа Лисков, так как методы использующие прямоугольник не подходят (без модефикаций) к Квадрату

  • @Epenckorn
    @Epenckorn 4 года назад +4

    Никак не въезжаю. То ли примеры такие подбирают везде дурацкие, то ли идея сама по себе непонятная, то ли я чего-то не понимаю.
    Из всех примеров, какие я встречал по всему интернету, я могу сделать только один вывод: принципы эти сводятся к тому, чтобы превратить простую парадигму класс-наследник-объекты в чрезмерно разветвлённую структуру из бесконечно растущего количества наследников, отличающихся порой только значениями свойств.
    Если кто-то реально использует эти принципы, приведите, пожалуйста, пару-тройку примеров, где и почему вы их используете?

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

      самый лучший примеры для таких принципов слишком сложны для понимание к примеру исходные коды фреймворов Laravel и Symfony и они в открытом доступе, просто наследуешь базовой контроллер и твой контроллер превращается в супер мутант монстра который способен на все, аналогично работает все компоненты этих фреймворков

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

    Подскажиье. 2 пригцип. Если не создавать интерфейс, а в класс ауто добавить ф-ю getPrice(), которая возвращала бы цену, заданую в конструкторе при создании new Auto(name, price). Это можно считать теми же я только в профиль, или есть ращница? Спасибо

    • @YauhenKavalchuk
      @YauhenKavalchuk  11 месяцев назад

      Ну по сути можно, но это уже нарушает принцип ООП об абстракции

  • @nadianoirnp
    @nadianoirnp 3 года назад

    Женя, какие есть идеи по применению SOLID принципов относительно чистого JavaScript, а не TypeScript ? нет интерфейсов, есть прототипы, ну и классы как синтаксический сахар. Однако очень требуется SOLID )

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 года назад

      Ну нет интерфейсов, это не проблема. Используйте всё с классами)

  • @user-fv3su4yn3i
    @user-fv3su4yn3i 3 года назад +1

    Мужик, очень здорово объяснил. Чудесная подача материала, ты большой молодец, продолжай в том же духе)
    Успехов!

  • @Gelen794
    @Gelen794 3 года назад

    Я не понял проблематику которая затрагивалась в примере принципа Барбары Лисков.
    У нас есть класс прямоугольника и класс квадрата, и если мы отдадим инстанс класса квадрата в функцию changeShapeSize. То как вообще интерфейс решит проблему того, что в квадрате будут меняться сразу и высота и ширина?

  • @user-rg5wh3fx2q
    @user-rg5wh3fx2q 4 года назад +1

    Спасибо за видио, с меня лайк.
    Если вы пишите в TS interface, вы ведь просто делаете описание данных, и когда создаете сущности показываете чему они должны соответствовать, в противном случае ts начнет ругаться. Не совсем понял почему мы имплементируемся в классах от интерфейса

    • @dmitry.gashko
      @dmitry.gashko 4 года назад +1

      Вы как раз описали почему)
      Интерфейсы это в первую очередь "описание интерфейса", и по класике их кроме как с классами и не использовать. Это в ts можно просто сказать, что какой-то объект имплементирует какой-то интерфейс

  • @user-kp7mt1qr8r
    @user-kp7mt1qr8r 3 года назад

    10:21 Сущности не должны зависеть от интерфейсов , которые они используют? Или которые не используют? Или которые они не используют?

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 года назад

      сущности НЕ должны зависеть от интерфейсов, которые НЕ используют

  • @user-uk3mc9vd3w
    @user-uk3mc9vd3w 3 года назад

    огромное спасибо за видео! все по делу, понятно и без воды! очень благодарен!

  • @sergeyivanov3351
    @sergeyivanov3351 3 года назад +15

    "Реально хочу надеяться..." клевый оборот речи

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

    У меня вопрос насчет принципа единственной ответственности (кстати, слова "единый" и "единственный" - паронимы, я бы не стал их взаимозаменять).
    Итак,
    "2:20 - итак принцип единой ответственности звучит он как у модуля должна быть только одна причина для изменения или класс должен отвечать только за что-то одно".
    А вот цитата из Роберта Мартина "Чистая архитектура":
    "Из всех принципов SOLID наиболее трудно понимаемым является прин цип единственной ответственности (Single Responsibility Principle, SRP). Это, вероятно, обусловлено выбором названия, недостаточно точно соот ветствующего сути. Услышав это название, многие программисты решают: оно означает, или класс должен отвечать только за что-то одно".
    Самое интересное, что такой принцип действительно существует. Он гласит: функция должна делать что-то одно и только одно. Этот принцип мы исполь зуем, когда делим большие функции на меньшие, то есть на более низком уровне. Но он не является одним из принципов SOLID - это не принцип единственной ответственности."
    Тут возникает сразу несколько вопросов, и самый первый - кому же верить?

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

    Особлива подяка за приклади на TS

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

    Хорошее объяснение. Не зная тайп скрипт я даже всё понял. Про OCP только поверхностно. Как расширять классы не рассказал

  • @dsalodki
    @dsalodki 4 года назад +5

    действительно просто, подписчиков мало
    ещё бы разобрать grasp и gof

    • @SlavaCh
      @SlavaCh 4 года назад

      Нормально подписчиков для it канала, очень хороший результат

  • @andreygokhan6893
    @andreygokhan6893 4 года назад

    А в javascript есть что-то похожее на interface и implement или есть какой-то способ их имитации?

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад +1

      Нет. В JS это всё классы

    • @GreyFoxTube
      @GreyFoxTube 4 года назад

      Javascript динамически типизированный язык, и соответственно интерфейсы там не нужны / не реализуемы. Те цели которые достигаются посредством интерфейсов, а это лёгкое тестирование и другие о которых говорил автор, для JS не является проблемой. Динамическая природа JS одновременно и сила и слабость

    • @andreygokhan6893
      @andreygokhan6893 4 года назад

      @@GreyFoxTube То что интерфейсы в javascript не реализуемы - согласен, а то что не нужны - сомневаюсь. Наверно было бы неплохо знать набор интерфейсов, которым следует объект, чтобы точно знать, что в данном объекте необходимые методы точно реализованы и их можно вызывать. Например, если у этого объекта класса Car есть интерфейс "плавание", то значит инкапсулировано свойство герметичность и реализован и доступен метод плыть(). А если есть интерфейс "полёт" ...

    • @GreyFoxTube
      @GreyFoxTube 4 года назад

      @@andreygokhan6893, я лично согласен, что динамически типизированным языкам не хватает строгости. Но в целом, в индустрии разработки, где используются динамически типизированные языки, прибегают к соглашениям (конвенциям) в компании и частично обходятся линтерами. Без компиляторов и статических анализаторов, конечно, не так эффективно. Тем не менее работают

  • @SochnayaShaurma
    @SochnayaShaurma 4 года назад +5

    Ничего не понятно, но очень интересно. Видимо я один тут плохо понимаю объяснение. Судя по всему надо ООП в js хорошо знать.

    • @alexandertarasenko3038
      @alexandertarasenko3038 4 года назад +1

      OOP в JS? :D

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

      в чистом js нет понимания интерфейсов и абстракции. Typescript - это мощь, синтаксис учится буквально за пару дней, а с ним ООП станет намного понятнее и ближе

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

    6:24 почему нельзя сделать класс, в котором атрибутами объекта будут являться название и цена? Массив соответственно будет из инстансов этого класса. Функция будет забирать значение цены из атрибута

  • @dmitryfokin5205
    @dmitryfokin5205 4 года назад +1

    Принцип открытости и закрытости - тут нужно ловить баланс. Пример, изменился функционал цены, что лучше? Бегать по всем классам и изменять? Или, как в "неправильном примере", в одном классе в одной функции поменять. Очень сложный вопрос! Если функционал сложный и имеет множество условий в плоть до комбинаторики, то лучше разнести по классам. Если логика попроще, лучше запихнуть в один класс. Еще ошибка - решать данный принцип классами, а не структурой данных. В правильном примере зачем создавать кучу классов? Когда можно решить вопрос объектом содержащим все цены с ключами ссылками, при этом цикл гонять не надо {audi:{tradePrice:100, retailPrice:200}, bmw:{tradePrice:150, retailPrice:250}}. Ну и принцип O противоречит принципу S разбивая функциональность на несколько классов.

  • @evisotskiydev
    @evisotskiydev 4 года назад +1

    Да, принцип подстановки Лисков всё-равно не понял. Но в любом случае, спасибо за старания

  • @O_Hat
    @O_Hat 6 месяцев назад

    Принцип подстановки Барбары Лисков.
    Я бы изобразил абстракцию реализовав в ней метод расчета площади и от неё наследовался бы, реализуя метод установки ширины и высоты.
    Вопрос. Это же тоже сохраняет принцип подстановки. Нет?

    • @YauhenKavalchuk
      @YauhenKavalchuk  5 месяцев назад

      Если я правильно понял описание, то нет

  • @Brick87Game87
    @Brick87Game87 4 года назад

    Круто, спасибо за видео

  • @yuriiabramovych1400
    @yuriiabramovych1400 4 года назад

    Не думали о том, чтобы выпускать курсы на udemy? У вас отлично получается)

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад

      Нет не думал и не планирую

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

    Отличное видео, вкратце и понятно, но думаю разрабам с низким уровнем будет сложновато, и возможно стоит посмотреть более подробный разбор принципов

  • @Max-kr4ie
    @Max-kr4ie 4 года назад

    Интерфейс это особеность тайпскрипта ? Или и в ванильном джс есть ? Походу настал момент когда мне надо освоить тайпскрипт. А что такое лоу и хай модуль, как понять, что он лоу или хай. Или вся разница в том кто кого включает в себя ?

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

    В примере про общий интерфейс у фигуры не должно быть установки ширины и высоты, фигура может быть и окружность и треугольник. Там должен быть только метод получения площади.

  • @Ingvarsson-Ukr
    @Ingvarsson-Ukr Год назад

    Пример в Инверсии зависимостей был слишком сложными, прийшлось еще отдельно детально его разбирать, что бы понять что к чему.
    А так в целом, хороший видос, много полезного узнал. Спасибо.

  • @vadimm3077
    @vadimm3077 4 года назад

    Спасибо тебе друже! Очень рад что нашел твой канал хотя не часто захожу сюда и как вижу зря!

  • @olegpristashkin9078
    @olegpristashkin9078 3 года назад

    А вот по принципу Single Responsibility, сколько методов может содержать класс?

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 года назад

      Сколько угодно, ограничений нет. Главное что-бы класться отвечал за что-то одно

  • @teamplay5921
    @teamplay5921 4 года назад +1

    Понравилось, спасибо! Лисков немного подкачал.... палец вверх!

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

    Спасибо за видео, отличное объяснение.

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

    Пример с квадратом считаю "высосанным из пальца"\некорректным
    В функции setWidth можно было сделать "пустое" тело, у функции setHeight сделать только this.height = height, а также переопределить функцию areaOf: areaOf() { return this.height * this.height}
    Тогда никаких ошибок бы не возникло

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

      Возможно… но это самый распространённый пример

  • @StefanTheBlade
    @StefanTheBlade 4 года назад

    Во втором примере (принцип открытости \ закрытости) с тем же успехом я могу ведь просто не создавать никакой абстракции и все будет отлично работать, у меня тот же самый метод getPrice в каждом объекте. Объясните пожалуйста зачем она (абстракция) нужна?
    Из другого ролика другого автора по этой же теме, я понял этот принцип так: класс должен быть ОТКРЫТ для расширения и ЗАКРЫТ для изменения (расширяем класс для внедрения нового, продвинутого функционала и при этом не изменяем базовый класс, на котором работает старый функционал. В итоге старый код с большей вероятностью продолжит работать без ошибок). Или я что то не правильно понял смотря это видео, или другой автор просто оказался ближе к истине.

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад

      Абстракцию можно и не создавать. Всё верно поняли - открыт для расширения, закрыт для изменения. Я ведь тоже делал акцент на этом)

  • @alex330k47
    @alex330k47 3 года назад +1

    10:00 в коде ошибка, написано
    interface Figure {
    setWidth(width: number): void;
    setHeight(width: number):void;
    }
    А должно быть setHeight(height: number): void;

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 года назад +1

      Да, пропустил( Исправлю в репозитории

  • @blagumur.kratos
    @blagumur.kratos 2 года назад

    Просто и понятно, супер пояснение, спасибо!

  • @alexaxenov974
    @alexaxenov974 3 года назад

    Очень качественное обьяснение спасибо огромное !!!)))

  • @user-jr5hw4gx1y
    @user-jr5hw4gx1y 3 года назад

    Спасибо, очень коротко, доступно и понятно

  • @Scrayerful
    @Scrayerful 4 года назад

    Немного сбивает с толку пример со стоимостями машин:
    Почему не сделать базовый класс с полем цены, метод getPrice() так же определить в базовом классе, а вариации (Audi, BMW) уже сделать наследниками, в которых переопределяется поле цены ?
    И второй вариант вообще оставить один класс, а определять самоу стоимость в экземпляре (это вроде как не противоречит смыслу того, что машины стоят по разному)
    *если что я в js не разбираюсь, но думаю наследование и перегрузка полей там есть ?

  • @sanyastorm
    @sanyastorm 4 года назад

    Супер
    Коротко и ясно
    Спасибо

  • @fisherenok
    @fisherenok 4 года назад

    Как всегда годно)

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

    Принцыпы сухпайка)

  • @user-lh4yj4gy7c
    @user-lh4yj4gy7c 2 года назад

    Получается класс Rectangle ( в примере принципа Барбары Лисков ) противоречит принципу единственной ответственности? Ведь у него как минимум 3 метода для изменения

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

      И кстати это вполне нормальная ситуация когда сделав код по одному принципу, конфликтуешь с другим. Но в примере противоречия нет - все 3 метода работают с параметрами одной сущности и нет каких-то «левых» манипуляций

    • @user-lh4yj4gy7c
      @user-lh4yj4gy7c 2 года назад

      @@YauhenKavalchuk Спасибо за ответ!
      В этом случае непонятно тогда, в чем принцип единственной ответственности, если суть принципа: "Есть только один повод для изменения". Тогда нужно раскрыть более подробно принцип единственной ответственности.
      ( это не претензия, я не знаю как правильно, а наоборот пытаюсь понять )

  • @andyvoice
    @andyvoice 4 года назад

    спасибо за видео, но объяснение на тайпскрипт не подходит, например для меня. я понимаю что происходит но не по профилю идёт потеря понимания.

    • @YauhenKavalchuk
      @YauhenKavalchuk  4 года назад

      Нужны были примеры кода. Я не могу писать одни и те же имплементации на разных языках

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

    Классное видео! Спасибо за работу!

  • @amtal6760
    @amtal6760 3 года назад

    "Аджайл" было бы неплохо поправить в описании.
    Покоробило от абстрактного класса цены, унаследованного автомобилями.

  • @Radik7159
    @Radik7159 4 года назад

    13:08 прошупрощения, не понимаю почему в параметры конструктура передается интерфейс с модификатором private

    • @whins
      @whins 4 года назад

      kendaleiv.com/typescript-constructor-assignment-public-and-private-keywords/

  • @user-ee1lx1pe7n
    @user-ee1lx1pe7n 3 года назад

    Спасибо большое! Поскольку я не знаю языка, на котором были примеры, то понятными для меня оказались лишь первые два принципа. Но, и на этом большое спасибо!

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 года назад

      Пожалуйста. Язык TypeScript - он просто добавляет типизацию

  • @artyomovanton
    @artyomovanton 6 месяцев назад

    13:55 оговорка про реализацию в интерфейсе

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

    Идеально понятное объяснение принципа SOLID, оргомнейший лайкос !!!

  • @aleksandrHz
    @aleksandrHz 4 года назад

    Основы чистой архитектуры

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

    9:47 и как это решает проблему?
    У Square по-прежнему будут два метода setWidth и setHeight каждый из которых изменяет оба поля width и height?
    Специально реализацию не написал, потому что пришлось бы это объяснять?))
    Выглядит как-будто поменяли шило на мыло
    Похоже, методы setWidth и setHeight нужно вовсе убрать из интерфейса Figure, так как они нарушают LSP. А вот areaOf не нарушает и его можно оставить.
    Решить проблему можно было бы так:
    - В Shape оставить только areaOF
    - Для Rectangle нужно было бы создать интерфейс RectangleShape который был бы наследником Shape. А setWidth и setHeight вынести в RectangleShape
    - для Square нужно было бы создать интерфейс SquareShape который был бы наследником Shape. В SquareShape добавить метод setSize.
    - Таким образом если теперь в коде заменить все Shape на ReactangleShape или SquareShape поведение программы никак не изменится.

  • @yuriiabramovych1400
    @yuriiabramovych1400 4 года назад

    Спасибо, ждем следующий видео))

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

    Про grasp ещё можно рассказать

  • @kerimamanov7760
    @kerimamanov7760 3 года назад

    Zdorovo!
    Tol'ko u menya voprosov stalo bol'she?

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

    Спасибо, всё предельно понятно)

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

    Вот вроде бы понимаю все, но при написании программы не могу применять этот ООП, выходит процедурный способ всегда

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

    "L": не сразу понял, но потом дошло! совместимость это да, это правильно! гласное не нарушать при этом "S" (не штамповать "универсальных солдат" в коде)!

  • @rikkicase
    @rikkicase 4 года назад +13

    9:52 в итоге проблема с 9:30 ведь осталась.

    • @user-vd9eu5vh5f
      @user-vd9eu5vh5f 3 года назад

      Подскажите где посмотреть более корректный пример?

    • @user-iq5gz2rd9w
      @user-iq5gz2rd9w 3 года назад

      @@user-vd9eu5vh5f В wikipedia идеальное описание этого принципа

  • @user-nc7zt9rj9e
    @user-nc7zt9rj9e 4 года назад

    И все таки спасибо мне как раз для собеседования и нужно было хоть какое то представление иметь))

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

    Предлагаю тему к следующему видео: Просто о шаблоне MVC

  • @user-rl4zw6zg8g
    @user-rl4zw6zg8g 3 года назад

    А зачем на скриншоты листингов приклеен какой-то светофорчик вверху?

    • @YauhenKavalchuk
      @YauhenKavalchuk  3 года назад

      Для красоты

    • @user-rl4zw6zg8g
      @user-rl4zw6zg8g 3 года назад

      @@YauhenKavalchuk да, красота требует жертв.

  • @MartinEden-ps6ld
    @MartinEden-ps6ld Год назад

    за теслу лайк) А объяснение очень компатное и понятное, спасибо)

  • @user-nk8wq4sx1x
    @user-nk8wq4sx1x 7 месяцев назад

    Почему в примиере Лисков не использовать абстрактный класс для фигур?

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

      Решил не усложнять дополнительной абстракцией

  • @PC-mv5jj
    @PC-mv5jj Год назад

    👍

  • @yuryzhuravlev2312
    @yuryzhuravlev2312 3 года назад

    Самое интересное что если отказаться от TS обратно к JS то это все будет не нужно. )))
    Статическая типизация - напридумывали себе проблем а потом героически боремся с ними.

  • @user-lf7mp6fv1u
    @user-lf7mp6fv1u 4 года назад

    спасибо, то что нужно

  • @eugeniyseliverstov1998
    @eugeniyseliverstov1998 4 года назад

    Как можно установить такой же стиль оформления кода для VS Code. Кто знает, подскажите, плиз)

  • @t3m8ch79
    @t3m8ch79 4 года назад

    Отличный и понятный ролик

  • @adelkhalitov5984
    @adelkhalitov5984 3 года назад

    Брат, Tesla implement CarPrice, не extends. (Потому что твой абстрактный класс и метод не несет никакой реализации)
    Да ты ушел от того что не нужно делать фактори, но ты должен добавлять элемент в массив, что тоже является изменением кода. Самое простое сделать менеджера. Который принимает интерфейс класса CarPrice и выдает цену при вызове метода любого класса описанного этим интерфейсом для примера. А конеркретная реализация того как выбрать определенный авто это уже реализация конеткрной задачи.

  • @soversus5374
    @soversus5374 4 года назад +1

    Класс для каждого типа авто? Даже не знаю, стоит ли дальше смотреть...

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

    Вроде все так знакомо, но синтаксис какой-то непонятный ... не C++ ли это часом?