Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > As3 изучение и немного As2

Рейтинг: 2.80. Голосов: 10.

MVC в игорной индустрии

Запись от in4core размещена 27.11.2012 в 19:00

Кто знает, кто нет, не важно, - 90% разработанных мною приложений относятся к игорной индустрии ( казино, букмейкерки, слоты и т.п.). В связи с этим, накопился какой-никакой опыт в создании таких приложений, которым и хочу поделится. Все что здесь описано ( некоторые термины так же ) - это сугубо мое мышление, поэтому , если что то кажется из рамок выходящим, прошу спокойно указать - исправим.

Статья рассчитана на любой уровень программиста , ознакомленного с MVC ( например здесь или почитать детально блог по мвс комрада Psycho Tiger) или уже хоть раз пробывшим использовать данный паттерн. Конечно, по большей части для новичков и средничков Профи и так все это знают и понимают.

1. Предисловие
Хочется сказать немного слов о самом MVC как таковом. MVC - это скорее инструкция к применению, призыв к действию, а не четко поставленный алгоритм уклонение от которого - влечет ошибки. Основное , что мы точно возьмем с собой в путь :
1. Лучший контроллер ( или как говорят лучший - пустой ) - это тонкая прослойка между моделью и видом. Контроллер может ( но не обязан ) хранить ссылку как на модель(и), так и на вид(ы). В большинстве случаев так и есть, особенно, если это основной(главный) контроллер приложения. Контроллер часто служит для взаимодействия с сервером ( запросы к серверу ) для получения данных, которые потом и записываются в модель ЛИБО запускается метод вида и данные напрямую передаются туда ( если не изменяет память это отголосок MVP)
2. Модель - не имеет ссылок ни на вид ни на контроллер. Модель это хранилище данных + обработчик логики ( данных ).
3. Вид может иметь ссылку на контроллер ( что крайне не рекомендуется делать ) , модель ( на нее родную обязательно - иначе пропадает весь смысл паттерна ) и другие виды.
Важно понимать : хоть я и сказал , что плохая практика иметь ссылку на контроллер у вида - это не совсем так. Дело вот в чем - я называю вид "толстый контроллер" , потому что виды могут содержать в себе другие виды, другие контроллеры, модели - а разве это не сущность контроллера? Конечно все это утрировано , но тем не менее. А вот *передавать* ссылку на контроллер виду - плохой тон.

Это основные постулаты, которым , я считаю, нужно следовать, используя MVC. Все остальное - вода, и в зависимости от вашего восприятия , опыта и т.п. - может находится в разных состояниях

2. Архитектура
Безусловно нет четкого представления о безупречной архитектуре приложения, кроме того, каждый сам волен решать, что делать в первую очередь, с чего начинать - кому как удобнее.
Я для себя вывел простую схему :
1. По скольку почти любое приложение это визуализация нашего кода, первым делом я штампую виды ( изначально оценивая сколько их может быть и как их обозвать ) .
Вне зависимости от вида имплементирую вот такой интерфейс :
Код AS3:
public interface IBaseView 
{
   function define/*initialize*/();
   function destroy();
}
Как говорится - точка входа, точка выхода. Инициализация и удаление. Безусловно , в ходе написания проекта , не всем видам такое подойдет, - заменим, но большинству - в самый раз.
2. Вторым пунктом штампуем модели - для тех видов, которым по вашему мнению они понадобятся. Интерфейсы в данном случае мы не используем , ибо чем то общим загрузить любую модель мы не сможем. Но можно поступить так :
Код AS3:
public interface IBaseModel
{
   function clear();
}
Метод для очистки данных в модели, что вполне может нам понадобится.
3. Ну а теперь пришло время описать наш Main и первый контроллер.
Я считаю, что лучший мейн - как лучший контроллер - пустой. В связи с этим любой мой мейн обычно состоит из одной строчки :
Код AS3:
this._globalController = new GlobalController(this);
И так, а что же из себя будет представлять основной контроллер ( global ) ? А вот он будет *мусоркой* для ВСЕХ видов, моделей , контроллеров. По мне это идеальная схема для проектов средней *крупности* .
Приведу пример такого контроллера :
Код AS3:
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
В методе define у основного вида приложения, в список отображения добавляются те виды, которые он держит. Это удобно в случае быстрой правки zIndex наших мини-видов.
Кроме того, (а это часто бывает) - если у вас это будет ЕДИНСТВЕННЫЙ контроллер приложения ( который будет ухаживать за данными с сервера ), то мы можем записать в ЛЮБУЮ модель, запустить метод ЛЮБОГО вида ( не рекомендую ) , запустить методы ОСНОВНОГО вида приложения ( лучше так ) .

