Model View ViewModel, Модель Вид Модель Вида, Unity, C#

Поділитися
Вставка
  • Опубліковано 29 вер 2024

КОМЕНТАРІ • 67

  • @sergeykazantsev1655
    @sergeykazantsev1655  Рік тому +6

    Небольшое уточнение для пары классных ребят-занудок типа меня по историческому ликбезу.
    В своей статье про Presentation Model Мартин Фаулер тоже говорил о дата-биндинге как о взаимодействии между View и Presentation Model.
    Цитирую с martinfowler.com/eaaDev/PresentationModel.html
    "Probably the most annoying part of Presentation Model is the synchronization between Presentation Model and view. It's simple code to write, but I always like to minimize this kind of boring repetitive code. Ideally some kind of framework could handle this, which I'm hoping will happen some day with technologies like .NET's data binding."
    То есть - "было бы неплохо прикрутить дата биндинг, но пока такого решения нет, надеюсь .Net когда то до этого дойдет"
    Джон Госсман же перенёс эту идею в Microsoft, и реализовал её как стандарт для WPF и Silverlight архитектур.
    Статья learn.microsoft.com/en-us/archive/msdn-magazine/2009/february/patterns-wpf-apps-with-the-model-view-viewmodel-design-pattern
    И сам текст
    MVVM is identical to Fowler's Presentation Model, in that both patterns feature an abstraction of a View, which contains a View's state and behavior. Fowler introduced Presentation Model as a means of creating a UI platform-independent abstraction of a View, whereas Gossman introduced MVVM as a standardized way to leverage core features of WPF to simplify the creation of user interfaces. In that sense, I consider MVVM to be a specialization of the more general PM pattern, tailor-made for the WPF and Silverlight platforms.
    Получается MVVM это тот же самый PM Фаулера только доточенный под микрософтовский фреймворк 😕 Почему тогда паттерн называется MVVM а не PM ибо PM более общая архитектура, а MVVM частное решение - непонятно. Но, так исторически сложилось

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

    Молюсь что бы канал не забросился

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

      Помолитесь, пожалуйста, чтобы я работу нашёл, а то попал тут под сокращение в Европе и полтора месяца ничего найти не могу :D

    • @radari7180
      @radari7180 14 днів тому

      ​@@sergeykazantsev1655 нашли?

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

    А как быть, если StatsViewModel не может только по значениям из StatsView определить новые данные PlayerModel? (значения PlayerModel определяются из вереницы методов других объектов) Ему нужно создать клона playermodel. То есть толку что в statsview чтото меняется, если нужно знать конечные характеристики при изменении statsview.

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

      StatsViewModel не обязан собой полностью покрывать все данные PlayerModel.
      По коду я с таким не сталкивался но мне кажется что вполне реально на одну большую модель сделать 3 разных viewModel и view.
      Условно отдельный viewModel для статов и её изменения + отдельный ViewModel для шмоток + отдельный для личной инфы.
      Тогда получается что клон не нужен, а наоборот на одну и ту же модель будет завязано 3 вьюмодели, каждая из которых отвечает за своё.

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

    А вы знаете что такое абстрактный класс и для чего он предназначен? Я конечно понимаю что это просто пример, можете объяснить для чего ViewModel и View в данном случае помечены как абстрактные? Ведь они реализуют логику конкретного элемента интерфейса и никакой абстракцией тут и не пахнет

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

      Хочу сразу добавить что само видео мне понравилось, хорошее и понятное объяснение подхода и его отличия от MVP.

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

      ViewModel и View помечены как абстрактные на случай если у вас должны быть разные реализации. Например у вам может быть MobileAppView и DesktopPCView, они будут иметь разную внутреннюю логику.
      Если в базе стоит абстрактный класс вы можете комбинировать разные реализации Model, View и ViewModel

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

      @@sergeykazantsev1655 теперь понятно, меня смутил нейминг))

  • @USSR-Lenin-Stalin-Forever
    @USSR-Lenin-Stalin-Forever День тому

    Первый раз вижу в Ru сегменте что бы кто то в IT объяснял также круто как CodeMonkey, подписка однозначно!

  • @chillcompany1028
    @chillcompany1028 Рік тому +11

    Было бы интересно послушать про то как правильно выстраивать общую архитектуру игр, в особенности сетевых

    • @COOKIEMONSTER90
      @COOKIEMONSTER90 Рік тому +2

      Если интересует Сервер-Клиент, то советую поискать где-нибудь в сети старые билды игры Rust, года 2017-2019. Тогда dll’ки юнити легко декомпилировались. Я полностью пересобрал эту игру у себя. Почерпнул просто гигантские знания, особенно если учитывать, что когда я начинал изучать исходники, то был практически полным новичком в программировании.

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому +2

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

  • @user-uy7ry1mh6w
    @user-uy7ry1mh6w 4 місяці тому +3

    Благодарю за ролик, объясняете лучше чем те у кого миллионы просмотров, только после ваших видео четко понял концепции архитектур)

  • @dobrinyanicitich7514
    @dobrinyanicitich7514 7 місяців тому +2

    Как же вы классно и наглядно обьясняете, спасибо за ваш труд и качественный контент!

  • @КорвинКори-б6у
    @КорвинКори-б6у Рік тому +2

    Очередной бэннгер от моего любимого сэнсея.

  • @NoldoWalker
    @NoldoWalker Рік тому +2

    Главное при всем этом не забывать отписываться от подписок перед уничтожением объекта. А то память потечет

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

    Насколько применим этот патерн в случае использования ui toolkit, в котором есть свои биндинги? Спасибо

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

      Я с ui toolkit знаком только номинально, но по тому что я видел, мне кажется вполне себе применим. По коду разницы нет особо - перерисовывать монобеховский канвас или монобеховский тулкит

  • @forcesoftheevil9252
    @forcesoftheevil9252 Рік тому +2

    Как я проорал с мема "Это тяжелее , чем Singleton". Спасибо за видео!

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

    Вот совершенно случайно наткнулся на видос и решил для общего развития посмотреть как mvvm реализуют в unity. После wpf, uwp и silverlight это прям, извините, дрочево. Писать view на c# с простыней из биндингов, да и в vm делать то же самое, сомнительное удовольствие. Вот другое дело, если бы это можно было на уровне инспектора, накинул vm на gameObject и закинул в нужные поля отслеживаемые/отслеживающие объекты. Но думаю что даже в качестве стороннего фреймворка это было бы слишком сложно и скорее всего нашло бы малое признание в сообществе. Хотя справедливости ради, руками реализовать mvvm в рамках wpf, uwp и silverlight тоже довольно трудозатратно для новичка, а вот уже с каким-нибудь prism милое дело, только новичек реально головоу сломает, пока всё поймет.

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

      Дрочево не дрочево, а пока альтернатив особых я не вижу.
      Знаю ребят которые на MVVM построили всю архитектуру. Они в инспекторе прокидывают только вью модель а остальное собирается само - но для тех же новичков это еще сложнее чем забиндить ивент в двух местах

  • @МихаилЗайлогин
    @МихаилЗайлогин 9 місяців тому +1

    Воу, это очень круто! Впервые на этом канале и это прям топ. Очень крутой продакшен и уровень программирования что очень редко для ру сегмента, так что спасибо автор!

  • @Harlanov-t1g
    @Harlanov-t1g Рік тому +2

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому +1

      Ох уж этот Zenject и ECS ))) постараюсь в ближайшие пару месяцев до зенжекта добраться)

  • @германпопов-з2ь
    @германпопов-з2ь Рік тому +1

    я хз, эти вставки просто имба - мемы в точку!))

  • @СержПахомов-л4я
    @СержПахомов-л4я Місяць тому

    Спасибо большое за доклад, как всегда уйма информации для размышления. Есть вопросы.. можно ли считать что мvvm превосходит mvp по своему функциональному назначению и что в mvp уже нет необходимости? Имеет ли смысл применения патерна КОМАНДА в контексте mvvm ( в wpf эти патерны используются совместно , но там есть технология binding) . Так же вы сказали что реактивное программирование это не совсем ооп подход, так можете посоветовать какой нибудь ооп подход при разработке простейших графических оконных приложений? Понимаю не ваш формат роликов , но видно что вы в этом хорошо понимаете.

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

      Здравствуйте, да, Command с MVVM в геймдеве можно сочетать, как я понимаю он где-то в ViewModel должен находится
      Насчёт простейших графических оконных приложений я мало что могу подсказать ибо занимаюсь разработкой игр, но наверное подойдет классический ООП с каким-нибудь сервис локатором

    • @СержПахомов-л4я
      @СержПахомов-л4я Місяць тому

      Спасибо большое!

  • @json_floyd5793
    @json_floyd5793 Рік тому +1

    Отличный ролик, лаконично, с качественными примерами и хорошей аналитикой

  • @tarzeronone7274
    @tarzeronone7274 Рік тому +1

    ViewModel нарушает SPR?

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому +3

      По самой архитектуре MVVM - я думаю, что нарушает ибо
      Есть зона ответственности - обработка сигналов со стороны пользователя
      Есть зона ответственности - мониторинг изменения модели
      Есть зона ответственности - хранение состояния UI(те самые режимы)
      теоретически эти зоны ответственности можно запихнуть во внутренние скрипты
      как я уже говорил, MVVM в малой степени использует ключевые принципы ООП(ни наследования, ни программирования на уровне интерфейса, ни инкапсуляции как таковой), и больше перетекает в реактивное программирование

  • @ВладимирШалагинов-о2и

    Отличное видео, спасибо большое. Единственное замечание: то, что ты описал в unity, это не MVVM, а PresentationModel в чистом виде. При реализации MVVM дата-биндингом занимается отдельный фреймворк (например, unity weld), а так как всю синхронизацию пришлось писать самому ручками - то по Фаулеру это чистая PM.

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому

      Спасибо за комментарий! Хорошее замечание, только сейчас заметил что Фаулер в конце описания PM так тихонечко упомянул что хорошо бы прикрутить Data-binding , хоть в конце статьи написал неплохое разъяснение. А Госсман получается о Data-Binding-е чуть громче говорил и говорил что он прям НУЖЕН.

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому

      Получается если DB есть и в PM и в MVVM то тогда никакой архитектурной разницы для юнитологов между ними нет, потому то мы не делаем приложения в WPF

  • @AywiWarframe
    @AywiWarframe Рік тому

    А чья зона ответственности выбирать какую view и/или viewModel спавнить?

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому

      их надо "склеивать" где-то выше уровнем. То есть где-то будет скрипт в который вы прокидываете конфиги и который будет принимать это решение

  • @TimTV_Club
    @TimTV_Club Рік тому +1

    Ого, такой точной подачи материала еще не видел, программирую всего пол года, но с трудом все понимаю

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому +1

      С трудом все понимать это нормально, я работаю программистом уже 7 лет, но не могу сказать, что все знаю и легко все осваивается) главное, продолжать развиваться)

  • @naumov-channel
    @naumov-channel Рік тому +1

    Скинул 500 рублей на Сбербанк за годный контент! Спасибо за работу!

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому

      Принял, спасибо большое за поддержку)

  • @COOKIEMONSTER90
    @COOKIEMONSTER90 Рік тому +1

    Имхо, дело вкуса использовать ли в небольших проектах этот паттерн или нет. По мне, так лучше больше простых простыней из кода, но при этом четкая шаблонная структура, в которой очень сложно запутаться, чем меньше кода, но неорганизованный подход. Тем более что очень часто бывает такое, что небольшой по изначальному замыслу проект начинает разрастаться и клубок запутывается все сильнее и сильнее. Было бы круто конечно запилить в Юнити подобие биндинга из WPF.
    Само видео отличное, большое спасибо за него. Теперь в самой сути паттерна наконец то разобрался.

    • @bogdan22232
      @bogdan22232 Рік тому

      Имхо, не дело вкуса. Потому что MVP, MVVM и тд решают похожие, но разые проблемы. Тут скорее зависит от того, какая у тебя проблема в проекте, которую надо решить. Очевидно, что если у тебя есть только консольный вывод и не планируется другой, то городить код не имеет смысла. И совсем другой кейс, когда ты делаешь приложение и сейчас у тебя простой UI, но UX-дизайнер, продюсер и ГД говорят тебе, что в будущем многие окна будут чуть не ли не отдельным мини-приложением.

    • @adrew4
      @adrew4 11 місяців тому

      К слову про мультиплеер и сложные проекты. Обычно под капотом там простая логика, классы зависят от абстракций и интерфейсов, а модули по типу View внутри себя разбиты еще на компоненты, каждый при этом автономен. Вот и получается, что с Вьюшки уходит инпут на Presenter, который отправляет условную команду перетащить предмет инвентаря на другой слот, с Presenter идут запрос на модель, по сути на бек, и обратно возвращается по цепочке, обновляя UI у клиента в конечном итоге. А это обычный MVP. Делал раньше нечто похожее на MVVM, но мне это показалось оверхедом, т.е. все становится слишком абстрактным, и по сути ViewModel ничего не делает а просто осуществляет перекрестную подписку. Это скорее местечковое решение, чтобы просто работало, нежели правило для всех сложных проектов. И я бы такое использовал только в случае где без этого никак не обойтись. Это скорее усложняет структурированную логику MVP, добавляя перекрестные события и промежуточные стейты для View во ViewModel. имхо

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

    видимо это лучшее объяснение, спасибо😘

  • @MrGolovewkin
    @MrGolovewkin 4 місяці тому

    Спасибо, очень хорошо объяснено!

  • @waste-moon
    @waste-moon 10 місяців тому

    Очень полезно и понятно. Спасибо за твою работу!

  • @valeriim7676
    @valeriim7676 Рік тому

    Отличная подача! Отличные слайды! Все по делу

  • @abikfundos1174
    @abikfundos1174 Рік тому

    нативный андроид наше всё))0

  • @mikki5923
    @mikki5923 Рік тому

    Для меня тоже довольно потный паттерн для понимая.
    Знаю еще, что в Plarium игра "Raid Shadow Legends" отказалась от MVVM в пользу MVP. Вроде бы большой проект, но MVVM оказался слишком громоздким и сложным для работы с ним и потом всё переписывали.
    То-есть весь прикол в том, что паттерн который подходит для больших проектов иногда к ним же подходит хуже всего.
    + Если шаришь MVP, то можно и прошарить логику работы ECS, там принцип работы построенный на данных, а это по-сути наш Model.

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому +1

      Насколько я знаю в Hustle Castle MVVM довольно плотно используется, видел видео с TBD Pro.
      Как раз сейчас пытаюсь для видосиков запилить вторую игру и на MVVM построить несколько диалогов с прокачкой и инвентарём персонажа. Посмотрим что из этого выйдет
      А на счёт разделения слоёв, да тут по идее любой MV* паттерн должен подойти но MVVM с его состояниями не так удобен для ECS-а судя по всему. С другой стороны а как иначе хранить эти состояния?

  • @Anton-ny6tx
    @Anton-ny6tx Рік тому

    К примеру вьюшка главного меню, что-то пишем в модель, для сохранения, что-то просто как стейт во вьюмодели крутится. А если нужен сервис, к примеру загрузить некст сцену? Его во ВьюМодел загонять и делать доступ через метод для вьюхи?

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому +1

      Если я правильно вас понял, то да. Как и в mvc, mvp так и в mvvm может быть какая-то логика. Сервис по идее тоже можно засунуть во viewmodel

  • @АлексейЧабан-ч2й
    @АлексейЧабан-ч2й 9 місяців тому

    Мемы смешные

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

    Круто!

  • @MrG12g
    @MrG12g Рік тому

    Как всегда отлично! Все четко и по полочкам.

  • @mikki5923
    @mikki5923 Рік тому

    Кстати, между делом говоря есть еще паттерны HMC, HMVP. Компания Playtika о них написала пару статей.
    У меня появился вопрос. Во всех паттернах группы MV* мы живём с зависимостями, например: View -> ViewModel.
    А используется ли к ним DI? Потому что в примерах их нет. Отчасти я понимаю, что это может быть для упрощения. Однако, я не пойму как его можно было бы использовать в них.
    Не сделаешь же по сути никакой интерфейс с Модели или Вида, чтобы потом можно было его инжектить. С другой стороны не лучше ли тогда инжектить сразу целый класс, но всё равно через DI контейнер?
    Спасибо за видео.

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому

      Мне кажется можно DI спокойно использовать. В примерах я вроде даже делал абстрактный класс View, ViewModel и Model, а потом уже от этих абстрактных классов ты наследуешься, то есть по факту работаешь на уровне интерфейса.
      Таким образом в DI-контейнер мы прокидываем не конкретную реализацию модели или вьюмодели а через абстрактный класс
      Я правда когда пробовал так - всё равно столкнулся с тем, что сильно ты с разной реализацией не разойдешься, потому что model-viewModel-view даже если на уровне абстракций, но завязаны друг на друга.
      Если сделать новую реализацию модели с новым полем, то надо и по идее новую вьюмодель писать чтобы это новое поле обрабатывалось, что очень неудобно.

    • @mikki5923
      @mikki5923 Рік тому

      @@sergeykazantsev1655 Вот поэтому я и не уверен, что здесь стоит DI использовать.
      По-логике DI должен упрощать код и делать его более гибким, но прикол MVP, MVC, MVVM, что они сами по себе гибкие и как по мне в DI не нуждаються, а добавишь, то только усложнишь логику.

    • @mikki5923
      @mikki5923 Рік тому

      @@sergeykazantsev1655 Я чекну. На польском есть пара презентаций как их сочетать. После просмотра отпишу.

  • @alexsorokin8373
    @alexsorokin8373 Рік тому

    Отличное видео, спасибо! Попробовал сам повторить в своем проекте - очень круто получилось по сравнению с тем что было!
    Вопросик небольшой, а есть какое-то готовое решение, которое позволит использовать MVVM в Unity так же как в WPF?)) Ну то есть где уже вшито ReactiveProperty и явные подписки задавать было бы необязательно) Просто странно, что Юнити столько лет, а мы всё еще не имеем какого-то архитектурного паттерна встроенного...

    • @sergeykazantsev1655
      @sergeykazantsev1655  Рік тому

      Есть UniRx, ссылка на него есть в описании, но там немного другой подход к написанию кода. О других нормальных решениях я не знаю, возможно, где-то есть, сколько видел, люди либо писали на UniRx, либо писали своё

    • @alexsorokin8373
      @alexsorokin8373 Рік тому

      @@sergeykazantsev1655, UniRx обязательно попробую) тебе спасибо и процветания каналу!

    • @ВладимирШалагинов-о2и
      @ВладимирШалагинов-о2и Рік тому

      Посмотри в сторону Unity Weld

    • @COOKIEMONSTER90
      @COOKIEMONSTER90 Рік тому

      @@alexsorokin8373 Погуглите "MVVM Hustle Castle". Там разработчик говорил, что решили не прикручивать UniRx потому что он слишком тяжелый. Ну и может, что почерпнете интересного еще.