SlideShare una empresa de Scribd logo
1 de 52
Descargar para leer sin conexión
Опыт создания
визуальных редакторов бизнес-логики
       для непрограммистов
        на 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

Más contenido relacionado

La actualidad más candente

Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебеTatyanazaxarova
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Basics of assertions in automated testing
Basics of assertions in automated testingBasics of assertions in automated testing
Basics of assertions in automated testingÞorgeir Ingvarsson
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5Technopark
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6Technopark
 

La actualidad más candente (9)

java 8
java 8java 8
java 8
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
 
Kranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenko
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Basics of assertions in automated testing
Basics of assertions in automated testingBasics of assertions in automated testing
Basics of assertions in automated testing
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
 

Destacado

Об эффективности льгот
Об эффективности льготОб эффективности льгот
Об эффективности льготAnatol Alizar
 
Declarative Internal DSLs in Lua: A Game Changing Experience
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
 
Пользовательская автоматизация профессиональных веб-приложений на Lua
Пользовательская автоматизация профессиональных веб-приложений на LuaПользовательская автоматизация профессиональных веб-приложений на Lua
Пользовательская автоматизация профессиональных веб-приложений на LuaAlexander Gladysh
 
A visual DSL toolkit in Lua: Past, present and future
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
 
Kghmi default slide
Kghmi default slideKghmi default slide
Kghmi default slideKGHM
 
PUEMBO DE COTOPAXI. Pablo Guaña
PUEMBO DE COTOPAXI. Pablo GuañaPUEMBO DE COTOPAXI. Pablo Guaña
PUEMBO DE COTOPAXI. Pablo GuañaPablo Guaña
 
BubbleMap Application
BubbleMap ApplicationBubbleMap Application
BubbleMap ApplicationMasaya Kogawa
 
Global entry strategies global p s of marketing
Global entry strategies global p s of marketingGlobal entry strategies global p s of marketing
Global entry strategies global p s of marketingSourav Karmakar
 
Cornwall Life magazine analysis
Cornwall Life magazine analysisCornwall Life magazine analysis
Cornwall Life magazine analysisjamesasmedia
 
Sales management 8 2014 van verkopen naar co creatie
Sales management 8 2014 van verkopen naar co creatieSales management 8 2014 van verkopen naar co creatie
Sales management 8 2014 van verkopen naar co creatieAntwerp Management School
 
藥師到府健康照護服務Faq
藥師到府健康照護服務Faq藥師到府健康照護服務Faq
藥師到府健康照護服務Faq至元 朱
 

Destacado (20)

Об эффективности льгот
Об эффективности льготОб эффективности льгот
Об эффективности льгот
 
Declarative Internal DSLs in Lua: A Game Changing Experience
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
 
Пользовательская автоматизация профессиональных веб-приложений на Lua
Пользовательская автоматизация профессиональных веб-приложений на LuaПользовательская автоматизация профессиональных веб-приложений на Lua
Пользовательская автоматизация профессиональных веб-приложений на Lua
 
A visual DSL toolkit in Lua: Past, present and future
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
 
formato 1
formato 1 formato 1
formato 1
 
Kghmi default slide
Kghmi default slideKghmi default slide
Kghmi default slide
 
Liderar para Transformar.
Liderar para Transformar.Liderar para Transformar.
Liderar para Transformar.
 
PUEMBO DE COTOPAXI. Pablo Guaña
PUEMBO DE COTOPAXI. Pablo GuañaPUEMBO DE COTOPAXI. Pablo Guaña
PUEMBO DE COTOPAXI. Pablo Guaña
 
Organic Vegetable Gardening ~ University of Tennessee
Organic Vegetable Gardening ~ University of TennesseeOrganic Vegetable Gardening ~ University of Tennessee
Organic Vegetable Gardening ~ University of Tennessee
 
Weapons of Mass Deception by David Moosa Pidcock, Leader of Islamic Party of ...
Weapons of Mass Deception by David Moosa Pidcock, Leader of Islamic Party of ...Weapons of Mass Deception by David Moosa Pidcock, Leader of Islamic Party of ...
Weapons of Mass Deception by David Moosa Pidcock, Leader of Islamic Party of ...
 
Classon halmet
Classon halmetClasson halmet
Classon halmet
 
BubbleMap Application
BubbleMap ApplicationBubbleMap Application
BubbleMap Application
 
Agenda for Ecologically Safe Cities
Agenda for Ecologically Safe CitiesAgenda for Ecologically Safe Cities
Agenda for Ecologically Safe Cities
 
Global entry strategies global p s of marketing
Global entry strategies global p s of marketingGlobal entry strategies global p s of marketing
Global entry strategies global p s of marketing
 
35
3535
35
 
Webinar2003
Webinar2003Webinar2003
Webinar2003
 
Cornwall Life magazine analysis
Cornwall Life magazine analysisCornwall Life magazine analysis
Cornwall Life magazine analysis
 
Aa
AaAa
Aa
 