3. Модельный ряд ЗИМА-ЛЕТО 2099
Особое внимание хочется уделить моделям в наших приложениях. Частая ошибка начинающих в том, что они думают, ну раз вид хранит ссылку на модель - то почему бы не изменить модель из вида?
Давай те сначала подумаем, какие модели вообще бывают :
а) модель - хранитель данных
б) модель - хранитель логики и данных
в) модель - радиовещатель ( диспатч событий )
г) гибриды с (в)
Предположим , что мы используем тип (в). Мы из вида - меняем модель - модель отправляет событие виду. - это же глупый замкнутый круг.

Поэтому ОСНОВНОЕ ПРАВИЛО : если , вдруг, возникло дикое желание изменить данные в модели из вида, СРОЧНО переносить эти данные в САМ вид - видимо они в нем нужнее.

Безусловно вид тоже имеет право хранить какие то свои данные, описывать свою логику и т.п. и это стоит понимать.
Очень важный момент - определиться какие типы моделей вы будете использовать по большей части. Это решение нужно принять как можно скорее, иначе чревато переписью приложения ни один раз. А вот по какому пути пойти, это уже зависит от вас и только от вас. либо (б) + (в) либо просто (б). Я приведу пример второго случая в моей практике:
Когда я проектировал слот-автомат, при запуске барабанов отправлялся запрос к серверу - и ожидание данных о спине. Запрос мог пройти моментально, а мог с задержкой. А кнопок всего две, быстрая остановка барабанов и медленная. Если данные пришли быстро , а нажата медленная, нужно было ждать - в этом случае пришлось вешать TIMER событие , и пока не пройдет определенное кол-во времени, не заполнять ( уже давно ) пришедшими данными объект. Можно было бы пойти и по пути диспатча, но в данный момент , я считаю , диспатч не был лучшим и удобным архитектурным решением, особенно в связи с тем, что запросов у нас до сервера раз два и обчелся.

4.Стейты(фазы) против именованных событий
Очень проблемная часть архитектурного решения - выбрать стейты или именованные события. Стейт(State) - или фаза, - это положение в котором находится приложение. Например *начало игры*, *конец игры*, *бой* и т.п.
Что же выбрать? - В своей практике я нашел простой ответ на этот вопрос - мало стейтов, используем именованные события, много - однозначно стейты. Чтобы ни ходить вокруг да около, рассмотрим еще один пример.
Многие old School игроки играли в Wizardry 8 ( на днях снова прошел, дух старой школы, это просто прелесть ) . Сразу закинем возможные стейты :
Обычное движение, движение с поиском, каст заклятий во время движения, заход в инвентарь, бой, заход в инвентарь во время боя, каст во время боя ...... n
Да их жутко много. Причем каждый из них может несильно влиять на ход отображения , а лишь частично. Если мы будем использовать именованные события - их будет больше 100 (event классов ) , но это мелочи по сравнению с тем, как будет хромать архитектура, когда начнутся жуткие взаимодействия между видами , и каждый новый метод будет звучать типа onFightInventoryOpenAfterCast - ужасно к прочтению , так и заполненности. А если бы мы использовали стейты все могло бы перетечь в несколько методов обработки стейтов:
Код AS3:
switch(state)
case "Fight"
view1.startFight();
view2.stopCast();
Безусловно, это лишь сугубо грубый пример, в самой игре используется смешанная механика, я лишь хотел пояснить в чем разница двух подходов.
Для игр типа казино - именованные события - это профит однозначно, а вот на слотах уже не факт, ведь стейтов, там очень много, и кто писал - это знает.
Выбор так же может повлечь за собой перепись приложения, и что самое неприятное - в самом конце , когда чуть чуть до завершения, а ты начинаешь путаться в 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 Прошу аккуратно и грамотно, всех кто прочитал указать на ошибки, недочеты, недопонимания и ляпсусы, будем исправлять.
Успехов
С вами был - упоротый лис)
Всего комментариев 43

Комментарии

Старый 27.11.2012 19:55 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
При беглом осмотре вызвала отторжение идея передавать виду экземпляры "вложенных" видов извне. Разве не логичней будет, если каждый узел (будь то модель, вид, контроллер) будет создавать вложенные узлы сам, предоставляя лишь геттеры.
Старый 27.11.2012 20:08 GBee вне форума
GBee
 
