No video

SOLID, 1.1 SRP - Single Responsibility Principle, Принцип Единственной ответственности, С#, Unity

  Рет қаралды 5,312

Sergey Kazantsev

Sergey Kazantsev

Күн бұрын

другие принципы SOLID-а
OCP - Принцип открытости закрытости • SOLID, 1.2 OCP - Open ...
LSP - Принцип подстановки Лисков • SOLID, 1.3 LSP - Lisko...
ISP - Принцип сегрегации интерфейсов • SOLID, 1.4 ISP - Inter...
DIP - Принцип инверсии зависимости • SOLID, 1.5 DIP - Depen...
Автору на кофе и шаурму
4276 5500 5792 8742 - карта Сбербанка
Если будут вопросы
мой тг @wargy
моя почта kazancev.s215@gmail.com
Тайминги
00:00 Введение
00:30 Как я собес проходил
02:02 Вопрос на собесе про SRP
03:05 Определение SRP
04:20 Фикс плохого кода согласно SRP
06:19 SRP основные правила
09:09 Когда следовать SRP?
10:32 Шкала "труЪООП" - "быдлокод"
12:43 Финал

Пікірлер: 38
@user-gp7js3zu6b
@user-gp7js3zu6b Жыл бұрын
Спасибо, это лучшее объяснение, что я слышала! А ещё будут? По остальным принципам? Крутая подача, без воды и хоровода мыслей! Чётко интересно и содержательно. Спасибо!!!
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Спасибо! Постараюсь пробежаться по всему solid в ближайшее время, материал по ocp осталось озвучить, остальное тоже постараюсь сделать в ближайшие две три недели
@hencho4115
@hencho4115 Жыл бұрын
Никакой воды, грамотная подача, 13 минут исключительно полезной инфы. Спасибо!
@Djegur
@Djegur Жыл бұрын
Сергей, вы мой спаситель! Единственный человек который внятно и понятно смог объяснить с примерами. Спасибо вам огромное! Хотелось бы увидеть мини курс где вы простенькую игру доведете от ночала и до конца.
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Спасибо! На канале есть рубрика "Паттерны на практике" - там я написал простую игру и выложил её на гитхаб и разобрал там решения. Как раз вчера последнее видео залил. Это конечно не запись того как я игру с нуля пишу, но код можете спокойно посмотреть и что-то взять на вооружение.
@alexsorokin8373
@alexsorokin8373 Жыл бұрын
Огонь! Очень хорошие примеры и объяснение! Работаю джуном, чтобы устроится перечитал много объяснений на эти темы, чтобы что-то понять и на собеседовании не провалиться, но сейчас понимаю, что если бы мне твой канал попался раньше, то может быть я завалил бы меньше собесов))
@RatchetTV1515
@RatchetTV1515 6 ай бұрын
Сколько месяцев искал работу?
@redlinegame3025
@redlinegame3025 Ай бұрын
Уже лет 8 занимаюсь вебом, паттерны так сяк нужны были. Обычно разработка сводится "наговняй че ни будь по бырому", так что вроде и не сильно востребовано. Была давняя мечта игру написать, решил вот попробовать на годот простенький товер запилить. И тут понял 😅 зачем нужны паттерны. Твои видео пока что самое понятное на что я натыкался. Спасибо за контент.
@sergeykazantsev1655
@sergeykazantsev1655 Ай бұрын
Спасибо)
@user-hk8sh7zb4c
@user-hk8sh7zb4c Жыл бұрын
Спасибо тебе большое, очень хорошая инфа! 🎉
@AlisaLisa-sx2te
@AlisaLisa-sx2te 5 ай бұрын
Просто шик! Снимаю шляпу перед автором!
@shlembert
@shlembert Жыл бұрын
Спасибо! Толково! *И еще несколько слов в коммент, что бы сагрить ютюбские алгоритмы =)
@paraleach
@paraleach Жыл бұрын
Спасибо, доходчиво🫡
@ivan-jc1bp
@ivan-jc1bp Жыл бұрын
Огромное спасибо !
@Awdesk_
@Awdesk_ 2 ай бұрын
Имбааа. Спасибо вам
@mgrm7031
@mgrm7031 Жыл бұрын
спасибо за труд
@PinkPanteRus
@PinkPanteRus Жыл бұрын
Спасибо! Понравилось объяснение.
@user-zd3qw7le5c
@user-zd3qw7le5c 11 ай бұрын
приятный обучающий голос и интонация
@obusis
@obusis Жыл бұрын
Спасибо!
@Serge86210
@Serge86210 4 ай бұрын
Такое ощущение, что класс должен реализовывать только то поведение объекта, которое меняет его состояние. Если поведение не влияет на состояние - оно должно быть передано другому объекту (контроллеру). Если класс оказывается перегружен - значит, некорректно выбраны параметры, определяющие состояние объекта. Например, PickGold должен быть реализован в самом классе, а не контроллере. Либо _gold заменен на некий объект Inventory.
@sergeykazantsev1655
@sergeykazantsev1655 4 ай бұрын
Поведение и состояние это к паттерну State, но архитектурные проблемы и задачи всей рразработки к данному паттерну не сводятся. Есть куча кейсов когда класс является перегружен, но это никак к состоянию объекта не относится. Именно в таких ситуациях SRP и говорит как именно решать проблему перегруженных классов - разбивать логику по зонам ответственности.
@Serge86210
@Serge86210 4 ай бұрын
​@@sergeykazantsev1655 зачем нам куча кейсов, когда есть конкретный пример в видео?) Паттерн State?) Поведение и состояние определяют объект. Состояние - это множество полей объекта. Зависимости объектов реализуются через поля. Вы во всех видео говорите исключительно про состояние и поведение объектов. В примере вы связали состояние объекта с его поведением. У этого объекта нет полей, используемых в методах attack и move - очевидно, что эти поля инкапсулированы в некие объекты. Соответственно требуются ссылки на методы этих объектов. Таким образом, классы реализуют то поведение, которое меняет состояние их объектов. SRP. Без неопределенных "одна задача" и "одна причина для изменения". По поводу последнего - в исходном коде стандартной библиотеки найдется много неожиданного.
@sergeykazantsev1655
@sergeykazantsev1655 4 ай бұрын
А... вы про ЭТО поведение и состояние, старая добрая инкапсуляция. Ну хорошо, тогда поехали сначала) " Класс должен реализовывать только то поведение объекта, которое меняет его состояние" - в целом да, вопрос в том, что делать если этого вашего поведения и состояния в одном классе слишком много? "Некорректно выбраны параметры объекта" - это что значит? Как их выбрать по другому? Группировать? Отрезать лишние? Для меня из ваших утверждений решение неочевидно. "У объекта Player нет полей, связанных с Attack, Move и тд" - Я их скрыл от того чтобы текст нормально на слайде уместился. Представьте что в том же классе Player есть поля типа AttackCooldown, weaponDamage, MovementSpeed и тд. Действительно - SRP говорит нам о том что надо создавать новые классы по зонам ответственности, и в один унести всю логику связанную с атакой(опять же поведение и состояние) и так далее
@ephemerayne
@ephemerayne 11 ай бұрын
👍
@teawizzard
@teawizzard Жыл бұрын
Но если вам кинули тестовое, то делайте чистый
@nikolayshavrin7093
@nikolayshavrin7093 5 ай бұрын
Здравствуйте, правильно ли я понимаю, что нужно в идеале разбивать классы на отдельные классы, каждый из который должен иметь свою зону ответственности, а потом с помощью композиции связывать их с начальным классом? Если это так, то является ли хорошей практикой использование анонимных классов?
@sergeykazantsev1655
@sergeykazantsev1655 5 ай бұрын
"нужно ли в идеале разбивать классы на отдельные классы, каждый из который должен иметь свою зону ответственности, а потом с помощью композиции связывать их с начальным классом" - ответ да, но в рамках разумного. Нужно оценивать затраты на рефакторинг а также перспективы на распухание конкретно этого класса. Если риск распухания высок - да, лучше сделать как вы сказали Анонимные классы если я вас правильно понимаю(анонимные типы) никак к SRP не относятся так как крупной логики и зон ответственности в себе не несут
@maksimsazanovich6087
@maksimsazanovich6087 Жыл бұрын
я написал прототип с архитектурой за 1500₽, лол
@obusis
@obusis Жыл бұрын
И ещё. Не нашел ссылки на телеграм. Закрипите, пожалуйста, в описании канала
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
телеграм канала нет. В описании есть ссылка на мой личный тг) Пока на канале мало подписчиков в телеграм канале смысла особо не вижу
@obusis
@obusis Жыл бұрын
Вопрос по теме. Если ия правильно понял идеальная реализация SRP - разделение объектов на классы состояния и классы поведения, для которых будет идеально реализовать логику один класс - один метод. Есть карточная игра, выношу в отдельный класс ThrowValidator, который валидирует подкидывание карт. В нем есть два метода: один проверяет, может ли игрок принципиально подкинуть, а второй проверяет, валидны ди кпрты, которые подкидывает игрок. Вроде бы это одна логика и следовательно есть только одна причина для изменений класса. Такая реализает не нарушает SRP?
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Конкретно в данном примере я бы сказал что данный пример не нарушает SRP, так как внутри этих расчётов используется одна и та же логика. Пример - берём условную карточную игру "Дурак", кто-то кидает шестёрку. Логика - CanThrowCard(true если карта = 6) и IsCardValid(true если карта = 6) - это по идее один и тот же метод только по разному используемый в разных местах. Бывают более сложные случаи но тут главное не скатиться в перфекционизм который никому в итоге не нужен.В играх есть куча классов которые делают пачку похожих но не одинаковых задач и какой-нибудь зануда-перфекционист ООП-шник может это всё раскритиковать
@obusis
@obusis Жыл бұрын
Спасибо!
@maksimsazanovich6087
@maksimsazanovich6087 Жыл бұрын
для проигрывания анимации тоже нужен отдельный класс, который будет реагировать на ивенты?
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
На 08:45 как раз на этот вопрос отвечал) Надо смотреть насколько это нужно и насколько оправданно. Если у вас сложная анимация и много логики с ней связано - вынести логику анимации в отдельный класс хорошая идея. Если у вас маленькая игра на 200 строк кода - в этом нет особого смысла
@andynaz7044
@andynaz7044 Жыл бұрын
00:32 Разве мидл, даже неокрепший, может несерьёзно относиться к ООП ????????
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Запросто) есть куча начинающих мидлов которые написали несколько мелких игр, почитали про dependency injection и ECS и считают что ООП им нужен процентов на 30
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Да и как раз я был тем кто думал что знаю ООП, но знал его ровно на те 30%
Parenting hacks and gadgets against mosquitoes 🦟👶
00:21
Let's GLOW!
Рет қаралды 11 МЛН
Spot The Fake Animal For $10,000
00:40
MrBeast
Рет қаралды 210 МЛН
Паттерн Observer, С#, unity,  gamedev,
15:04
Sergey Kazantsev
Рет қаралды 7 М.