SOLID принципы в объектно ориентированном программировании

แชร์
ฝัง
  • เผยแพร่เมื่อ 27 ม.ค. 2025

ความคิดเห็น • 98

  • @Den4eg37
    @Den4eg37 3 ปีที่แล้ว +3

    Видео прикольное,просто о сложном,но площадь квадрата высчитывается точно так же как площадь прямоугольника :))

  • @Кирилл-в4л8м
    @Кирилл-в4л8м 3 ปีที่แล้ว +1

    Одно из лучших видео по SOLID. Максимально просто, коротко и понятно. Большое спасибо!

  • @MaxKalama
    @MaxKalama 5 ปีที่แล้ว +20

    Я разработчик со стажем и, стыдно сказать, что всегда ленился разобраться в принципах solid. Александр, спасибо большое! За 12 минут этого видео всё стало предельно ясно!

    • @alextopsite
      @alextopsite 5 ปีที่แล้ว

      Разобраться это одно, а начать применять - это уже совсем другая история

    • @JohnDoe_777
      @JohnDoe_777 4 ปีที่แล้ว

      Ты машинистка значит, а не разраб.

    • @jonathanlawrence2249
      @jonathanlawrence2249 3 ปีที่แล้ว

      i dont mean to be offtopic but does anybody know a method to log back into an instagram account..?
      I stupidly lost my login password. I would love any help you can offer me!

    • @soversus5374
      @soversus5374 ปีที่แล้ว

      @@alextopsite , проблема не начать применять, а принять все эти "удобства" своим естеством и понять зачем. Что если мое нутро просто орет "зачем"?
      Чем плохо, например иметь один класс? Чем это неудобно? Никогда не испытывал неудобства. И тут вдруг мне говорят, это неудобно. ) А работать с кучей файлов удобно? Плодить тысячи файлов удобно? Удобно, когда хостер не хочет делать резервную копию от переизбытка маленьких файлов? ...
      Это как бы вот только, что на скорую руку.
      Удобство, понятие относительное. Но тут кто то "придумал" принципы и все теперь должны им следовать порождая новый геморрой. )
      Барбары Лискоу предлагает свои тапки, а пусть походит в моих, мои мне удобнее, значит и ей будет удобно. )

    • @soversus5374
      @soversus5374 ปีที่แล้ว

      @@JohnDoe_777 , забавно. А я думал, разраб, это тот кто думает своей головой, а не копирует бездумно. Вы выходит не разраб, а конструктор? Берете готовые кубики и складываете в конструкцию? )
      Без обид.

  • @koala4ka
    @koala4ka 2 ปีที่แล้ว

    наверное вы единственный кто хорошо объяснил принцыпы спасибо за видео

  • @TheMool11
    @TheMool11 6 ปีที่แล้ว +6

    Спасибо, очень доступно объяснил и с хорошими примерами.

  • @ТкачукИгорь
    @ТкачукИгорь 6 ปีที่แล้ว +1

    Спасибо! Очень полезно!
    Рассказываете очень доступно. Приятно слушать.
    Жду с нетерпением еще интересных уроков!!

    • @livecodingschool8906
      @livecodingschool8906  6 ปีที่แล้ว +1

      Спасибо большое будем стараться

  • @Egadirov
    @Egadirov 4 ปีที่แล้ว +1

    Лучший туториал по SOLID, браво!

  • @mirlaniusUMK
    @mirlaniusUMK 5 ปีที่แล้ว +1

    очень приятно изложение темы, музыка этому хорошо способствует. Спасибо

  • @exxbrain
    @exxbrain 4 ปีที่แล้ว +2

    В первом примере в случае с большим классом мы тоже будем менять только один класс. Наверное имелось ввиду, что причин для изменения большого класса из примера может быть 3 - это 1) изменение способа хранения, 2) изменение структуры данных и 3) изменение способа вывода, что не соответствует принципу Single Responsibility. Принцип говорит, что классы должны иметь только одну причину для изменения, а не "только одну ответственность". Есть еще одна проблема в описании первого принципа - для класса вывода есть как минимум 2 причины для изменения, собственно скорее всего то же можно сказать и о классе для хранения. Принцип Single Responsibility нарушен и в результате рефакторинга. Возможно использован слишком сложный пример.

  • @egorslamihin2434
    @egorslamihin2434 6 ปีที่แล้ว +2

    Спасибо, с конкретными примерами. Ясно и доступно)

  • @simplewebdev1098
    @simplewebdev1098 5 ปีที่แล้ว +23

    С принципом подстановки Барбары Лисков пример ужасный. Такое впечатление, что автор примера вымучивал его под дулом пистолета. Там есть два класса: прямоугольник и квадрат, квадрат наследуется от прямоугольника. У прямоугольника есть два приватных поля: высота и ширина, и сеттеры + геттеры соответствующих полей. Квадрат наследуется от прямоугольника (получает поля высоту и ширину) и переопределяет сеттеры высоты и ширины. Сеттер высоты устанавливает и ширину и высоту переданным значением, сеттер ширины аналогично. Пока всё нормально (почти).
    Но дальше появляется метод вычисления площади. Как он работает? Он принимает три параметра: объект класса прямоугольник (или его наследник), ширину и высоту. Далее, он вызывает сеттер ширины, потом сеттер высоты, потом геттерами получает ширину и высоту и возвращает их произведение. С прямоугольником всё работает нормально, а у квадрата сначала ширина и высота устанавливается в 4, потом ширина и высота устанавливается в 5, вызываются геттеры и получается неверный ответ (не совсем так).
    Первый вопрос к методу: почему он неявно присваивает значения? У него в названии есть set? Тогда почему он что-то устанавливает объекту. Второй вопрос, кто так вообще делает? В нормальном мире создаётся объект, которому в конструктор передаются значения ширины и высоты. Либо, конструктор перегружается и устанавливаются значения по умолчанию. Что значит new Sqгare или new Rectangle без параметров? Прямоугольник с шириной 0? А почему 0? Должны быть инициализирующие значения. Сама суть ООП нам об этом говорит: прямоугольник - объект, со своими свойствами: ширина и высота. При его создании мы должны их указать (или получить по умолчанию). Потом мы можем их поменять сеттером, это ОК. В таком случае метод вычисления площади получает геттерами нужные значения и всё работает нормально. И не изменяет (неявно!) переданный ему объект. Кроме того, что вообще должен означать вызов calculate (new Square, 4, 5) ? Почему мы квадрату передаём два значения (ширина и высота), отличающихся между собой. Вопрос: чему равна площадь квадрата с шириной 4 и высотой 5 см? А это точно квадрат? А как наш код защищён от подобных ошибок? Почему клиент, который понятия не имеет о внутреннем устройстве класса, может делать подобные вызовы?
    В нормальном мире создаётся новая фигура Rectangle rect = new Rectangle (4, 5) или Square sq = new Square (4). Конструктор в прямоугольнике устанавливает значания ширины и высоты. Конструктор в квадрате вызывает конструктор прямоугольника со значениями (4, 4). В прямоугольнике определяется метод расчёта площади. Квадрат его не переопределяет. вызывается таким образом: int square = rect.calculateSquare() или int square = sq.calculateSquare() и всё работает замечательно. Если метод сторонний, ну ладно, но он не должен неявно устанавливать свойства объекта. Передали ему объект класса Rectangle и пусть вычисляет.
    Я не говорю, что такого принципа нет, или он не нужен. Я говорю только, что пример подобран ужасно.

    • @xenm85
      @xenm85 5 ปีที่แล้ว +2

      Да просто этот пример зачастую везде описывают.

    • @simplewebdev1098
      @simplewebdev1098 5 ปีที่แล้ว +8

      @@xenm85 тогда это ещё хуже. Мало того, что не понятно, в чём заключается принцип Лисков, но ещё и получается, что уважаемые авторы нихрена не понимают в том, о чём пишут. Или им пофиг, ctrl+c ctrl+v.

    • @eugeniabashieva2536
      @eugeniabashieva2536 4 ปีที่แล้ว

      Да нормальный пример, всё понятно. Просто если вы никогда не программировали это сложно понять, как не объясняй. Всё отлично человек объяснаяет, подача простая и понятная, информация подобрана хорошо. 5 баллов из 5.

    • @xenm85
      @xenm85 4 ปีที่แล้ว +2

      @@eugeniabashieva2536 вы видимо программировали. Приведите пример нарушения этого принципа в реальном коде

    • @livecodingschool8906
      @livecodingschool8906  4 ปีที่แล้ว +1

      @@xenm85 Не все 5 принципов равнозначны так за 10 лет в веб программировании ни разу не встречал проблему связанную с подстановкой Liskov, но это не значит что данной проблемы не существует. Скорее данная проблема актуальна для более больших программ - такие как операционные системы. Я сообще не фанат наследование и если отказаться от наследования то данной проблемы не существует )

  • @alexeypashchenko
    @alexeypashchenko 4 ปีที่แล้ว

    Очень понятно объяснил!

  • @alex_pochebut
    @alex_pochebut 5 ปีที่แล้ว +1

    Классная подача и хорошие примеры, Спасибо!

  • @МартинШааф
    @МартинШааф 5 ปีที่แล้ว +1

    Прекрасное объяснение, спасибо большое!

  • @vrg9460
    @vrg9460 4 ปีที่แล้ว

    Спасибо, все четко и понятно

  • @alextopsite
    @alextopsite 5 ปีที่แล้ว

    Отличное, а главное понятное объяснение SOLID

  • @nbrains6380
    @nbrains6380 3 ปีที่แล้ว

    Класс должен выполнять не одну какую-то работу, а должен выполнять что-то для одного чего-то или для одной какой-то группы. В книге Роберт Мартин приводил пример с классом Работник в котором обледенили методы работающие с разными отделами внутри их фирмы. И вот как раз по этой причине, что они работают для разных групп, его нужно было разделить. Но сам класс может много чего делать для этой группы.

  • @eugenstakhursky9604
    @eugenstakhursky9604 5 ปีที่แล้ว

    Спасибо Александр!
    Лайк однозначно)

  • @VCSelfDevelopment
    @VCSelfDevelopment 5 ปีที่แล้ว +32

    Лайк поставил видео крутое, но "принцЫп"...:D

  • @maxkatrenko8865
    @maxkatrenko8865 4 ปีที่แล้ว

    Спасибо большое!

  • @gsfynkjczard
    @gsfynkjczard 3 ปีที่แล้ว

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

  • @alekseyradzhabov4684
    @alekseyradzhabov4684 5 ปีที่แล้ว

    Очень структурировано, спасибо!

  • @batpyiiikob7245
    @batpyiiikob7245 5 ปีที่แล้ว

    Коротко и понятно, спасибо

  • @volodymyrgachkovsky7256
    @volodymyrgachkovsky7256 5 ปีที่แล้ว +2

    В описании улыбнуло "Что такое SOLID принцы". Это прям для дам ищущих своих принцев. Ищите только SOLID принцев )))
    Так же там же есть "Принцы открытости закрытости (Open/Closed)"

    • @livecodingschool8906
      @livecodingschool8906  5 ปีที่แล้ว +2

      Хаха и правда смешно получилось

  • @DzhigurdaAnton
    @DzhigurdaAnton 3 ปีที่แล้ว

    так у Order и у OrderView один Актор. Это вы описали принцип чистого кода, в книге Чистая архитектура Роберта Мартина сказано о подобной путанице.

  • @OpalGooDog
    @OpalGooDog 3 ปีที่แล้ว

    А это пхп на примере?

    • @livecodingschool8906
      @livecodingschool8906  3 ปีที่แล้ว

      оно самое

    • @OpalGooDog
      @OpalGooDog 3 ปีที่แล้ว

      @@livecodingschool8906 благодарю!)

    • @OpalGooDog
      @OpalGooDog 3 ปีที่แล้ว

      @@livecodingschool8906 спасибо за объяснения)

  • @mushfigagayev4396
    @mushfigagayev4396 5 ปีที่แล้ว

    Spasibo druq.

  • @MrLOLs1
    @MrLOLs1 4 ปีที่แล้ว

    Спасибо

  • @inilim
    @inilim 5 ปีที่แล้ว +4

    Люблю делать класс монстр!

    • @simplewebdev1098
      @simplewebdev1098 5 ปีที่แล้ว +2

      Видимо, не приходилось переделывать класс-монстр в связи с изменениями в проекте.

  • @thejustmoose
    @thejustmoose ปีที่แล้ว

    Круто. Но прям на первом слайде опечатка. И на втором тоже.

  • @DanielTitov_archimage
    @DanielTitov_archimage 5 ปีที่แล้ว

    dependency inversion можно достичь, используя паттерн фабрика. спасибо за видео

  • @TheOmokage
    @TheOmokage 5 ปีที่แล้ว +2

    Я не согласен с тем пояснением для Single Responsibility, которое представлено в этом видео. У класса должна быть одна ответственность, да. Но, Order - это целый логический кусок, который вполне может быть в одном классе, который, соответственно, будет иметь одну зону ответственности - Order. Тут все дело в количестве сущностей, которые используют этот класс. Такие сущности в uml называются Actor. Разбивать класс на более мелкие по ответственности классы стоит только в том случае, если у них в результате будут отличатся эти самые Actor'ы. Иначе, вы просто создаете более сложное и запутанное приложение, которое конфликтует со вторым принципом Open/Close. То есть есл ивы без надобности разделяете один класс на три, но ваше количество Actor не увеличилось при этом, то вы просто увеличили его связанность и у уменьшили связность, без особых преимуществ. Самый простой для понимания пример - это класс формы в WnForm. На форме может быть куча кнопок и все они делают разные вещи, но в свою очередь класс Form имеет ответственность перед Form1 и больше не перед кем. Если мы разобьем этот класс, как предлагаете вы, то сложность программы возрастет многократно.

    • @livecodingschool8906
      @livecodingschool8906  5 ปีที่แล้ว +1

      Спасибо за комментарий. Дело не в том чтобы слепо следовать этим правилам если у вас небольшой интернет магазин и в классе Order находится скажет ~10 методов большого смысла такое разделение не принесет но сложность возрастет. Свами здесь согласен. Но давайте попробуем забежать вперед. Ваш интернет магазин стал успешным и разросся до размеров амазона. Вы можете представить чтобы в амазоне все что каcается заказа находилось в одном классе ? Какой он будет ~1M строк кода? Думаю что такой класс будет сложно поддерживать. Чисто теоритически все программу можно написать в одном файле в и не парится с namespace в всей этой лабудой с ооп. Для компьютера нет разницы. Но вот человеку будет очень сложно разобраться. По этому и пытаются код разделять на какие-то куски которые были бы понятны логически. Лично я бы предпочел бы 10 классов с ~100 строк кода чем один в класс в ~1000 строк так как если раздробить большой класс на небольшие кусочки у них появится название которое будет подсказывать что оно делает

    • @soversus5374
      @soversus5374 ปีที่แล้ว

      @@livecodingschool8906 , прям аж интересно стало... что же там в order озона такого понаписано на 1м кода. )

  • @Antzimin
    @Antzimin 2 ปีที่แล้ว

    А фоновая музыка зацикленная словами и безумно отвлекающая это специально или так получилось?

  • @eazypeazy8559
    @eazypeazy8559 ปีที่แล้ว

    пожалуйста, помечайте "Clean Architecture" (и следующий из него SOLID) как торговую марку и частный взгляд создателей на то, как по их мнению надо писать код. "Чистая архитектур/код" это не ультимативные подходы.

    • @livecodingschool8906
      @livecodingschool8906  ปีที่แล้ว

      это один из способов как можно писать код чтобы потом в этом можно разобраться, но естественно не единственный )

    • @eazypeazy8559
      @eazypeazy8559 ปีที่แล้ว

      @@livecodingschool8906 это неправда)

  • @ТуралИскендерли
    @ТуралИскендерли 4 ปีที่แล้ว

    все хорошо объяснил спасибо только последний не понял в основном из за некачественного звука.

  • @TheRockmannn
    @TheRockmannn 5 ปีที่แล้ว

    за трек на фоне тоже плюс)

  • @soversus5374
    @soversus5374 ปีที่แล้ว

    С одной стороны, я понимаю как отстал в теории для собеседования... Но с другой стороны, забавно смотреть, как мне рассказывают на сколько удобнее носить чужие тапочки. В особенности тапочки Барбары Лискоу. Интересно, у нее какой размер, а то вдруг и вправду удобнее? )))

  • @nursgrata2865
    @nursgrata2865 5 ปีที่แล้ว

    не совсем понял ваш пример класса квадрат ,просто вы там параметры не павилно задали

  • @olegpristashkin9078
    @olegpristashkin9078 4 ปีที่แล้ว

    принцип Лисков нужен для низкоуровневого кодинга, а для PHP, JS это мусор - правильно?

    • @livecodingschool8906
      @livecodingschool8906  4 ปีที่แล้ว

      и для PHP и JS тоже актуально но достаточно редко встречается - зависит на сколько много у вас OOP кода

  • @Barsikspit
    @Barsikspit 5 ปีที่แล้ว +5

    музыка на фоне только мешает

  • @AlexDeminX
    @AlexDeminX 5 ปีที่แล้ว +1

    На мой взгляд пример с прямоугольником и квадратом спорный. Тут скорее всего корявая реализация с использованием. Я понимаю, что не всё из жизни можно переложить на принципы ООП, но это не тот случай. Из геометрии мы знаем, что квадрат - это частный случай прямоугольника у которого все стороны равны. Так почему при подсчёте площади передаётся new Square, а ширина и высота не равны друг другу? Так получается здесь котлеты с мухами в перемешку?!

    • @livecodingschool8906
      @livecodingschool8906  5 ปีที่แล้ว

      Как раз отличный пример так как все это знаю т и и большенство будет ломать логику родителя зачем мол заниматься ерундой передавать два параметра когда можно один. Данную ошибку будет сложно отловить а если представить что параметров не 2 а 20 или 200 скажем это модуль аналитики - то вообще кошмар для разработчика

    • @AlexDeminX
      @AlexDeminX 5 ปีที่แล้ว +1

      @@livecodingschool8906 я не про это, а про то что выглядит, как минимум, странно - создание квадрата и передача в параметрах двух разных величин.

  • @olegpristashkin9078
    @olegpristashkin9078 5 ปีที่แล้ว

    Площадь прямоугольника єто вісота умноженная на ширину, площать квадрата можно тоже посчитать как произведение вісоті на ширину

    • @livecodingschool8906
      @livecodingschool8906  5 ปีที่แล้ว

      Может не совсем удачный пример - смысл в том что если мы в дочернем классе меняем поведение функции родителя например вместо S = a*b будем делать S = a*a что в частности верно (для квадрата) то в дальнейшем можно упустить из виду что наша реализацию считает площадь не как произведение сторон а как квадрат стороны. Скажу честно не самая распространенная проблема!

  • @mishafomin3973
    @mishafomin3973 5 ปีที่แล้ว

    Надо бы микрофончик получше... а то немного тише чем у других..... приходится громкость накручивать

  • @eugenteris
    @eugenteris 5 ปีที่แล้ว +3

    Не уверен, что принцип open/closed описан верно. То, что описано более подходит для полиморфизма. Принцип open/closed больше о наследовании, чем об имплементации

  • @dsalodki
    @dsalodki 5 ปีที่แล้ว

    как-то не идеально, но лайк

  • @kind1y
    @kind1y 4 ปีที่แล้ว

    Всё понятно кроме Лисков...

  • @SmemsMusic
    @SmemsMusic 4 ปีที่แล้ว

    Вроде и неплохо объясняешь, но как же скучно... Я несколько раз чуть не заснул, хотя тема и интересна. Написали бы текст какой-то, проговорил бы его несколько раз перед записью. И при монтировании либо переходы плавные, либо обрезать незаконченные слова. А то в некоторых местах обрывается на полуслове и сразу же новая тема. В итоге пока переключишься с того, что не договорили в предыдущем предложении на новое, приходится перематывать назад. Честно, лучше статью почитать чем такое видео, оно сложно к восприятию.

  • @ТимурСафаров-в1ч
    @ТимурСафаров-в1ч 2 ปีที่แล้ว

    Что ты тут сказал нихера ж не понятно - 9:55

  • @РоманСарваров-ч5л
    @РоманСарваров-ч5л 4 ปีที่แล้ว

    Принцип открытости/закрытости не понимаю.
    Это про то, чтобы не делать методы private, а делать их protected или что?

    • @livecodingschool8906
      @livecodingschool8906  4 ปีที่แล้ว

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

  • @Кукусик-е2э
    @Кукусик-е2э ปีที่แล้ว

    А что такое архЕтИктура??? 😂🤦‍♀️

  • @МаксимМакаров-о5ы
    @МаксимМакаров-о5ы ปีที่แล้ว

    Музыка нарушает принципы solid😂

  • @alexpipin3693
    @alexpipin3693 4 ปีที่แล้ว

    пля как ты туго рассказываешь
    я представляю как бы ты про фп рассказывал))

  • @tao309
    @tao309 5 ปีที่แล้ว

    принцИп, не принцЫп

  • @astasjr8969
    @astasjr8969 4 ปีที่แล้ว +2

    Ты, конечно, невероятно красив, но, полагаю, если бы 80% места занимал код, а не твоё лицо, всё же было бы лучше.

    • @livecodingschool8906
      @livecodingschool8906  4 ปีที่แล้ว

      хаха - следующее видео скринкаст только хард коде

  • @АлексейКузьмичёв-ц7о
    @АлексейКузьмичёв-ц7о 4 ปีที่แล้ว

    Озвучка статьи с хабры, лол

  • @JohnDoe_777
    @JohnDoe_777 4 ปีที่แล้ว

    Мудень в кадре сам не понимает о чем рассуждает. Очередной учитель.

    • @livecodingschool8906
      @livecodingschool8906  4 ปีที่แล้ว +1

      Сделай лучше и поделись. Пока вижу у тебя нечем делиться. Ну можно же ведь просто комментироваться верно же ? Очередной комментатор я тебя даже банить не буду

  • @angularlessons2514
    @angularlessons2514 5 ปีที่แล้ว +2

    Чувак все плохо))) Данное видео не рекомендуеться для понимания солид)

    • @livecodingschool8906
      @livecodingschool8906  5 ปีที่แล้ว

      что же с ним не так ? )

    • @vladislavstepanov7591
      @vladislavstepanov7591 5 ปีที่แล้ว

      дк что не так?

    • @alekseyfrozis937
      @alekseyfrozis937 5 ปีที่แล้ว +2

      @@vladislavstepanov7591 да с самим комментатором все не так) Аргументов нет, он просто "пукнул", обозначив свое влажное мнение, ни чем не подкрепив.
      Автору ролика спасибо за разъяснения, пригодится на ближайших моих собеседованиях )

  • @desys.
    @desys. 4 ปีที่แล้ว

    Автор не умеет объяснять(((

  • @Alex2114011
    @Alex2114011 3 ปีที่แล้ว

    Спасибо