Принципы ООП, инкапсуляция, абстракция, наследование, полиморфизм, 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 Финал - Ігри
Больше 10 лет опыта с юнити, множество пересмотренных видосов и имхо - у тебя самые исчерпывающие, толковые по повествованию \ примерам. Подписался, буду рекомендовать, жду новый контент!
Согласен, просмотрел некоторые видео, очень много понял, что не понимал из других! А у канала всего 2к подписчиков!
+, согласен
Это самое лучшие и понятное объяснение всех принципов что Я видел за всю жизнь. Ничего лишнего, просто только то что надо так еще и понятным языком
Класс не конвертируется, а одновременно является и тем и другим(про наследование) Классно сказано. До этого я обкастил в голове, а так достаточно спросить, чем является
Единственный видос по ооп, который я действительно слушал
По качеству видео прямо ваау, все понятно и супер, люблю паузы между слов, так получается запомнить и обдумать услышанное)
Надеюсь, паузы не такие уж большие)
нет, это отнюдь не стеб, мне реально так очень легко понимать информацию @@sergeykazantsev1655
Супер, самое лучшее объяснение ООП что нашел! Продолжайте снимать уроки, у вас талант учить!
Класс, спасибо, чётко, с примером и понятно. Десяток видео пересмотрел, и все как из утюга пишут один и тот же код и говорят, вот это полиморфизм, а в чем его суть не понятно, ещё раз благодарю.
Спасибо за видео, продолжайте в том же духе!!!!
Хотелось бы в дальнейшем увидеть про ECS
Sergey Kazantsev, из вас хороший бы учитель информатики получился. Лукас и подписота)
Ходят слухи, есть запустить стиралку в 4 утра с оборотами 666 в минуту, можно призвать Сергея) спасибо за видео, помог азы вспомнить
Спасибо, все очень доступно. Вроде как все знал, но послушал и стал знать еще лучше :)))
Не понимаю, почему так мало просмотров, очень недооцененный контент, еще не находил настолько исчерпывающих объяснений на эту тему, наконец-то я понял как это работает
Желаю развития каналу! Очень хорошие объяснения. Наконец понял всю идею инкапсуляции
Сергей, спасибо! У Вас лучшая подача материала) Буду ждать новые видосы!
Это лучшие уроки которые я встречал на ютубе. Спасибо огромное! Всё просто и понятно. Лайк, подписка. 🔥🔥🔥🔥
Спасибо, всё очень хорошо объяснено. У вас талант учителя!
Приятно слушать автора и все хорошо объясняет!
Спасибо)
Видео огонь, очень доходчиво и примеры отличные !🤘
Посмотрел, хоть все принципы и знаю =) Классный канал!
Здравствуйте! Ваш канал это настоящая находка, которую посоветовал мне друг. Данный канал единственный, на котором мне не скучно погрузиться в детали шаблонов проектирования и разобраться в некоторых моментах теории программирования! Очень жду новые видосы, старые уже пересмотрел по 3 раза)
Спасибо большое, у меня сейчас мало есть сил и времени на канал но все равно пытаюсь хоть часик хоть пол часика в день ему уделять)
Спасибо ОГРОМНОЕ. Очень понятно и круто объяснили!!! Это лучший канал по Юнити на русскоязычном ютубе. Спасибо.
Спасибо за работу! Многое помогло понять.
Очень подробно и понятно, спасибо!
Мы скучаем по лучшим обучающим видосам 😊
Июль и август выдались для меня очень непростыми) И на работе тяжело, и вообще в другую страну переезжаю. Потихоньку пилю материал по новой игре) Но когда я её опубликую - не знаю. Очень непростая игра получается)
@@sergeykazantsev1655 Поздравляю с переездом!!! Если не секрет, в какую страну? Сам мечтаю переехать, но что-то не находится работка с релокейтом.
Спасибо! В Германию, в город Гамбург. Работку с релокейтом действительно нелегко найти, много фирм которые зовут тебя на фул удалёнку и им всеравно в какой ты стране, а вот с релоком предложений мало и релокают в основном синьоров. Я искал около года
Гениальное оформление материала🍑
Очень круто, продолжайте!
Отличное видео, для начинающих самое то)
Спасибо большое за урок!
Кстати говоря, говорят, что лучше создавать контроллер для управлением состояний игрока, а не пихать логику в самого игрока, аля MVC, но для наглядности этот пример то что надо👍
всё зависит от того насколько сложная игра. Если много состояний или механик - в одном игроке может вообще быть несколько контроллеров, какой-нибудь отдельный для анимаций, отдельный для состояния(жив/мёртв, какие нибудь эффекты) и куча ещё всего
Не много не понимаю, чем имено мне нравятся твои видосы. Наверное, у тебя голос классный
Еще практика всегда есть, понятно, нахуя
Спасибо. Когда-нибудь я куплю хороший микрофон и перестану записывать в пустых комнатах - тогда вообще будет АСМР
Лучший, спасибо за годноту
Спасибо тебе, мил человек!
Благодарю за видео, синьер
Супер, ты золотой мужик
Спасибо, кажется, я начал что-то понимать про ООП 😅
Спасибо за видео!
Спасибо большое, сразу видно настоящий Сеньер. Сергей, подскажите пожалуйста какие курсы вы осваивали для c# и Unity, где вы так хорошо выучились. И можете посоветовать достоверные источники пожалуйста, желательно русскоязычные!?
На днях сделаю подборку и выложу ее как пост от сообщества, наверное)
@@sergeykazantsev1655 ждем
Отличное видео!
Спасибо!
Посмотрев видео и примеры из геймдева самому аж захотелось перейти в геймдев из бэкенда 🤣🤣
А мне в последнее время наоборот, хочется освоить что-то еще, например бэкенд
Спасибо, помогло
дуже корисні відоси. Отримую максимальний апгрейді скіллсів від цього. Продовжуй - це в кайф
🤌 идеально
Скажите пожалуйста, а upcast используется исключительно в массивах? если где хоть как то объясняют про суть upcasting'а говорят про масивы, не уж то нет других примеров
Тут скорее апкаст используется не в массивах а в коллекциях(массивы, списки, словари, HashMap и тд)
Ещё может пригодиться в программировании на уровне интерфейса и внедрении зависимостей. Там могут быть случаи что мы работаем не с коллекциями а именно с индивидуальным сервисом и где то его надо проапкастить
пасиба,
польза есть
Можешь привести примеры паттернов, которые чаще используются в проектах среднего и большого масштаба
MVVM, Декоратор, Фабрики, всякие DI-контейнеры, например
Привет, в конце видео ты показал код, где для каждого типа юнита ты создал свою переменную, а если у нас 10 типов, ошибочка в конце.😅
Можно, пожалуйста по конкретней, в чём ты считаешь тут ошибочку? Желательно с таймингом, а то я пока не понимаю о какой переменной на каждого юнита идёт речь
А будут еще видое?
Будут, но нескоро и нечасто, в последнем сообщества объяснял почему)
Спасибо,
Вроде все понятно, но вот абстракция как-то уж очень похожа на наследование с полиморфизм. Не понятно зачем его надо было выделять отдельно.
Они взаимосвязаны и вместе используются для решения одной и той же задачи. Отсюда и похожесть. Можно сказать что это три части одного целого
Но всё же их хорошо бы различать)
По сути же мы все равно можем менять переменную health из другого класса через метод AddHealth, задать например значение в миллион или я что-то не понял?
менять переменную через метод лучше, чем менять переменную напрямую.
в метод легко добавить валидацию(ту же проверку на миллион) и метод проще дебажить и логгировать, нежели изменение поля напрямую
@@sergeykazantsev1655 спасибо за ответ!
Как это всё работает то понятно, а вот как это всё писать не понятно :D
у меня на канале есть плейлист "Паттерны на практике". В рамках неё я запилил игрульку, вертикальный скроллер, вылил в открытую проект на гитхаб. Связку - полиморфизм + наследование + абстракция можно посмотреть там на логике Interactables - как я описал астероиды, аптечки, монетки, щиты и тд)
а так, просто надо пытаться потихоньку писать, косячить, понимать где накосячил, переписывать и так по кругу) с каждым следующим кругом будет чуть яснее)
@@sergeykazantsev1655 о спасибо, надо будет глянуть
Пизец, не знал, что инженеры стиралок владеют навыком ООП!
Пример со стиральной машинкой отличный способ показать процедурное программирование:
1 загрузить_тряпки();
2 выбрать_режим(стирать_тряпки);
3 засыпать_порошок();
4 начать_стирку();
А причем сдесь ООП ? И вообще, кто вам мешает скрывать переменные и методы в процедурном программировании ? Что вы до них так докапываетесь.
Половина ютуб "учителей" сами не особо понимают что такое ООП, и морочат голову новичкам.
Ох уж эти "эксперты в комментах" - которые притягивают тему которая вообще в ролике не затрагивается и в итоге эти эксперты спорят сами с собой
Ну давайте по фактам...
Причем тут процедурное программирование и ваш пример когда речь идёт об ООП? В моём примере - стиральная машинка - объект, есть внутренние данные и методы, которые непосредственно с ней взаимодействуют, есть сокрытие некоторых данных от внешнего воздействия. В этом заключается инкапсуляция. Если не согласны, дайте конкретику и уточните.
В процедурном программировании нет модификаторов public private и protected, в процедурном программировании нет понятия объект, зачем вообще в видео про ООП это накидывать?
@@sergeykazantsev1655 В моем примере у стиральной машины тоже есть внутренние данные и методы, которые непосредственно с ней взаимодействуют, есть сокрытие некоторых данных от внешнего воздействия. Только это все набор функций в процедурном программировании. А если я эти функции и преременные залеплю одной структурой, будет это объектом ? Следует пояснить, чем нобор функций отличается от в объекта, ну или признать что пример с машинкой неудачный.
Если из языка выкинуть указатели на память, то неважно ООП это или процедурный язык, намутить public private и protected не составит труда.
Я пытаюсь понять что такое ООП, но вижу только процедурщиков, которые сами не понимают что они процедурщики. Ну или ООП нафиг никому не нужно, просто современный тренд для резюме.
Мое мнение, что главное различие между ООП и процедурным программированием заключается не столько в инкапсуляции, хотя и в ней тоже(ибо есть protected) но в самой идее абстракции, наследования и полиморфизма.
Насколько я знаю, умного копирования структур с их возможностями расширения в процедурных языках нет.
В конце видео я как раз привожу задачу на подсчёт суммы разных юнитов, и как раз таки показываю разницу как бы это решение приблизительно выглядело в процедурном коде и как это благодаря ООП можно завернуть и избежать дублирования логики
Ну и также принцип DIP как раз говорит что благодаря такому подходу у нас инвертируется зависимость и подход разработки идёт не от частного к общему, а от общего к частному
@@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;
}
Благодаря процедурам можно завернуть и избежать дублирования логики, избежать накопипастинье классов, сократить код и поднять производительность :)
Согласен, на процедурном тоже это не невыполнимая задача, вот только я не уверен что если задачка будет посложнее подсчёта суммы - могут начаться более наглядные сложности
Например если ГД-шники захотят устроить АБ-тесты и потестить разные механики нанесения урона. Например:
1. Чистый и постоянный урон(всегда бьёт 3)
2. Ранжированный урон(2-5)
3. Чистый и постоянный но с вероятностью крита.
В ООП ты создаёшь 3 класса, наследников одного базового с абстрактным методом CalculateDamage и можешь легко это всё переключать.
В процедурном тоже можно так сделать, но я не уверен что это будет достаточно удобно.