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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.05.2013, 15:22
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 21  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
СлаваRa - собственно что я и написал
__________________
Марк Tween

Старый 25.05.2013, 11:55
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 22  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
Код AS3:
WindowsManager.open(WindowEnum.MAIN_MENU);
WindowsManager.alert(AlertEnum.ERROR);
ResourceManager.getResource(ResNameEnum.ARP, ResNameEnum.MAIN_MENU_BACKGROUND);
Validate.stringIsNullOrEmpty(someString);
вот в таком ключе использую, но не больше, остальное обходится без глобальных точек доступа, синглтонов и т.п.
спасибо за установку.
Логика получается у Вас разбросана, есть исполняющие методы которые Вы вызываете и там же (где вызывали) обрабатываете информацию, я правильно понял?

Добавлено через 1 минуту
к примеру если нужно обработать клик пользователя, после чего отправить данные с полей на сервер, принять, закешировать и вывести.
__________________
return this...

Старый 25.05.2013, 13:51
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 23  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
к примеру если нужно обработать клик пользователя, после чего отправить данные с полей на сервер, принять, закешировать и вывести.
Ну вообще, я бы делал так (писал в браузере, сори за возможные ошибки):

Код AS3:
private function clickHandler(event:MouseEvent):void{
var someCommand:SomeCommand = new SomeCommand('some data may be');
someCommand.run(); //команда держит как-то статикой ссылку на соединение с сервером, но здесь этого не видно. Принцип Hide Complexity
//на каждую команду - свой класс.
//вариант 1: в команду передается всё необходимое (например, ссылка на вью) и по приходу данных от сервера команда сама делает "парсинг" и всё остальное.
//т.е. каждая команда знает, что надо отправить на сервер и просит минимальное – что она не знает, и выполняется по ответу от сервера она тоже сама, 
//дёргая нужные методы у вьюхи и добавляя содержимое.
 
//вариант 2: получили данные и делаем это дело в хэндлере
someCommand.addEventListener(Event.COMPLETE, onCommandDataReceived);
 
//вариант 3: два в одном, самый клёвый. Данные и парсятся, и стреляется событие. Если команду удобно "отпарсить" внутри её самой – она парсится там
//и, откуда она вызвана не захламлется. Одна строчка
new PingServer().run();
//найс! Ну, а если неудобно – вариантом 2. Иногда и там, и там – она и парсится, и дополнительно ещё здесь тянутся данные. Короче, как удобней, ну.
}
 
private function onCommandDataReceived(event:Event):void{
(event.currentTarget as SomeCommand).some_data; //данные здесь уже разложены в удобные для работы места с удобными типами и т.д.
}

Старый 25.05.2013, 16:04
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 24  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
спасибо, приму к сведению.

Но в чем минус моего решения?
Код AS3:
public class Core {
 
		public var ADD_BLACKLIST:String = 'add_blacklist';
		public var COMPLAINT_USER:String = 'complaint_user';
		public var COMPLAINT_USER_SEND:String = 'complaint_user_send';
		public var CLOSE:String = 'close';
		public var SEND_GIFT:String = 'send_gift';
		public var INIT_REG:String = 'init_reg';
 
		.....................
 
		public function Core() {
			...........
		}
 
		public function logic($cmd:String='', $data:Object=null):void {
			trace('CMD: '+$cmd);
			if ($data) {
				trace('logic');
				for ( var i in $data) {
					trace(i+" >> "+$data[i]);
				}
			}
 
			switch ($cmd) {
 
				.....................
 
				case ADD_BLACKLIST: {
					GlobalVars.amf.toamf(GlobalVars.methods.addBlacklist, GlobalVars.handler.blacklistHandler, GlobalVars.account.amfSing($data));
				} break;
 
				case COMPLAINT_USER: {
					GlobalVars.gui.attachToCentr(new Complaint($data),true);
				} break;
 
				case COMPLAINT_USER_SEND: {
					$data.cmd = 'send';
					GlobalVars.amf.toamf(GlobalVars.methods.sendToSupport, GlobalVars.handler.supportHandler, GlobalVars.account.amfSing($data));
				} break;
 
				.....
			}
 
			if ($data && $data.remove) GlobalVars.gui.remove($data.remove);
		}
 
	}
соответственно в любом месте мне достаточно вызвать
Код AS3:
GlobalVars.core.logic(GlobalVars.core.COMPLAINT_USER, {'uid':$uid,'remove':this} );
и откроется окно с жалобой на пользователя.

