2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил...

65
DSL для правил валидации Алексей Букуров Старший инженер-программист HWdTech, LLC

Transcript of 2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил...

DSL для правил валидации

Алексей БукуровСтарший инженер-программист

HWdTech, LLC

Мы не хотим лекций в субботу

2

DSL на коленкеЕвгений ТюменцевДиректор

HWdTech, LLC

3

Проблемы❏ Валидация данных

4

Проблемы❏ Валидация данных

❏ Валидация данных

5

Проблемы❏ Валидация данных

❏ Валидация данных

❏ Валидация данных

6

❏ Унифицировать механизм валидации

Задача

7

Валидация на основе метаописания

8

... validators: [{ method: 'lte', message: 'Field foo should be less than 10', value: 10 }] ...

Реализовать DSL❏ Математические операции

❏ Логические операции

❏ Функции

❏ Переменные

9

Готовые решения?❏ math-expression-evaluator

❏ mathjs

❏ angular-expressions

❏ expressions-js

❏ expression-paser

10

math-expression-evaluator

Чрезвычайно эффективный, гибкий и потрясающий парсер для математических выражений в Javascript

http://redhivesoftware.github.io/math-expression-evaluator

120,205 downloads in the last day

640,123 downloads in the last week

2,390,992 downloads in the last month

One open issues on GitHub

No open pull requests on GitHub

11

Достоинства❏ Популярность (2,390,992 скачиваний в месяц)

❏ Работа с математическими выражениями

❏ Расширяемость

❏ Размер библиотеки ~13Kb

❏ Документация

12

Недостатки❏ Не поддерживает логических выражений

13

mathjs

Math.js - библиотека для JavaScript и Node.js. Включает в себя гибкий анализатор выражений с поддержкой символьных вычислений, поставляется с большим набором встроенных функций и констант

http://mathjs.org

3,432 downloads in the last day

16,779 downloads in the last week

68,277 downloads in the last month

87 open issues on GitHub

10 open pull requests on GitHub

14

Достоинства❏ Популярность (68,277 скачиваний в месяц)

❏ Работа с математическими и логическими выражениями

❏ Расширяемость

❏ Документация

15

Недостатки❏ Внушительный размер библиотеки ~150Kb

16

angular-expressions

Лучшая часть Angular, вынесенная в отдельный модуль

www.npmjs.com/package/angular-expressions

66 downloads in the last day

478 downloads in the last week

1,606 downloads in the last month

3 open issues on GitHub

No open pull requests on GitHub

17

Достоинства❏ Популярность (1,606 скачиваний в месяц)

❏ Работа с математическими выражениями и фильтрами

❏ Размер библиотеки ~13.5Kb

18

Недостатки❏ Не поддерживает логических выражений

❏ Отсутствие расширяемости функционала

19

expressions-js

Преобразует строковые выражения в исполняемые функции JavaScript

www.npmjs.com/package/expressions-js

3 downloads in the last day

66 downloads in the last week

325 downloads in the last month

2 open issues on GitHub

No open pull requests on GitHub

20

Достоинства❏ Работа с математическими и логическими выражениями

❏ Расширяемость

❏ Размер библиотеки ~8.5Kb

21

Недостатки❏ Реализован на регулярных выражениях

22

expression-parser

Парсер математических выражений, со встроенным компилятором для создания исполняемых функций в JavaScript

www.npmjs.com/package/expression-parser

1 downloads in the last day

7 downloads in the last week

70 downloads in the last month

2 open issues on GitHub

No open pull requests on GitHub

23

Достоинства❏ Работа с математическими выражениями

❏ Расширяемость

24

Недостатки❏ Не поддерживает логических выражений

❏ Размер библиотеки ~26Kb

25

morph-expressions Чрезвычайно эффективный и гибкий парсер математических и/или логических выражение для JavaScript.

www.npmjs.com/package/morph-expressions

26

Использование

import Parser from 'morph-expressions';

const parser = new Parser(); const compiled = parser.parse('1 + 1'); compiled.eval(); // returns 2

27

Переменные

const compiled = parser.parse('x + 1 - y == 0');

compiled.identifiers; // ['x', 'y'] compiled.eval({ x: 2, y: 3 }); // true

parser.parseAndEval('x + 1 - y == 0', { x: 2, y: 3 });

28

Функции и вычислимые поля

