Александр Гладыш — Visual editor for business logic in Lua and JS

Yury Yurevich
Yury YurevichProduct Architect at oDesk
Опыт создания
визуальных редакторов бизнес-логики
       для непрограммистов
        на Lua и JavaScript


            Александр Гладыш
           LogicEditor.com, CTO
            ag@logiceditor.com
Что такое «бизнес-логика»?
●   Бизнес-логика — совокупность правил,
    принципов, зависимостей поведения
    объектов предметной области.
●   Иначе можно сказать, что бизнес-логика —
    это реализация правил и ограничений
    автоматизируемых операций.
                                   — Wikipedia
Что такое «бизнес-логика»?




      http://www.flickr.com/photos/danisarda/2868413519/
Как пишется бизнес-логика?

Классика:

→ Придумали
→ Поставили в план программистам
→ Программисты добрались до тикета,
 поругались, что-то написали
→ Потестировали, поняли, что всё не так
→ Поставили в план программистам доработки
→ ...и так ad nauseam
Как пишется бизнес-логика?

Выделенный программист:

→ Придумали
→ Объяснили задачу программисту
→ Программист «сразу» написал код
→ Потестировали, попросили поправить
→ ...и так ad nauseam
Как хочется писать бизнес-логику?

→ Сам придумал
→ Сам реализовал
→ Сразу протестировал
→ Поправил как надо
→…
→ PROFIT!!!
http://www.flickr.com/photos/buro9/299002685
«Почему гейм-дизайнеры
        — не программисты?»

    Профессиональные программисты, помимо
    навыков составления алгоритмов и их
    реализации ещё, как минимум, имеют:
●   Технические знания об используемой
    системе
●   Навыки отладки
●   Навыки командной работы с кодом
Что делать?

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


●   Пустить пользователя в базу
●   Дать ему писать XML
●   Сделать ему бэкофис — админку
Недостаточно гибко!



Рано или поздно любая попытка
абстрагирования логики в данные
 растягивается слишком сильно
          и лопается.
Нужен редактор бизнес-логики!

    Редактируем всю «логику» (алгоритм),
    а не только «данные» (параметры алгоритма)
    При этом нужно обеспечить:
●   приемлемую кривую обучения;
●   приемлемую сложность работы;
●   доступную сложность разработки и поддержки, т. е.
    адекватную гибкость решения.
Как другие решают этот вопрос?
  Несколько классических примеров
StarCraft Campaign Editor triggers




                                     http://www.campaigncreations.org/starcraft/resources/staredit_tutorials/basics_of_ums_mapping
Descent Freespace Editor Events




                                  http://www.hard-light.net/wiki/index.php/File:RTBSampleExpanded.JPG
http://mindstorms.lego.com/en-us/Software/
Lego NXT-G
http://www.macosxautomation.com/automator/index.html
Apple Automator
Что общего?



 Визуальный DSL,
   описывающий
дерево Control Flow
Как это решали мы?
                 Краткая ретроспектива
                 шести поколений идеи


В каждом случае реализация была сделана мной и / или моими коллегами
полностью с нуля, включая графику, для разных заказчиков / работодателей.
Повторно использовалась и развивалась только общая идея о том,
как это должно работать.
Редактор видео-квестов
         (Увы, скриншота не осталось)


Грубо:


Граф из реплик диалогов с возможностью
привязывать к ним видеоряд.


            ~2002–2004, достался в наследство
Редактор квестовых диалогов I, II
Редактор квестов I, II
Редактор магии
Анализ

●   Кто-то предпочитает псевдо-естественный текст,
    кто-то — блок-схемы.
●   Все редакторы принесли существенную пользу.
●   Некоторые оказались абсолютно незаменимы.
●   В ретроспективе ясно, что вместо работы над
    некоторыми следовало нанять скрипторов.
●   Ни один из редакторов первых шести поколений не
    оказался достаточно гибким, чтобы выйти за рамки
    конкретной технологии (движка или даже игры). Но
    такая задача и не ставилась.
Седьмое поколение

 Тулкит для создания
визуальных редакторов
    бизнес-логики
Work in progress
Цели