Аватар для GBee
Цитата:
При беглом осмотре вызвала отторжение идея передавать виду экземпляры "вложенных" видов извне. Разве не логичней будет, если каждый узел (будь то модель, вид, контроллер) будет создавать вложенные узлы сам, предоставляя лишь геттеры.
Вы провоцируете очередной мвц холивар.

А я спровоцирую другой:
Код AS3:
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()
Вам не кажется, что this засоряет код?
Старый 27.11.2012 20:13 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Цитата:
Вы провоцируете очередной мвц холивар.
Отнюдь. Все по делу откамментил.
Старый 27.11.2012 20:18 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
При беглом осмотре вызвала отторжение идея передавать виду экземпляры "вложенных" видов извне. Разве не логичней будет, если каждый узел (будь то модель, вид, контроллер) будет создавать вложенные узлы сам, предоставляя лишь геттеры.
Может я немного не понял, о чем идет речь ( точнее, что ты предлагаешь ). Но такое арх решение одно из логичных и удобных. Поскольку , во-первых, ты в одном месте держишь все части приложения, ты их видишь, видишь всегда, и точно знаешь, что нигде больше они не пересоздаются. Во вторых, думая глубже, как я уже сказал при своевременно не верном подходе, могут произойти такие казусы, что на финальных стадиях ( пускай и небольшого ) приложения, придется сделать быстрый костыль-мост между видами, или контроллерами, а раз они у нас в одном месте, то и бегать между ними очень удобно. Еще чем это удобно. Допустим, пойдем по твоему пути ( если я верно понял о чем речь) и будем создавать ВСЕ мини-виды, в основном виде. Тогда в основном виде придется держать другие контроллеры, чтобы передать им ссылки на виды ( если они конечно есть контроллеры) . Модели опять же можно придется ( можно ) создавать тоже в основном виде, а не в основном контроллере, иначе - получается, что все в разных местах. Ну тут еще от задачи опять же зависит, и связей.
В любом случае, если я тебя не верно понял, проясни примером.
Вот кусок основного вида из слотов, по моему решению.
Код AS3:
public function set gambleView(view:DoubleWindow):void 
		{
			this._gambleView = view;
			this._gambleView.x = 120;
			this._gambleView.y = 102;
			this._gambleView.addEventListener(DoubleViewEvent.DOUBLE_FAILED , onDoubleFailed);
			this._gambleView.addEventListener(DoubleViewEvent.DOUBLE_ACCEPTED , onDoubleAccepted);
		}
// и так для каждого вида, помоему удобно, для 5-6 видов
 
public function define():void
		{
			this._back = this._graphicModel.backgroundImage;
			this.addChild(this._back);
			this.addChild(this._hudView);
			this.addChild(this._drumsView);
			this.addChild(this._linesView);
			this.addChild(this._paytableView);
			this.addChild(this._gambleView);
		}
//  а тут только в список добавляем и все.
P.s. кстати такое решение мне однажды предложил Wolsh - и как бы я считаю, что оно имеет место быть.

По поводу this - нет не считаю, начал писать так пол года назад - доволен. Хотя тому же Wolsh как и тебе, ну может еще кому - не нравится такой код стайл.
Старый 27.11.2012 20:28 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Цитата:
Тогда в основном виде придется держать другие контроллеры
Это совершенно не обязательно.
Основной контроллер создал основную модель, основной вид.
Основная модель создала внутри себя пару дочерних моделей, предоставила геттеры.
Основной вид создал внутри себя пару дочерних видов, предоставил геттеры.
Основной контроллер создал несколько дочерних контроллеров и передал им лишь необходимые модель и вид, которые надергал у основных модели и вида через геттеры.

Вид никогда не знает про контроллер. Контроллер не указывает модели и виду, как им создавать логику и отображение — это не его тонких материй дело!

Однако при таком подходе следует хорошо продумывать архитектуру приложения. За этот невидимый труд заказчиков наподобие billion баттхерт хватит ))
Старый 27.11.2012 20:32 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Вид никогда не знает про контроллер. Контроллер не указывает модели и виду, как им создавать логику и отображение — это не его тонких материй дело!
Ну я вроде и ни разу не сказал , что так стоит делать. По-моему наоборот везде осветил, что так делать нельзя.

Zebestov, да уж, соглашусь, что твой подход имеет право жить, я думаю ты основываешься на крупных проектах типа MMORPG , где архитектуру можно продумывать дольше чем писать. А что касается о невиданном труде, я честно говоря уже стал подуставать от поиска мега-решений, старею, мне хочется попроще и понятнее. Ведь как я уже сказал и думаю ты со мной согласен - мвц лишь инструкция к применению, - решений масса.

