Clojure Spec、Typed和Schema的比较

7

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

  • 两者之间有什么优势?
  • 为什么会考虑其中一个而不是另一个?
  • 哪一个适合编译类型检查?

(Note: No changes were made to HTML tags)

1
尽管这个问题在某些方面措辞含糊,但它已经吸引了一个很好的具体答案,所以我认为它不应该被关闭。 - Arthur Ulfeldt
作为一则旁注,compojure-api 2.0.0也旨在集成spec。看起来这种集成不会像Schema那么好,但让我们拭目以待。演示:https://github.com/metosin/c2 & 完全支持的规范缺失之处:https://dev.clojure.org/jira/browse/CLJ-2116 - Tommi Reiman
1个回答

15

这三种方法都是为开发者提供类型安全的不同方式。它们均提供自己的DSL来描述数据的模式/类型,但在理念上有很大区别。它们都得到了积极的维护并拥有良好的社区支持。

这是一个基于我的经验的主观概述

core typed

core typed试图通过使用额外的宏对clojure语言进行扩展,以注释函数和变量的静态类型信息。然后使用静态类型分析确保代码与类型信息匹配(即产生和消耗正确类型的数据)。

一些优点:

  • 静态类型通常是非常强大的工具。如果您熟悉静态类型编程语言,您将非常欣赏这点。
  • 许多错误可以在编译时被发现。再也没有NullPointerExceptions!

一些缺点:

  • 更改类型或代码中的某些内容可能需要额外的工作来传播更改到代码的所有部分。有时编写类型信息或正确程序过于复杂。
  • 静态代码检查会减缓编译时间并可能减缓开发流程。

Schema

Schema中,您也需要编写类型注释,但类型检查在运行时发生。它鼓励您动态构建模式声明,并允许您指定要在哪里检查模式以及不想使用其功能的地方。

一些优点:

  • 非常友好的DSL来描述数据架构。
  • 各种工具。例如:生成测试数据进行生成测试,解释为什么架构不匹配的工具。

一些缺点:

  • 仅在您告诉它何时何地检查模式时才会检查模式。
  • 外部库,不受核心团队支持。

Spec

Spec 是从Racket lang借鉴哲学而来的最新技术。它是Clojure 1.9版本中Clojure核心库的一部分。

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

一些优点:

  • 属于Clojure核心,而不是外部库。现在已经用于解析宏参数以及文档目的。
  • 社区对其非常激动,产生了有趣的想法,例如在遗传编程和生成测试中使用规范。

一些缺点:

个人而言,core.typed 让人望而却步,而 core.spec 则感觉不够成熟,因此我在生产中使用 schema。我的建议如下:

  • 如果需要静态类型检查,则应使用 core.typed
  • 如果要进行解析,则 core.spec 是一个很好的选择。
  • 如果需要简单的类型描述,则 schema 是一个很好的选择。

2022年更新:Spec功能强大且可用:)。Rich Hickey保持了相同的哲学。目标是自描述数据和可组合性。 - Jorge Tovar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接