Принципы ООП, инкапсуляция, абстракция, наследование, полиморфизм, Unity, C#

Поділитися
Вставка
  • Опубліковано 3 чер 2024
  • Решил вместо редких паттернов рассказать самую базу, так как годный материал по этой теме разбросан по всему интернету
    Гитхаб на проект с демкой из видео: github.com/Haywaar/PatternDem...
    Лежит по пути
    Assets/Patterns/OOPExampleBad
    Assets/Patterns/OOPExampleGood
    Там и демка с аптечкой и с расчётом стоимости юнитов
    Автору на кофе и шаурму
    4276 5500 5792 8742 - карта Сбербанка
    Если будут вопросы
    мой тг @wargy
    моя почта kazancev.s215@gmail.com
    Тайминги
    00:00 Введение
    00:31 Что такое ООП?
    01:41 Инкапсуляция - определение
    03:12 Инкапсуляция - пример из жизни
    05:25 Почему нарушать инкапсуляцию плохо?
    09:35 Правильная инкапсуляция на практике
    11:55 Абстракция - определение
    13:29 Абстракция в геймдеве
    14:14 Наследование - определение
    15:41 Наследование в геймдеве
    17:01 Полиморфизм
    18:43 ООП на практике - зачем?
    21:14 ООП на практике - вот зачем
    23:18 Финал
  • Ігри