Про billion юмора не понял, не в теме. Расскажи если желание есть
Старый 27.11.2012 20:43 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
На счет billion-а смотри тут
Старый 27.11.2012 20:53 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Цитата:
По-моему наоборот везде осветил, что так делать нельзя.
А вот это чиво тогда
Цитата:
Код AS3:
this._globalView.view1 = this._view1;
this._globalView.view2 = this._view2;
Цитата:
я думаю ты основываешься на крупных проектах типа MMORPG
Не не не ))) казуалки и Flash приложения.
Цитата:
Про billion юмора не понял, не в теме.
Шкандальчик тут был один )) курам на смех.
Старый 27.11.2012 21:18 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Вид никогда не знает про контроллер. Контроллер не указывает модели и виду, как им создавать логику
Цитата:
this._globalView.view1 = this._view1;
this._globalView.view2 = this._view2;
Не вижу противоречия в двух постах.
Старый 27.11.2012 21:24 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Цитата:
А я спровоцирую другой:
Я тоже использую this и super, иногда думаю отказаться от этой затеи, но пока использую. Код все-таки с ними читабельней, хотя это настоящий мусор. В общем, пока думаю)

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

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

P.S. Товарищ in4core, по моему скромному мнению, реально самый популярный блогер на флэшере. Кто-нибудь напишет статью - за неделю 10 комментов маскимум. in4core напишет - 5 страниц комментов за полчаса. Вот это популярность
Старый 27.11.2012 21:51 in4core вне форума
in4core
 
Аватар для in4core
Ну не за пол пожалуй, за час скорее ) Ну комменты обычно флеймовые, на данный момент только Zebestov по теме рассуждает.
Цитата:
Каждое слово по делу, стоит прислушиваться
Так и делаем, выше сказано, подход обоснован имеет место жить. Точнее это не новое для меня, просто это немного долго для средних проектов, мой вариант - будет удобнее. А расширяемость требуется ДЛЯ особого числа приложений, часто для браузерных игр, например.
Старый 27.11.2012 22:42 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
а что же из себя будет представлять основной контроллер ( global ) ? А вот он будет *мусоркой* для ВСЕХ видов, моделей , контроллеров. По мне это идеальная схема для проектов средней *крупности* .
В своё время используя этот подход я ощущал скорее наличие "тяжести" протягивать зависимости и создания того, чего можно было и не создавать.
Реальную пользу от "чистого" MVC в отличии от MV (Item Renderer, по сути) + редкие Controller'ы я нашел в горизонтальном масштабировании. Когда на новый "стейт" приложения пишется дополнительный лёгкий контроллер, цепляющийся к приложению и отпадающий, когда он не нужен. Все данные такой дядя получает динамически через методы главной модели, вроде
Код AS3:
super.baseModel.getModel(UserInfoModel, this.friendID);
В итоге, при добавлении функционала растёт количество классов с очень низкой связанностью, а не засоряются уже написанные классы.

Про пункт 4 вообще ничего не понял и в игру ту я не играл. Что такое "именованные события"?
Старый 27.11.2012 22:44 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Что такое "именованные события"?
Код:
SomeViewEvent.SOME_EVENT
Как то так.
Старый 28.11.2012 00:29 dimarik вне форума
dimarik
 
Аватар для dimarik
Именованные события у него, ага. Котяры на вас не хватает. Идеальная схема с мусорным контроллером для проектов средней крупности. Это же надо такое придумать! Сами <ваш коммент на удалении моего сообщения> всех. Программируйте ночью, под одеялом, не тащите сюда этот хлам.

flasher.ru — международный клуб flash-мастеров. рука-лицо.jpg
Старый 28.11.2012 00:40 Котяра вне форума
Котяра
 
Аватар для Котяра
Кто меня звала? )
На самом деле, не буду говорить о литературном даре автора и его манере доносить до читателя свои мысли - начну просто с вопроса:
Зачем?
После ответа - продолжу дальше.
Старый 28.11.2012 00:43 Котяра вне форума
Котяра
 
Аватар для Котяра
И да. Не стоит удалять комментарии модераторов. Мы это не любим.
Старый 28.11.2012 00:53 in4core вне форума
in4core
 