parser.registerFunction('sqr', val => val * val); parser.registerProperty('foo', () => 'bar'); parser.registerProperty('now', () => new Date()); parser.parseAndEval('sqr(sqr(x))', { x: 2 }); // 16 parser.parseAndEval('foo'); // ‘bar’ parser.parseAndEval('now'); // Wed Feb 04 2015 12:00:00

29

Валидация площади квартиры

parser.registerFunction('SUM', (l, r) => l + r);

parser.parseAndEval('SUM(kitchen, living) <= total', { total: 40, kitchen: 10, living: 30 });

30

Валидация почтового кода

parser.registerFunction('ZIP_CODE', c => /\d{6}/.test(c));

parser.parseAndEval('ZIP_CODE(code)', { code: 644106 });

31

Можно? Можно всё!

32

❏ Кириллица?

❏ Пароль?

❏ Проверка возраста?

Ближайшие планы❏ Возможность расширение с помощью плагинов

❏ Плагин для Excel функций

33

Выводы❏ Сокращение рутинной работы

34

Генератор форм

Игорь ЦиглерИнженер-программист

HWdTech, LLC

Написать несколько тысяч форм для ввода данных

Задача

36

Проблемы

❏ Много форм

37

Проблемы

❏ Много форм❏ Контейнеры

38

Проблемы

❏ Много форм❏ Контейнеры❏ Валидация данных

39

Проблемы

❏ Много форм❏ Контейнеры❏ Валидация данных❏ Сложноподчиненные поля

40

Проблемы

❏ Много форм❏ Контейнеры❏ Валидация данных❏ Сложноподчиненные поля❏ Вычислимые поля

41

JSON Form

❏ Валидация только по значению текущего поля

42

Репозиторий: git.io/vDO2D

JSON Form

❏ Валидация только по значению текущего поля

❏ Нет сложноподчиненных полей

43

Репозиторий: git.io/vDO2D

JSON Form

❏ Валидация только по значению текущего поля

❏ Нет сложноподчиненных полей

❏ Нет вычислимых полей

44

Репозиторий: git.io/vDO2D

JSON Form

❏ Валидация только по значению текущего поля

❏ Нет сложноподчиненных полей

❏ Нет вычислимых полей

❏ Не поддерживается с 2014 года

45

Репозиторий: git.io/vDO2D

JSON Form

❏ Валидация только по значению текущего поля

❏ Нет сложноподчиненных полей

❏ Нет вычислимых полей

❏ Не поддерживается с 2014 года

❏ Устаревшие зависимости

46

Репозиторий: git.io/vDO2D

47

48

49

50

Smartforms

"form": { "email": { "block": "input" }, "пароль": { "block": "input", "type": "password" }},"schema": ["email", "пароль"]

51

Контейнеры

"schema": [{ "block": "container", "items": [ "email", "пароль" ]}]

52

Таблицы

53

"schema": [{ "block": "fieldset", "items": [ "Адрес", "Дом", "Корпус", "Квартира" ], "layout": [ 1, 3 ]}]

Таблицы

54

"schema": [{ "block": "fieldset", "items": [ "Адрес", "Дом", "Корпус", "Квартира" ], "layout": [ 1, [6, 3, 3] ]}]

Списки

55

"schema": [{ "block": "list", "items": [ "email", "пароль" ], "layout": 1}]

Списки

56

Динамические контейнеры

57

Апробация morph-expressions на smartforms

Библиотека для создания форм и модальных окон с формами по метаописанию

58

Для чего будем использовать DSL?

❏ Валидация

❏ Сложноподчиненные поля

❏ Вычислимые поля

59

Валидация данных"validationRules": [

{

"rule": "1 <= длина и длина <= 4 и число",

"errorMessage": "...",

"isGlobalError": false

}

]

60

Пример регистрации свойств

parser.registerProperty('длина', scope => { const value = scope[scope.fieldName] || '';

return value.length;});

61

Сложноподчиненные поля"Номер телефона": {

"dependencies": "Тип == ’По номеру телефона’",

"placeholder": "+7 (3822) ______"

"block": "text"

}

62

Вычислимые поля

63

"Сумма": {

"block": "text",

"label": "Сумма"

},

"Комиссия": {

"block": "static",

"calculationRule": "Сумма * 0.05"

}

Спасибо за внимание!

64

❏ hwdtech.ru/smartforms

❏ vk.com/hwdtech

Валидация пароля

65