Пользовательские события Actionscript 3.0: создавать отдельные классы для разных целей или использовать один для всех? - PullRequest
0 голосов
/ 18 ноября 2009

Я впервые использую пользовательские события в Actionscript 3.0 и не знаю, как их лучше проектировать. Мне нужна пара событий. Некоторые из них должны транспортировать различные виды данных, а некоторые нет. Теперь я не знаю, должен ли я использовать один класс для их реализации или использовать отдельные классы для разных целей. Создание собственного класса событий для каждого вида данных кажется мне немного беспорядочным, поскольку все эти события в основном все равно делают одно и то же. Но мне не очень нравится вариант с одним классом. Этот класс будет нуждаться в универсальной переменной для хранения любых данных, которые также часто не используются. Кроме того, мне нужно будет распечатать все данные, к которым я хочу получить доступ. А что, если иногда нужно перевозить несколько объектов? Какой путь выбрать (по стилю) или есть другой способ, о котором я не подумал?

Ответы [ 4 ]

1 голос
/ 19 ноября 2009

Я подозреваю, что нахождение правильного баланса становится канатом и многое из этого - личные предпочтения, но я всегда чувствовал, что лучше иметь больше событий, чем меньше по нескольким причинам:

1) Оптимизация кода - если вам просто нужно отправить строку, не передавайте ее в объекте - это создает больше сложности, чем вам нужно. Аналогично, если ваша полезная нагрузка данных должна быть огромной и сложной, одного объекта может быть недостаточно. Я думаю, создание различных типов событий на основе полезной нагрузки данных - это минимум.

2) Читаемость кода - да, это сложно в чем-то вроде Cairngorm с миллиардом событий, но знаете что? Я всегда точно знаю, что происходит, и никогда не возникает вопросов о том, откуда оно. Если вы работаете над достаточно большим проектом, чтобы А) другие люди читали ваш код или Б) со временем вы можете забыть, что делает каждое событие, тогда я бы определенно предложил разбить все события на пользовательские классы.

Надеюсь, это поможет!

1 голос
/ 18 ноября 2009

Я думаю, это зависит от контекста. Общие рекомендации Cairngorm - строго ограничивать цели новых событий. Я часто видел взаимно однозначное сопоставление типов событий с классами событий и командами. Это ничего, если не явно.

С другой стороны, FlexEvent имеет множество различных применений, и это (технически) пользовательское событие. Это имеет смысл в его контексте - он обычно функционирует как параллель к событиям рендеринга DisplayObject ...

Если вы просто говорите о новом ТИПЕ события (и не нужно переносить дополнительные данные), не изобретайте колесо заново - событие принимает тип в качестве параметра. Сохраните новый тип в некоторой общедоступной статической константе, а затем используйте ее.

Если вам нужно переносить данные, моя общая рекомендация состоит в том, чтобы по возможности ошибаться или использовать строго типизированные переменные, таким образом вы получите преимущество от ошибок времени компиляции. Если это можно сделать более общим (скажем, IList вместо ArrayCollection), это лучше, но, если не считать этого, чем более явным вы сделаете свой код, тем легче.

0 голосов
/ 18 ноября 2009

На самом деле, как и в большинстве других программ, все зависит от того, насколько легко понять, что происходит. Если проще с одним классом, используйте один, если проще с большим количеством классов, специфичных для конкретного случая, используйте больше.

Actionscript мудро, вы сэкономите несколько байтов, имея только один класс, но лучший способ программирования всегда лучше всего использовать повторно и легче всего понимать код.

Вы также можете добавить столько общедоступных свойств для вашего типа, сколько вам нужно, и назначать или извлекать только то, что вам нужно, вместо того, чтобы иметь одно свойство общих данных.

0 голосов
/ 18 ноября 2009

Я думаю, достаточно использовать один пользовательский класс событий.

<code>public class CustomEvent extends Event {
  public var data:Object;
  public function CustomEvent(type:String, cData:Object) {
    super(type, true);
    this.data = cData;
    return;
  }
}
И во время передачи любых пользовательских событий данные передаются через объект данных.
<code>dispatchEvent(new CustomEvent("eventWithData", {somedata:value, somemoredata:value}));
...