Аватар для in4core
Да плевать мне там кто чего не любит. Все не довольные идут маршем.
dimarik - ты кто такой, давай досвидания.
Старый 28.11.2012 01:06 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Цитата:
Товарищ in4core, по моему скромному мнению, реально самый популярный блогер на флэшере
Цитата:
Да плевать мне там кто чего не любит
Вот она, популярность, пришла...
Старый 28.11.2012 01:48 Котяра вне форума
Котяра
 
Аватар для Котяра
По хорошему - инфокора давно пора забанить навечно, но я против - он вносит оживлённость в, иногда застопорившуюся, жизнь форума. Он веселит.
Старый 28.11.2012 01:55 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Цитата:
Не вижу противоречия в двух постах.
Это все потому что ты недоцитировал мой комментарий
Цитата:
Вид никогда не знает про контроллер. Контроллер не указывает модели и виду, как им создавать логику и отображение
Что противоречит коду
Цитата:
Код AS3:
this._globalView.view1 = this._view1;
this._globalView.view2 = this._view2;
Следует быть внимательней.
Старый 28.11.2012 02:15 Котяра вне форума
Котяра
 
Аватар для Котяра
оффтоп:
как же всё-таки лучше выглядит
Код AS3:
_globalView.view1 = _view1;
_globalView.view2 = _view2;
Старый 28.11.2012 03:20 Котяра вне форума
Котяра
 
Аватар для Котяра
Даниил Хармс. «Четыре иллюстрации того, как новая идея огорашивает человека, к ней не подготовленного»
I
ПИСАТЕЛЬ: Я писатель!

ЧИТАТЕЛЬ: А по-моему, ты *****!

(Писатель стоит несколько минут, потрясенный этой новой идеей и падает замертво. Его выносят.)

II

ХУДОЖНИК: Я художник!

РАБОЧИЙ: А по-моему, ты *****!

(Художник тут же побледнел, как полотно,

И как тростиночка закачался,

И неожиданно скончался,

Его выносят.)

III

КОМПОЗИТОР: Я композитор!

ВАНЯ РУБЛЕВ: А по-моему, ты *****!

(Композитор, тяжело дыша, так и осел. Его неожиданно выносят.)

IV

ХИМИК: Я химик!

ФИЗИК: А по-моему, ты *****!

(Химик не сказал больше ни слова и тяжело рухнул на пол.)

13 апреля 1933 года
Старый 28.11.2012 12:39 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Цитата:
всё-таки лучше выглядит
Нисколько. Нелепая экономия на буквах привела к тому, что теперь неизвестно, с чем мы работаем: аргументами функции, локальными переменными, полями класса. Это заставляет нагружать примеры несущественным контекстом, дабы никто не задавал лишние вопросы.
Старый 28.11.2012 13:32 kackbip вне форума
kackbip
 
Аватар для kackbip
Цитата:
Это заставляет нагружать примеры несущественным контекстом, дабы никто не задавал лишние вопросы.
На самом деле контекст в любом случае приходится какой-то соображать просто из удобства. К примеру написание полей класса начиная с подчеркивания - хорошее правило, которое позволяет не путать поля с локальными переменными и аргументами.
Писать this или _? Да пофигу. И то и то вполне понятно.
Старый 28.11.2012 13:37 etc вне форума
etc
 
Аватар для etc
Весело у вас тут
Старый 28.11.2012 14:24 GBee вне форума
GBee
 
Аватар для GBee
Правила создания популярной темы:
1) Напиши что-нибудь про MVC
2) Пусть кто-нибудь оспорит твое видение
4) Вуаля
Старый 28.11.2012 14:48 Sintesis вне форума
Sintesis
 
Аватар для Sintesis
Как-то думается, что MVC на флеше всё равно не может быть настоящим, в силу запретов и защиты платформы. Да мы можем имитировать разделение и это будет удобно, но глобально за нас уже решено, что программа стартует с главного ViewController, которые полностью разделить не получится из-за того, что запрещено наследовать класс, например, отдельно от InteractiveObject и отдельно от DisplayObjectContainer.
Старый 28.11.2012 15:04 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
А я думал товариСЧ in4core решил преобразиться в нечто ДОБРОЕ_И_ПУШИСТОЕ:
- удалил, из своего блога последнюю тему, чтобы пресечь конфликт, нарастающий в ее коментах;
- аватарку сменил;
- в текущей теме старался сдержано отвечать на несколько первых коментариев.
Но...

По моему его не спасет даже перерегистрация под новым ником - все равно узнают