КОМЕНТАРІ • 89

  • @hello_nazarko
    @hello_nazarko 8 місяців тому +18

    Больше 10 лет опыта с юнити, множество пересмотренных видосов и имхо - у тебя самые исчерпывающие, толковые по повествованию \ примерам. Подписался, буду рекомендовать, жду новый контент!

    • @bur-mq1mq
      @bur-mq1mq 5 місяців тому

      Согласен, просмотрел некоторые видео, очень много понял, что не понимал из других! А у канала всего 2к подписчиков!

    • @scc-6
      @scc-6 7 днів тому

      +, согласен

  • @NikitaJe_
    @NikitaJe_ 3 місяці тому +3

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

  • @scc-6
    @scc-6 7 днів тому

    Класс не конвертируется, а одновременно является и тем и другим(про наследование) Классно сказано. До этого я обкастил в голове, а так достаточно спросить, чем является

  • @void4365
    @void4365 20 днів тому

    Единственный видос по ооп, который я действительно слушал

  • @doxo3469
    @doxo3469 8 місяців тому +3

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  8 місяців тому

      Надеюсь, паузы не такие уж большие)

    • @doxo3469
      @doxo3469 8 місяців тому

      нет, это отнюдь не стеб, мне реально так очень легко понимать информацию @@sergeykazantsev1655

  • @upcourse745
    @upcourse745 5 місяців тому +2

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

  • @user-kp5wz6qx5u
    @user-kp5wz6qx5u 4 місяці тому +1

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

  • @user-qu9jm4zf3d
    @user-qu9jm4zf3d 10 місяців тому +5

    Спасибо за видео, продолжайте в том же духе!!!!
    Хотелось бы в дальнейшем увидеть про ECS

  • @flyman811
    @flyman811 3 місяці тому +1

    Sergey Kazantsev, из вас хороший бы учитель информатики получился. Лукас и подписота)

  • @timelapse3606
    @timelapse3606 10 місяців тому +1

    Ходят слухи, есть запустить стиралку в 4 утра с оборотами 666 в минуту, можно призвать Сергея) спасибо за видео, помог азы вспомнить

  • @user-lb6lv1sq3v
    @user-lb6lv1sq3v 2 місяці тому

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

  • @shelikhann
    @shelikhann Місяць тому

    Не понимаю, почему так мало просмотров, очень недооцененный контент, еще не находил настолько исчерпывающих объяснений на эту тему, наконец-то я понял как это работает

  • @Creeper71
    @Creeper71 9 місяців тому

    Желаю развития каналу! Очень хорошие объяснения. Наконец понял всю идею инкапсуляции

  • @user-tm6xr5jj8d
    @user-tm6xr5jj8d 7 місяців тому

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

  • @ntn2866
    @ntn2866 3 місяці тому

    Это лучшие уроки которые я встречал на ютубе. Спасибо огромное! Всё просто и понятно. Лайк, подписка. 🔥🔥🔥🔥

  • @Greshnoff
    @Greshnoff 2 місяці тому

    Спасибо, всё очень хорошо объяснено. У вас талант учителя!

  • @ephemerayne
    @ephemerayne 8 місяців тому

    Приятно слушать автора и все хорошо объясняет!
    Спасибо)

  • @adrassad
    @adrassad 6 місяців тому

    Видео огонь, очень доходчиво и примеры отличные !🤘

  • @Kancernik
    @Kancernik 10 місяців тому

    Посмотрел, хоть все принципы и знаю =) Классный канал!

  • @Kancernik
    @Kancernik 6 місяців тому

    Здравствуйте! Ваш канал это настоящая находка, которую посоветовал мне друг. Данный канал единственный, на котором мне не скучно погрузиться в детали шаблонов проектирования и разобраться в некоторых моментах теории программирования! Очень жду новые видосы, старые уже пересмотрел по 3 раза)

    • @sergeykazantsev1655
      @sergeykazantsev1655  6 місяців тому

      Спасибо большое, у меня сейчас мало есть сил и времени на канал но все равно пытаюсь хоть часик хоть пол часика в день ему уделять)

  • @Djegur
    @Djegur 10 місяців тому

    Спасибо ОГРОМНОЕ. Очень понятно и круто объяснили!!! Это лучший канал по Юнити на русскоязычном ютубе. Спасибо.

  • @august4228
    @august4228 21 день тому

    Спасибо за работу! Многое помогло понять.

  • @nerpa3056
    @nerpa3056 3 місяці тому

    Очень подробно и понятно, спасибо!

  • @user-yu9wr7tt9v
    @user-yu9wr7tt9v 9 місяців тому +1

    Мы скучаем по лучшим обучающим видосам 😊

    • @sergeykazantsev1655
      @sergeykazantsev1655  9 місяців тому +2

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

    • @user-yu9wr7tt9v
      @user-yu9wr7tt9v 9 місяців тому

      @@sergeykazantsev1655 Поздравляю с переездом!!! Если не секрет, в какую страну? Сам мечтаю переехать, но что-то не находится работка с релокейтом.

    • @sergeykazantsev1655
      @sergeykazantsev1655  9 місяців тому +3

      Спасибо! В Германию, в город Гамбург. Работку с релокейтом действительно нелегко найти, много фирм которые зовут тебя на фул удалёнку и им всеравно в какой ты стране, а вот с релоком предложений мало и релокают в основном синьоров. Я искал около года

  • @user-ci8nl4og9r
    @user-ci8nl4og9r 3 місяці тому

    Гениальное оформление материала🍑

  • @askardw636
    @askardw636 10 місяців тому

    Очень круто, продолжайте!

  • @kkolyann2
    @kkolyann2 10 місяців тому

    Отличное видео, для начинающих самое то)

  • @vladimirkraft4315
    @vladimirkraft4315 9 місяців тому

    Спасибо большое за урок!

  • @botcser
    @botcser 6 місяців тому

    Кстати говоря, говорят, что лучше создавать контроллер для управлением состояний игрока, а не пихать логику в самого игрока, аля MVC, но для наглядности этот пример то что надо👍

    • @sergeykazantsev1655
      @sergeykazantsev1655  6 місяців тому

      всё зависит от того насколько сложная игра. Если много состояний или механик - в одном игроке может вообще быть несколько контроллеров, какой-нибудь отдельный для анимаций, отдельный для состояния(жив/мёртв, какие нибудь эффекты) и куча ещё всего

  • @scc-6
    @scc-6 7 днів тому

    Не много не понимаю, чем имено мне нравятся твои видосы. Наверное, у тебя голос классный

    • @scc-6
      @scc-6 7 днів тому

      Еще практика всегда есть, понятно, нахуя

    • @sergeykazantsev1655
      @sergeykazantsev1655  6 днів тому +1

      Спасибо. Когда-нибудь я куплю хороший микрофон и перестану записывать в пустых комнатах - тогда вообще будет АСМР

  • @user-yu9wr7tt9v
    @user-yu9wr7tt9v 10 місяців тому

    Лучший, спасибо за годноту

  • @Desotterro
    @Desotterro 10 місяців тому

    Спасибо тебе, мил человек!

  • @lopiktest5193
    @lopiktest5193 10 місяців тому

    Благодарю за видео, синьер

  • @wepko
    @wepko 7 місяців тому

    Супер, ты золотой мужик

  • @timurcraft2018
    @timurcraft2018 10 місяців тому

    Спасибо, кажется, я начал что-то понимать про ООП 😅

  • @user-mm7ch3xw4e
    @user-mm7ch3xw4e 10 місяців тому

    Спасибо за видео!

  • @user-nc9qc7ec8m
    @user-nc9qc7ec8m 10 місяців тому +1

    Спасибо большое, сразу видно настоящий Сеньер. Сергей, подскажите пожалуйста какие курсы вы осваивали для c# и Unity, где вы так хорошо выучились. И можете посоветовать достоверные источники пожалуйста, желательно русскоязычные!?

    • @sergeykazantsev1655
      @sergeykazantsev1655  10 місяців тому +1

      На днях сделаю подборку и выложу ее как пост от сообщества, наверное)

    • @Djegur
      @Djegur 10 місяців тому

      @@sergeykazantsev1655 ждем

  • @pashafilenko1567
    @pashafilenko1567 10 місяців тому

    Отличное видео!

  • @PinkPanteRus
    @PinkPanteRus 10 місяців тому

    Спасибо!

  • @user-cq6ri2it3j
    @user-cq6ri2it3j 3 місяці тому

    Посмотрев видео и примеры из геймдева самому аж захотелось перейти в геймдев из бэкенда 🤣🤣

    • @sergeykazantsev1655
      @sergeykazantsev1655  3 місяці тому +1

      А мне в последнее время наоборот, хочется освоить что-то еще, например бэкенд

  • @ggplay7778
    @ggplay7778 10 місяців тому

    Спасибо, помогло

  • @Black_Raven-
    @Black_Raven- 7 місяців тому +1

    дуже корисні відоси. Отримую максимальний апгрейді скіллсів від цього. Продовжуй - це в кайф

  • @obusis
    @obusis 10 місяців тому

    🤌 идеально

  • @user-jv7tb6fz9h
    @user-jv7tb6fz9h 7 місяців тому

    Скажите пожалуйста, а upcast используется исключительно в массивах? если где хоть как то объясняют про суть upcasting'а говорят про масивы, не уж то нет других примеров

    • @sergeykazantsev1655
      @sergeykazantsev1655  7 місяців тому

      Тут скорее апкаст используется не в массивах а в коллекциях(массивы, списки, словари, HashMap и тд)
      Ещё может пригодиться в программировании на уровне интерфейса и внедрении зависимостей. Там могут быть случаи что мы работаем не с коллекциями а именно с индивидуальным сервисом и где то его надо проапкастить

  • @Digildon
    @Digildon 10 місяців тому

    пасиба,
    польза есть

  • @user-vo2qf2yr6p
    @user-vo2qf2yr6p 8 місяців тому

    Можешь привести примеры паттернов, которые чаще используются в проектах среднего и большого масштаба

    • @sergeykazantsev1655
      @sergeykazantsev1655  8 місяців тому

      MVVM, Декоратор, Фабрики, всякие DI-контейнеры, например

  • @hackzem07
    @hackzem07 2 місяці тому

    Привет, в конце видео ты показал код, где для каждого типа юнита ты создал свою переменную, а если у нас 10 типов, ошибочка в конце.😅

    • @sergeykazantsev1655
      @sergeykazantsev1655  2 місяці тому

      Можно, пожалуйста по конкретней, в чём ты считаешь тут ошибочку? Желательно с таймингом, а то я пока не понимаю о какой переменной на каждого юнита идёт речь

  • @naumov-channel
    @naumov-channel 6 місяців тому

    А будут еще видое?

    • @sergeykazantsev1655
      @sergeykazantsev1655  6 місяців тому

      Будут, но нескоро и нечасто, в последнем сообщества объяснял почему)

  • @sashakolsky
    @sashakolsky 5 місяців тому

    Спасибо,
    Вроде все понятно, но вот абстракция как-то уж очень похожа на наследование с полиморфизм. Не понятно зачем его надо было выделять отдельно.

    • @sergeykazantsev1655
      @sergeykazantsev1655  5 місяців тому

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

  • @user-eh4fm7ux5z
    @user-eh4fm7ux5z 17 днів тому

    По сути же мы все равно можем менять переменную health из другого класса через метод AddHealth, задать например значение в миллион или я что-то не понял?

    • @sergeykazantsev1655
      @sergeykazantsev1655  17 днів тому

      менять переменную через метод лучше, чем менять переменную напрямую.
      в метод легко добавить валидацию(ту же проверку на миллион) и метод проще дебажить и логгировать, нежели изменение поля напрямую

    • @user-eh4fm7ux5z
      @user-eh4fm7ux5z 17 днів тому

      @@sergeykazantsev1655 спасибо за ответ!

  • @KeysREC
    @KeysREC 10 місяців тому

    Как это всё работает то понятно, а вот как это всё писать не понятно :D

    • @sergeykazantsev1655
      @sergeykazantsev1655  10 місяців тому +2

      у меня на канале есть плейлист "Паттерны на практике". В рамках неё я запилил игрульку, вертикальный скроллер, вылил в открытую проект на гитхаб. Связку - полиморфизм + наследование + абстракция можно посмотреть там на логике Interactables - как я описал астероиды, аптечки, монетки, щиты и тд)

    • @sergeykazantsev1655
      @sergeykazantsev1655  10 місяців тому +1

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

    • @KeysREC
      @KeysREC 10 місяців тому

      @@sergeykazantsev1655 о спасибо, надо будет глянуть

  • @botcser
    @botcser 6 місяців тому

    Пизец, не знал, что инженеры стиралок владеют навыком ООП!

  • @user-qn7kg6yk8c
    @user-qn7kg6yk8c Місяць тому

    Пример со стиральной машинкой отличный способ показать процедурное программирование:
    1 загрузить_тряпки();
    2 выбрать_режим(стирать_тряпки);
    3 засыпать_порошок();
    4 начать_стирку();
    А причем сдесь ООП ? И вообще, кто вам мешает скрывать переменные и методы в процедурном программировании ? Что вы до них так докапываетесь.
    Половина ютуб "учителей" сами не особо понимают что такое ООП, и морочат голову новичкам.

    • @sergeykazantsev1655
      @sergeykazantsev1655  Місяць тому +1

      Ох уж эти "эксперты в комментах" - которые притягивают тему которая вообще в ролике не затрагивается и в итоге эти эксперты спорят сами с собой
      Ну давайте по фактам...
      Причем тут процедурное программирование и ваш пример когда речь идёт об ООП? В моём примере - стиральная машинка - объект, есть внутренние данные и методы, которые непосредственно с ней взаимодействуют, есть сокрытие некоторых данных от внешнего воздействия. В этом заключается инкапсуляция. Если не согласны, дайте конкретику и уточните.
      В процедурном программировании нет модификаторов public private и protected, в процедурном программировании нет понятия объект, зачем вообще в видео про ООП это накидывать?

    • @user-qn7kg6yk8c
      @user-qn7kg6yk8c Місяць тому

      @@sergeykazantsev1655 В моем примере у стиральной машины тоже есть внутренние данные и методы, которые непосредственно с ней взаимодействуют, есть сокрытие некоторых данных от внешнего воздействия. Только это все набор функций в процедурном программировании. А если я эти функции и преременные залеплю одной структурой, будет это объектом ? Следует пояснить, чем нобор функций отличается от в объекта, ну или признать что пример с машинкой неудачный.
      Если из языка выкинуть указатели на память, то неважно ООП это или процедурный язык, намутить public private и protected не составит труда.
      Я пытаюсь понять что такое ООП, но вижу только процедурщиков, которые сами не понимают что они процедурщики. Ну или ООП нафиг никому не нужно, просто современный тренд для резюме.

    • @sergeykazantsev1655
      @sergeykazantsev1655  Місяць тому +1

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

    • @user-qn7kg6yk8c
      @user-qn7kg6yk8c Місяць тому

      @@sergeykazantsev1655
      Как я понял (в разных умных книжках написано по-разному) отличие ООП от процедур не в коде, а в подходе к решению. Объект должын быть самостоятельным, его не надо водить за ручку и говорить что ему делать, в противном случае и получаются процедуры завернутые в псевдо-классы.
      я как процедурщик запилил бы задачу с юнитами так (примерно):
      #define WAR 0
      #define MAG 1
      #define ARC 2
      // WAR MAG ARC
      int unit_price_us[] = { 10, 20, 30 }
      int unit_price_ex[] = { 15, 40, 10 }
      int get_price(id, type)
      {
      if (type > 2) return 0;
      if (id % 3)
      return unit_price_us[type];
      else
      return unit_price_ex[type];
      }
      int get_sum()
      {
      int result =0;
      for (int id = 0; id < COUNT; id++)
      result += get_price(id, units[id]);
      return result;
      }
      Благодаря процедурам можно завернуть и избежать дублирования логики, избежать накопипастинье классов, сократить код и поднять производительность :)

    • @sergeykazantsev1655
      @sergeykazantsev1655  Місяць тому

      Согласен, на процедурном тоже это не невыполнимая задача, вот только я не уверен что если задачка будет посложнее подсчёта суммы - могут начаться более наглядные сложности
      Например если ГД-шники захотят устроить АБ-тесты и потестить разные механики нанесения урона. Например:
      1. Чистый и постоянный урон(всегда бьёт 3)
      2. Ранжированный урон(2-5)
      3. Чистый и постоянный но с вероятностью крита.
      В ООП ты создаёшь 3 класса, наследников одного базового с абстрактным методом CalculateDamage и можешь легко это всё переключать.
      В процедурном тоже можно так сделать, но я не уверен что это будет достаточно удобно.