![]() |
Цитата:
Сам спросил — сам ответил. |
Цитата:
|
Цитата:
Пока что было приведено три довода. 1) Удобство отключения слушателя для множества объектов. Ну я показал, как это делается без костылей, стандартными методами ActionScript, созданными как раз для этого. 2) "то как реализовано у меня больше похоже на полиморфизм". Полиморфизм имеет очень четкое определение, на него не может быть "похоже". Полиморфизм это когда объект одного типа может быть безопасно заменен объектом другого типа. Например в addChild() вы можете передать как Sprite, так и TextField. То, что Вы одну Function заменяете на другую Function, к полиморфизму никакого отношения не имеет. Поскольку в ActionScript отсутствуют шаблоны типов, функции не могут быть "типизированы", то есть их сигнатура не может быть гарантирована непосредственно, а только через интерфейс объекта-хозяина. Если в вашу кнопку передать метод, требующий параметры, произойдет исключение. И механизма контроля нет. Именно поэтому в ActionScript коллбэки нарушают ООП. В языках с шаблонами типов этой проблемы нет, и там использование коллбэков никого не напрягает. Если хотите поддержку из мира ООП, ссылайтесь не на полиморфизм, а на паттерн Command (Action). Вот от него тут есть что-то)) 3) Страничка из Мука. Централизация не значит "коллбэки". Более того, централизация не значит "централизация всего и вся". Есть (должна быть) иерархия, в этом суть ООП, в разделении на объекты с ответственностью. Вы пытаетесь всю ответственность отдать одному классу. Это сломает иерархию и все ее плюсы. В приложении должны быть выделены несколько модулей. Каждый отвечает за какой-то функционал. Допустим есть Меню, есть Статья, есть Галерея фоток. Каждый из этих модулей должен иметь свою специфическую логику, работая со своими частями. Главный класс вовсе не обязан знать все о картинках галереи и разбираться с их поведением. Он "общается" с Галереей, а Галерея управляет картинками. Вот в отношениях Галерея > картинки безусловно хороша централизация. Нет смысла вешать слушатели на каждую картинку, потому что действия идентичны. А если действия разные, централизация превращается в батарею свитчей и такие прелести ООП как повторное использование, расширяемость, абстрактность и полиморфизм исчезают навсегда. Пока у вас только кнопки, то есть все фигуранты одного типа, все нормально выглядит. Когда Мейн будет ловить и обрабатывать клики и от кнопочек Меню, и от картинок Галереи, вам никакая страница Мука не поможет, ибо это по ту сторону логики, и Мук туда не хаживал. Не цепляйтесь за буквы, выдранные из контекста. Добавлено через 2 минуты Пока писал, целую страницу накатали)) Рад что стало походить на диалог. |
Прошу прощения - не скажу ничего нового, но все же замечу: как много тем на форуме (да и мною поднятых в том числе) напоминают анекдот про Шварцнегера и бензопилу (я уже по моему писал где-то). Странные люди упорно не желают использовать даваемые им инструменты как положено, а пытаются делать все через южное полушарие. В данном случае я про событийную модель.
|
И это хорошо.
Сигналы - это тоже альтернативный велосипед. Правда списанный с сишарп и QT. Но ведь хороший велосипед. |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
у меня кнопки нажимаются мышкой, одновременно можно мышкой нажать только 1 кнопку (потому что только один курсор). Различия скорости выполнения в наносекундах в данном случае не критичны
|
Мне вот больше интересно другое.
Мы в кнопке подписываемся на клик, чтобы вызвать метод, который передали в кнопку по ссылке. А почему нельзя сразу подписаться на клик с нужным методом? |
Кто "мы"? Ты про что? Речь как раз о централизации, то есть никакая кнопка никаких отношений с кликами не имеет. Подписывается контейнер (в случае автора - стейдж).
Добавлено через 9 минут Кнопка хранит примитивную Command/Action. Это то же самое (типа), что хранить id, и потом в Большом Центральном Кликоразделителе выуживать этот id у таргета и по нему определять метод, который запускать (что конечно было бы приятней, так как дает больше свободы с параметрами). Если сделать подписку и execute() внутри кнопки, то есть она сама ловит клик по себе и запускает акцию, то это потребует еще кучу наворотов для контроля состояний кнопки в зависимости от ситуации с приложением. Это такая децентрализация, которая хуже мегацентрализации, имхо, так как будет рождать баг на баге и потребует кучи каких-то сомнительных условий и угловатых стежков. Впрочем, как и обычное решение на событийной модели ;) |
я сделал отдельный класс без конструктора в котором лежат статические хендлеры для кнопок... это правильно?
|
Не правильно. Конструктор есть всегда, даже если не указан явно. Правило хорошего тона - всегда писать конструктор.
|
а он не унаследуется от супер-класса? я с этим классом нигде new использовать не буду, в нём кроме статики ничего не будет
Добавлено через 32 секунды а туплю.. супер класса нету =) |
Правила хорошего тона все равно остаются ;)
|
кароче у меня теперь срабатывают обработчики событий и кнопки в которую тыкнул и спрайта в котором эта кнопка лежит одновременно... как лечить?
Добавлено через 5 минут третий аргумент сделать тру? Добавлено через 7 минут не.... |
надо прототипу спарйта тоже свой action назначить, не? будьте последовательны.
|
я экшины убрал уже
|
Цитата:
|
Цитата:
|
Цитата:
|
Тоже не понял... У Вас теперь подписка И на контейнер, И на каждую кнопку?
|
Цитата:
|
Так если каждая кнопка вызывает свой конкретный хендлер, то зачем общий на контейнере?
Либо, если есть Большой Центральный Кликоразделитель, то зачем каждой кнопке свой конкретный слушатель? Вы уж выберите одно из двух. У меня в том примере слушатель на контейнер повешен с одной целью - отловить событие клика в фазе захвата и остановить его, пока событие не дошло до кнопок в контейнере. А если Вы ловите все события контейнера и потом разбираетесь, что за кнопка породила событие и на основе этого решаете, что делать дальше, то кнопкам и не нужны собственные хендлеры. Это и есть та централизация, о которой говорил Мук. Надо только иметь систему отождествления кнопка-действие. Если отказались от колбэков, то надо либо завести словарь (Dictionary) в котором привязать каждой кнопке нужное действие (если сами действия принципиально разные) или привязать каждой кнопке какой-то параметр, который будет передаваться функции (если действия одинаковые, то есть один метод с разными параметрами).. Либо не заводить Словарь а просто хранить в кнопках этот параметр в поле класса кнопки. |
Цитата:
Цитата:
попробую для разнообразия сделать со словарем еще |
Цитата:
Кроме того, если действия одинаковые, например trace("21"), trace("22") и т.п., то можно просто хранить этот параметр (21, 22) в самой кнопке и иметь один метод, который сделает трейс, а не столько же методов, сколько есть кнопок)))). В общем хендлере получаете ссылку на кнопку (target) и спрашиваете у нее этот параметр. Передаете его в метод. |
| Часовой пояс GMT +4, время: 01:43. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.