Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Функции в Object (http://www.flasher.ru/forum/showthread.php?t=139847)

XDiaBLo 12.05.2010 21:40

Функции в Object
 
Нашёл в исходнике чата для вконтакта нечто подобное
Код AS3:

dp.request(DataProvider.GET_PROFILES,                                 
{
        params: dpparam,
        onComplete: function(data)
        {
                output2.text = data[0].first_name + ' ' + data[0].last_name + ' ' + data[0].mobile_phone;
        }
});

Конечно я уже слегка преобразовал, изначальную версию найти не могу. Хотелось бы подробнее узнать про функцию которая там создаётся. Но ничего не нашёл про это нигде. Это единственный способ создавать функции в Object? Может есть какие-то нюансы использования? Где про это глянуть?

i.o. 12.05.2010 21:46

Пожалуйста, можно и так:
Код AS3:

var myObject:Object = new Object();
 
myObject.funct = function():void
{
        trace( "lalala" );
}
 
myObject.funct();

А можно и вот так:
Код AS3:

var myObject:Object = new Object();
myObject.funct = _funct;
myObject.funct();
 
function _funct():void
{
        trace( "lalala" );
}

Только зачем вам функции в Объекте создавать? Рекоммендую создать простой класс с публичной переменной и методом. И работать быстрее будет и сами не запутаетесь :)

wvxvw 12.05.2010 21:48

При встрече с автором сего шедевра сделайте ему что-нибудь нехорошее, например пните ногой, или плюньте в лицо. Это ж такую редкосную гадость надо было написать... (а еще для таких вещей есть замечательный сайт - govnokod.ru)
Называется это умными словами "анонимная функция присвоеная свойству динамического объекта" - чем это чревато:
- отсутствие нормальной проверки на этапе компиляции.
- такие функции будут создаваться по-новой при каждом выполнении функции-обертки.
- контекст такой функции можно переопределить в рантайме.
- такие функции плохо перевариваются JIT компилятором, если вообще перевариваются.
- судя по названию, ее еще и планировалось передать в качестве обработчика какого-то события, а это добавляет ко всему вышеперечисленному проблемы с очисткой памяти.

XDiaBLo 12.05.2010 21:48

Я пока изучаю исходник чата, и экспериментирую в отдельном проекте, удалось имя, фамилию и номер мобилы получить для начала. А поскольку там такое сплошь и рядом, хотелось бы понять принципы. Устал искать описание, и уже готов довольстоваться малым. Спасибо и на этом :)

Добавлено через 2 минуты
Оригинал нашёл
Код AS3:

        _data_provider.request(DataProvider.GET_USER_INFO,
                {
            onComplete: function(data)
                        {
                self._user_info.user_id = data.user_id;
                self._user_info.user_name = data.user_name;
 
                // Make next request after 500 ms delay because of API restriction (3 reqsts per second)
                setTimeout(function()
                                {
                    self._data_provider.request(DataProvider.GET_SERVER_TIME,
                                        {
                        onComplete: function(data)
                                                {
                            var current_time = (new Date()).getTime();
                            self._time_offset = current_time - parseInt(data) * 1000;
                            dispatchEvent(new DataAccessEvent(DataAccessor.INIT));
                        }
                    });
                }, 500);
            }
        });


wvxvw 12.05.2010 21:53

Если сами не запостите в *****код, то я с радостью это сделаю с вашего позволения, страна должна знать своих героев. :)

XDiaBLo 12.05.2010 21:55

Цитата:

Сообщение от wvxvw (Сообщение 907789)
При встрече с автором сего шедевра сделайте ему что-нибудь нехорошее, например пните ногой, или плюньте в лицо. Это ж такую редкосную гадость надо было написать... (а еще для таких вещей есть замечательный сайт - govnokod.ru)
Называется это умными словами "анонимная функция присвоеная свойству динамического объекта" - чем это чревато:
- отсутствие нормальной проверки на этапе компиляции.
- такие функции будут создаваться по-новой при каждом выполнении функции-обертки.
- контекст такой функции можно переопределить в рантайме.
- такие функции плохо перевариваются JIT компилятором, если вообще перевариваются.
- судя по названию, ее еще и планировалось передать в качестве обработчика какого-то события, а это добавляет ко всему вышеперечисленному проблемы с очисткой памяти.