Sales management 8 2014 van verkopen naar co creatie
Sales management 8 2014 van verkopen naar co creatieSales management 8 2014 van verkopen naar co creatie
Sales management 8 2014 van verkopen naar co creatie
 
藥師到府健康照護服務Faq
藥師到府健康照護服務Faq藥師到府健康照護服務Faq
藥師到府健康照護服務Faq
 

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

Тренинг GLPK, часть 1: Модель планирования производства
Тренинг GLPK, часть 1: Модель планирования производстваТренинг GLPK, часть 1: Модель планирования производства
Тренинг GLPK, часть 1: Модель планирования производстваGleb Zakhodiakin
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3Computer Science Club
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхNikolay Samokhvalov
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...7bits
 
BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationAnton Gorokhov
 
Введение в машинное обучение
Введение в машинное обучениеВведение в машинное обучение
Введение в машинное обучениеGrigory Sapunov
 
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.7bits
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Sergey Nemchinsky
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серыйVladislav Morgun
 
20120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-0420120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-04Computer Science Club
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
презентация л.р. №11
презентация л.р. №11презентация л.р. №11
презентация л.р. №11student_kai
 
Концепция продукта
Концепция продуктаКонцепция продукта
Концепция продуктаYury Kupriyanov
 
Переменные: тип, имя, значение
Переменные: тип, имя, значениеПеременные: тип, имя, значение
Переменные: тип, имя, значениеЕлена Никонова
 

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

Тренинг GLPK, часть 1: Модель планирования производства
Тренинг GLPK, часть 1: Модель планирования производстваТренинг GLPK, часть 1: Модель планирования производства
Тренинг GLPK, часть 1: Модель планирования производства
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения (...
 
BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: Personalization
 
Введение в машинное обучение
Введение в машинное обучениеВведение в машинное обучение
Введение в машинное обучение
 
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.
Стажировка-2013, разработчики, занятие 3. Абстракции, контракты, соглашения.
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
 
20120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-0420120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-04
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
презентация л.р. №11
презентация л.р. №11презентация л.р. №11
презентация л.р. №11
 
Концепция продукта
Концепция продуктаКонцепция продукта
Концепция продукта
 
Переменные: тип, имя, значение
Переменные: тип, имя, значениеПеременные: тип, имя, значение
Переменные: тип, имя, значение
 

Más de Yury Yurevich

ekb.py: KISS REST API
ekb.py: KISS REST APIekb.py: KISS REST API
ekb.py: KISS REST APIYury Yurevich
 
ekb.py: Mini Zen of Python
ekb.py: Mini Zen of Pythonekb.py: Mini Zen of Python
ekb.py: Mini Zen of PythonYury Yurevich
 
PyCon UA 2011: Test Infected
PyCon UA 2011: Test InfectedPyCon UA 2011: Test Infected
PyCon UA 2011: Test InfectedYury Yurevich
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangYury Yurevich
 
Ильшад Хабибуллин — BlueBream
Ильшад Хабибуллин — BlueBreamИльшад Хабибуллин — BlueBream
Ильшад Хабибуллин — BlueBreamYury Yurevich
 
Иван Иноземцев — Fantom
Иван Иноземцев — FantomИван Иноземцев — Fantom
Иван Иноземцев — FantomYury Yurevich
 
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — LuaYury Yurevich
 
About (unit) testing
About (unit) testingAbout (unit) testing
About (unit) testingYury Yurevich
 
Almost Success Story: Unix to Linux migration
Almost Success Story: Unix to Linux migrationAlmost Success Story: Unix to Linux migration
Almost Success Story: Unix to Linux migrationYury Yurevich
 

Más de Yury Yurevich (12)

ekb.py: KISS REST API
ekb.py: KISS REST APIekb.py: KISS REST API
ekb.py: KISS REST API
 
ekb.py: Mini Zen of Python
ekb.py: Mini Zen of Pythonekb.py: Mini Zen of Python
ekb.py: Mini Zen of Python
 
PyCon UA 2011: Test Infected
PyCon UA 2011: Test InfectedPyCon UA 2011: Test Infected
PyCon UA 2011: Test Infected
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про Erlang
 
Ильшад Хабибуллин — BlueBream
Ильшад Хабибуллин — BlueBreamИльшад Хабибуллин — BlueBream
Ильшад Хабибуллин — BlueBream
 
Иван Иноземцев — Fantom
Иван Иноземцев — FantomИван Иноземцев — Fantom
Иван Иноземцев — Fantom
 
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — Lua
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
About Python
About PythonAbout Python
About Python
 
About (unit) testing
About (unit) testingAbout (unit) testing
About (unit) testing
 
SQLAlchemy Seminar
SQLAlchemy SeminarSQLAlchemy Seminar
SQLAlchemy Seminar
 
Almost Success Story: Unix to Linux migration
Almost Success Story: Unix to Linux migrationAlmost Success Story: Unix to Linux migration
Almost Success Story: Unix to Linux migration
 

Александр Гладыш — 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.