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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.08.2008, 12:12
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 1  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Схема: сабмит формы -> обработать ввод большого количества разных контролов

Вопрос теоретического характера:
Переделываю свой старый проект, и вот в нем есть одно место, которое мне очень не нравится, а придумать, как бы его переделать не могу...
Вобщем, что есть: набор из полтора десятка разных форм, каждая из которых состоит из еще 1-2 десятка контролов. Все формы при изменении значения в хотя бы одном контроле сабмитят новое значение обработчику который должен 1. обновить состояние экрана, 2. обновить ХМЛ представление того, что происходит на экране + иногда обновить состояние связаных контролов (например, можно одновременно изменить ширину и положение по Х объекта - нужно обновить сразу 2 значения). Сейчас обработчик выглядит как длинющий switch-case с вложенными switch-case примерно так:
Код:
onSubmit(evt:FormEvent):void
{
	switch(evt.form)
	case 1:
	switch(evt.formElement)
	{
		case 1:
			screen.layer[1].updateElement(elementID = 1, elementValue = evt.value);
			xml.form[1].@formElement = evt.value;
			...
		case 2:
		...
	}
	case 2:
		...
	case N:
	...
}
Проблема еще и в том, что значение контрола может быть чем угодно, т.е. строкой, числом, массивом... на форме может быть несколько однотипных контролов, которые можно различить только по ID, но тем не менее, нужно выполнить разные действия при изменении значения в том и другом.
Недостатки такого метода очевидны - если на форме добавится / удалится 1 контрол нужно делать изменения в обработчике. Не возможно сгенерить форму "на лету", т.е. технически, конечно, можно, но обработчик не будет знать что делать с импутом от такой формы... + этот switch-case неимоверной длины (строк 400 чтоб не соврать) и вобщем, выглядит это крайне удручающе =)
Вопрос: как бы перепроектировать это дело, чтобы 1. можно было избежать switch-case, 2. создавать формы "на лету"?
__________________
Hell is the possibility of sanity

Старый 20.08.2008, 12:27
chatlano вне форума Посмотреть профиль Отправить личное сообщение для chatlano Найти все сообщения от chatlano
  № 2  
Ответить с цитированием
chatlano

Регистрация: Jun 2006
Сообщений: 30
как насчет того чтобы унаследовать контролы от одного класса или организовать интрейфес который реализуют разные классы и далее используя полиморфизм избавиться от switch? более подробно можно почитать у Фаулера в "Рефакторинг"

Старый 20.08.2008, 12:34
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Контролы и так наследуются от одного класса... проблема в том, что на форме может быть, например, 2 input text, один сабмитит значение в виде XX:YY, другой - "абвгд". И обработать, соответственно, нужно по-разному. А как пишется фамилия автора "Рефакторинга" по-английски? Чего-то я не соображу..
__________________
Hell is the possibility of sanity

Старый 20.08.2008, 13:04
chatlano вне форума Посмотреть профиль Отправить личное сообщение для chatlano Найти все сообщения от chatlano
  № 4  
Ответить с цитированием
chatlano

Регистрация: Jun 2006
Сообщений: 30
Martin Fowler "Refactoring Improving the Design of Existing Code". По поводу разных инпутов. Если формат ввода разный можно и два разных класса организовать?

Старый 20.08.2008, 15:00
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Можно... но не хочется... ну, представь, есть 2 с виду ни чем не отличающихся текстфилда, но в один можно вводить только цифры, а в другой - цифры и буквы, как-то не с руки делать 2 разных класса для этого...
Вобщем, пока что, что пришло в голову - все значения контролов преобразовывать в ХМЛ, а после сабмита парсить ХМЛ и в зависимости от его структуры изменять чего нужно, мож не самое лучшее, но, код сократило так раз в 10 почти =)

ЗЫ. За книжку пасиб, буду искать =)
__________________
Hell is the possibility of sanity

Старый 20.08.2008, 15:53
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 6  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Создай класс контроллов с полями-значениями. В каждом контролле храни список связанных контроллов. XML и перерисовщик экрана тоже контроллы. При изменении значения в контролле, контролл вызывает метод update у всех связанных с ним контроллов. В твоей схеме фигово то, что отдельный класс занимается выполнением чужой работы.

Старый 20.08.2008, 17:40
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 7  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
может я неправильно понял, но я делал примерно так(прошу прощения UML-редактора под рукой не оказалось):
два класса: элемент и форма.
Код:
элемент:
	onSubmitEl
	дополнительные поля
форма:
	onSubmit
	addElement
	список элементов
при добавлении элемента, мы указываем функцию onSubmitEl
в функции onSubmit проходимся по всем элементам и выполняем onSubmitEl
__________________
я могу стать всем, если только захочу

Старый 21.08.2008, 12:32
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
Сообщение от Яски Посмотреть сообщение
Создай класс контроллов с полями-значениями. В каждом контролле храни список связанных контроллов. XML и перерисовщик экрана тоже контроллы. При изменении значения в контролле, контролл вызывает метод update у всех связанных с ним контроллов. В твоей схеме фигово то, что отдельный класс занимается выполнением чужой работы.
такая схема будет хреново работать если 2 контрола взаимосвязаны. Т.е. если контрол А должен обновляться когда обновляется контрол Б, и контрол Б должен обновляться когда обновляется контрол А (при чем такие ситуации имеют место быть).
Т.е. предположим:
есть контрол изменяющий позиционирование объекта, но если объкт не может быть позиционирован определенным образом он изменяет свой размер. И наоборот, если изменить ширину, то возможна ситуация, когда нужно будет изменить позиционирование. Т.е. условно контрол setX и setWidth могут друг другу очень долго слать апдейты. Поэтому нужно промежуточное звено, которое следит за тем, что контролы не апдейтаят сами себя по тысяче раз.

Felicast:
Не знаю... мне если честно не хочется делать десятки замен в ХМЛе просто так. т.е. если на каждый сабмит переписывать все значения элементов на форме (при том, что изменилось оно только у одного... ) мне кажется нерационально
__________________
Hell is the possibility of sanity

Старый 21.08.2008, 22:20
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 9  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Не понимаю как это. Ну предложу другой вариант -
Каждый контролл имеет сеттер и геттер на изменяемое свойство. В конструктор контролла мы передаем связанную XML( XML ноду). На сеттер изменяем свойства связанных элементов и переписываем значение в XML. Если нужен респонз на перерисовку можно еще генерировать событие при изменении значения - перерисовщик будет подписываться на него.

Старый 21.08.2008, 23:10
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Дело в том, что не хочется в сеттере проверять, а действительно ли изменилось свойство, потому что иногда для этого пройдеться несколько фор-инов вложеных запустить... легче просто переписать по-новой.
А то получится:
Код:
var _abc:String;
var _def:String;

function abc(s:String):void
{
	_abc = s;
	def(s);
}
function def(s:String):void
{
	_def = s;
	abc(s);
}
__________________
Hell is the possibility of sanity

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

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

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


 


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


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