Бесплатно скачать Adobe Flash Player

Класс Dictionary — это жесть и экономия времени

Недавно на большом проекте осознал, что могу сократить кучу кода за счет использования появившегося в AS3 класса Dictionary (уже давно, позор мне, мне же известного ;-)
Было:

function tileIsRendered(theTile:MapTile):Boolean {
var result:Boolean;
var aTile:MapTile;
for each(aTile in renderedTiles)
{
if(aTile == theTile)
{
result = true;
break;
}
}
return result
}
Стало:
function tileIsRendered(theTile:MapTile):Boolean {
return renderedTiles[theTile] == true
}

Если вы не в курсе: Dictionary—это подобие ассоциативного массива, но его ключами можно назначать не только строки, но и объекты любого типа. Ключи объекта Dictionary работают как ссылки на объекты. Осталось проверить, насколько этот способ быстре вычислительно.

Писал: Rost, 29 Октябрь 2007 13:51

Комментарии:

век живи - век учись!

способ естественно быстрее, но ресурсоёмчее(в теории памяти больше жрать будет на объект Dictionary) )

__i - 29 Октябрь 2007 14:47

Я сейчас как раз тоже начал этот Класс использовать, кстате как раз для хранения тайлов:)

Shagrat - 29 Октябрь 2007 15:43

Dictionary - это, бесспорно, очень полезный класс. Правда иногда забываешь о его существовании и решаешь задачу массивами или объектами. Спасибо, что напомнил о нем. =)

Garbage Collector - 29 Октябрь 2007 20:19

Я немного не в теме Flash-а, но IMHO ключ хэша с типом отличным от строки в приведенном примере вам не нужен.

Vadim Voituk - 30 Октябрь 2007 9:27

А Вадим діло говорить, чому це в тебе в об'єкті типу Dictionary 'renderedTiles' kлюч хеша є типу Tile? Здається можна було б обійтись і

function tileIsRendered(theTile:MapTile):Boolean {

return renderedTiles[theTile.id] == true

}

JabbyPanda - 30 Октябрь 2007 14:10

Вообще незаменимый класс для ассоциированного хранения данных. На нём сделали и "список" (по сути тот же "словарь", где ключ равен значению). По скорости неахти, так что злоупотреблять не советую.

Антон Волков - 30 Октябрь 2007 14:32

var o:Object = new Object();
var a:Object = new Object();
a.toString = function():String {
return "It's me";
}
o[a] = true;
o[true] = a;
trace(o[a]+',',o[true]);

__etc - 30 Октябрь 2007 16:01

Vadim Voituk™, JabbyPanda™ - да, вы правы. Честно говоря, в примере - не реальный код из проекта, а просто первая иллюстрация, пришедшая мне в голову. И она не самая удачная из возможных :)

Поэтому возникает желание: давайте подберем самые лучшие (желательно простые) примеры использования Dictionary?

Один вариант, который я сейчас могу вспомнить: Когда мы имеем дело с "чужим и запечатанным" классом, который не поддерживает свойство ID. Тогда мы можем использовать Dictionary для имитации такого свойства у класса, изначально его не поддрживающего, передавая экземпляры класса как ключи Словаря, и присваивая им значения ID.

Но я хочу еще примеров.

Спасибо за чоткие комменты! :)

Рост - 30 Октябрь 2007 16:30

__etc™ - спасибо хакерам :)

С динамическими классами все клево; но ведь может быть и такая ситуация:

var o:Shape = new Shape();
var a:Shape = new Shape();
...

Рост - 30 Октябрь 2007 16:36

Да ладно, это шутка была =)
Объект не заменит Dictionary =)

Что касается Dictionary, то мне нужно было удалять и добавлять элементы в него без поиска . И так, чтобы не было двух одинаковых ссылок на один и тот же объект.

__etc - 30 Октябрь 2007 17:57

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

a_[w] - 31 Октябрь 2007 13:06

Тоже отказался от Dictionary в угоду скорости поиска данных.

pazaal - 1 Ноябрь 2007 13:56



Подписаться на новости (RSS)




Примечания:
Статус документа
: в процессе
   2002-2009 Производство: Ростислав Сирык · О проекте · Подписка на новости (RSS)