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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.10.2010, 14:34
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 1  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
По умолчанию Кто-нибудь пользуется итераторами?

Уже наверно N-цатый раз борюсь с желанием написать итератор для обхода итемов.
Например:
- есть список инструментов в инвентаре;
- вьюшке надо его отобразить;
- из инвентаря другому объекту надо достать предмет по его итему

Интерфейс получается таким:
Код AS3:
function getItemById(id:int):Item;
function getItems():Vector.<Item>;
function addItem(item):void// допустим контроллеру надо
Очень бесит то, что мы отдаем вектор итемов для обхода, который можно ломать как угодно.
Ладно, пусть ломают, но тогда, если кто-то добавит еще один элемент в вектор, он не захешируется в хеше "item по айдишнику".
Ну не копировать же массив при отдаче каждый раз.

Но нигде не встречал людей, которые пишут так:
Код AS3:
function getItemById(id:int):Item;
function getItems():ItemIterator;
function addItem(item):void// допустим контроллеру надо
Почему?

Старый 24.10.2010, 15:11
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Потому, что в первом случае отдают не оригинальный вектор, а его копию, изменения в которой не меняют содержимое вектора в классе.
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 25.10.2010 в 12:53.
Старый 24.10.2010, 20:58
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Вобщем да, причина понятна, тут либо массив каждый раз создавать либо итератор. Массив создать проще, меня смущает только то что:
- создание массива может ввести в заблуждение - клиент класса может подумать, что он вправе его менять (и удивляться, почему ничего не изменяется);
- копирование массива обходится дороже создания итератора (сомневаюсь, что тест лажает из-за оптимизации кода компилятором):
Код AS3:
package  
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getTimer;
 
	public class ArrayCopyTest extends Sprite
	{
 
		public function ArrayCopyTest() 
		{
			var tf:TextField = new TextField();
			addChild(tf);
 
			var array:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
			var timer:int;
			var i:int;
 
			timer = getTimer();
			for (i = 100000; i-- > 0; )
			{
				var iterator:Iterator = new Iterator(array);
			}
			tf.appendText(String(getTimer() - timer) + "\n");// 33
 
			timer = getTimer();
			for (i = 100000; i-- > 0; )
			{
				var arrayCopy:Array = array.concat();
			}
			tf.appendText(String(getTimer() - timer) + "\n");// 128
		}
 
	}
 
}class Iterator
{
	private var _array:Array;
	private var _currentIndex:int = 0;
 
	public function Iterator(array:Array)
	{
		_array = array;
	}
 
	public function get hasNext():Boolean
	{
		return _currentIndex < _array.length - 1;
	}
 
	public function next():Object
	{
		return _array[_currentIndex++];
	}
}


Последний раз редактировалось expl; 24.10.2010 в 21:15.
Старый 25.10.2010, 01:24
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Я пользую итераторы.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

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

Поделитесь практической нуждой создавать сущность итератора помимо создания универсальной структуры как самоцели?

Старый 25.10.2010, 02:02
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Флекс, так сказать, дает Cursor'ы.
А по-моему эти итераторы - гениальная идея. На каком топливе у вас работают структуры хранения данных скрывается и начинается просто типизированный доступ к ним.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 25.10.2010 в 02:04.
Старый 25.10.2010, 02:05
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Сообщение от dimarik Посмотреть сообщение
Флекс, так сказать, дает Cursor'ы.
А по-моему эти итераторы - гениальная идея. На каком топливе у вас работают структуры хранения данных скрывается и начинается просто типизированный доступ к ним.
Это очень интересно ) Итератор на вид курсора? Нестандартно )

Можешь об этом рассказать или дать ссылок чтобы почитать? Гугл только туториалы how to выдаёт =\

Ну я ничего против итераторов не имею. Мне итератор представляется как отдельная сущность, и в моей практике она несоизмерима дорога с точки зрения практической ценности по сравнению с обычным циклом в 2 строчки. Проще говоря, за мой скромный опыт использование итераторов не было бы оправдано ни разу.


Последний раз редактировалось Psycho Tiger; 25.10.2010 в 02:09.
Старый 25.10.2010, 02:16
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Рекомендую Head first design patterns издательства O'Reilly. Там донельзя разжеваны почти все гофы. И итератор тоже )
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 25.10.2010 в 02:31.
Старый 25.10.2010, 02:29
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 9  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

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

Старый 25.10.2010, 13:02
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 10  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
- создание массива может ввести в заблуждение - клиент класса может подумать, что он вправе его менять (и удивляться, почему ничего не изменяется);
Для это существует описание метода, в котором этот момент обговаривается.
Цитата:
- копирование массива обходится дороже создания итератора (сомневаюсь, что тест лажает из-за оптимизации кода компилятором):
Это смотря как тесты проводить. Массив вы создали один раз, а потом гоняете его сколько угодно, а с итератором будет постоянный вызов метода. И доступ будет последовательный, что не всегда удобно и нужно.
Можно сделать и то и другое.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

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

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


 


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


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