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

  Рет қаралды 31,260

Live Coding School

Live Coding School

Күн бұрын

Пікірлер: 98
@Den4eg37
@Den4eg37 3 жыл бұрын
Видео прикольное,просто о сложном,но площадь квадрата высчитывается точно так же как площадь прямоугольника :))
@Кирилл-в4л8м
@Кирилл-в4л8м 3 жыл бұрын
Одно из лучших видео по SOLID. Максимально просто, коротко и понятно. Большое спасибо!
@koala4ka
@koala4ka 2 жыл бұрын
наверное вы единственный кто хорошо объяснил принцыпы спасибо за видео
@MaxKalama
@MaxKalama 5 жыл бұрын
Я разработчик со стажем и, стыдно сказать, что всегда ленился разобраться в принципах solid. Александр, спасибо большое! За 12 минут этого видео всё стало предельно ясно!
@alextopsite
@alextopsite 4 жыл бұрын
Разобраться это одно, а начать применять - это уже совсем другая история
@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 9 ай бұрын
@@alextopsite , проблема не начать применять, а принять все эти "удобства" своим естеством и понять зачем. Что если мое нутро просто орет "зачем"? Чем плохо, например иметь один класс? Чем это неудобно? Никогда не испытывал неудобства. И тут вдруг мне говорят, это неудобно. ) А работать с кучей файлов удобно? Плодить тысячи файлов удобно? Удобно, когда хостер не хочет делать резервную копию от переизбытка маленьких файлов? ... Это как бы вот только, что на скорую руку. Удобство, понятие относительное. Но тут кто то "придумал" принципы и все теперь должны им следовать порождая новый геморрой. ) Барбары Лискоу предлагает свои тапки, а пусть походит в моих, мои мне удобнее, значит и ей будет удобно. )
@soversus5374
@soversus5374 9 ай бұрын
@@JohnDoe_777 , забавно. А я думал, разраб, это тот кто думает своей головой, а не копирует бездумно. Вы выходит не разраб, а конструктор? Берете готовые кубики и складываете в конструкцию? ) Без обид.
@Egadirov
@Egadirov 4 жыл бұрын
Лучший туториал по SOLID, браво!
@vrg9460
@vrg9460 3 жыл бұрын
Спасибо, все четко и понятно
@alexeypashchenko
@alexeypashchenko 4 жыл бұрын
Очень понятно объяснил!
@TheMool11
@TheMool11 5 жыл бұрын
Спасибо, очень доступно объяснил и с хорошими примерами.
@maxkatrenko8865
@maxkatrenko8865 4 жыл бұрын
Спасибо большое!
@mirlaniusUMK
@mirlaniusUMK 5 жыл бұрын
очень приятно изложение темы, музыка этому хорошо способствует. Спасибо
@alextopsite
@alextopsite 4 жыл бұрын
Отличное, а главное понятное объяснение SOLID
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
благодарю!
@egorslamihin2434
@egorslamihin2434 5 жыл бұрын
Спасибо, с конкретными примерами. Ясно и доступно)
@exxbrain
@exxbrain 4 жыл бұрын
В первом примере в случае с большим классом мы тоже будем менять только один класс. Наверное имелось ввиду, что причин для изменения большого класса из примера может быть 3 - это 1) изменение способа хранения, 2) изменение структуры данных и 3) изменение способа вывода, что не соответствует принципу Single Responsibility. Принцип говорит, что классы должны иметь только одну причину для изменения, а не "только одну ответственность". Есть еще одна проблема в описании первого принципа - для класса вывода есть как минимум 2 причины для изменения, собственно скорее всего то же можно сказать и о классе для хранения. Принцип Single Responsibility нарушен и в результате рефакторинга. Возможно использован слишком сложный пример.
@МартинШааф
@МартинШааф 5 жыл бұрын
Прекрасное объяснение, спасибо большое!
@livecodingschool8906
@livecodingschool8906 5 жыл бұрын
Спасибо за комментарий
@ТкачукИгорь
@ТкачукИгорь 5 жыл бұрын
Спасибо! Очень полезно! Рассказываете очень доступно. Приятно слушать. Жду с нетерпением еще интересных уроков!!
@livecodingschool8906
@livecodingschool8906 5 жыл бұрын
Спасибо большое будем стараться
@nbrains6380
@nbrains6380 2 жыл бұрын
Класс должен выполнять не одну какую-то работу, а должен выполнять что-то для одного чего-то или для одной какой-то группы. В книге Роберт Мартин приводил пример с классом Работник в котором обледенили методы работающие с разными отделами внутри их фирмы. И вот как раз по этой причине, что они работают для разных групп, его нужно было разделить. Но сам класс может много чего делать для этой группы.
@alex_pochebut
@alex_pochebut 5 жыл бұрын
Классная подача и хорошие примеры, Спасибо!
@eugenstakhursky9604
@eugenstakhursky9604 5 жыл бұрын
Спасибо Александр! Лайк однозначно)
@batpyiiikob7245
@batpyiiikob7245 5 жыл бұрын
Коротко и понятно, спасибо
@MrLOLs1
@MrLOLs1 4 жыл бұрын
Спасибо
@mushfigagayev4396
@mushfigagayev4396 4 жыл бұрын
Spasibo druq.
@alekseyradzhabov4684
@alekseyradzhabov4684 5 жыл бұрын
Очень структурировано, спасибо!
@gsfynkjczard
@gsfynkjczard 2 жыл бұрын
На примере ларавела удобно рассказывать)
@VCSelfDevelopment
@VCSelfDevelopment 5 жыл бұрын
Лайк поставил видео крутое, но "принцЫп"...:D
@livecodingschool8906
@livecodingschool8906 5 жыл бұрын
да есть косяк спс
@Сергей-е4г5п
@Сергей-е4г5п 4 жыл бұрын
АрхЕтиктура ООП в начале еще.
@TheRockmannn
@TheRockmannn 5 жыл бұрын
за трек на фоне тоже плюс)
@volodymyrgachkovsky7256
@volodymyrgachkovsky7256 5 жыл бұрын
В описании улыбнуло "Что такое SOLID принцы". Это прям для дам ищущих своих принцев. Ищите только SOLID принцев ))) Так же там же есть "Принцы открытости закрытости (Open/Closed)"
@livecodingschool8906
@livecodingschool8906 5 жыл бұрын
Хаха и правда смешно получилось
@thejustmoose
@thejustmoose Жыл бұрын
Круто. Но прям на первом слайде опечатка. И на втором тоже.
@ТуралИскендерли
@ТуралИскендерли 4 жыл бұрын
все хорошо объяснил спасибо только последний не понял в основном из за некачественного звука.
@simplewebdev1098
@simplewebdev1098 5 жыл бұрын
С принципом подстановки Барбары Лисков пример ужасный. Такое впечатление, что автор примера вымучивал его под дулом пистолета. Там есть два класса: прямоугольник и квадрат, квадрат наследуется от прямоугольника. У прямоугольника есть два приватных поля: высота и ширина, и сеттеры + геттеры соответствующих полей. Квадрат наследуется от прямоугольника (получает поля высоту и ширину) и переопределяет сеттеры высоты и ширины. Сеттер высоты устанавливает и ширину и высоту переданным значением, сеттер ширины аналогично. Пока всё нормально (почти). Но дальше появляется метод вычисления площади. Как он работает? Он принимает три параметра: объект класса прямоугольник (или его наследник), ширину и высоту. Далее, он вызывает сеттер ширины, потом сеттер высоты, потом геттерами получает ширину и высоту и возвращает их произведение. С прямоугольником всё работает нормально, а у квадрата сначала ширина и высота устанавливается в 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 4 жыл бұрын
Да просто этот пример зачастую везде описывают.
@simplewebdev1098
@simplewebdev1098 4 жыл бұрын
@@xenm85 тогда это ещё хуже. Мало того, что не понятно, в чём заключается принцип Лисков, но ещё и получается, что уважаемые авторы нихрена не понимают в том, о чём пишут. Или им пофиг, ctrl+c ctrl+v.
@eugeniabashieva2536
@eugeniabashieva2536 4 жыл бұрын
Да нормальный пример, всё понятно. Просто если вы никогда не программировали это сложно понять, как не объясняй. Всё отлично человек объяснаяет, подача простая и понятная, информация подобрана хорошо. 5 баллов из 5.
@xenm85
@xenm85 4 жыл бұрын
@@eugeniabashieva2536 вы видимо программировали. Приведите пример нарушения этого принципа в реальном коде
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
@@xenm85 Не все 5 принципов равнозначны так за 10 лет в веб программировании ни разу не встречал проблему связанную с подстановкой Liskov, но это не значит что данной проблемы не существует. Скорее данная проблема актуальна для более больших программ - такие как операционные системы. Я сообще не фанат наследование и если отказаться от наследования то данной проблемы не существует )
@DanielTitov_archimage
@DanielTitov_archimage 5 жыл бұрын
dependency inversion можно достичь, используя паттерн фабрика. спасибо за видео
@DzhigurdaAnton
@DzhigurdaAnton 3 жыл бұрын
так у Order и у OrderView один Актор. Это вы описали принцип чистого кода, в книге Чистая архитектура Роберта Мартина сказано о подобной путанице.
@TheOmokage
@TheOmokage 5 жыл бұрын
Я не согласен с тем пояснением для Single Responsibility, которое представлено в этом видео. У класса должна быть одна ответственность, да. Но, Order - это целый логический кусок, который вполне может быть в одном классе, который, соответственно, будет иметь одну зону ответственности - Order. Тут все дело в количестве сущностей, которые используют этот класс. Такие сущности в uml называются Actor. Разбивать класс на более мелкие по ответственности классы стоит только в том случае, если у них в результате будут отличатся эти самые Actor'ы. Иначе, вы просто создаете более сложное и запутанное приложение, которое конфликтует со вторым принципом Open/Close. То есть есл ивы без надобности разделяете один класс на три, но ваше количество Actor не увеличилось при этом, то вы просто увеличили его связанность и у уменьшили связность, без особых преимуществ. Самый простой для понимания пример - это класс формы в WnForm. На форме может быть куча кнопок и все они делают разные вещи, но в свою очередь класс Form имеет ответственность перед Form1 и больше не перед кем. Если мы разобьем этот класс, как предлагаете вы, то сложность программы возрастет многократно.
@livecodingschool8906
@livecodingschool8906 5 жыл бұрын
Спасибо за комментарий. Дело не в том чтобы слепо следовать этим правилам если у вас небольшой интернет магазин и в классе Order находится скажет ~10 методов большого смысла такое разделение не принесет но сложность возрастет. Свами здесь согласен. Но давайте попробуем забежать вперед. Ваш интернет магазин стал успешным и разросся до размеров амазона. Вы можете представить чтобы в амазоне все что каcается заказа находилось в одном классе ? Какой он будет ~1M строк кода? Думаю что такой класс будет сложно поддерживать. Чисто теоритически все программу можно написать в одном файле в и не парится с namespace в всей этой лабудой с ооп. Для компьютера нет разницы. Но вот человеку будет очень сложно разобраться. По этому и пытаются код разделять на какие-то куски которые были бы понятны логически. Лично я бы предпочел бы 10 классов с ~100 строк кода чем один в класс в ~1000 строк так как если раздробить большой класс на небольшие кусочки у них появится название которое будет подсказывать что оно делает
@soversus5374
@soversus5374 9 ай бұрын
@@livecodingschool8906 , прям аж интересно стало... что же там в order озона такого понаписано на 1м кода. )
@inilim
@inilim 5 жыл бұрын
Люблю делать класс монстр!
@simplewebdev1098
@simplewebdev1098 5 жыл бұрын
Видимо, не приходилось переделывать класс-монстр в связи с изменениями в проекте.
@soversus5374
@soversus5374 9 ай бұрын
С одной стороны, я понимаю как отстал в теории для собеседования... Но с другой стороны, забавно смотреть, как мне рассказывают на сколько удобнее носить чужие тапочки. В особенности тапочки Барбары Лискоу. Интересно, у нее какой размер, а то вдруг и вправду удобнее? )))
@eazypeazy8559
@eazypeazy8559 Жыл бұрын
пожалуйста, помечайте "Clean Architecture" (и следующий из него SOLID) как торговую марку и частный взгляд создателей на то, как по их мнению надо писать код. "Чистая архитектур/код" это не ультимативные подходы.
@livecodingschool8906
@livecodingschool8906 Жыл бұрын
это один из способов как можно писать код чтобы потом в этом можно разобраться, но естественно не единственный )
@eazypeazy8559
@eazypeazy8559 Жыл бұрын
@@livecodingschool8906 это неправда)
@Antzimin
@Antzimin 2 жыл бұрын
А фоновая музыка зацикленная словами и безумно отвлекающая это специально или так получилось?
@olegpristashkin9078
@olegpristashkin9078 5 жыл бұрын
Площадь прямоугольника єто вісота умноженная на ширину, площать квадрата можно тоже посчитать как произведение вісоті на ширину
@livecodingschool8906
@livecodingschool8906 5 жыл бұрын
Может не совсем удачный пример - смысл в том что если мы в дочернем классе меняем поведение функции родителя например вместо S = a*b будем делать S = a*a что в частности верно (для квадрата) то в дальнейшем можно упустить из виду что наша реализацию считает площадь не как произведение сторон а как квадрат стороны. Скажу честно не самая распространенная проблема!
@OpalGooDog
@OpalGooDog 3 жыл бұрын
А это пхп на примере?
@livecodingschool8906
@livecodingschool8906 3 жыл бұрын
оно самое
@OpalGooDog
@OpalGooDog 3 жыл бұрын
@@livecodingschool8906 благодарю!)
@OpalGooDog
@OpalGooDog 3 жыл бұрын
@@livecodingschool8906 спасибо за объяснения)
@olegpristashkin9078
@olegpristashkin9078 4 жыл бұрын
принцип Лисков нужен для низкоуровневого кодинга, а для PHP, JS это мусор - правильно?
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
и для PHP и JS тоже актуально но достаточно редко встречается - зависит на сколько много у вас OOP кода
@AlexDeminX
@AlexDeminX 5 жыл бұрын
На мой взгляд пример с прямоугольником и квадратом спорный. Тут скорее всего корявая реализация с использованием. Я понимаю, что не всё из жизни можно переложить на принципы ООП, но это не тот случай. Из геометрии мы знаем, что квадрат - это частный случай прямоугольника у которого все стороны равны. Так почему при подсчёте площади передаётся new Square, а ширина и высота не равны друг другу? Так получается здесь котлеты с мухами в перемешку?!
@livecodingschool8906
@livecodingschool8906 5 жыл бұрын
Как раз отличный пример так как все это знаю т и и большенство будет ломать логику родителя зачем мол заниматься ерундой передавать два параметра когда можно один. Данную ошибку будет сложно отловить а если представить что параметров не 2 а 20 или 200 скажем это модуль аналитики - то вообще кошмар для разработчика
@AlexDeminX
@AlexDeminX 5 жыл бұрын
@@livecodingschool8906 я не про это, а про то что выглядит, как минимум, странно - создание квадрата и передача в параметрах двух разных величин.
@nursgrata2865
@nursgrata2865 5 жыл бұрын
не совсем понял ваш пример класса квадрат ,просто вы там параметры не павилно задали
@dsalodki
@dsalodki 4 жыл бұрын
как-то не идеально, но лайк
@mishafomin3973
@mishafomin3973 4 жыл бұрын
Надо бы микрофончик получше... а то немного тише чем у других..... приходится громкость накручивать
@Barsikspit
@Barsikspit 4 жыл бұрын
музыка на фоне только мешает
@eugenteris
@eugenteris 5 жыл бұрын
Не уверен, что принцип open/closed описан верно. То, что описано более подходит для полиморфизма. Принцип open/closed больше о наследовании, чем об имплементации
@kind1y
@kind1y 4 жыл бұрын
Всё понятно кроме Лисков...
@SmemsMusic
@SmemsMusic 4 жыл бұрын
Вроде и неплохо объясняешь, но как же скучно... Я несколько раз чуть не заснул, хотя тема и интересна. Написали бы текст какой-то, проговорил бы его несколько раз перед записью. И при монтировании либо переходы плавные, либо обрезать незаконченные слова. А то в некоторых местах обрывается на полуслове и сразу же новая тема. В итоге пока переключишься с того, что не договорили в предыдущем предложении на новое, приходится перематывать назад. Честно, лучше статью почитать чем такое видео, оно сложно к восприятию.
@Кукусик-е2э
@Кукусик-е2э Жыл бұрын
А что такое архЕтИктура??? 😂🤦‍♀️
@РоманСарваров-ч5л
@РоманСарваров-ч5л 4 жыл бұрын
Принцип открытости/закрытости не понимаю. Это про то, чтобы не делать методы private, а делать их protected или что?
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
нет это про то чтобы не изменять логику методов а дополнять и расширять
@АлексейКузьмичёв-ц7о
@АлексейКузьмичёв-ц7о 4 жыл бұрын
Озвучка статьи с хабры, лол
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
в описание есть ссылочка
@АлексейКузьмичёв-ц7о
@АлексейКузьмичёв-ц7о 4 жыл бұрын
@@livecodingschool8906 Вот и вспомнилось да, всё оттуда
@МаксимМакаров-о5ы
@МаксимМакаров-о5ы Жыл бұрын
Музыка нарушает принципы solid😂
@alexpipin3693
@alexpipin3693 4 жыл бұрын
пля как ты туго рассказываешь я представляю как бы ты про фп рассказывал))
@tao309
@tao309 5 жыл бұрын
принцИп, не принцЫп
@ТимурСафаров-в1ч
@ТимурСафаров-в1ч 2 жыл бұрын
Что ты тут сказал нихера ж не понятно - 9:55
@astasjr8969
@astasjr8969 4 жыл бұрын
Ты, конечно, невероятно красив, но, полагаю, если бы 80% места занимал код, а не твоё лицо, всё же было бы лучше.
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
хаха - следующее видео скринкаст только хард коде
@JohnDoe_777
@JohnDoe_777 4 жыл бұрын
Мудень в кадре сам не понимает о чем рассуждает. Очередной учитель.
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
Сделай лучше и поделись. Пока вижу у тебя нечем делиться. Ну можно же ведь просто комментироваться верно же ? Очередной комментатор я тебя даже банить не буду
@desys.
@desys. 3 жыл бұрын
Автор не умеет объяснять(((
@angularlessons2514
@angularlessons2514 4 жыл бұрын
Чувак все плохо))) Данное видео не рекомендуеться для понимания солид)
@livecodingschool8906
@livecodingschool8906 4 жыл бұрын
что же с ним не так ? )
@vladislavstepanov7591
@vladislavstepanov7591 4 жыл бұрын
дк что не так?
@alekseyfrozis937
@alekseyfrozis937 4 жыл бұрын
@@vladislavstepanov7591 да с самим комментатором все не так) Аргументов нет, он просто "пукнул", обозначив свое влажное мнение, ни чем не подкрепив. Автору ролика спасибо за разъяснения, пригодится на ближайших моих собеседованиях )
@Alex2114011
@Alex2114011 2 жыл бұрын
Спасибо
Все о принципах SOLID
16:07
Merion Academy
Рет қаралды 32 М.
Человек паук уже не тот
00:32
Miracle
Рет қаралды 3,6 МЛН
Trapped by the Machine, Saved by Kind Strangers! #shorts
00:21
Fabiosa Best Lifehacks
Рет қаралды 22 МЛН
Yay, My Dad Is a Vending Machine! 🛍️😆 #funny #prank #comedy
00:17
Просто о SOLID (Принципы SOLID)
15:54
webDev
Рет қаралды 222 М.
THE MOST FREQUENT MISCONCEPTIONS ABOUT OOP
19:37
ExtremeCode
Рет қаралды 556 М.
G.R.A.S.P | шаблоны проектирования
12:09
Человек паук уже не тот
00:32
Miracle
Рет қаралды 3,6 МЛН