Форум 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. Замыкание в ОО языках не имеет никакого смысла. Для того, чтобы оно имело практический смысл, нужен другой подход и другое окружение... Тут нет никаких возможных скрытых причин и оправданий, просто откровенное ***** в чистом виде.

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

udaaff 12.05.2010 22:24

wvxvw, какой-то ты агрессивный стал :) Скоро буду бояться свой код тут постить :D
Там, кстати, все примеры такого уровня. Это же и их компонентов касается.

XDiaBLo, разбирайтесь сразу, непосредственно, с их api. Быстрее получится, чем по этим примерам.

XDiaBLo 12.05.2010 22:29

Я попробую. Возьму у них из примеров только исходник MD5.as и может ещё какие-то мелочи, и попробую сделать свою библиотечку. Хотя я нашёл несколько библиотек по использованию API Vkontakte, надо будет их тоже заценить, может там более достойные примеры найдутся, тем более что одна из них даже прилично закомментирована.

wvxvw 12.05.2010 22:42

XDiaBLo
Функциональные, или такие в которых существует возможность создавать или, как минимум переопределять функции первого порядка (например в C++ / C# это тоже можно). Яваскрипт и AS3 никакого отножения к этим языкам не имеют.

udaaff
Ну, смотри, если бы это был код человека, который учится или еще что-то в этом роде - то, ну ладно, все делают глупости, но это же выкладывается в качестве примеров!

Котяра 12.05.2010 22:55

Цитата:

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

Когда я написал практически аналогичную фразу на хабре в коменте про java 7 - (о введении там кложуров) меня жутко заминусовали))))
Замыкания вещь хорошая, но это наподобие рычага катапульты в самолёте.
Вещь нужная, но лучше никогда не использовать - только по строгому назначению.
Цитата:

Сообщение от XDiaBLo (Сообщение 907802)
Возможно вы имеете в виду функциональные языки? :)

скорее не языки а парадигму. можно и на AS3(JavaScript/Java) реализовывать алгоритмы с ф-циональной парадигмы (во всяком случае попытаться)
Можно описать отдельный независимый алгоритм (например какую-нибудь сложную мат. ф-цию) и включить его в ООП структуру. Пихать замыкания в ООП структуру, просто потому что можно их запихнуть - плохо.

wvxvw 12.05.2010 23:15

Цитата:

Here is the same example rewritten in ECMAScript (JavaScript), another popular language with support for closures:
Это взято из википедии :) Так что идиоты на хабре не одиноки, и они еще и энциклопедии пишут :)

Gaen 13.05.2010 00:11

Да, это замыкание. Почему этим не стоит пользоваться, wvxvw все популярно объяснил. По той же причине не стоит пытаться "передать параметр в обработчик события", как хотят многие начинающие.

Котяра 13.05.2010 00:17

вопрос в том что путаются понятия: язык и парадигма (что-то очень часто я пишу за сегодня это страшное слово))
ECMAScript, с#, java - языки в основе своей основаны на ООП, но поддерживают ФП (здесь, П== парадигма)
http://progopedia.ru/paradigm/
Кстати - там нет про AS2/3 и haxe - нужно ликвидировать пробел.

BlooDHounD 13.05.2010 02:50

самое страшное, что это это замыкание в итоге конвертируются в ООП. и под него генерируется класс Контекст, в внутри, которого в виде кучи говна свален весь скоуп вызова =)

это конечно не точно, но предположение основано на количестве занимаемой памяти объектом в итоге.

Psycho Tiger 13.05.2010 11:36

Жесть какая)) А в каком виде там представлен скоуп? Если он компилируется в ООП, то наверное его можно повторить и руками... хочу знать, как делать ненужно )

i.o. 13.05.2010 17:04

Цитата:

Если он компилируется в ООП
не знал, что есть такой компилятор))

BlooDHounD 14.05.2010 00:39

Psycho Tiger, я вот не понял ... а что в этом сложного? и что Вам не понятно?

Psycho Tiger 14.05.2010 19:55

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

wvxvw 14.05.2010 21:01

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

Psycho Tiger 15.05.2010 21:05

А, стало понятно =) Спасибо.


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

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