MVC в игорной индустрии
Запись от in4core размещена 27.11.2012 в 19:00
Кто знает, кто нет, не важно, - 90% разработанных мною приложений относятся к игорной индустрии ( казино, букмейкерки, слоты и т.п.). В связи с этим, накопился какой-никакой опыт в создании таких приложений, которым и хочу поделится. Все что здесь описано ( некоторые термины так же ) - это сугубо мое мышление, поэтому , если что то кажется из рамок выходящим, прошу спокойно указать - исправим.
Статья рассчитана на любой уровень программиста , ознакомленного с MVC ( например здесь или почитать детально блог по мвс комрада Psycho Tiger) или уже хоть раз пробывшим использовать данный паттерн. Конечно, по большей части для новичков и средничков
![Smile](images/smilies/smile.gif)
1. Предисловие
Хочется сказать немного слов о самом MVC как таковом. MVC - это скорее инструкция к применению, призыв к действию, а не четко поставленный алгоритм уклонение от которого - влечет ошибки. Основное , что мы точно возьмем с собой в путь :
1. Лучший контроллер ( или как говорят лучший - пустой ) - это тонкая прослойка между моделью и видом. Контроллер может ( но не обязан ) хранить ссылку как на модель(и), так и на вид(ы). В большинстве случаев так и есть, особенно, если это основной(главный) контроллер приложения. Контроллер часто служит для взаимодействия с сервером ( запросы к серверу ) для получения данных, которые потом и записываются в модель ЛИБО запускается метод вида и данные напрямую передаются туда ( если не изменяет память это отголосок MVP)
2. Модель - не имеет ссылок ни на вид ни на контроллер. Модель это хранилище данных + обработчик логики ( данных ).
3. Вид может иметь ссылку на контроллер ( что крайне не рекомендуется делать ) , модель ( на нее родную обязательно - иначе пропадает весь смысл паттерна ) и другие виды.
Важно понимать : хоть я и сказал , что плохая практика иметь ссылку на контроллер у вида - это не совсем так. Дело вот в чем - я называю вид "толстый контроллер" , потому что виды могут содержать в себе другие виды, другие контроллеры, модели - а разве это не сущность контроллера?
![Smile](images/smilies/smile.gif)
Это основные постулаты, которым , я считаю, нужно следовать, используя MVC. Все остальное - вода, и в зависимости от вашего восприятия , опыта и т.п. - может находится в разных состояниях
![Smile](images/smilies/smile.gif)
2. Архитектура
Безусловно нет четкого представления о безупречной архитектуре приложения, кроме того, каждый сам волен решать, что делать в первую очередь, с чего начинать - кому как удобнее.
Я для себя вывел простую схему :
1. По скольку почти любое приложение это визуализация нашего кода, первым делом я штампую виды ( изначально оценивая сколько их может быть и как их обозвать ) .
Вне зависимости от вида имплементирую вот такой интерфейс :
Как говорится - точка входа, точка выхода. Инициализация и удаление. Безусловно , в ходе написания проекта , не всем видам такое подойдет, - заменим, но большинству - в самый раз.
2. Вторым пунктом штампуем модели - для тех видов, которым по вашему мнению они понадобятся. Интерфейсы в данном случае мы не используем , ибо чем то общим загрузить любую модель мы не сможем. Но можно поступить так :
Метод для очистки данных в модели, что вполне может нам понадобится.
3. Ну а теперь пришло время описать наш Main и первый контроллер.
Я считаю, что лучший мейн - как лучший контроллер - пустой. В связи с этим любой мой мейн обычно состоит из одной строчки :
И так, а что же из себя будет представлять основной контроллер ( global ) ? А вот он будет *мусоркой* для ВСЕХ видов, моделей , контроллеров. По мне это идеальная схема для проектов средней *крупности* .
Приведу пример такого контроллера :
this._view1.model1 = this._model1; this._view1.model2 = this._model2; this._view2.model1 = this._model1; this._globalView.gameModel = this._gameModel; this._globalView.view1 = this._view1; this._globalView.view2 = this._view2; this._globalView.define() // entry point
Кроме того, (а это часто бывает) - если у вас это будет ЕДИНСТВЕННЫЙ контроллер приложения ( который будет ухаживать за данными с сервера ), то мы можем записать в ЛЮБУЮ модель, запустить метод ЛЮБОГО вида ( не рекомендую ) , запустить методы ОСНОВНОГО вида приложения ( лучше так ) .
3. Модельный ряд ЗИМА-ЛЕТО 2099
Особое внимание хочется уделить моделям в наших приложениях. Частая ошибка начинающих в том, что они думают, ну раз вид хранит ссылку на модель - то почему бы не изменить модель из вида?
Давай те сначала подумаем, какие модели вообще бывают :
а) модель - хранитель данных
б) модель - хранитель логики и данных
в) модель - радиовещатель ( диспатч событий )
г) гибриды с (в)
Предположим , что мы используем тип (в). Мы из вида - меняем модель - модель отправляет событие виду. - это же глупый замкнутый круг.
Поэтому ОСНОВНОЕ ПРАВИЛО : если , вдруг, возникло дикое желание изменить данные в модели из вида, СРОЧНО переносить эти данные в САМ вид - видимо они в нем нужнее.
Безусловно вид тоже имеет право хранить какие то свои данные, описывать свою логику и т.п. и это стоит понимать.
Очень важный момент - определиться какие типы моделей вы будете использовать по большей части. Это решение нужно принять как можно скорее, иначе чревато переписью приложения ни один раз. А вот по какому пути пойти, это уже зависит от вас и только от вас. либо (б) + (в) либо просто (б). Я приведу пример второго случая в моей практике:
Когда я проектировал слот-автомат, при запуске барабанов отправлялся запрос к серверу - и ожидание данных о спине. Запрос мог пройти моментально, а мог с задержкой. А кнопок всего две, быстрая остановка барабанов и медленная. Если данные пришли быстро , а нажата медленная, нужно было ждать - в этом случае пришлось вешать TIMER событие , и пока не пройдет определенное кол-во времени, не заполнять ( уже давно ) пришедшими данными объект. Можно было бы пойти и по пути диспатча, но в данный момент , я считаю , диспатч не был лучшим и удобным архитектурным решением, особенно в связи с тем, что запросов у нас до сервера раз два и обчелся.
4.Стейты(фазы) против именованных событий
Очень проблемная часть архитектурного решения - выбрать стейты или именованные события. Стейт(State) - или фаза, - это положение в котором находится приложение. Например *начало игры*, *конец игры*, *бой* и т.п.
Что же выбрать? - В своей практике я нашел простой ответ на этот вопрос - мало стейтов, используем именованные события, много - однозначно стейты. Чтобы ни ходить вокруг да около, рассмотрим еще один пример.
Многие old School игроки играли в Wizardry 8 ( на днях снова прошел, дух старой школы, это просто прелесть ) . Сразу закинем возможные стейты :
Обычное движение, движение с поиском, каст заклятий во время движения, заход в инвентарь, бой, заход в инвентарь во время боя, каст во время боя ...... n
Да их жутко много. Причем каждый из них может несильно влиять на ход отображения , а лишь частично. Если мы будем использовать именованные события - их будет больше 100 (event классов ) , но это мелочи по сравнению с тем, как будет хромать архитектура, когда начнутся жуткие взаимодействия между видами , и каждый новый метод будет звучать типа onFightInventoryOpenAfterCast - ужасно к прочтению , так и заполненности. А если бы мы использовали стейты все могло бы перетечь в несколько методов обработки стейтов:
Безусловно, это лишь сугубо грубый пример, в самой игре используется смешанная механика, я лишь хотел пояснить в чем разница двух подходов.
Для игр типа казино - именованные события - это профит однозначно, а вот на слотах уже не факт, ведь стейтов, там очень много, и кто писал - это знает.
Выбор так же может повлечь за собой перепись приложения, и что самое неприятное - в самом конце , когда чуть чуть до завершения, а ты начинаешь путаться в N кол-во именованных методов и не можешь понять какой первый запускается, а какой второй. Может быть - эта проблема возникала только у меня, но освятить ее стоило.
5. Готовые архитектурные решения(упрощенно)
На этом мой рассказ завершается, если что упустил дополню позже. И в данном пункте напишу свои архитектурные решения, которые я использовал - не ручаюсь , что это лучшие решения, каждому свое, но описать их обязан.
Клиенты Дилеров в казино играх :
Controller-View-Model ( 1 / n / 2) - чистый MVC
Один контроллер основной, несколько видов, и одна модель - модель дилера , и модель игры.
Модели - типа В ( логика, хранение, диспатч)
Именованные события
Клиенты Игроков в казино :
Controller-View-Model ( n / n / n) - MVP / MVC
Модель игры, модель игрока, другие модели ( чат, клавиатура и т.п. )
Модели типа В ( логика, хранение, диспатч)
Именованные события
Клиенты слот-автоматов :
Controller-View-Model ( 2 / n / n) - MVC
Да да всего 2 контроллера, основной - ухаживающий за сервером, и контроллер HUD ( кнопочная панель ). Второй оказался полезным в случаях изменения кол-ва линий, ставок и т.п.
Модели типа А и Б ( хранение, логика и хранение )
Стейты
Можно еще было поговорить о ассетах, как с ними работают , и что лучше. Но думаю это будет излишним в данной теме.
P.s. Все что здесь описано, это сугубо мой опыт, он может отличаться от Вашего понимания, - с удовольствием послушаем Ваши мнения. Кто то спросит - причем тут игорная индустрия, когда просто в общем рассказывается о MVC ? - Дело в том, как я сказал , 90% проектов написанных мной - игорные , а значит и опыта больше на них, и статья заточена ( частями ) именно под арх решения для игорных приложений. Возможно занимайся я другими разработками - статья была бы описана иначе - судить не берусь.
p.p.s Прошу аккуратно и грамотно, всех кто прочитал указать на ошибки, недочеты, недопонимания и ляпсусы, будем исправлять.
Успехов
![Smile](images/smilies/smile.gif)
С вами был - упоротый лис)
Всего комментариев 43
Комментарии
![]() ![]() |
|
Цитата:
Вы провоцируете очередной мвц холивар.
|
![]() ![]() |
|
На счет billion-а смотри тут
|
![]() ![]() |
|
Цитата:
Что такое "именованные события"?
Код:
SomeViewEvent.SOME_EVENT |
![]() ![]() |
|
И да. Не стоит удалять комментарии модераторов. Мы это не любим.
|
![]() ![]() |
|
Да плевать мне там кто чего не любит. Все не довольные идут маршем.
dimarik - ты кто такой, давай досвидания. |
![]() ![]() |
|
Цитата:
Товарищ in4core, по моему скромному мнению, реально самый популярный блогер на флэшере
Цитата:
Да плевать мне там кто чего не любит
|
![]() ![]() |
|
По хорошему - инфокора давно пора забанить навечно, но я против - он вносит оживлённость в, иногда застопорившуюся, жизнь форума. Он веселит.
|
![]() ![]() |
|
![]() ![]() |
|
Весело у вас тут
|
![]() ![]() |
|
Правила создания популярной темы:
1) Напиши что-нибудь про MVC 2) Пусть кто-нибудь оспорит твое видение 4) Вуаля |
![]() ![]() |
|
dimarikam, котярам и прочим недовольным посвящается!
Думаю все уже откомментировали, нового мы ничего не услышим. Чтобы не быть голословным , сначала отвечу на комментарий : Цитата:
Идеальная схема с мусорным контроллером для проектов средней крупности. Это же надо такое придумать!
Цитата:
Все что здесь описано ( некоторые термины так же ) - это сугубо мое мышление, поэтому , если что то кажется из рамок выходящим, прошу спокойно указать - исправим.
Цитата:
Зачем?
После ответа - продолжу дальше. А вот на вопрос зачем, я отвечу более широко : Зачем вообще люди здесь что-то постят? Правильно - делятся опытом. Коим поделился и я. Если , допустим, в некоторых предыдущих статьях , я не поддавался самокритике или же просто выкладывал сырой код - да я был не прав, тут и признавать нечего. В данном же случае - это статья , а не код , и описываю я ее своими словами. Наверное, у многих возник бы вопрос - ты кто такой? С чего ты решил, что у тебя вообще есть опыт?! Я сразу сказал , что 90% работаю в игорной индустрии, и проектов уже написал не мало. Причем работал с серьезными заказчиками. Например пройдя суда : БУК, можно видеть одно из моих приложений , которое используется по ВСЕЙ РОССИИ в каждом городе где есть система букмейкерских контор. На данном сайте показана браузерная версия, похожие десктоп версии используются на панелях в офисах. Я не буду говорить , что я супер программист, я средний программист , но определенного уровня я достиг, и могу дать отпор многим НЕДОВОЛЬНЫМ. Кроме того, я еще молодой парень и мне есть чему учиться. Программирование это хобби, у меня нет ни образования типа САПР , ни учителей не было, ни базы, - всему я научился сам. И если мое хобби, может дать отпор тем, кто этим живет - то это чего то, да стоит. Я не просто так высказался о молодом человеке, как о себе. Я частенько захожу на форум, уже машинально, нового ничего здесь не узнаю почти, уже давно. Я обычный пользователь. Что касается, димариков разных, видимо они уже более взрослые люди, раз имеют право , так себя возвышать. Причем возвышать дико глупо, говоря о том, что они модераторы - чешите нам пятки. Да вы просто смешны. И если, например Wolsh - довольной взрослый дядя 40 лет - заходит суда часто и помогает новичкам , то для него это хобби - в котором он довольно подкован. В отличии от Вас горе-модераторы, он не позволяет себе кого то оскорблять и пишет всегда по делу. Теперь я спрошу у тебя Димарик - чего ты тут вообще делаешь? Кто тебя назначил модером? Когда ты не выполняешь своей задачи даже на 5% , зато в троллинге ты преуспел на ура!!! Ты наверное все еще живешь с мамой , которая готовит тебе борщи из крапивы?! - Мне кажется это точный псих портрет. Ибо столько яда из тебя течет, что явно указывает на проблемы в твоей жизни. Обязательно спрошу - чего достиг ты Димарик? Работаешь в каком нибудь Мейл.ру, куда тебя взяли по знакомству , работаешь на дядю? - Да ты просто смешон тогда. Очень понравилась фраза : Цитата:
flasher.ru — международный клуб flash-мастеров. рука-лицо.jpg
Такое ощущение, что - это ты создал этот форум, причесал его , поднял тысячи программистов с колен!!! Видимо так и есть ![]() Очень интересна также позиция - зайти в блог человека, который тебе ( видимо ) неприятен, нагадить там и спокойно свалить. Я бы на твоем месте просто ушел в игнор человека да и все. Либо просто взял и высказался по существу. Например - если про мусорный контейнер не понравилась или рассмешила фраза. Так бы и сказал - это никуда не годится, я бы поправил на твоем месте, о чем я и попросил в начале статьи. Своей выходкой ты еще раз погрел свое эго, засчет других пользователей. Если непонятно о чем речь : Товарищи Zebestov, Gbee, carrotoff, Psycho Tiger - которые задали нормальные вопросы или высказали свою критику, по вашему выходят тупые нубы, - ведь если они задают вопросы, а не просто отписывают - фу удали срочно , значит им возможно интересно и они готовы к дискуссии. Отдельный ответ для elder_Nosferatu : я тут ни под кого не подстраиваюсь, ни по аватарке ни по чему либо еще. У меня свое мнение есть. В данной ситуации - ты стал одним из толпы недовольных по факту просто поддержки модератора, который явно не прав, хотя бы в выражении своего недовольства. Что касается других комментариев - которые были определенно по делу у Zebestov например, заметь я не противоречил, а сказал что вполне годная точка зрения и я к ней прислушиваюсь, и обязательно обмозгую. Тоесть, ты поддерживаешь человека который не высказался по теме, а позволил себе сказать - это фу, без оснований. inils - насколько я помню один из создателей форума, модератор и админ. Ни разу от него не слышал грубости безпричинной, а тех людей которые ему не нравятся он обходит стороной. Поэтому к нему есть уважение, видно , что взрослый человек, а не шклололо. Он как минимум может собой гордится , что разработал IFlash шрифты, которыми все пользуются, но почему то он не говорит - чешите мне пятки, как делают у нас тут некоторые особо ВАЖНЫЕ модераторы. Котяра - к тебе отдельный пост. Сильно плохого я против тебя ничего не имею. Ты специалист, это видно. Но местами ведешь себя как школьник. Особенно вот это : Цитата:
Кто меня звала? )
![]() Zebestov - отдельное спасибо за грамотные комментарии. И даже если он считает как и Димарик, в каких то местах, он как умный человек не стал - это выносить. Насчет забанить меня навсегда - да пожалуйста. Только найдите адекватную причину сначала. Я первый никого не поливаю , я только обороняюсь. А банить стоит как раз ТЕХ прекрасных модераторов, которые считают себя богами программирования в подтексте Если сказать пару слов о себе. Когда я работал в одном проекте, у нас был JAVA проггер, с которым были постоянные стычки , ну не понимали мы друг друга по жизни ![]() В вашем же случае - вы никто, и звать вас никак. Какое может быть уважение, если вы не можете ничем похвастаться действительно стоящим, - хотя нет, троллинг у вас развит на высоте, преклоняюсь. |
![]() ![]() |
|
Что посеешь то и пожнешь!
Не на пустом месте выросл предвзятое отношение к вам. Репутацию вы себе зарабатывали пост за постом и удивляться к чему это привело не стоит. |
![]() ![]() |
|
Простите, я поставил третий плюс. Аминь.
|
![]() ![]() |
|
Ну вот! А был самый популярный блогер
|
![]() ![]() |
|
Эй! А где аватарка?
![]() |
![]() ![]() |
|
>> Эй! А где аватарка?
Появится, когда/если разбанят. Или это такой стёб? |
![]() ![]() |
|
А ведь в чем-то он прав
![]() |
![]() ![]() |
|
Утренние новости "Упоротый лис" покорил Рунет
|
![]() ![]() |
|
Rzer, боюсь он уже не ответит
† |
Последние записи от in4core
- Система диалогов, создаем подобие old School типа Fallout. (07.05.2014)
- MVC в игорной индустрии (27.11.2012)
- Якорь мне .... ))) Или History API (06.11.2012)
- FSD - учим php/sql (28.06.2012)
- I4Logger - простой и компактный логгер (06.05.2012)