Тема, как бы, не плохая и вполне сойдет для личного блога, но для таких тем лучше бы подошел блого-сервис, не связаный с программированием или личный сайт (как у Антона Карлова). Так если и наберется определенное число читателей, то скорее всего они будут искать совета (ибо сами они не столь сведущи в данном вопросе). В коментах они осыпят автора горой хвалебных висказываний и СПАСИБей. А если и найдется какой нибуть гневный критик, то его мнение легко растворится в прочих коментах.

Здесь же очень высока плотность специалистов, готовых пошептать пальцами по клаве для направления на путь истинный всех заблудших душ-программистов (за это им огромная благодарность). И от этих спецов дождаться похвалы или кроткого "СПАСИБО", можна лишь за действительно ценные мысли. Так что, уважаемый и глубоко любимый in4core, славу вы здесь уже нашлы. Если вам хочется обожания, то лучше создать и раскрутить "личное пространство". Ну а если же вам нужен личный рост как программиста, тогда советую не игнорировать критику (снисходительное "имеет право жить" - эквивалент вежливого игнора), а учитывать ее и переосмысливать свои подходы.

П.С.: За такое название темы стоит руки повыдергивать! Никакого отношения к игровой индустрии тема не имеет. МММ - и то меньше кидалово.
П.П.С.: Никоим образом не хотел обидеть Антона Карлова упоминанием его имени в столь неприятном контексте (смотри предпоследний абзац). Просто отношение его читателей к его персоне - одни из самых ярких примеров обожания почитателями/последователями.
Старый 28.11.2012 15:23 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Позволю внести некоторые изменения

Цитата:
Правила создания популярной темы:
1) Напиши что-нибудь про MVC
2) Пусть кто-нибудь оспорит твое видение
4) Вуаля
0) Ты инфокор?
1) Напиши что-нибудь про MVC
2) Пусть кто-нибудь оспорит твое видение

4) Вуаля
Старый 28.11.2012 17:02 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Нелепая экономия на буквах привела к тому, что теперь неизвестно, с чем мы работаем: аргументами функции, локальными переменными, полями класса.
Это легко понять, зато мусор в глазах не рябит.)
Старый 28.11.2012 18:40 in4core вне форума
in4core
 
Аватар для in4core
dimarikam, котярам и прочим недовольным посвящается!

Думаю все уже откомментировали, нового мы ничего не услышим.

Чтобы не быть голословным , сначала отвечу на комментарий :
Цитата:
Идеальная схема с мусорным контроллером для проектов средней крупности. Это же надо такое придумать!
Было написано в начале статьи, что это сугубо мое восприятие и не обязывает никого так делать или рассуждать.
Цитата:
Все что здесь описано ( некоторые термины так же ) - это сугубо мое мышление, поэтому , если что то кажется из рамок выходящим, прошу спокойно указать - исправим.
Безусловно стоит ответить и на этот не менее интересный комментарий котяры :
Цитата:
Зачем?
После ответа - продолжу дальше.
Мне не интересно не ваше продолжение не ваше начало - совершенно. Если Вы хотели сказать что по делу, или не по делу - ваше право.
А вот на вопрос зачем, я отвечу более широко :
Зачем вообще люди здесь что-то постят? Правильно - делятся опытом. Коим поделился и я. Если , допустим, в некоторых предыдущих статьях , я не поддавался самокритике или же просто выкладывал сырой код - да я был не прав, тут и признавать нечего. В данном же случае - это статья , а не код , и описываю я ее своими словами.
Наверное, у многих возник бы вопрос - ты кто такой? С чего ты решил, что у тебя вообще есть опыт?!
Я сразу сказал , что 90% работаю в игорной индустрии, и проектов уже написал не мало. Причем работал с серьезными заказчиками.
Например пройдя суда : БУК,
можно видеть одно из моих приложений , которое используется по ВСЕЙ РОССИИ в каждом городе где есть система букмейкерских контор. На данном сайте показана браузерная версия, похожие десктоп версии используются на панелях в офисах.
Я не буду говорить , что я супер программист, я средний программист , но определенного уровня я достиг, и могу дать отпор многим НЕДОВОЛЬНЫМ.
Кроме того, я еще молодой парень и мне есть чему учиться. Программирование это хобби, у меня нет ни образования типа САПР , ни учителей не было, ни базы, - всему я научился сам. И если мое хобби, может дать отпор тем, кто этим живет - то это чего то, да стоит.

