|
|
|||||
Кто-нибудь пользуется итераторами?
Уже наверно N-цатый раз борюсь с желанием написать итератор для обхода итемов.
Например: - есть список инструментов в инвентаре; - вьюшке надо его отобразить; - из инвентаря другому объекту надо достать предмет по его итему Интерфейс получается таким: function getItemById(id:int):Item; function getItems():Vector.<Item>; function addItem(item):void// допустим контроллеру надо Ладно, пусть ломают, но тогда, если кто-то добавит еще один элемент в вектор, он не захешируется в хеше "item по айдишнику". Ну не копировать же массив при отдаче каждый раз. Но нигде не встречал людей, которые пишут так: Почему? |
|
|||||
Вобщем да, причина понятна, тут либо массив каждый раз создавать либо итератор. Массив создать проще, меня смущает только то что:
- создание массива может ввести в заблуждение - клиент класса может подумать, что он вправе его менять (и удивляться, почему ничего не изменяется); - копирование массива обходится дороже создания итератора (сомневаюсь, что тест лажает из-за оптимизации кода компилятором): 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. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
*Тут было много мыслей по поводу итераторов*
Поделитесь практической нуждой создавать сущность итератора помимо создания универсальной структуры как самоцели?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
.
|
Флекс, так сказать, дает Cursor'ы.
А по-моему эти итераторы - гениальная идея. На каком топливе у вас работают структуры хранения данных скрывается и начинается просто типизированный доступ к ним. Последний раз редактировалось dimarik; 25.10.2010 в 02:04. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Цитата:
Можешь об этом рассказать или дать ссылок чтобы почитать? Гугл только туториалы how to выдаёт =\ Ну я ничего против итераторов не имею. Мне итератор представляется как отдельная сущность, и в моей практике она несоизмерима дорога с точки зрения практической ценности по сравнению с обычным циклом в 2 строчки. Проще говоря, за мой скромный опыт использование итераторов не было бы оправдано ни разу.
__________________
Тут мужик танцует и поёт про флэш Последний раз редактировалось Psycho Tiger; 25.10.2010 в 02:09. |
|
|||||
.
|
Рекомендую Head first design patterns издательства O'Reilly. Там донельзя разжеваны почти все гофы. И итератор тоже )
Последний раз редактировалось dimarik; 25.10.2010 в 02:31. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Да, я давно хочу её прочитать, но руки никак не доходят ) Спасибо.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Цитата:
Цитата:
Можно сделать и то и другое. |
Часовой пояс GMT +4, время: 13:21. |
|
« Предыдущая тема | Следующая тема » |
|
|