Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Функции внутри функций - почему это зло? (http://www.flasher.ru/forum/showthread.php?t=117508)

chingachgoog 28.11.2008 13:51

А по-моему, если что и называть пренебрежительно "костылем", то как раз сам Delegate.

etc 28.11.2008 14:03

И то и другое костыль, но self-ссылки — костыль в несколько раз больше, и не один.

iNils 28.11.2008 14:16

Цитата:

Сообщение от __etc (Сообщение 780279)
И то и другое костыль, но self-ссылки — костыль в несколько раз больше, и не один.

Абсолютно согласен. Преимущество делагата в том, что мы не меняем область видимости this в любом месте класса.

faust.d503 28.11.2008 14:22

Цитата:

Да, но тогда анонимная функция с большой вероятностью останется жить, потому что есть self-ссылка, используемая внутри.
self объявлено внутри конструктора, анонимная функция существует там же. Как они остануться жить после выполнения кода констуктора мне с трудом понятно.
На self ссылка после выполнения конструктора убивается, остается ссылка внутри безымянной функции, на которую ссылка отсутствует, по идее должна убиться.
Как и что убивается при использования Delegate мне неизвестно, если известно вам, поясните пожалуйста.
А вообще рассуждения "с большей вероятностью" чистая демагогия.

iNils 28.11.2008 14:35

Цитата:

Сообщение от faust.d503 (Сообщение 780287)
self объявлено внутри конструктора, анонимная функция существует там же. Как они остануться жить после выполнения кода констуктора мне с трудом понятно.
На self ссылка после выполнения конструктора убивается, остается ссылка внутри безымянной функции, на которую ссылка отсутствует, по идее должна убиться.

Все поубивались после конструктора. И куда же тогда придет сообщении о загрузке?

chingachgoog 28.11.2008 16:11

А что вообще делегат делает? Возвращает функцию оболочку с нужной функцией вызова apply:
Код:

class Room {
        public function Room() {
                xmlDoc = new XML();
                xmlDoc.onLoad = function (){                   
                        return onLoadXML.apply(this, arguments);
                }
        }
        private function onLoadXML (success){}
}

По-любому генерится лишняя функция.

etc 28.11.2008 16:16

Цитата:

Сообщение от chingachgoog (Сообщение 780310)
Код:

                        return onLoadXML.apply(this, arguments);

Ага, только в этом коде область видимости не изменится.

Цитата:

Сообщение от chingachgoog (Сообщение 780310)
По-любому генерится лишняя функция.

Так она генерится в обоих костылях.

chingachgoog 28.11.2008 17:29

Цитата:

Сообщение от __etc (Сообщение 780311)
Ага, только в этом коде область видимости не изменится.

Да, это просто схема работы делегата. (код нерабочий, если кто не понял. Чтобы сделать его рабочим надо добавить ссылку на функцию onLoadXML. Например, так: xmlDoc.onLoadXML=onLoadXML)
Но суть в создании лишней функции-оболочки.

etc 28.11.2008 19:18

Цитата:

Сообщение от chingachgoog (Сообщение 780342)
Чтобы сделать его рабочим надо добавить ссылку на функцию onLoadXML. Например, так: xmlDoc.onLoadXML=onLoadXML)

Опять же, this внутри onLoadXML будет ссылаться на xmlDoc, а не на экземпляр Room. Снова область видимости будет неправильной.

chingachgoog 28.11.2008 19:38

Цитата:

Сообщение от __etc (Сообщение 780371)
Опять же, this внутри onLoadXML будет ссылаться на xmlDoc, а не на экземпляр Room. Снова область видимости будет неправильной.

Наоборот, правильной. Вместо вымученной делегатом.
Сразу видно, что обработчик onLoad принадлежит объекту xmlDoc и соответственно this внутри обработчика принадлежит xmlDoc.

Код без делегатов более понятный и логичный. Не зря же делегаты - пользовательский класс, а не встроенный.

etc 28.11.2008 20:13

chingachgoog, боже мой, вы снова начали гнуть свою извращенную линию мысли.
Любой метод, описанный в классе, обязан вызываться в области видимости этого класса, без вариантов. Если вы считаете иначе — ваши проблемы.

iNils 28.11.2008 20:24

Цитата:

Сразу видно, что обработчик onLoad принадлежит объекту xmlDoc и соответственно this внутри обработчика принадлежит xmlDoc.
Любой нормальный редактор на this вам выдаст автокомплитом свойства/методы класса, а не xml. А mtasc начнет ругаться на несоответствие типов.

Цитата:

Сообщение от chingachgoog (Сообщение 780373)
Код без делегатов более понятный и логичный. Не зря же делегаты - пользовательский класс, а не встроенный.

Может вам и понятный. А программистам нет, поэтому в as3 делегат уже не нужен, там область видимости не меняется.

chingachgoog 28.11.2008 20:40

Цитата:

Сообщение от __etc (Сообщение 780380)
Если вы считаете иначе — ваши проблемы.

А у меня проблем нет - я знаю, на что у меня в каждом конкретном случае this ссылается.

Цитата:

Сообщение от iNils (Сообщение 780382)
Может вам и понятный. А программистам нет, поэтому в as3 делегат уже не нужен, там область видимости не меняется.

То что в AS3 нет вымороченных делегатов, как раз и говорит, что они программистам были непонятны. Впрочем, в AS3 своих "делегатов" хватает...

iNils 28.11.2008 21:05

Цитата:

Сообщение от chingachgoog (Сообщение 780383)
То что в AS3 нет вымороченных делегатов, как раз и говорит, что они программистам были непонятны. Впрочем, в AS3 своих "делегатов" хватает...

Прекращайте нести чушь.

etc 28.11.2008 23:27

Цитата:

Сообщение от chingachgoog (Сообщение 780383)
А у меня проблем нет - я знаю, на что у меня в каждом конкретном случае this ссылается.

Пока вы пишете и видите свой код только у себя в каморке на коленке — пожалуйста. Но показывать свой код, а тем более учить других писать в подобной форме я вам настоятельно не рекомендую. И упаси боже кому-нибудь придется модифицировать ваш код. Лучше сразу повеситься.

Цитата:

Сообщение от chingachgoog (Сообщение 780383)
То что в AS3 нет вымороченных делегатов, как раз и говорит, что они программистам были непонятны. Впрочем, в AS3 своих "делегатов" хватает...

Бред.


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

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