Я не просто так высказался о молодом человеке, как о себе. Я частенько захожу на форум, уже машинально, нового ничего здесь не узнаю почти, уже давно. Я обычный пользователь. Что касается, димариков разных, видимо они уже более взрослые люди, раз имеют право , так себя возвышать. Причем возвышать дико глупо, говоря о том, что они модераторы - чешите нам пятки. Да вы просто смешны. И если, например Wolsh - довольной взрослый дядя 40 лет - заходит суда часто и помогает новичкам , то для него это хобби - в котором он довольно подкован. В отличии от Вас горе-модераторы, он не позволяет себе кого то оскорблять и пишет всегда по делу.
Теперь я спрошу у тебя Димарик - чего ты тут вообще делаешь? Кто тебя назначил модером? Когда ты не выполняешь своей задачи даже на 5% , зато в троллинге ты преуспел на ура!!! Ты наверное все еще живешь с мамой , которая готовит тебе борщи из крапивы?! - Мне кажется это точный псих портрет. Ибо столько яда из тебя течет, что явно указывает на проблемы в твоей жизни.

Обязательно спрошу - чего достиг ты Димарик? Работаешь в каком нибудь Мейл.ру, куда тебя взяли по знакомству , работаешь на дядю? - Да ты просто смешон тогда.

Очень понравилась фраза :
Цитата:
flasher.ru — международный клуб flash-мастеров. рука-лицо.jpg
Это было сказано наверняка с такой экспрессией , что 2advanced нервно курят за углом.
Такое ощущение, что - это ты создал этот форум, причесал его , поднял тысячи программистов с колен!!!
Видимо так и есть

Очень интересна также позиция - зайти в блог человека, который тебе ( видимо ) неприятен, нагадить там и спокойно свалить. Я бы на твоем месте просто ушел в игнор человека да и все. Либо просто взял и высказался по существу. Например - если про мусорный контейнер не понравилась или рассмешила фраза. Так бы и сказал - это никуда не годится, я бы поправил на твоем месте, о чем я и попросил в начале статьи.
Своей выходкой ты еще раз погрел свое эго, засчет других пользователей. Если непонятно о чем речь :
Товарищи Zebestov, Gbee, carrotoff, Psycho Tiger - которые задали нормальные вопросы или высказали свою критику, по вашему выходят тупые нубы, - ведь если они задают вопросы, а не просто отписывают - фу удали срочно , значит им возможно интересно и они готовы к дискуссии.

Отдельный ответ для elder_Nosferatu :
я тут ни под кого не подстраиваюсь, ни по аватарке ни по чему либо еще. У меня свое мнение есть. В данной ситуации - ты стал одним из толпы недовольных по факту просто поддержки модератора, который явно не прав, хотя бы в выражении своего недовольства. Что касается других комментариев - которые были определенно по делу у Zebestov например, заметь я не противоречил, а сказал что вполне годная точка зрения и я к ней прислушиваюсь, и обязательно обмозгую. Тоесть, ты поддерживаешь человека который не высказался по теме, а позволил себе сказать - это фу, без оснований.

inils - насколько я помню один из создателей форума, модератор и админ. Ни разу от него не слышал грубости безпричинной, а тех людей которые ему не нравятся он обходит стороной. Поэтому к нему есть уважение, видно , что взрослый человек, а не шклололо. Он как минимум может собой гордится , что разработал IFlash шрифты, которыми все пользуются, но почему то он не говорит - чешите мне пятки, как делают у нас тут некоторые особо ВАЖНЫЕ модераторы.

Котяра - к тебе отдельный пост. Сильно плохого я против тебя ничего не имею. Ты специалист, это видно. Но местами ведешь себя как школьник.
Особенно вот это :
Цитата:
Кто меня звала? )
А потом еще и злоупотребление служебным положением В роли - мы не любим когда наше удаляют. Как в роли с Димариком - можно смело провести параллель по поводу Я СОЗДАЛ ФОРУМ и Я ТУТ ХОЗЯИН - чешите пятки.

Zebestov - отдельное спасибо за грамотные комментарии. И даже если он считает как и Димарик, в каких то местах, он как умный человек не стал - это выносить.

Насчет забанить меня навсегда - да пожалуйста. Только найдите адекватную причину сначала. Я первый никого не поливаю , я только обороняюсь. А банить стоит как раз ТЕХ прекрасных модераторов, которые считают себя богами программирования в подтексте