●   Минимальная стоимость создания новых
    редакторов.
●   Минимальный порог внедрения в «любой» проект
    на «любой» технологии, даже сторонний.
●   Минимальная стоимость поддержки вновь
    созданных редакторов.
●   Достаточная простота освоения и эксплуатации
    этих редакторов их пользователями.
«No silver bullet»

Даже если вы собираете ваши domain-
specific редакторы при помощи идеального
сферического тулкита в вакууме, который
закрывает любые технические вопросы,
вам всё равно нужно ломать голову над
юзабилити каждого конкретного
редактора!
Природа данных редактора
Редактор работает с деревом Control Flow
На основе этого дерева «рендерятся»
(генерируются):
●   UI редактора (у нас — DHTML,
    псевдоестественный текст).
●   Конечные данные (код!), с которым работает
    приложение, для которого сделан редактор.
И то и другое — структурированный
текст.
Дерево
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент
●   Условие
     ●   Булево выражение
          –   «>»
                ●   Получить значение параметра
                      – «Мана»
                ●   «100»
     ●   Список действий
          –   Действие
                ●   Нанести урон по цели
                      –   «/»
                            ● Получить значение параметра
                                ● «Мана»
                            ● «3»
                      –   «Оппонент»
Конечные данные
            для нашего примера
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент


  if self:get_param(MANA) > 100 then
    self:deal_damage_to(
            self:get_param(MANA) / 3,
            self:get_opponent()
        )
  end
Типы нод
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент

●   Если (Boolean), то (ActionList) → Root
●   (Action) [, …, (Action)] → ActionList
●   (Number) > (Number) → Boolean
●   Параметр (ParamID) → Number
●   Мана → ParamID
●   (Пользовательская константа) → Number
●   Нанести урон (Number), цель: (Target) → Action
●   (Number) / (Number) → Number
●   Оппонент → Target
«Схема»
●   Выделенные нами типы нод (плюс
    информация о том, какой тип — корневой)
    определяют правила конструирования
    дерева данных редактора.

●   Будем называть полный набор типов нод
    для конкретного редактора логики схемой
    (данных) этого редактора.
Схема — фундамент для всех
    манипуляций с деревом данных
●   Валидация дерева данных (проверка на соответствие
    схеме).
●   Дефолтные значения («новый документ» и добавление
    новых элементов в старый).
●   Правила генерации UI и конечных данных.
●   Правила работы UI с деревом данных.
Манипуляции с деревом данных
        в редакторе

●   Создать новый документ
●   Добавить потомка
●   Удалить потомка
●   Заменить потомка
●   Переставить потомков местами
Допустимость манипуляций
●   Допустимость выполнения той или иной манипуляции
    для каждой ноды напрямую зависит от того, что можно
    делать с прямыми потомками (первого уровня) ноды
    данного типа:
    ●   в списке действий можно поменять элементы
        местами или изменить их количество;
    ●   а вот поменять в условии список действий и булево
        выражение или же совсем удалить булево
        выражение — уже нельзя.
Классификация типов нод

●   Классифицируем типы нод по тому, как ведут
    себя их прямые потомки.
●   Для краткости будем называть «класс типа
    ноды» «метатипом».
●   Для ясности, будем вместо «тип ноды»
    говорить «конкретный тип ноды».
Метатипы
    Для простоты выберем следующий набор метатипов:
●   literal,
●   value,
●   list,
●   record,
●   variant.
    Если допустить введение «промежуточных» фиктивных
    нод, при помощи типов, основанных на этом наборе
    метатипов можно описать практически любую требуемую
    схему дерева. (Например, list of records of values =
    dictionary of values, variant of literals = enum.)
Literal
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент
●   В примере: «оппонент», «Мана».
●   Нет потомков.
●   Нельзя редактировать.
●   В конечных данных — константная строка.
Value
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент
●   В примере: «100», «3».
●   Нет потомков.
●   В редакторе пользователь задаёт конкретное
    значение для каждой ноды.
●   В конечные данные попадает значение,
    заданное пользователем (возможно,
    предварительно обработанное и в обрамлении
    какого-то текста).
