Форум 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=114128)

sospamom 18.07.2008 21:59

Как правильно написать код
 
Код:

package code {
        import flash.display.*;
        import flash.text.*;
        import flash.events.*;
        import flash.net.*;
        import flash.ui.Mouse;
        import flash.geom.Matrix;
               
        public class RSSAggregator extends Sprite{
               
                private var urlLoader:URLLoader;
               
                public function RSSAggregator(){
                        LoadXML();                       
                }
               
                private function LoadXML(){
                        var urlRequest:URLRequest = new URLRequest("lol.xml");
                        urlLoader = new URLLoader( );
                        urlLoader.addEventListener(Event.COMPLETE, completeListener);
                        urlLoader.load(urlRequest);
                }
               
                private function completeListener(e:Event):void {
                        var xml:XML = new XML(urlLoader.data);
                        var main:TextField = new TextField();
                        addChild(main);
                        main.text = xml.toXMLString();
                }
               
        }
}

Начинаю изучать программирование вообще и в частности на AS3.

Как правильно написать вышеприведённый работоспособный код? Мне кажется для загрузки файла и для его вывода в TextField должны быть созданы два дополнительных класса или это должно выглядеть ещё как-то но только не так? Ведь основной код начинает засоряться всякими
Код:

private var urlLoader:URLLoader;
и вообще скоро потеряет ясность. Но я не представляю как это правильно должно выглядеть.

ramshteks 18.07.2008 22:19

так как судя по твоему коду видно что твой URLLoader больше нигде не используется то строчку
Код:

private var urlLoader:URLLoader;
удалить и функцию loadXML
написать вот так:

Код:

private function LoadXML(){
                       
                        var urlLoader:URLLoader = new URLLoader( );
                        urlLoader.addEventListener(Event.COMPLETE, completeListener);
                        urlLoader.load(new URLRequest("lol.xml"));
                }

а слушатель к нему так:

Код:

private function completeListener(e:Event):void {
                        var xml:XMLDocument = new XMLDocument ();
                                xml.parseXML(evt.target.data)
                        var main:TextField = new TextField();
                        addChild(main);
                        main.text = xml.toXMLString();
                }

ну это то что можно слету предложить... дальше все зависит от нужд...
судя по названию класса это рсс... ну как я раньше делал, исходя из своего задания, я писал еще один класс, который дожен был работать только с одним полем <item> в рсс( не уверен что верно назвал это полем, скорее содержимым тэга)

Удачи!
Читай Макконела)

sospamom 18.07.2008 22:36

Спасибо! А как бы ещё сделать так, чтобы всё не было в одной куче? Сейчас то код маленький, но потом например код отображения в TextField разростётся итп.

А что конкретно Макконела?

ramshteks 18.07.2008 22:53

макконела, совершенный код, советую купить эту книгу и читать перед сном))

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

еще конечно стоило бы удалить слушатель, прямо в функии completeListener


Код:

private function completeListener(e:Event):void {
                        var xml:XMLDocument = new XMLDocument ();
                                xml.parseXML(evt.target.data)
                        var main:TextField = new TextField();
                        addChild(main);
                        main.text = xml.toXMLString();
                                  evt.target.addEventListener(Event.COMPLETE, completeListener);// хотя не совсем уверен что это необходимо...
                }

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

ign 20.07.2008 13:10

2ramshteks
Цитата:

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

vic_ 20.07.2008 13:32

Цитата:

Сообщение от ign (Сообщение 753182)
2ramshteks

Он возьмет его из дисплей листа ^_^

И потом каждый раз когда понадобится будет брать из дисплей листа? И так все остальные DisplayObjects? Или только для этого текстфилда будет исключение? Нечитабельно и getChildByName работает перебором, ресурсы.

etc 20.07.2008 15:29

Цитата:

Сообщение от vic_ (Сообщение 753187)
getChildByName работает перебором

Откуда такая информация?

vic_ 20.07.2008 17:58

Цитата:

Сообщение от __etc (Сообщение 753209)
Откуда такая информация?

Где то читал, не помню. Это не так?

BlooDHounD 20.07.2008 18:14

vic_, нет конечно :)

vic_ 20.07.2008 18:26

ок, надо будет сравнить время обращения по индексу и по имени

BlooDHounD 20.07.2008 19:47

vic_, дай догадаюсь. по индексу будет быстрее?

vic_ 20.07.2008 19:58

почти в два раза

BlooDHounD 20.07.2008 20:38

vic_, и? разве это не очевидно?

vic_ 20.07.2008 21:12

BlooDHounD, да я знал это и раньше, поэтому и написал. Правда, не ожидал настолько большой разницы. Что именно должно быть для меня очевидно, ваш вариант ответа если не возражаете

BlooDHounD 20.07.2008 22:00

ну как бы имя это вроде бы текст? а где Вы видели что бы поиск по текстовому индексу был быстрее чем по числовому?

vic_ 20.07.2008 22:41

Ясно, спасибо.

etc 20.07.2008 22:51

Проведу тесты. Не думаю, чо программисты в Adobe настолько глупые, что не делают хеш.

ign 21.07.2008 19:40

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

etc 21.07.2008 19:45

Цитата:

Сообщение от ign (Сообщение 753498)
Кхм, я тоже был в полной уверенности, что там хеши..

Ну вообще говоря, хеши и есть:

Код:

var sp:Sprite;
sp = new Sprite();
var n:String = sp.name;
super.addChild(sp);
var t:uint = getTimer();
trace(super.getChildByName(n));
trace(getTimer() - t); // 0
for (var i:uint = 0;i < 20000;i+=1) {
        super.addChild(new Sprite());
}
super.addChildAt(sp, 15000);
t = getTimer();
trace(super.getChildByName(n));
trace(getTimer() - t); // 0

Время от количества детей не изменяется, значит хеш.

BlooDHounD 21.07.2008 20:07

__etc, я думал это очевидно :)

etc 21.07.2008 20:21

Цитата:

Сообщение от BlooDHounD (Сообщение 753511)
__etc, я думал это очевидно :)

С Adobe не всегда очевидно :)

BlooDHounD 21.07.2008 20:51

__etc, убалтал, чёрт языкастый :)

ps: может indexOf ? :D


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

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