Спецификация Clojure, типизированная и схема

В моем проекте Clojure я использую Clojure Spec, но если мне нужно использовать какую-то библиотеку, например compojure-api, мне нужно использовать Schema.

  • В чем преимущество одного над другим?
  • Почему я должен рассматривать один над другими?
  • Какой из них подходит для проверки типа компиляции?

person Mamun    schedule 05.10.2017    source источник
comment
Этот вопрос, несмотря на то, что он в некотором роде сформулирован расплывчато, привлек хороший конкретный ответ, поэтому я не думаю, что его следует закрывать.   -  person Arthur Ulfeldt    schedule 05.10.2017
comment
В качестве примечания: compojure-api 2.0.0 также нацелен на интеграцию спецификаций. Похоже, интеграция будет не такой хорошей, как со Schema, но посмотрим. Демонстрация: github.com/metosin/c2 и недостающая вещь в спецификации для полной поддержки: dev.clojure.org/jira/browse/CLJ-2116   -  person Tommi Reiman    schedule 07.10.2017


Ответы (1)


Это три просто разных подхода, чтобы дать разработчику некоторую безопасность типов. Все три предлагают свои собственные DSL для описания схемы/типа данных, но они очень разные по философии. Все они активно поддерживаются и имеют хорошее сообщество.

Это утвержденный обзор, основанный на моем опыте.

основной тип

core typed пытается расширить язык clojure дополнительными макросами для аннотирования функций. и vars со статической информацией о типе. Затем он использует анализ статического типа, чтобы убедиться, что код соответствует информации о типе (то есть он создает и использует данные правильных типов).

Некоторые преимущества:

  • Статическая типизация вообще очень сильный инструмент. Если вы знакомы с языками программирования со статической типизацией, вы очень оцените это.
  • Многие ошибки могут быть обнаружены во время компиляции. Никаких больше исключений NullPointerException!

Некоторые недостатки:

  • Изменение чего-либо в типе или коде может потребовать дополнительной работы для распространения изменений во всех частях вашего кода. А иногда просто слишком сложно писать информацию о типах или корректировать программы.
  • Статическая проверка кода замедляет время компиляции и может замедлить рабочий процесс разработки.

Схема

В Schema вы также пишете аннотации типов, но проверка типов происходит во время выполнения. Он побуждает вас создавать объявления схемы динамически и позволяет вам указать, где вы хотите проверить схему, а где вы не хотите, чтобы ее функциональность.

Некоторые преимущества:

  • Очень удобный DSL для описания схемы данных.
  • Различные инструменты. Например: Генерация данных для генеративного тестирования, инструменты для объяснения, почему схема не соответствует.

Некоторые недостатки:

  • Только проверяет схему, где и когда вы говорите ей это сделать.
  • Внешняя библиотека, не поддерживаемая основной командой.

Спецификация

Spec — новейший игрок с философией, заимствованной у Язык Racket. Это (будет) часть основной библиотеки Clojure из Clojure версии 1.9.

Основная идея состоит в том, чтобы типы сущностей определялись ключами (в пространстве имен) в объекте карты. Объявления спецификаций хранятся в реестре приложения, привязанном к ключевым словам в пространстве имен. Спецификация очень сильна в проверке последовательности.

Некоторые преимущества:

  • Часть ядра Clojure, а не внешняя библиотека. Теперь он используется для разбора аргументов макроса, а также для документирования.
  • Сообщество очень взволновано этим, что приводит к появлению интересных идей, таких как использование спецификации в генетическое программирование и генеративное тестирование.

Некоторые недостатки:

Лично мне core.typed кажется пугающим, а core.spec — незрелым, поэтому я использую schema в рабочей среде. Мой совет следующий:

  • Если вам нужна статическая проверка типов, тогда core.typed — это то, что вам нужно.
  • Если вы хотите выполнить синтаксический анализ, core.spec — хороший выбор.
  • Если вам нужны простые описания типов, вам подойдет схема.
person erdos    schedule 05.10.2017