List
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент
●   В примере: список действий (с единственным элементом
    — «нанести урон»).
●   «Произвольное» число потомков одного,
    фиксированного конкретного типа.
●   Пользователь может менять число потомков, заменять
    их, переставлять местами.
●   В конечные данные попадают склеенные один за одним
    значения (с сохранением порядка; возможно, через
    разделитель и с дополнительным текстом до и после).
Record
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент
●   В примере: «если..., то», «параметр», «нанести урон
    …, цель», «>», «/».
●   Фиксированное число потомков заданных
    конкретных типов.
●   Конфигурацию прямых потомков нельзя
    редактировать
●   В конечные данные потомки подставляются в
    заранее определённом порядке (возможно, с каким-
    то текстом до, после и между ними).
Variant
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент
●   В примере: булева операция в «если / то», численная
    операция — величина наносимого урона. (Не были
    детализованы на слайдах с примерами.)
●   Один потомок, конкретный тип которого входит в заранее
    заданный набор.
Пользователь может редактировать конкретный тип потомка.
●   В конечные данные подставляются данные потомка
    (возможно, в обрамлении какого-то текста).
Генерация конкретных данных
           и UI редактора
    И то и другое — структурированный текст.
    Для его генерации:
●   Обходим дерево данных снизу вверх.
●   Получаем конкретный тип и метатип ноды.
●   Текст для листовых нод известен сразу.
●   Для нелистовых нод подставляем текст
    потомков в шаблон текста этой ноды.
Текстовые шаблоны для нод
Если параметр Мана > 100, то
  Нанести урон параметр Мана / 3, цель: оппонент
    Упрощённо, для редактора:
●   Record: Если ${1}, то<br> ${2}
●   List: Ноды списка действий склеиваем через <br>
●   Record: ${1} > ${2}
●   Record: Параметр ${1}
●   Literal: Мана
●   Value: ${1}
●   Record: Нанести урон ${1}, цель: ${2} → Action
●   Record: ${1} / ${2} → Number
●   Literal: Оппонент → Target
Создание конкретного редактора
●   Описываем схему данных (на Lua-based DSL)
●   Из неё генерируем (на Lua):
    ●   Валидатор данных (на Lua, на JavaScript)
    ●   Генератор дефолтных данных (на JavaScript)
    ●   Код редактирования (на JavaScript)
    ●   Код генерации конкретных данных (на Lua)
●   …
●   PROFIT!!!
Почему Lua?
Хорошая поддержка «встроенных» декларативных DSL-ей:
schema:literal "boolean.true"
{
  editor:ui [[True]]
  {
     "<b>True</b>";
     description = [[<i><b>True</b></i><br>
         <hr>
         The boolean constant <i><b>True</b></i>
       ]];
  };
  render:data
  {
     "true";
  };
}
Почему Lua?
Хорошая поддержка Sandboxing'а.
При должной подготовке можно не бояться
работать с данными из недоверенных
источников.

Если аккуратно писать схему, то и
получившийся в результате код тоже можно
запускать безбоязненно.
Почему Lua?




Мы любим этот язык!
За рамками доклада остались
●   Схема второго       ●   Опциональные
    уровня                  потомки
●   Устойчивость        ●   Подходы к
    данных к                интеграции
    изменениям схемы        конечных данных в
●   Области видимости       приложения
●   Внешние и
                        ●   Много-много мелких
    внутренние              фичей для тюнинга
    источники данных        UI.
Итого



demo.logiceditor.com/game_ctor
  demo.logiceditor.com/mini
Вопросы?
ag@logiceditor.com
1 of 52

Recommended

Программирование как способ выражения мыслей. by
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Levon Avakyan
278 views36 slides
Javascript testing by
Javascript testingJavascript testing
Javascript testingTCS bank
485 views29 slides
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) by
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) it-people
361 views17 slides
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD by
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
3.4K views85 slides
Methods for building dialog agents and the technologies we used by
Methods for building dialog agents and the technologies we used Methods for building dialog agents and the technologies we used
Methods for building dialog agents and the technologies we used Grid Dynamics
113 views42 slides
C++ Базовый. Занятие 03. by
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
137 views18 slides

