gpt4 book ai didi

clojure - Clojure.Spec 的规范应该放在哪里?

转载 作者:行者123 更新时间:2023-12-02 04:44:59 24 4
gpt4 key购买 nike

所以,我越来越深入地研究 Clojure.Spec

我偶然发现的一件事是,在哪里放置我的规范。我看到三个选项:

全局规范文件

在大多数示例中,我在网上发现,有一个大的 spec.clj 文件,它在主命名空间中是必需的。它具有所有“数据类型”和函数的所有 (s/de​​f)(s/fdef)

优点:

  • 一个文件即可统治所有内容

魂斗罗:

  • 这个文件可能很大
  • 违反了单一责任原则?

生产命名空间中的规范

您可以将 (s/de​​f)(s/fdef) 放在生产代码旁边。因此,实现和规范共存于同一命名空间中。

优点:

  • 实现和规范的协同定位
  • 一个命名空间 - 一个关注点?

魂斗罗:

  • 生产代码可能会变得困惑
  • 一个命名空间 - 两个问题?

专用规范命名空间结构

然后我想,也许规范是第三种代码(仅次于生产和测试)。所以也许他们应该拥有自己的命名空间结构,如下所示:

├─ src
│  └─ package
│   ├─ a.clj
│   └─ b.clj
├─ test
│  └─ package
│   ├─ a_test.clj
│   └─ b_test.clj
└─ spec
  └─ package
  ├─ a_spec.clj
  └─ b_spec.clj

优点:

  • 规范专用(但相关)命名空间

魂斗罗:

  • 您必须获取并要求正确的命名空间
<小时/>

谁对其中一种方法有经验?
还有其他选择吗?
您对不同的选择有何看法?

最佳答案

我通常将规范放在它们自己的命名空间中,以及它们所描述的命名空间中。它们的名称并不特别重要,只要它们使用一些一致的命名约定即可。例如,如果我的代码位于 my.app.foo 中,我会将规范放入 my.app.foo.specs 中。

规范键名称最好位于代码的命名空间中,但不要位于规范的命名空间中。通过在关键字上使用命名空间别名仍然很容易做到:

(ns my.app.foo.specs
(:require [my.app.foo :as f]))

(s/def ::f/name string?)

我不会尝试将所有内容放入一个巨大的规范命名空间中(这真是一场噩梦。)虽然我当然可以将它们与规范代码一起放在同一个文件中,但在我看来,这会损害可读性。

可以将所有规范 namespace 放在单独的源路径中,但这样做没有真正的好处,除非您想要分发代码而不是规范或反之亦然...很难想象那会是什么样子。

关于clojure - Clojure.Spec 的规范应该放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37942495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com