![]() |
Экземпляр какого класса придет в листенер. Часть 2
На самом деле это продолжение старого топика. Но старый топик стал таким запутанным, что я решил подвести итог и начать новый топик.
Итог: Пример: Человек может купить собаку. При этом он посылает кастомное событие, в котором лежит собака. Код AS3:
Для решения проблемы можно отнаследовать ManEvent от TransportEvent и посылать в слушатель именно ManEvent. Код AS3:
|
Зачем вообще наследовать события? Вполне достаточно унаследовать свой класс от базового класса Event и не городить никаких длинных цепочек.
И зачем передавать эту собаку в конструкторе? Можно сделать у события публичное свойство dog и передавать его туда. п.с. не стоило создавать новую тему |
По всему проекту разбросаны кучи однотипных классов.
Код AS3:
Я решил удалить все эти классы, и создал TransportEvent, который несет нетипизированный объект. |
Цитата:
Цитата:
Добавлено через 7 минут у пришедшего события (TransportEvent) будет type == ManEvent.I_BOUGHT_DOG |
С помощью метатегов event мы можем указать редактору кода, какие события может отправлять Man.
А как узнать какой объект придет в слушатель, не залезая в Man? |
Цитата:
Если есть Man и ManEvent, то не должен Man отправлять никаких TransportEvent. Он должен слать ManEvent, чтобы все было интуитивно понятно. |
Цитата:
|
Цитата:
Код AS3:
caseyryan, я описал тут почему я хочу попробовать новый подход. |
Цитата:
Зачем нужно посылать TransportEvent, пытаясь его выдать за ManEvent, когда можно просто сделать свойство в TransportEvent публичным, и оно будет доступно как в ManEvent, так и в TransportEvent и в других местах, где есть доступ к объекту ManEvent или TransportEvent. Что мешает сделать так? Код AS3:
|
Пусть будет публичное. Это никак не влияет на суть вопроса.
Зачем у вас класс ManEvent расширяет TransportEvent? Что он умеет нового по сравнению с TransportEvent? |
Цитата:
А расширяет TransportEvent для того, чтобы унаследовать от него свойство dog Даже если бы он вообще ничего не умел нового и констант не содержал, он все равно должен был бы быть, потому что Man должен посылать ManEvent, а не какой-то там TransportEvent. Вообще, исходя из вашей логики, не надо создавать вообще никаких лишних классов. Можно весь код писать в одном полотенце Main и не париться, аккуратно раскладывая все по полочкам. Программе пофиг аккуратно там все написано или названия классов и свойств вообще обфусцированы. Все это делается исключительно для удобства чтения программистом. |
Цитата:
Цитата:
|
Что ж, удачи тогда с изобретением новых концепций)
|
Цитата:
Код AS3:
Ну или разные слушатели для разных типов событий. |
Цитата:
Цитата:
Проблема вобщем в том, что addEventListener принимает подозрительную строку а не тип События. И этого нам не исправить, увы (иногда не увы а ура, но здесь кажется увы). Вцелом я вообще не вижу никакой проблемы, кроме "мы ожидаем", потому что "мы" же и использовали константу из другого класса. Ну так не ожидайте. Во всех случаях, когда мы используем обычный Event со своим строковым типом, мы имеем ровно эту проблему — подписываемся на какую-то левую строку, а получаем в хэндлер стандартный Event. И все довольны. Либо напишите пресловутый ManEvent extends TransportEvent, как советует Кейси. Только наверное нет смысла добавлять к "грузу" еще и "собаку"))))) |
Цитата:
caseyryan приписал мне: Код AS3:
После чего я приписал ему интерфейсы. |
может вообще не стоит использовать классы событий, если нет четкого понимания как и зачем это делать)
передавайте через общую шину событие buyPet, единсвтенное можете расширить Event до datEvent, и уже в data пихаете все что нужно. Мне кажется проблема в первую очередь в архитектуре, но однозначно сказать не могу по этому отрывку кода, но слишком все усложнено и запутано. |
Цитата:
Цитата:
|
Дело не в принципе работе событий, а понимании целей их типизации. Вы сами видите что получается сложно и запутанно - это сразу должно настораживать. У transportEvent та же проблема, семантически не отражает своей сути (если это просто dataEvent) . Если пользователь купил собаку, то в системе должно быть сгенерировано что-то типа addPet, это логично что где-то понадобится обрабатывать целый класс событий, а не отдельно рождение кошек, собак, поросят.
Но не видя игры целиком - это опять же мое предположение |
faraday, вся эта тема, и предыдущая его тема тоже, попахивает каким-то троллингом (кого-то он мне напоминает, из уже неоднократно забаненных на форуме). Чувак либо вообще нифига не понимает и не хочет понимать, либо специально делает вид, что не понимает. Ему уже и так все досконально разжевали что, как и зачем. В итоге вся тема стоит на том же месте, с которого началась.
|
caseyryan, зато поугарать можно, а то порой тишина зависает, днями никто ничего не постит :D
P.S. Недавно когда кому-то хотел ответить, не помню кому уже, чуть не написал "Akopalipsis, это не вы, случаем?)"... Больно напоминал) |
// опаздун
посмотрев незамутненным взглядом на топик (и частчно предыдущий), что могу сказать: чувак хочет на самом деле очень простой вещи: чтобы после подписки листенера на определенный тип события в коде реализации этого листенера аругмент-событие имел тот же тип, что и в подписке, автоматически, а не дефолтный Event или что ты там впишешь ручками. Типа глянул на листенер и видишь, на какой конкретно тип события он подписан согласно подписке. Т.е. речь идет о чем-то вроде макроса, сниппета или как бишь там оно зовется....автогенерилка кода, короче. В студии мелкософта нечто подобное имеет место быть, кстати. А наследование и проч. тут вообще не при чем. |
У меня было следующее соглашение с самим собой:
То есть когда я пишу Код AS3:
Код AS3:
а если я пишу Код AS3:
Код AS3:
По поводу изначального вопроса, я не знаю правилен ли мой новый подход. Так как обсуждение целиком свелось к вопросам архитектуры, я наверно буду разбираться сам, т.к. архитектуру на форуме обсуждать долго и трудно. |
Зачем это? Это же не логично... TimerEvent.TIMER смотрится уж куда лучше, чем TimerEvents.TIMER.
Добавлено через 23 минуты К тому же подобный код обещает быть неоднородным. Добавлено через 26 минут Вдруг вы в одном месте напишете TimerEvents, а в другом без s, выйдет каша из "новых" и "старых" подходов. |
Цитата:
Цитата:
|
Такой подход не предусматривает пуш-события.
Что, если вы захотите передать вместе с событием новые/обновлённые данные? Как вы их в Event засунете? Или вы всё таки превратить код в кашу и там использовать одно, а там другое. Отсылайте тогда уж DataEvent. |
Если мне нужно передать какие-то данные в событии, то я создаю кастомное событие в названии которого нет "s" на конце.
Для меня большей кашей кажется Цитата:
|
ZackMercury, не надо представлять везде DataEvent как панацею. Обнаружьте уже с удивлением, что data у него всего-лишь String, и никакие ссылки на объекты это событие таскать не может.
callme, создать список констант или создать кастомное событие, отличающееся от Event только расширенным списком констант и говорящим названием — технически разницы почти никакой, а в плане организации кода однозначный профит — подписываться на тип из ManEvent и получать в обработчике event:ManEvent — это идеально. Есть еще третий вариант — хранить константы в классе отправителя, но это уже компромисс (Man.I_EAT_MY_DOG). Списки констант (то есть классы в которых ТОЛЬКО списки) хороши, как легкое связующее между системами, которые не должны иметь жесткой связности (например, в MVC Вью не должна импортировать класс Модели, но должна как-то подписаться на ее события. Интерфейс Модели предоставляет Вью геттеры данных, но никак не может описать События. И их (Вью и Модель) приходится связывать либо классами кастомных Событий — то есть и Вью и Модель импортируют в себя одни и те же классы Событий — либо легким списочком строковых констант, используя при этом стандартный Event). Городить списки, которые наоборот только создают неразбериху нет никакого смысла. |
Wolsh, спасибо. Смирюсь с этим глупым наследованием, все равно класс порождать для констант.
Вопрос по MVC. Мы же во вью все равно завяжемся на классы, в которых константы лежат? |
Цитата:
|
Wolsh, я так и подумал, но лучше было узнать точно.
Спасибо, эта информация намного интересней, чем ответ на мой изначальный вопрос :) |
| Часовой пояс GMT +4, время: 23:48. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.