More Related Content

What's hot

java 8 by
java 8java 8
java 8Unguryan Vitaliy
1.5K views28 slides
Большой брат помогает тебе by
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебеTatyanazaxarova
208 views6 slides
Kranonit s16 (python). dmitry furzenko by
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKrivoy Rog IT Community
3.3K views21 slides
Лекция 11. Тестирование. by
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
27.2K views43 slides
Spring AOP by
Spring AOPSpring AOP
Spring AOPUnguryan Vitaliy
2K views34 slides
Basics of assertions in automated testing by
Basics of assertions in automated testingBasics of assertions in automated testing
Basics of assertions in automated testingÞorgeir Ingvarsson
8.1K views16 slides

What's hot(9)

Большой брат помогает тебе by Tatyanazaxarova
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
Tatyanazaxarova208 views
Лекция 11. Тестирование. by Roman Brovko
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
Roman Brovko27.2K views
C++ осень 2013 лекция 5 by Technopark
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
Technopark692 views
Введение в язык программирования «Java» by Unguryan Vitaliy
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
Unguryan Vitaliy12.5K views
C++ осень 2013 лекция 6 by Technopark
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
Technopark1.4K views

Viewers also liked

Об эффективности льгот by
Об эффективности льготОб эффективности льгот
Об эффективности льготAnatol Alizar
11.9K views6 slides
Declarative Internal DSLs in Lua: A Game Changing Experience by
Declarative Internal DSLs in Lua: A Game Changing ExperienceDeclarative Internal DSLs in Lua: A Game Changing Experience
Declarative Internal DSLs in Lua: A Game Changing ExperienceAlexander Gladysh
3.1K views64 slides
Пользовательская автоматизация профессиональных веб-приложений на Lua by
Пользовательская автоматизация профессиональных веб-приложений на LuaПользовательская автоматизация профессиональных веб-приложений на Lua
Пользовательская автоматизация профессиональных веб-приложений на LuaAlexander Gladysh
644 views18 slides
A visual DSL toolkit in Lua: Past, present and future by
A visual DSL toolkit in Lua: Past, present and futureA visual DSL toolkit in Lua: Past, present and future
A visual DSL toolkit in Lua: Past, present and futureAlexander Gladysh
5.4K views44 slides
formato 1 by
formato 1 formato 1
formato 1 Mayra Martin
233 views5 slides
Kghmi default slide by
Kghmi default slideKghmi default slide
Kghmi default slideKGHM
267 views1 slide

Viewers also liked(20)

Об эффективности льгот by Anatol Alizar
Об эффективности льготОб эффективности льгот
Об эффективности льгот
Anatol Alizar11.9K views
Declarative Internal DSLs in Lua: A Game Changing Experience by Alexander Gladysh
Declarative Internal DSLs in Lua: A Game Changing ExperienceDeclarative Internal DSLs in Lua: A Game Changing Experience
Declarative Internal DSLs in Lua: A Game Changing Experience
Alexander Gladysh3.1K views
Пользовательская автоматизация профессиональных веб-приложений на Lua by Alexander Gladysh
Пользовательская автоматизация профессиональных веб-приложений на LuaПользовательская автоматизация профессиональных веб-приложений на Lua
Пользовательская автоматизация профессиональных веб-приложений на Lua
Alexander Gladysh644 views
A visual DSL toolkit in Lua: Past, present and future by Alexander Gladysh
A visual DSL toolkit in Lua: Past, present and futureA visual DSL toolkit in Lua: Past, present and future
A visual DSL toolkit in Lua: Past, present and future
Alexander Gladysh5.4K views
Kghmi default slide by KGHM
Kghmi default slideKghmi default slide
Kghmi default slide
KGHM267 views
PUEMBO DE COTOPAXI. Pablo Guaña by Pablo Guaña
PUEMBO DE COTOPAXI. Pablo GuañaPUEMBO DE COTOPAXI. Pablo Guaña
PUEMBO DE COTOPAXI. Pablo Guaña
Pablo Guaña1.2K views
Global entry strategies global p s of marketing by Sourav Karmakar
Global entry strategies global p s of marketingGlobal entry strategies global p s of marketing
Global entry strategies global p s of marketing
Sourav Karmakar613 views
Cornwall Life magazine analysis by jamesasmedia
Cornwall Life magazine analysisCornwall Life magazine analysis
Cornwall Life magazine analysis
jamesasmedia260 views
藥師到府健康照護服務Faq by 至元 朱
藥師到府健康照護服務Faq藥師到府健康照護服務Faq
藥師到府健康照護服務Faq
至元 朱218 views