причем написав GlobalVars мне IDE подсветит возможные обработчики, к примеру пишу GlobalVars.core.logic, метод обработки логики (внешняя связь, GUI, обработка внутренних команд), после чего указываю GlobalVars.core.COMPLAINT_USER, что является командой и любые данные (в приемнике есть свой корректор на входящие данные). То-есть в плане глобальной логики мне нужно запомнить только GlobalVars. Идем дальше. В самом
Код AS3:
public function logic($cmd:String='', $data:Object=null):void {
			// команда
			switch ($cmd) {
 
				.....................
 				// используется константа потому напутать что-то очень сложно
				case ADD_BLACKLIST: {
 
					GlobalVars.amf.toamf(GlobalVars.methods.addBlacklist, GlobalVars.handler.blacklistHandler, GlobalVars.account.amfSing($data));
					// GlobalVars.amf.toamf - отправка данных на сервер
					// GlobalVars.methods.addBlacklist - метод добавления в черный список
					// GlobalVars.handler.blacklistHandler - обработчик данных с коректировкой данных связанных с черным списком (добавление, удаление, вывод )
					// GlobalVars.account.amfSing - подпись пользователя
 
				} break;
 
				case COMPLAINT_USER: {
 
					GlobalVars.gui.attachToCentr(new Complaint($data),true);
					// GlobalVars.gui.attachToCentr - добавить на экран объект по центру
					// new Complaint($data) - тут по сути должно быть получение экземпляра с библиотеки, но пока так. Создается класс в него сразу впихиваются данные для отображения. 
					// true - означает использовать ли блокировку заднего экрана
				} break;
 
				.....
			}
 
			if ($data && $data.remove) GlobalVars.gui.remove($data.remove);
		}
таким образом я могу посмотреть всю логику приложения в одном месте, сами окна (gui-элементы уже работаю с листнерами и диспатчами. Так же могу посмотреть на каждый обработчик, данные пользователя, методы работы с сервером тоже в едином месте.

В чем минус такого решения?
__________________
return this...


Последний раз редактировалось AlexCooper; 25.05.2013 в 17:59.
Старый 25.05.2013, 16:46
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 25  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Так же могу посмотреть на каждый обработчик, данные пользователя, методы работы с сервером тоже в едином месте.
Именно в этом.
ООП - есть разумное разграничение логики от данных
__________________
Марк Tween

Старый 25.05.2013, 16:55
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 26  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от in4core Посмотреть сообщение
Именно в этом.
ООП - есть разумное разграничение логики от данных
это мне ничего не объяснило. Имелось в виду что есть класс обработчики, класс пользователь, гуи и т.д (не весь код в едином месте, а по группируются по схожести) . Только управляется все с "ядра" и "ядро" запускает уже "классы-подрядчики".
__________________
return this...


Последний раз редактировалось AlexCooper; 25.05.2013 в 18:02.
Старый 25.05.2013, 17:59
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 27  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
AlexCooper, самый большой минус - это инкапсулированность тех функций, которые не должны быть инкапсулированны. Если вы разработчик - одиночка то пофик, что вы творите со своим г/к. Возьмите за пример Drupal 7 и вы поймете разницу. Там есть тоже ядро, модули, виды, хуки, типы данных,темы .

Старый 25.05.2013, 19:52
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 28  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Цитата:
Сообщение от AlexCooper Посмотреть сообщение
в любом месте мне достаточно вызвать
GlobalVars.core.logic(GlobalVars.core.COMPLAINT_USER, {'uid':$uid,'remove':this} );
...
В чем минус такого решения?
1. Код с "сырыми" объектами никогда не будет гибким. А если COMPLAINT_USER потребуется объект с новым полем? Будете по всему проекту искать и добавлять? "Современные умные IDE" - не аргумент.
2. Свитч в методе logic может разрастись во много сотен строк монотонного кода.
3. Код с упоминанием GlobalVars.core.* станет не переносимым. Например, небольшой пакет из 5-10 классов заточенный выполнять какую-либо конкретную задачу не получится просто вытащить из репозитория и тут же начать использовать в новом проекте. Нужно будет либо удалять GlobalVars.core.*, либо тащить в новый проект GlobalVars.

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

Старый 25.05.2013, 21:06
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 29  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Babylon Посмотреть сообщение
Возьмите за пример Drupal 7 и вы поймете разницу.
Обязательно посмотрю

Цитата:
Сообщение от Bgg Посмотреть сообщение
1. Код с "сырыми" объектами никогда не будет гибким. А если COMPLAINT_USER потребуется объект с новым полем? Будете по всему проекту искать и добавлять? "Современные умные IDE" - не аргумент.
мне не нужна гибкость, гибкость поддерживается на низком уровне, имеется ввиду классы по работе с сервером, гуи и т.д.,

Цитата:
Сообщение от Bgg Посмотреть сообщение
2. Свитч в методе logic может разрастись во много сотен строк монотонного кода.
это явный минус в плане роста, но а как по другому, логика собранная в одном месте для меня как инструкция по использованию. Хотя с другой стороны согласен что 1000 case это 1000 операций сравнивания.

Цитата:
Сообщение от Bgg Посмотреть сообщение
3. Код с упоминанием GlobalVars.core.* станет не переносимым. Например, небольшой пакет из 5-10 классов заточенный выполнять какую-либо конкретную задачу не получится просто вытащить из репозитория и тут же начать использовать в новом проекте. Нужно будет либо удалять GlobalVars.core.*, либо тащить в новый проект GlobalVars.
проект не рассчитан на перенос или клонирование функционала, проект рассчитан сам на себя, максимально быть продуктивным и удобным в плане разработки и поддержки.
__________________
return this...

Старый 26.05.2013, 03:08
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 30  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Возьмите за пример Drupal 7 и вы поймете разницу.
Друпал, возможно, хорош. Но рекоммендовать что-то, что написанное на языке, в котором ожидают поджидают сюрпризы (например, а=б, б=в, а!=в. Сюрпрайз!) – вообще не стоит.

Создать новую тему Ответ Часовой пояс GMT +4, время: 04:15.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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