Это три просто разных подхода, чтобы дать разработчику некоторую безопасность типов. Все три предлагают свои собственные 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