Similar to Александр Гладыш — Visual editor for business logic in Lua and JS

Тренинг GLPK, часть 1: Модель планирования производства by
Тренинг GLPK, часть 1: Модель планирования производстваТренинг GLPK, часть 1: Модель планирования производства
Тренинг GLPK, часть 1: Модель планирования производстваGleb Zakhodiakin
580 views22 slides
20111002 information retrieval raskovalov_lecture3 by
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3Computer Science Club
596 views41 slides
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ... by
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
99 views25 slides
C++ осень 2012 лекция 9 by
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
578 views51 slides
Теория языков программирования некоторые слайды к лекциям by
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
25 views55 slides
C++ Базовый. Занятие 04. by
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
302 views17 slides

Similar to Александр Гладыш — Visual editor for business logic in Lua and JS(20)

Тренинг GLPK, часть 1: Модель планирования производства by Gleb Zakhodiakin
Тренинг GLPK, часть 1: Модель планирования производстваТренинг GLPK, часть 1: Модель планирования производства
Тренинг GLPK, часть 1: Модель планирования производства
Gleb Zakhodiakin580 views
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ... by corehard_by
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
corehard_by99 views
C++ осень 2012 лекция 9 by Technopark
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
Technopark578 views
Теория языков программирования некоторые слайды к лекциям by Sergey Staroletov
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
C++ Базовый. Занятие 04. by Igor Shkulipa
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
Igor Shkulipa302 views
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных by Nikolay Samokhvalov
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (... by 7bits
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
7bits248 views
BigData Week Moscow 2013 - Case: Personalization by Anton Gorokhov
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: Personalization
Anton Gorokhov676 views
Введение в машинное обучение by Grigory Sapunov
Введение в машинное обучениеВведение в машинное обучение
Введение в машинное обучение
Grigory Sapunov2.4K views
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения. by 7bits
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.
7bits308 views
Web осень 2013 лекция 6 by Technopark
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark701 views
Конспект лекций по курсу "Шаблоны разработки ПО" by Sergey Nemchinsky
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
Sergey Nemchinsky7.9K views
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый by Vladislav Morgun
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
Vladislav Morgun484 views
C++ осень 2012 лекция 6 by Technopark
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
Technopark622 views
презентация л.р. №11 by student_kai
презентация л.р. №11презентация л.р. №11
презентация л.р. №11
student_kai215 views
Концепция продукта by Yury Kupriyanov
Концепция продуктаКонцепция продукта
Концепция продукта
Yury Kupriyanov5.2K views

More from Yury Yurevich

ekb.py: KISS REST API by
ekb.py: KISS REST APIekb.py: KISS REST API
ekb.py: KISS REST APIYury Yurevich
1.7K views29 slides
ekb.py: Mini Zen of Python by
ekb.py: Mini Zen of Pythonekb.py: Mini Zen of Python
ekb.py: Mini Zen of PythonYury Yurevich
626 views9 slides
PyCon UA 2011: Test Infected by
PyCon UA 2011: Test InfectedPyCon UA 2011: Test Infected
PyCon UA 2011: Test InfectedYury Yurevich
652 views6 slides
Лев Валкин — Кое-что про Erlang by
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangYury Yurevich
6.1K views30 slides
Ильшад Хабибуллин — BlueBream by
Ильшад Хабибуллин — BlueBreamИльшад Хабибуллин — BlueBream
Ильшад Хабибуллин — BlueBreamYury Yurevich
785 views12 slides
Иван Иноземцев — Fantom by
Иван Иноземцев — FantomИван Иноземцев — Fantom
Иван Иноземцев — FantomYury Yurevich
888 views33 slides

More from Yury Yurevich(12)

ekb.py: KISS REST API by Yury Yurevich
ekb.py: KISS REST APIekb.py: KISS REST API
ekb.py: KISS REST API
Yury Yurevich1.7K views
ekb.py: Mini Zen of Python by Yury Yurevich
ekb.py: Mini Zen of Pythonekb.py: Mini Zen of Python
ekb.py: Mini Zen of Python
Yury Yurevich626 views
PyCon UA 2011: Test Infected by Yury Yurevich
PyCon UA 2011: Test InfectedPyCon UA 2011: Test Infected
PyCon UA 2011: Test Infected
Yury Yurevich652 views
Лев Валкин — Кое-что про Erlang by Yury Yurevich
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про Erlang
Yury Yurevich6.1K views
Ильшад Хабибуллин — BlueBream by Yury Yurevich
Ильшад Хабибуллин — BlueBreamИльшад Хабибуллин — BlueBream
Ильшад Хабибуллин — BlueBream
Yury Yurevich785 views
Иван Иноземцев — Fantom by Yury Yurevich
Иван Иноземцев — FantomИван Иноземцев — Fantom
Иван Иноземцев — Fantom
Yury Yurevich888 views
Александр Гладыш — Lua by Yury Yurevich
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — Lua
Yury Yurevich2.8K views
Almost Success Story: Unix to Linux migration by Yury Yurevich
Almost Success Story: Unix to Linux migrationAlmost Success Story: Unix to Linux migration
Almost Success Story: Unix to Linux migration
Yury Yurevich526 views

Александр Гладыш — Visual editor for business logic in Lua and JS

  • 1. Опыт создания визуальных редакторов бизнес-логики для непрограммистов на Lua и JavaScript Александр Гладыш LogicEditor.com, CTO ag@logiceditor.com
  • 2. Что такое «бизнес-логика»? ● Бизнес-логика — совокупность правил, принципов, зависимостей поведения объектов предметной области. ● Иначе можно сказать, что бизнес-логика — это реализация правил и ограничений автоматизируемых операций. — Wikipedia
  • 3. Что такое «бизнес-логика»? http://www.flickr.com/photos/danisarda/2868413519/
  • 4. Как пишется бизнес-логика? Классика: → Придумали → Поставили в план программистам → Программисты добрались до тикета, поругались, что-то написали → Потестировали, поняли, что всё не так → Поставили в план программистам доработки → ...и так ad nauseam
  • 5. Как пишется бизнес-логика? Выделенный программист: → Придумали → Объяснили задачу программисту → Программист «сразу» написал код → Потестировали, попросили поправить → ...и так ad nauseam
  • 6. Как хочется писать бизнес-логику? → Сам придумал → Сам реализовал → Сразу протестировал → Поправил как надо →… → PROFIT!!!
  • 8. «Почему гейм-дизайнеры — не программисты?» Профессиональные программисты, помимо навыков составления алгоритмов и их реализации ещё, как минимум, имеют: ● Технические знания об используемой системе ● Навыки отладки ● Навыки командной работы с кодом
  • 9. Что делать? ● Требуется средство работы с бизнес- логикой, которое будет прощать технические ошибки, а, лучше, не давать их совершать. ● При этом это средство должно, по возможности, минимально ограничивать свободу творчества пользователя.
  • 10. Типичные решения ● Пустить пользователя в базу ● Дать ему писать XML ● Сделать ему бэкофис — админку
  • 11. Недостаточно гибко! Рано или поздно любая попытка абстрагирования логики в данные растягивается слишком сильно и лопается.
  • 12. Нужен редактор бизнес-логики! Редактируем всю «логику» (алгоритм), а не только «данные» (параметры алгоритма) При этом нужно обеспечить: ● приемлемую кривую обучения; ● приемлемую сложность работы; ● доступную сложность разработки и поддержки, т. е. адекватную гибкость решения.
  • 13. Как другие решают этот вопрос? Несколько классических примеров
  • 14. StarCraft Campaign Editor triggers http://www.campaigncreations.org/starcraft/resources/staredit_tutorials/basics_of_ums_mapping
  • 15. Descent Freespace Editor Events http://www.hard-light.net/wiki/index.php/File:RTBSampleExpanded.JPG
  • 18. Что общего? Визуальный DSL, описывающий дерево Control Flow
  • 19. Как это решали мы? Краткая ретроспектива шести поколений идеи В каждом случае реализация была сделана мной и / или моими коллегами полностью с нуля, включая графику, для разных заказчиков / работодателей. Повторно использовалась и развивалась только общая идея о том, как это должно работать.
  • 20. Редактор видео-квестов (Увы, скриншота не осталось) Грубо: Граф из реплик диалогов с возможностью привязывать к ним видеоряд. ~2002–2004, достался в наследство
  • 24. Анализ ● Кто-то предпочитает псевдо-естественный текст, кто-то — блок-схемы. ● Все редакторы принесли существенную пользу. ● Некоторые оказались абсолютно незаменимы. ● В ретроспективе ясно, что вместо работы над некоторыми следовало нанять скрипторов. ● Ни один из редакторов первых шести поколений не оказался достаточно гибким, чтобы выйти за рамки конкретной технологии (движка или даже игры). Но такая задача и не ставилась.
  • 25. Седьмое поколение Тулкит для создания визуальных редакторов бизнес-логики
  • 27. Цели ● Минимальная стоимость создания новых редакторов. ● Минимальный порог внедрения в «любой» проект на «любой» технологии, даже сторонний. ● Минимальная стоимость поддержки вновь созданных редакторов. ● Достаточная простота освоения и эксплуатации этих редакторов их пользователями.
  • 28. «No silver bullet» Даже если вы собираете ваши domain- specific редакторы при помощи идеального сферического тулкита в вакууме, который закрывает любые технические вопросы, вам всё равно нужно ломать голову над юзабилити каждого конкретного редактора!
  • 29. Природа данных редактора Редактор работает с деревом Control Flow На основе этого дерева «рендерятся» (генерируются): ● UI редактора (у нас — DHTML, псевдоестественный текст). ● Конечные данные (код!), с которым работает приложение, для которого сделан редактор. И то и другое — структурированный текст.
  • 30. Дерево Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент ● Условие ● Булево выражение – «>» ● Получить значение параметра – «Мана» ● «100» ● Список действий – Действие ● Нанести урон по цели – «/» ● Получить значение параметра ● «Мана» ● «3» – «Оппонент»
  • 31. Конечные данные для нашего примера Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент if self:get_param(MANA) > 100 then self:deal_damage_to( self:get_param(MANA) / 3, self:get_opponent() ) end
  • 32. Типы нод Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент ● Если (Boolean), то (ActionList) → Root ● (Action) [, …, (Action)] → ActionList ● (Number) > (Number) → Boolean ● Параметр (ParamID) → Number ● Мана → ParamID ● (Пользовательская константа) → Number ● Нанести урон (Number), цель: (Target) → Action ● (Number) / (Number) → Number ● Оппонент → Target
  • 33. «Схема» ● Выделенные нами типы нод (плюс информация о том, какой тип — корневой) определяют правила конструирования дерева данных редактора. ● Будем называть полный набор типов нод для конкретного редактора логики схемой (данных) этого редактора.
  • 34. Схема — фундамент для всех манипуляций с деревом данных ● Валидация дерева данных (проверка на соответствие схеме). ● Дефолтные значения («новый документ» и добавление новых элементов в старый). ● Правила генерации UI и конечных данных. ● Правила работы UI с деревом данных.
  • 35. Манипуляции с деревом данных в редакторе ● Создать новый документ ● Добавить потомка ● Удалить потомка ● Заменить потомка ● Переставить потомков местами
  • 36. Допустимость манипуляций ● Допустимость выполнения той или иной манипуляции для каждой ноды напрямую зависит от того, что можно делать с прямыми потомками (первого уровня) ноды данного типа: ● в списке действий можно поменять элементы местами или изменить их количество; ● а вот поменять в условии список действий и булево выражение или же совсем удалить булево выражение — уже нельзя.
  • 37. Классификация типов нод ● Классифицируем типы нод по тому, как ведут себя их прямые потомки. ● Для краткости будем называть «класс типа ноды» «метатипом». ● Для ясности, будем вместо «тип ноды» говорить «конкретный тип ноды».
  • 38. Метатипы Для простоты выберем следующий набор метатипов: ● literal, ● value, ● list, ● record, ● variant. Если допустить введение «промежуточных» фиктивных нод, при помощи типов, основанных на этом наборе метатипов можно описать практически любую требуемую схему дерева. (Например, list of records of values = dictionary of values, variant of literals = enum.)
  • 39. Literal Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент ● В примере: «оппонент», «Мана». ● Нет потомков. ● Нельзя редактировать. ● В конечных данных — константная строка.
  • 40. Value Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент ● В примере: «100», «3». ● Нет потомков. ● В редакторе пользователь задаёт конкретное значение для каждой ноды. ● В конечные данные попадает значение, заданное пользователем (возможно, предварительно обработанное и в обрамлении какого-то текста).
  • 41. List Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент ● В примере: список действий (с единственным элементом — «нанести урон»). ● «Произвольное» число потомков одного, фиксированного конкретного типа. ● Пользователь может менять число потомков, заменять их, переставлять местами. ● В конечные данные попадают склеенные один за одним значения (с сохранением порядка; возможно, через разделитель и с дополнительным текстом до и после).
  • 42. Record Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент ● В примере: «если..., то», «параметр», «нанести урон …, цель», «>», «/». ● Фиксированное число потомков заданных конкретных типов. ● Конфигурацию прямых потомков нельзя редактировать ● В конечные данные потомки подставляются в заранее определённом порядке (возможно, с каким- то текстом до, после и между ними).
  • 43. Variant Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент ● В примере: булева операция в «если / то», численная операция — величина наносимого урона. (Не были детализованы на слайдах с примерами.) ● Один потомок, конкретный тип которого входит в заранее заданный набор. Пользователь может редактировать конкретный тип потомка. ● В конечные данные подставляются данные потомка (возможно, в обрамлении какого-то текста).
  • 44. Генерация конкретных данных и UI редактора И то и другое — структурированный текст. Для его генерации: ● Обходим дерево данных снизу вверх. ● Получаем конкретный тип и метатип ноды. ● Текст для листовых нод известен сразу. ● Для нелистовых нод подставляем текст потомков в шаблон текста этой ноды.
  • 45. Текстовые шаблоны для нод Если параметр Мана > 100, то Нанести урон параметр Мана / 3, цель: оппонент Упрощённо, для редактора: ● Record: Если ${1}, то<br> ${2} ● List: Ноды списка действий склеиваем через <br> ● Record: ${1} > ${2} ● Record: Параметр ${1} ● Literal: Мана ● Value: ${1} ● Record: Нанести урон ${1}, цель: ${2} → Action ● Record: ${1} / ${2} → Number ● Literal: Оппонент → Target
  • 46. Создание конкретного редактора ● Описываем схему данных (на Lua-based DSL) ● Из неё генерируем (на Lua): ● Валидатор данных (на Lua, на JavaScript) ● Генератор дефолтных данных (на JavaScript) ● Код редактирования (на JavaScript) ● Код генерации конкретных данных (на Lua) ● … ● PROFIT!!!
  • 47. Почему Lua? Хорошая поддержка «встроенных» декларативных DSL-ей: schema:literal "boolean.true" { editor:ui [[True]] { "<b>True</b>"; description = [[<i><b>True</b></i><br> <hr> The boolean constant <i><b>True</b></i> ]]; }; render:data { "true"; }; }
  • 48. Почему Lua? Хорошая поддержка Sandboxing'а. При должной подготовке можно не бояться работать с данными из недоверенных источников. Если аккуратно писать схему, то и получившийся в результате код тоже можно запускать безбоязненно.
  • 49. Почему Lua? Мы любим этот язык!
  • 50. За рамками доклада остались ● Схема второго ● Опциональные уровня потомки ● Устойчивость ● Подходы к данных к интеграции изменениям схемы конечных данных в ● Области видимости приложения ● Внешние и ● Много-много мелких внутренние фичей для тюнинга источники данных UI.