А потом. Скажем. ТЗ Как пользователь я хочу уметь рисовать отрезки. Нажатие левой кнопки мыши отмечает начало отрезка. Движение мыши после нажатия с удержанием левой кнопки мыши рисует промежуточный результат. После того как кнопку отпустили, отмечается конец отрезка. Данные посылаются на сервер. Сферический код в вакууме my. Drawing. Board. Starting. Point. Line. oncemouseup, set. Ending. Point. Lastsave. Figure. По крайней мере, так этот код выглядел у меня в голове. Нечто подобное я видел на j. Query Russia этой весной, где реализация была натянута на Rx. Увы, возможности просмотреть видео или пообщаться с докладчиком у меня не было, а посему пришлось изобретать велосипед самостоятельно. Поболтав с коллегами, я пришел к выводу, что сама задача это конечный автомат. А мой код требует небольшого колдовства над этим самым автоматом, поскольку события надо отслеживать над какими то регулярно существующими нодами, но перехватывать надо далеко не все эти события, а только те, которые нужны в текущем состоянии автомата. Собственно, путем кратковременной медитации над блокнотом, я построил вот такую схему и обозвал ее Flat Event Chain плоская цепочка событий. Каждое состояние представляет собой так называемый Meta. Event малую цепочку событий, состоящую из набора повторяющихся событий типа any и закрывающего одиночного события типа once. Если повторяющихся событий в Meta. Event может не быть, то закрывающее присутствовать обязано, иначе мы никогда не сможем сказать, когда выйти из этого состояния. В данной модели возможны коллизии, когда повторяемые события имеют общий тип. Для этого каждому элементу цепочки присваивается уникальное имя и на уровне метасобытия проходит проверка, каким обработчиком пользоваться. Как только мы решили, какой из элементов будет отвечать за обработку этого события, все предыдущие обработчики уничтожаются. У Вэйсинь Цигун Против Рака подробнее. Когда перехватывается закрывающее одиночное событие, Meta. Event считается выполненным и автомат переводится в следующее состояние. О реализации. Каждый элемент цепочки представляет собой вот такой модуль var Base. Event function type, element, callback, context Как можно увидеть, для событий предусмотрена нотация как в стиле event. Type, так и в стиле. Здесь можно обратить внимание на то, что если callback возвращает false, то машина не поменяет своего состояния. Это не очень красиво, но равно нехорошо было бы пользоваться и evt. Default. По крайней мере, return false в данном контексте никак не повлияет на default обработчик события и его bubbling. Собственно, остается только навернуть это все вокруг State Machine. В качестве оной я воспользовался опенсорсным решением вот отсюда. Event. Chain function element Без лишнего кода вот так выглядит рисовалка прямых линий. Line. Drawer new Concrete. Drawer. extend. У меня для этого написана небольшая цепочка ответственности, таким образом создание нового инструмента для рисования обходится в десяток строк. После того, как прототип был уже готов, я вдруг столкнулся с жутким предположением а что, если заказчику захочется повторять не отдельное событие, но целые паттерны, подцепочки событий. Скажем, достаточно тривиальная задача Фантастическое ТЗ Полигон Как пользователь я хочу уметь рисовать ломаные линии. Нажатие левой кнопки мыши отмечает начало отрезка. Движение мыши показывает промежуточный результат. Нажатие пробела отмечает вершину ломаной. Повторять пункты 2 и 3 до тех пор, пока пользователь не отпустит кнопку мыши, после чего сохранить последний промежуточный результат. В реализованной выше концепции такая задача уже невыполнима по крайней мере, в ней можно описать только определенное количество звеньев цепи, ни никак не произвольное. Внутреннее чувство прекрасного потребовало вот такой стиль return Board. Event. Layer. event. Chain. once. Если представить набор данных о графическом примитиве как множество, то, по сути, код, который мы пишем после event. Chain представляет собой описание операций над этим множеством и их композиции. Возможность добавления повторяющихся событий и паттернов событий добавляет всему этому гибкости, но вообще для какого никакого FRP было бы достаточно и once событий. Однако же в контексте задачи он определенно со своими обязанностями справляется идеально. Очевидно, что его есть куда расширять например, если добавить поддержку promises, можно красиво описывать сложные анимации, а если добавить концепцию равнозначных событий она пока реализована наполовину, позволяя равноценно отслеживать нажатия разных клавиш, можно создавать несложные игры. Ссылки Код на Cloud. Демо на Cloud. 9State Machine. Как преобразовать FRP файл в PDF файл. На этой странице объясняется, как Вы можете с легкостью конвертировать a. PDF файл с помощью бесплатного и простого в использовании PDF2. Creator. Описанный способ конвертации является бесплатным и простым. PDF2. 4 Creator устанавливает PDF принтер, и Вы можете распечатать Ваш. PDF. Что необходимо для конвертации FRP файла в PDF файл или как можно создать PDF версию Вашего FRP файла. Файлы типа FRP или файлы с расширением. PDF с помощью PDF принтера. Отличием от обычного принтера является то, что PDF принтер создает PDF файлы. Вы не печатаете на физическом листе бумаги. Принтер PDF печатает содержимое исходного файла в PDF файл. Просто откройте файл с помощью ридера, нажмите кнопку печати, выберите виртуальный PDF принтер и нажмите кнопку Печать. Если у Вас есть устройство для чтения файла FRP и если ридер может распечатать файл, то Вы можете преобразовать файл в формат PDF. Просто нажмите на кнопку загрузки справа от этой статьи, чтобы загрузить PDF2. Creator. Установите это программное обеспечение. После установки Вы будете иметь новое печатающее устройство, зарегистрированное в Windows, которое можно использовать для создания PDF файлов из Вашего. PDF. Поддерживаемые типы файлов добавляются по мере поступления и, возможно, формат файла FRP также уже поддерживается. Служба конвертации имеет различные интерфейсы. Два из них являются следующими. Онлайн PDF Конвертер от PDF2. PDF. Просто выберите файл FRP, из которого Вы хотели бы получить PDF версию, нажмите кнопку конвертировать, и Вы получите PDF версию файла. Просто отправьте по электронной почте сообщение в службу E Mail PDF Конвертера, прикрепите FRP файл к этому письму, и через несколько секунд Вы получите PDF файл обратно.