В этой заметке расскажу, как я использую пользовательские события jQuery (custom events) в своей работе.Читать полностью »
Метка «Events»
Пользовательские события в действии
2014-02-25 в 5:54, admin, рубрики: Events, javascript, jquery, workflow, метки: Events, jquery, workflowDeclarative event binding / handling
2014-02-18 в 8:55, admin, рубрики: coffeescript, Events, javascript, метки: coffeescript, Events, javascriptВсем привет! Хочу показать свой кусочек CoffeeScript для декларативной подписки и обработки событий.
Предистория
У меня 5 лет инженерного опыта, включающего в себя .NET (+forms, +WPF, +.NET MVC), Java (+Swing, +Tapestry5, +Groovy), JavaScript (+CoffeeScript, +Node).
Последний год я активно пишу собственное одностраничное веб-приложение работающее без перезагрузки, (о котором речь будет в следующих выпусках). Вся динамическая часть пользовательского интерфейса создается на клиенте, с сервера приходят только данные. Как часто бывает в UI, я имею дело с деревом компонентов. Разумеется, для организации взаимодействия дерева мне нужен механизм отправки и обработки событий. Я решил написать свой, и не использовать Backbone, или что-то из Google Closure. В любом случае у меня был опыт реализации этюда Слушатель (Listener pattern).
Класс ИспускательСобытий первой версии если ты хотел слушать его — просто записывал тебя в массив слушателей. Когда возникало событие «Ч» он обходил массив, и искал слушателей с методом «наЧ», и вызывал его. Типа как в Swing / .NET.
Все отлично работало для небольшого числа Испускателей. С ростом системы пришла проблема перекрытия имен событий между разными Испускателями. Подписчик выполнял один и тот же метод «наЧ», даже если «Ч» исходило от разных Испускателей. Затем был более привычный для JS, EventEmitter, как в jQuery / NodeJS. Не буду особо затягивать…
Диспетчер событий с фильтрацией по шаблону
2013-11-15 в 9:34, admin, рубрики: Events, php, Программирование, фильтрация, метки: Events, фильтрацияНедавно у меня появилась необходимость в простом и функциональном диспетчере событий. После непродолжительных поисков на Packagist-е я нашел пакет Evenement, который почти полностью подходил под мои требования. Но все же отбор он не прошел из-за двух параметров:
- была нужна возможность порождать события по шаблону;
- интерфейс библиотеки визуально не понравился.
Конечно же, я принял решение доделать и причесать библиотеку «под себя».
Порождение событий по шаблону
Мне нужна была возможность с помощью шаблона порождать нужные события, имена которых представляют собой иерархические ключи (foo.bar.baz
).
Например, для такого списка событий:
some.event
another.event
yet.another.event
something.new
Нужно породить все события, заканчивающиеся на «event». Или начинающиеся на «yet» и заканчивающиеся на «event», и не важно, что в середине.
Читать полностью »
Итоги online конференции ruHaxe 2
2013-07-12 в 21:45, admin, рубрики: Action Script, android, as3, community, cross-platform, Events, haxe, ruhaxe, метки: as3, community, cross-platform, Events, haxe, ruhaxe
6 июля 2013 года в 13:00 по Москве(10:00 по Гринвичу) состоялась вторая online конференция ruHaxe.
(отчёт о первой конференции)
Доклады были настолько интересны, что оторваться от трансляций было невозможно, и если на первой темы были посвящены больше программированию, то в этот раз были затронуты довольно специфичные вопросы.
Построение масштабируемых приложений на TypeScript — Часть 2.5. Работа над ошибками и делегаты
2013-07-01 в 21:19, admin, рубрики: Events, generic, javascript, TypeScript, Веб-разработка, Программирование, метки: delegaте, Events, generic, TypeScript Часть 1: Асинхронная загрузка модулей
Часть 2: События или зачем стоит изобретать собственный велосипед
К сожалению, московская жара серьезно повлияла на мою внимательность во время написания второй части статьи, что привело к одной неприятной ошибке — неправильной типизации параметров обобщенного класса событий, которую призван исправить данный пост.
Но просто написать работу над ошибками было бы не интересно. К счастью, процесс ее исправления сам по себе подкинул пару интересных находок и мыслей, которые я хотел бы вынести на суд сообщества.
Итак, мой WinAmp играет коллекцию хитов Ozzy Osbourne, а всех интересующихся прошу под кат.Читать полностью »
Event/Observer в Magento
2013-06-25 в 8:08, admin, рубрики: Events, Magento, Observer, php, электронная коммерция, метки: Events, Magento, Observer, PHPПривет! Хотел бы поделиться с тобой небольшой заметкой по кастомизации Magento. С данной системой работаю не так давно, но уже успел написать несколько модулей(модуль платёжной системы, добавление custom-полей, etc.). Сама система предлагает несколько способов модификации своего поведения:
- Переписывание классов в самой системе
- Копирование из app/code/core в app/code/local с последующим изменением
- Rewrite через XML файл модуля с наследованием родительского класса
- Система событий(Event) и наблюдателей(Observer)
В данном посте я расскажу о способе применения последнего метода. За подробностями прошу под кат.
Читать полностью »
Несколько «плюшек» для Symfony 2 && Doctrine
2013-04-15 в 14:30, admin, рубрики: doctrine, Events, symfony2, Песочница, метки: doctrine, Events, symfony2В этой статье пойдет речь о том, как можно решить некоторые проблемы в Symfony 2 и Doctrine, используя базовые компоненты из коробки, а именно:
- Внедрение сервиса в модель
- Сохранение истории изменения
- Отключение SQLLogger и чистка кеша
- Разделение environment (dev — console)
Objective C. Практика. События и «мертвые» объекты
2013-02-04 в 9:23, admin, рубрики: event handling, Events, обработка событий, события, метки: event handling, Events, objective-c, обработка событий, событияМногие, вероятно, знают, что при работе с событиями изменения свойств с помощью key-value observing существует очень удобный механизм, предотвращающий появление в приложении «метрвых» объектов, которые представляют собой получателей вызовов. В действительности, первый же мертвый объект «валит» приложение, при поступлении ему события — это закономерно, так как объект уже не существует и никаких методов вызвать у него уже не получится.
Поиск таких объектов мог быть затруднен, если бы не замечательная в отладке вещь под названием NSKVODeallocateBreak
, которая позволяет прервать выполнение приложения в момент, когда уничтожается объект, подписанный на события, чтобы отследить время его жизни и убрать проблему.
В процессе работы над классом, который я использовал для событий, мне захотелось создать аналогичный механизм, так как ошибки в событийной логике довольно сложно прогнозировать, и страховка здесь не помешает.
Данная статья рассчитана на разработчиков, имеющих опыт работы с платформой и знающих, каким образом определяется жизненный цикл объекта. Если у вас есть определенные пробелы в этой области (а я неоднократно встречал даже опытных разработчиков, которые не знают, каким образом работает счетчик ссылок и не представляющих, во что разворачивается @synthesize
), то вы можете прочитать мою старую статью, посвященную исследованию данного вопроса. Остальных прошу к столу.
Objective C. Практика. События
2013-02-04 в 8:09, admin, рубрики: event handling, Events, обработка событий, события, метки: event handling, Events, objective-c, обработка событий, событияСобытийно-ориентированная логика в Objective C держится на трех китах — протоколы, notification center и key-value observing. Традиционо протоколы используются для расширения функционала базовых классов без наследования, key-value observing – для взаимодействия между визуальной и логической частью приложения, а notification center — для обработкий событий пользователя.
Естественно, все это благообразие можно спокойно использовать для построения сложных приложений. Никакой реальной необходимости в изобретении собственных велосипедов, конечно же, нет. Однако мне, как человеку пришедшему в разработку Objective C приложений из мира .NET, показалось очень неприятным то, что notification center, который я планировал использовать для событий, разраывает стек приложения, записывая произошедшее событие в очередь в UI thread, а протоколы в классическом представлении не слишком удобны, посему для удобства я решил соорудить себе механизм, который был бы гораздо больше похож на то, чем мы привыкли обходиться в мире .NET. Так родился родилась идея реализации модели множественных подписантов через специальный класс, названный AWHandlersList.
Данная статья рассчитана на программистов, которые имеют определенный опыт в создании приложений на Objective C и уже писали подобные велосипеды, либо решали похожие задачи стандартными способами. Данный вариант не является silver bullet, но показал себя как удобный механизм, минимизирующий написание кода для обарботки множеств событий с разными интерфейсами и параметрами.
Методика проектирования CORE
2012-12-25 в 11:37, admin, рубрики: agile, Core, Events, ненормальное программирование, ооп, Программирование, событийное программирование, метки: Core, Events, ооп, событийное программированиеЯ работаю программистом более 5 лет (web), и хотел бы поделиться методикой, которая экономит силы, время и помогает автоматизировать процесс проектирования.
Методика основана на объектно-ориентированном проектировании, но несколько необычна. Зато имеет очевидные плюсы:
— в идеале, программирование по CORE сводится к описанию задачи (код близок к бизнес-логике)
— чётко разделяет систему на слабосвязанные компоненты
— легко автоматизируема, позволяет генерировать осмысленный код
Почему методика называется CORE и как это расшифровывается? Отчасти потому, что у меня тяга к красивым названиям. По буквам:
Context — контекст вычислений (что инициировало вычисления)
Object — объект, который производит вычисления
Request — действие, которое нужно совершить, чтобы объект смог продолжить вычисления
Event — событие, которое происходит с объектом
Плюсы по сравнению со стандартными способами разработки:
— ускорение стадии проектирования за счёт формализованной схемы проектирования
— ускорение стадии разработки за счёт умной генерации кода
— автоматизация создания юнит-тестов
— неглючная реализация бизнес-логики практически любой сложности
— простая поддержка кода
— простота совместного владения кодом
Минусы стандартных способов по сравнению с CORE:
— часто нельзя окинуть одним взглядом всю часть системы
— нужно самому продумывать когда и в каком месте будут вызываться обработчики тех или иных действий. CORE разруливает вызовы автоматически.
— часто вводятся дополнительные уровни абстракции, не связанные с бизнес-логикой, чтобы реализовать её особенности. в CORE это не нужно.
— программист часто совершает кучу однообразных действий, которые легко можно автоматизировать
— юнит-тестирование внедрять тяжелее