Плюсы и минусы статических классов в C#. Разбираем на примерах в Unity

2022 ж. 19 Қаң.
8 946 Рет қаралды

Поддержи канал, бро!
paypal.me/gamedevlavka - мир
boosty.to/gamedevlavka - рф
И даже криптой (пока только Ethereum):
0x7a53325D1C36Eea7BbE8C6a8D00f2a0efd580e77
Каждый опытный программист заверит, статика - зло. Но так ли это на самом деле? И почему это зло? Может все-таки иногда статические классы, методы, поля и др. полезны? Давайте разберемся на примерах в Unity, каковы плюсы и минусы статики. Данный урок подойдет не только к разработчикам игр на Unity, но и для тех, кто просто программирует на C#.
Кстати, лайки и донаты волшебным образом ускоряют процесс записи новых видео!
__________
Залетай в Таверну Разработчика в телеге, и делись своими траблами в Unity, вместе разбираться будем!
t.me/gamedevtavern
Подписывайся на канал в телеге, или на твиттер, там я публикую коротенькие типсы и практики, которые помогут писать код лучше, понятнее и эффективнее:
Telegram: t.me/gamedevlavka
Twitter: / gamedevlavka
Twitter (личный): / vavilichevgd

Пікірлер
  • Пересмотрел еще раз... Захотелось еще лайк поставить :) 👍 (особенно за сервис локатор)

    @def6141@def61412 жыл бұрын
  • Разбери сервис-локатор поподробнее.

    @Multizauri@Multizauri2 жыл бұрын
    • А чего разбирать? Обычный словарь, где ключ это тип.

      @mao3193@mao31932 жыл бұрын
    • @@mao3193 попросили написать в комментариях, если хотим, чтобы разобрали. Вот я и написал, в чем проблема?

      @Multizauri@Multizauri2 жыл бұрын
  • Спасибо за урок!!

    @user-we6si4mi3x@user-we6si4mi3x Жыл бұрын
  • Спасибо за видос)

    @evilvirraZzz@evilvirraZzz2 жыл бұрын
  • Привет. А будут ролики еще про архитектуру приложения ?. Или посоветуй пожалуйста материла по построении архитектуры игры (Кинги статьи). Связи UI и Game например. Заранее спасибо. Классный канал спасибо за ролики.

    @limlife4035@limlife40352 жыл бұрын
    • Максим крюков рекомендую там есть разбор стримов

      @blackmercy-il9me@blackmercy-il9me2 жыл бұрын
    • Точнее разбор кода подписчиков, довольно не плохо, к синдикат тоже неплохой канал, а так читать, устроиться на работу в конце концов, это самый эффективный способ считается

      @blackmercy-il9me@blackmercy-il9me2 жыл бұрын
  • спасибо за паттерн, очень полезно

    @user-ku1tu6bj7v@user-ku1tu6bj7v10 ай бұрын
  • Спасибо

    @kitws@kitws2 жыл бұрын
  • Ну минусы очень условные, скорее это просто особенности работы класса и просто условия использования Это как жаловаться на велосипед о том что он не может бетон возить Да, не стоит везде пихать статики, но это работает со всем кодом, где то нужно одно, где то другое Этот видос скорее просто разъясняет что и для чего нужно применять

    @VitVit312@VitVit3122 жыл бұрын
    • Именно так, так и задумывалось, а название видео такое - по известным причинам. Но цель была показать, для каких случаев подходит и не подходит статика

      @gamedevlavka@gamedevlavka2 жыл бұрын
    • @@gamedevlavka Всё понимается, видосик то надо продвигать с:

      @VitVit312@VitVit3122 жыл бұрын
  • разбор сервис локатора очень актуален

    @anton3757@anton37572 жыл бұрын
  • Вот так бывает) смотрел мнение по статике, а залип на сервис локаторе)

    @GameDev55@GameDev5511 ай бұрын
  • Привет! Спасибо за видео! Есть вопрос по статическим полям: заметил, что если в Unity в режиме Play значение статического поля изменяется, то эти изменения сохранятся во всем проекте и после выхода из режима Play (а не как обычно сбрасываются). Изменения сбрасываются, только если менять что-то в коде (напр. тупо добавить какую-нибудь строчку, даже не относящуюся к стат полю, причем не обязательно в скрипте со статичным полем). Не нашел объяснения почему так, кто-нибудь поможет, объяснит?) И еще вопрос - статические поля ведут себя точно так же в реальных игровых сессиях? (т.е. если игрок выйдет из игры, значение стат поля сохранится?). Если так, то получается статические поля нельзя использовать с объектами, которые изменяются во время игры?

    @user-hk5le8nv7x@user-hk5le8nv7x Жыл бұрын
    • Значение не сохранится. То что у тебя оно сохраняется между PlayModes у тебя наверняка стоит EnterPlayMode Options, чтобы Play быстрее включался. Именно эта опция сбрасывает всю статику, но занимает большее время

      @orwell235@orwell235 Жыл бұрын
  • Как ты относишься к статичным событиям?

    @brickman3171@brickman31712 жыл бұрын
    • Также, как и к статике в целом. Они должны быть на своем месте: сцена загружена, прошла секунда игрового времени, игру поставили на паузу или свернули - это можно делать статичными событиями. При чем некоторые из них в Unity уже реализованы в качестве внутренних методов, но масштаб ответственности приведенных примеров понятен. То есть об этих событиях может знать каждый. Но по умолчанию, этого не требуется, поэтому в 99.9% случаев события не статичны

      @gamedevlavka@gamedevlavka2 жыл бұрын
  • Подписка

    @user-hq2wg8pg1l@user-hq2wg8pg1l2 жыл бұрын
  • Хороший и познавательный ролик ?

    @vladisslavss@vladisslavss2 жыл бұрын
  • Ждём сервис-локатор.

    @user-bb3ny6fd4g@user-bb3ny6fd4g2 жыл бұрын
  • Разбери пожалуйста сервис локатор!! Подписался, поставил лайк, на колокольчик кликнул! Оч жду!

    @maxchannel4191@maxchannel41912 жыл бұрын
  • В 0:18 ночи нужно спать, а не про сервис-локатор рассказывать XD А если серьёзно, то не получится ли такая же ситуация, как в мемасике со скейтбордистом? Я так понимаю, что использование сервис-локатора "в любом месте" приведет к той же самой проблеме, что и просто со статическими классами. Если вдруг "неизменный" сервис аналитики придется поменять, то его получение через локатор снова нужно будет вычищать ручками. У нас "в любом другом классе" переменная типа Penguin. Хоть с локатором, хоть без.

    @andrey_aka_skif@andrey_aka_skif2 жыл бұрын
    • Сервис-локатор используется для глобальных сущностей, именно поэтому я говорил "представим, что пингвин это сервис", то есть это может быть фича (например магазин), или сервис аналитики, или сервис внутри игровых покупок и т.д. Не нужно в локатор хранить все подряд. Во-вторых, нужно делать сервис локатор не объектами, понятное дело, а через интерфейсы, тогда не нужно ничего вычищать руками, просто меняешь место инициализации и все. Думаю я расскажу подробности как раз в видео про сервис локатор)

      @gamedevlavka@gamedevlavka2 жыл бұрын
    • А раньше не выходит записывать, у меня годовалая дочка, и пока она не уснёт, дома слишком шумно, кабинета своего пока нет)

      @gamedevlavka@gamedevlavka2 жыл бұрын
    • @@gamedevlavka столкнулся с тем, что ютуб жестко трет мои комментарии. Кажется, я у него в немилости :-D Теперь по делу (повторю комментарий). Возможно, мне не хватает опыта, чтобы понять твою мысль. Однако, замена конкретного типа на интерфейс влечет за собой другую проблему. Я так понимаю, речь о чем-то вроде GetServices(). Но мы таким образом делаем контракт класса неявным. Мы скрываем зависимости. Не приведет ли это к большим проблемам? Да, я снова про DI

      @andrey_aka_skif@andrey_aka_skif2 жыл бұрын
  • Лайк

    @def6141@def61412 жыл бұрын
    • А можешь разобрать EventManager из Юнити примера FpsMicrogame. Он вроде не сложный совсем но чет не пойму как там с типами дело обстоит. Передают в конкретный тип пустой метод с параметром ,🙄

      @def6141@def61412 жыл бұрын
    • Там экшон, наверно идёт подписка как-то не явно

      @def6141@def61412 жыл бұрын
    • @@def6141 надо будет глянуть

      @gamedevlavka@gamedevlavka2 жыл бұрын
  • Если уж начал про статику рассказывать, можно было про синглтон немного рассказать.

    @mopnex8374@mopnex83742 жыл бұрын
    • Видео о синглтоне есть на канале, но да, не упомянул, каюсь

      @gamedevlavka@gamedevlavka2 жыл бұрын
  • Тема не раскрыта: Чем статик хуже singleton? Интересует ни очевидные: singleton может наследоваться и несколько реализаций singleton можно положить в массив, например для какого-то Inject. Но на моей опыте почти никогда не наследуется singleton от какой-то абстракции и интерфейса, все singleton независмые системы Если нужен instantiate или другое api unity, то нужен singleton наследуемый от MonoBehaviour. А например: static может работать в edit mode. static может работать в любой сцене. у static есть api которое вызывается в момент открытия проекта и update. Static даже пишется приятней: ServiceLocator вместо ServiceLocator.Instance Которые уже круто перекрывают singleton, хотя в одной компании мое решение тз забраковали за сервис в static, мол лучше бы написал singleton. Что вы думаете на эту тему?

    @SeempleIQ@SeempleIQ2 жыл бұрын
    • Гундяй)

      @GameDev55@GameDev5511 ай бұрын
  • Для начинающих практически ничего не понятно..., собственно и написано, что рассчитано на джунов.

    @cathello2900@cathello2900 Жыл бұрын
  • Классное видео! но дружище не чарактер а кэрэктер)

    @artemkorotkov9770@artemkorotkov9770 Жыл бұрын
    • Интересный факт, когда я говорю на английском, я правильно говорю) откуда эта привычка - ума не приложу, уже много лет избавиться не могу)

      @gamedevlavka@gamedevlavka Жыл бұрын
  • во первых,лягушки не всегда зеленые🙂 и во вторых вопрос: что имелось в виду "видео для джунов"?Лично я полное дно,но мне понятно,что рассказываете и ,мало того,я итак все это знал. А логика сервис-локатора у вас в архитектуре проекта достаточно подробно разложена.Хотя если будет что то новое-всегда интересно.

    @user-it9mg3ge6p@user-it9mg3ge6p2 жыл бұрын
    • Не каждый джун понимает вопрос на должном уровне, это ведь частный случай. С архитектурным видео согласен, там есть то, как работает сервис локатор.

      @gamedevlavka@gamedevlavka2 жыл бұрын
    • @@gamedevlavka дайте совет подписчику🤨 нужно создавать рандомно корабли(бриги,фрегаты и подобное). У каждого конкретного класса(например, у фрегата) один корабль имеет одни характеристики(скорость,кол-во пушек и т.д. ) другой фрегат другие.Какой паттерн использовать?Фабричный метод или Строитель?

      @user-it9mg3ge6p@user-it9mg3ge6p2 жыл бұрын
    • @@user-it9mg3ge6p что мешает использовать Prefab Variant? Где уже создать экземпляры с нужными характеристиками. Нужно больше контекста, чтобы дать ответ правильнее

      @gamedevlavka@gamedevlavka2 жыл бұрын
    • @@gamedevlavka визуализация не важна.У меня корабли это кубики🤣.важно создание экземпляров классов,то есть программирование.

      @user-it9mg3ge6p@user-it9mg3ge6p2 жыл бұрын
    • @@user-it9mg3ge6p ты часом не пытаешься сделать игру по мотивам настолки из книжки Олега Орлова?XD

      @andrey_aka_skif@andrey_aka_skif2 жыл бұрын
KZhead