Clojure Spec vs Typed vs Schema

标签 clojure clojure.spec

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

  • 一个比其他的有什么优势?
  • 为什么我会考虑其中一个而不是其他?
  • 哪一个适合编译类型检查?
  • 最佳答案

    这只是为开发人员提供某种类型安全性的三种不同方法。这三者都提供了自己的 DSL 来描述数据的模式/类型,但它们的理念非常不同。他们都得到积极维护,并拥有一个不错的社区。

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

    核心类型

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

    一些优势:

  • 一般来说,静态类型是一个非常强大的工具。如果您熟悉静态类型的编程语言,您将非常欣赏这一点。
  • 在编译期间可以发现许多错误。不再有 NullPointerExceptions!

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

  • 架构

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

    一些优势:
  • 非常友好的 DSL 来描述数据模式。
  • 各种工具。例如:生成测试的数据生成,解释模式不匹配原因的工具。

  • 一些缺点:
  • 仅在您告诉它的位置和时间检查模式。
  • 外部库,核心团队不支持。

  • 规范

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

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

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

  • 一些缺点:
  • 将在尚未发布的稳定版本的 Clojure 1.9 中提供。它仍然是一项未被广泛使用的新技术。
  • Spec do not look like the data they are describing.

  • 就个人而言,core.typed 感觉很吓人,而 core.spec 感觉不成熟,所以我在生产中使用模式。我的建议如下:
  • 如果您需要静态类型检查,那么 core.typed 就是要走的路。
  • 如果你想做解析,那么 core.spec 是一个不错的选择。
  • 如果您想要简单的类型描述,那么模式将是一个很好的选择。
  • 关于Clojure Spec vs Typed vs Schema,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46581570/

    相关文章:

    clojure - 如何在不强制实现的情况下找到惰性序列的长度?

    clojure - 在clojure中将符号作为函数传递

    clojure - 在将符号传递给 Clojure 中的宏之前,是否可以将符号解析为其值?

    具有非关键字键的映射的 Clojure 规范

    clojure - 在 Clojure 规范中将 s/and 与 s/or 组合

    clojure - 使用本地绑定(bind)函数进行评估

    performance - Clojure 时间序列分析

    emacs - swank-clojure 和 slime 不再在 emacs 中合作

    clojure - 如何 Clojure.Spec 引用类型(如原子)?

    具有相互依赖值的 HashMap 的 clojure 规范?