Clojure Spec vs Typed vs Schema

时间:2017-10-05 08:58:03

标签: clojure clojure.spec

在我的Clojure项目中,我使用的是Clojure Spec但是如果我需要使用像compojure-api这样的lib,那么我需要使用Schema。

  • 其他人的优势是什么?
  • 为什么我会考虑其中一个?
  • 哪一个适合编译类型检查?

1 个答案:

答案 0 :(得分:10)

这三种仅仅是为开发人员提供某种类型安全性的不同方法。所有这三者都提供了他们自己的DSL来描述数据的模式/类型,但它们在哲学上是非常不同的。他们都积极维护并拥有一个很好的社区。

根据我的经验,这是自以为是的概述

核心类型

core typed 尝试使用其他宏扩展clojure语言,以使用静态类型信息注释函数和变量。然后,它使用静态类型分析来确保代码与类型信息匹配(即它生成并使用正确类型的数据)。

一些优点:

  • 一般来说静态打字是一个非常强大的工具。如果您熟悉静态类型编程语言,您会非常感激。
  • 在编译期间可以找到许多错误。不再有NullPointerExceptions!

一些缺点:

  • 更改类型或代码中的内容可能需要额外的工作来将更改传播到代码的所有部分。有时写类型信息或正确的程序太复杂了。
  • 静态代码检查会减慢编译时间,并可能会降低开发工作流程的速度。

模式

Schema中,您还可以编写类型注释,但类型检查会在运行时发生。它鼓励您动态构造模式声明,并允许您指定要检查模式的位置以及不希望其功能的位置。

一些优点:

  • 用于描述数据模式的非常友好的DSL。
  • 各种工具。例如:生成测试的数据生成,解释模式不匹配的工具。

一些缺点:

  • 仅在您告诉它的地方和时间检查架构。
  • 外部库,核心团队不支持。

规格

Spec是从Racket lang借来的哲学的最新玩家。它(将成为)Clojure 1.9版Clojure核心库的一部分。

基本思想是在地图对象中使用(名称空间)键指定实体类型。规范声明存储在绑定到命名空间关键字的应用程序注册表中。 Spec在序列验证方面非常强大。

一些优点:

  • Clojure核心的一部分,而不是外部库。它现在用于解析宏参数,也用于文档目的。
  • 社区对此非常兴奋,产生了有趣的想法,例如在genetic programming中使用规范和生成测试。

一些缺点:

就个人而言, core.typed 感觉很吓人, core.spec 感觉不成熟所以我在生产中使用 schema 。我的建议如下:

  • 如果您需要静态类型检查,那么 core.typed 就是您的选择。
  • 如果你想进行解析,那么 core.spec 是一个不错的选择。
  • 如果您想要简单的类型描述,那么架构将是一个不错的选择。