Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   обращение сразу ко всем экземплярам определенного класса (http://www.flasher.ru/forum/showthread.php?t=145685)

gloomyBrain 16.10.2010 21:15

Цитата:

можно "забыть" удалить экземпляр из статик массива, когда объект станет ненужным
Так ведь можно и со сцены забыть его удалить =) Выше предложена реализация (ADDED_TO_STAGE, REMOVED_FROM_STAGE) при которой забыть не получится. В данном случае солидарен со всеми, кто за статичый массив

i.o. 16.10.2010 21:38

Не вижу смысла отягощать дополнительными функциями класс, заморачиваться на слушание событий типа ADDED_TO_STAGE / REMOVED_FROM_STAGE. Хранить это все еще где-то. Когда задача поставлена предельно просто и ясно: перебрать все объекты на сцене определенного класса. Зачем вот надо придумывать лишнее, когда конкретно в данном случае можно обойтись одной-единственной функцией. А для гибкости, можно класс динамически подсовывать:
Код AS3:

function getChildrenOfClass( container:DisplayObjectContainer, classToMatch:Class ):Array
{
        if( !container || !classToMatch )
                return null;
 
        var outInstances:Array = [];
        var d:DisplayObject;
        var i:int = container.numChildren;
        while( i-- )
        {
                d = container.getChildAt( i );
 
                if( d is classToMatch )
                        outInstances.push( d );
        }
 
        return outInstances;
}

Пример юзания:
Код AS3:

var shapes:Array/**Shape*/ = getChildrenOfClass( root as DisplayObjectContainer, Shape );

(Код не компилил, мог пропустить какую-нибудь мелкую ошибку).

Автор не ставил задачу "максимально быстро", где возможно было бы оправдано пихать лишний функционал в кастомные классы.
Приведенный пример максимально гибок / абстрактен и может быть использован независимо от реализации кастомных классов.

mayakwd 16.10.2010 21:40

@i.o.:

а если объекты искомого класса находятся внутри другого объекта находящегося на сцене, предлагаете рекурсивно бегать по всем DisplayObjectContainer'ам?

i.o. 16.10.2010 21:45

mayakwd, а что у вас на сцене тысячи объектов валяются, что это может сказаться на переборе, даже рекурсивном? Если да, то постом выше сказано:
Цитата:

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

mayakwd 16.10.2010 21:58

@i.o.:

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

TanaTiX 16.10.2010 21:59

i.o., не было задачи "перебрать все элементы", была задача "выбрать нужные". А ваш вариант хоть и имеет правл на жизнь, но вданном контексте ИМХО менее "ООПшный", мы же не gc пишем.

i.o. 16.10.2010 22:01

Вот статик массив, как раз, есть частное решение. То что я предложил - общее.

TanaTiX
Если вам платят за количествно набранных строк и за "только ООПшный код", а не за здравый взгляд на мир вещей, то я понимаю ваше несогласие.

andrew911 16.10.2010 22:13

Цитата:

Сообщение от mayakwd (Сообщение 943180)
@i.o.:

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

ИМХО для продуктвиности как раз и делаются частные решения ;)))
Так как условия и цели в разных случаях могут различаться, не бывает универсального кода.

mayakwd 16.10.2010 22:19

Цитата:

Сообщение от andrew911 (Сообщение 943183)
ИМХО для продуктвиности как раз и делаются частные решения ;)))
Так как условия и цели в разных случаях могут различаться, не бывает универсального кода.

пожалуй я не буду спорить.
вырвать из контекста можно что угодно )

i.o. 16.10.2010 22:27

Цитата:

я считаю что код должен быть продуктивным
Ну вот вы меня прям-таки вынудили сделать тесты для своего непродуктивного кода.. Честно говоря ожидал хуже.
В упрощенном виде тест такой:
Код AS3:

//{ filling
 
var myContainer:Sprite = new Sprite();
 
i = -1;
while( ++i < 100*1000 )
        myContainer.addChild( new Shape() );
 
i = -1;
while( ++i < 100*1000 )
        myContainer.addChild( new Sprite() );
 
//} filling
 
 
var tm01:int = getTimer();
 
result = getChildrenOfClass( myContainer, Shape );
 
tm01 = getTimer() - tm01;
 
// tm01: 35ms

Как мы видим, провал в 35мс появляется только при переборе и проверке 200'000 (двухсот тысяч) детей в контейнере.
Как же непродуктивно!... :p:p


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

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