Если сказать пару слов о себе. Когда я работал в одном проекте, у нас был JAVA проггер, с которым были постоянные стычки , ну не понимали мы друг друга по жизни Так вот, этот человек написал книгу по JAVA по которой учатся многие вузы. - человек достоин уважения. И если у нас возникал спор - то я даже и сметь особо не имел оспаривать его точку зрения именно в программировании, сразу соглашался.
В вашем же случае - вы никто, и звать вас никак. Какое может быть уважение, если вы не можете ничем похвастаться действительно стоящим, - хотя нет, троллинг у вас развит на высоте, преклоняюсь.
Старый 28.11.2012 20:05 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
Что посеешь то и пожнешь!

Не на пустом месте выросл предвзятое отношение к вам. Репутацию вы себе зарабатывали пост за постом и удивляться к чему это привело не стоит.
Старый 28.11.2012 21:13 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
К стати, на счет "именованых событий" и стейтов. Обработчик события принимает инстанс события а не просто тип события. По этому можна использовать всего один обработчик и у вас не будет проблем с поиском уникальных имен для разных событий:
Код AS3:
public class SomeGameEvent extends Event {
...
}
...
someObject.addEventListener(SomeGameEvent.TYPE_0, handleSomeGameEvent);
someObject.addEventListener(SomeGameEvent.TYPE_1, handleSomeGameEvent);
someObject.addEventListener(SomeGameEvent.TYPE_2, handleSomeGameEvent);
...
public function handleSomeGameEvent(event:SomeGameEvent):void {
	switch (event.type) {
		case SomeGameEvent.TYPE_0:
			// Do something
			break;
		case SomeGameEvent.TYPE_1:
			// Do something
			break;
		case SomeGameEvent.TYPE_2:
			// Do something
			break;
	}
}
Старый 28.11.2012 21:23 in4core вне форума
in4core
 
Аватар для in4core
elder_Nosferatu - то что вы привели это и есть стейты. По крайней мере смысл был именно такой. С небольшой оговоркой, что для любого вида используется именно этот SomeGameEvent, перенаправляющий в зависимости от TYPE_X на нужный case. Тоесть когда видов много, и они взаимодействуют тесно между собой, любой из них направляет нас на единственный ( или несколько ) метод в главном виде, который с помощью кейсов и решает, какие виды должны обменяться данными, или просто вызвать определенные методы
Старый 28.11.2012 22:05 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
Это понятно! Но мне кажется что вы все равно переключаете свои стейты по проишествию каких то событий. А так у вас даже не всплывает в подсознании само понятие "STATE". Вы, как и обычно, работаете с событиями, просто обработку вешаете на один метод.

П.С.: терпеть не могу switch-case! Если вместо "// Do something" прийдется наштамповать несколько строк кода, тогда вместо написания коментариев к каждому case-блку я бы завернул все строки этого блок в отдельную функцию с информативным именем и сократил бы таким образом размер этой мега-switch-case-break-default конструкции. А потм бы взглянул на нее еще раз и понял, что я сделал то же, что каждый EventDispatcher может делать самостоятельно (выбирать обаботчик события в зависимости от типа события). В результате я немного поматерюсь, добавлю всем ранее созданым функциям параметр с типом этого события, перепишу вешание обработчиков и пойму, что не так уж и плоха эта событийная модель
А если держать все обработчики событий вместе, тогда получится в акурат, как с свич-конструкцией - все в одном месте!
Старый 28.11.2012 22:09 dimarik вне форума
dimarik
 
Аватар для dimarik
Простите, я поставил третий плюс. Аминь.
Старый 29.11.2012 00:11 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Ну вот! А был самый популярный блогер
Старый 29.11.2012 01:35 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
Эй! А где аватарка?
Старый 29.11.2012 09:39 zuxul вне форума
zuxul
>> Эй! А где аватарка?
Появится, когда/если разбанят. Или это такой стёб?
Старый 29.11.2012 10:41 kackbip вне форума
kackbip
 
Аватар для kackbip
А ведь в чем-то он прав
Старый 29.11.2012 11:36 ISergey вне форума
ISergey
Старый 01.12.2012 00:22 Rzer вне форума
Rzer
 
Аватар для Rzer
in4core у вас слишком высокое мнение о себе. Может быть вас с детства учили, что Вы самый лучший, но это не так. Ваши статьи не несут смысловой нагрузки. Ваши успехи в написании "крупных" букмекерских приложений сомнительны. Пора вам начать учиться - молча и упорно с целью достижения результата. А пока у Вас получается только "брынчать на гитаре" с криком я умею играть, просто делаю это по своему - музыки только нет.
Старый 02.12.2012 15:38 Hauts вне форума
Hauts
 
Аватар для Hauts
Rzer, боюсь он уже не ответит

 

 


Часовой пояс GMT +4, время: 07:33.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.