Ну да, там дальше есть такой код
Код AS3:

      loader.addEventListener(Event.COMPLETE, function(e:Event){
        var loader:URLLoader = URLLoader(e.target);
        var data = JSON.decode(loader.data);
        if (data.error) {
          options.onError(data.error);
        } else if (options.onComplete && data.response) {
          options.onComplete(data.response);
        }
      });

Насколько я понимаю, это замыкание (closure). Возможно это сделано с целью уменьшения количества классов в программе-примере, но это её ни капли не упрощает для новичка в ЭкшнСкрипте. Попробую разобраться как это всё переделать.

Добавлено через 5 минут
Не, ну можете постить, но там весь исходник чата такой, у меня волосы дыбом, но понемногу разбираюсь. Похоже сделано чтобы отпугивать новичков от написания приложений для вконтакта :))) Сам пару месяцев боялся подступиться, смотрел на код, и выключал через 10 минут. Сейчас перешёл в решительное наступление. Что-то начало получаться, методом тыка. Но хочется каждую непонятную ситуацию выяснить, чтобы набраться знаний и опыта. Прежде чем сюда задавать вопрос, прошерстил несколько книг на предмет такой темы, и погуглил, информации нашёл маловато. Даже здесь я уже больше узнал, в этой теме. Спасибо.

wvxvw 12.05.2010 22:04

Класс занимает ничтожно мало места по сравнению с тем, сколько это ***** отъест потом места в памяти, если вообще не поломается до того, как достигнет критических размеров. Тут на лицо человек, который никогда в жизни на AS3 ничего не писал, а делал каие-нибудь *****сайты на яваскрипте (и возможно немного PHP). Конечно, обстоятельства могут быть разными, и если это код начинающего / любителя, за который никто не платил и т.д. - то, ну, как бы и ладно, но если за это кто-то хоть копейку заплатил - то оно того явно не стоило :)
Рефакторить - ну, в первую очередь вытащить все функции из других функций и сделать их методами класса, включить strict mode + все предупреждения и исправлять то, что компилятор найдет...

PS. Замыкание в ОО языках не имеет никакого смысла. Для того, чтобы оно имело практический смысл, нужен другой подход и другое окружение... Тут нет никаких возможных скрытых причин и оправданий, просто откровенное ***** в чистом виде.

XDiaBLo 12.05.2010 22:10

Оно лежит Вконтакте, в группе "ВКонтакте API ", как один из образцов
Цитата:

Примеры реализованных приложений
В целях ознакомления мы подготовили для Вас исходные коды нескольких базовых приложений:

* Аудиозаписи – пример реализации сервиса аудиозаписей для пользователей ВКонтакте. Скачать »
* Чат – пример реализации чата для пользователей ВКонтакте. Скачать »
* Города – пример реализации приложения, записывающего данные пользователя. Скачать »
* Тетрис – пример реализации игры, записывающей рейтинг. Скачать »
Я думал я ещё совсем плох в ЭкшнСкрипте, раз ничего не понимаю в этом коде.

wvxvw 12.05.2010 22:13

Какой ужас...

XDiaBLo 12.05.2010 22:20

Цитата:

Сообщение от wvxvw (Сообщение 907796)
PS. Замыкание в ОО языках не имеет никакого смысла. Для того, чтобы оно имело практический смысл, нужен другой подход и другое окружение... Тут нет никаких возможных скрытых причин и оправданий, просто откровенное ***** в чистом виде.

Возможно вы имеете в виду функциональные языки? :)


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

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