Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Каркас для Event-Driven программирования

Anna | 4.06.2014 | нет комментариев

Чем дольше я программирую, тем огромнее мне нравятся слабосвязанные системы, которые состоят из большого числа разрозненных единиц (модулей), ничего не знающих друг о друге, но полагающих существование других. Такие системы в идеале обязаны собираться аналогично конструктору, без зависимостей и без адаптирования друг к другу. В идеале, в процессе работы такой системы, все нужные задачи обязаны выполняться без остановки системы, простым вступлением нового модуля в мир (скажем, вбросом jar’ника в classpath), и система незамедлительно начнет взаимодействовать с новым модулем.
В связи с этим, дюже притягательно выглядит парадигма event-driven (либо Событийно-ориентированное) программирование.

Его неоспоримым плюсом является то, что не необходимо править присутствующий код при добавлении либо удалении какого-то модуля, система непрерывно продолжит трудиться, мы легко приобретем либо утратим часть функциональности.
Нужно оговориться, минусом является его же плюс — непредвиденность поведения при изменениях, а также ослабление контроля над системой в целом (кто повинен, отчего работает не так?) — в различие от традиционного программирования, где система реагирует на сходственные аномалии неотлагательно и жестко, с указанием причин (необходимый модуль не обнаружен).

Для чего менять обычии

В какой-то мере событийно-ориентированное программирование проявляется всюду — от современных многозадачных ОС, до всяческих фреймворков. Взамен того, Дабы всякий участник (модуль) слушал все события, он подписывается только на те, какие ему увлекательны, тем самым потребляя поменьше машинных источников. Вообще-то, даже вызов способа на объекте дозволено воспринимать как синхронную посылку-прием сообщений с гарантией доставки и приобретения. Так для чего лишние трудности?
Результат в том, Дабы все работало при любом исходе. Нас не волнует, кто получил наше сообщение, сколько получателей, и ответит ли он вообще. Мы легко мягко уведомляем. Никому не увлекательно — и хорошо. Увлекательно — вот и отменно, трудимся дальше.

Реалии

Скажем, та же событийная система в Java Swing. Дабы слушать какие-то события, для всякого компонента есть способы addXXXListener, removeXXXListener. Для посылки таких сообщений есть способ fireXXXEvent. Все восхитительно. Но, скажем, мы в той же философии пишем свой компонент. И хотим посылать многообразные события либо реагировать на них, с сохранением инкапсуляции. Следственно, доводится всякий раз реализовывать эти способы для всякого ХХХ события, для всякого компонента…

Решение

Код неизменно до омерзения схожий, потому хотелось бы его заменить на несколько строчек. Подумал я, и в выводе не одного дня реализовал хелпер для таких задач. Это будет класс со статическими способами, тот, что дозволено вызывать из всякий точки программы. Выходит, что нам необходимо?
Во-первых, мы хотим реагировать на всякие события. Пускай, для определенности, наши события будут реализовывать типовой интерфейс java.util.EventObject, а слушатели будут реализовывать интерфейс java.util.EventListener. Так, с одной стороны, мы ничем не ограничены, а с иной — максимально легко связать это с событийной парадигмой AWTSwing. Тогда, вероятно, подписка на событий должна выглядеть так:

public static synchronized void listen(final Class<? extends EventObject> event, final EventListener listener);

 

Наивная реализация выглядит так:

		if (!Events.listeners.containsKey(event)) {
			Events.listeners.put(event, new ArrayList<EventListener>());
		}
		@SuppressWarnings("unchecked")
		final List<EventListener> list = (List<EventListener>) Events.listeners.get(event);
		if (!list.contains(listener)) {
			list.add(listener);
		}

Так мы выразили свое желание быть в курсе событий какого-то подкласса EventObject, пообещав, что реализуем интерфейс EventListener (он не опредiv>

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB