monadsl — библиотека, предоставляющая внутренний DSL на Scala, с помощью которого можно легко выражать ветвление и прочие управляющие конструкции для монадических вычислений.
К монадическим выражениям неприменимы привычные управляющие конструкции, например if-else, так как тип результат обернут в монадический контейнер. Ниже один из вариантов записи ветвления:
for {
ok <- e1
result <- if (ok) e2 else e3
} yield result
Такая запись неизбежно замедляет как чтение этого кода, так и процесс написания, поскольку необходимо нагромождать сложные синтаксические конструкции вокруг элементарной логики.
С помощью DSL указанную выше конструкцию можно выразить в виде:
when (e1) e2 otherwise e3
Библиотека подойдет для приложений, в которых требуется выполнять рутинные проверки, например:
-
Реализация бизнес-процессов, где объектам часто приписывают определенную стадию, от которой зависят допустимые действия;
-
Валидация интегриционных инвариантов, то есть когда проверяется консистентность данных, полученных от внешних сервисов.
В примерах лежит приложение, реализующее простейший API для трекера задач. TicketService, реализующий методы для работы с задачами, реализован в двух версиях, одна из которых использует DSL, а другая нет. В качестве монады здесь используется Future (из scala.concurrent), позволяющая выражать асинхронные вычисления.
Для запуска нужно иметь установленную Scala, Docker Compose, make и иметь свободные порты 8080 и 5432. Если это так, то в корне репозитория достаточно позвать команду make
. После этого UI приложения — Swagger — будет доступен на http://localhost:8080/swagger, а база данных — на порту 5432.
Для демонстрации можно попробовать прогнать следующие сценарии:
- создать задачу и довести ее до релиза (основной сценарий).
- создать задачу, довести ее до тестирования и вернуть в разработку, после чего довести до релиза;
- создать задачу и удалить как дубликат.
В порядке приоритета.
- Юнит-тесты и расчет покрытия.
- CI.
- Реализовать API для дополнительных сценариев.
- Exception handler для красивого отображения ошибок.
- Расширить модель: добавить assignee с ролями и отдельные права на редактирование задач.
- Тесты на DAO.
- Скрипт для проверки эквивалентности таблиц в базе данных.