【问题标题】:Clojure Spec vs Typed vs SchemaClojure Spec vs Typed vs Schema
【发布时间】:2018-03-16 20:00:15
【问题描述】:

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

  • 其中一个比其他的有什么优势?
  • 我为什么要考虑其中之一?
  • 编译类型检查哪个好?

【问题讨论】:

  • 这个问题,尽管在某些方面措辞含糊,但吸引了一个很好的具体答案,所以我认为它不应该被关闭。
  • 附带说明,compojure-api 2.0.0 也旨在实现规范集成。看起来集成不如 Schema 好,但让我们看看。演示:github.com/metosin/c2 & 规范中缺少的东西以获得全面支持:dev.clojure.org/jira/browse/CLJ-2116

标签: clojure clojure.spec


【解决方案1】:

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

这是基于我的经验的个人观点

核心类型

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 是一个不错的选择。
  • 如果您想要简单的类型描述,那么 schema 将是一个不错的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2013-11-26
    • 1970-01-01
    • 2021-10-04
    • 2019-05-08
    • 1970-01-01
    • 2016-08-06
    相关资源
    最近更新 更多