我最近看过里奇·希基在2016年科隆·康吉的演讲,虽然它非常有趣,但我并不真正理解clojure.spec中的要点,也不知道什么时候使用它。似乎大多数思想,如一致性、有效性等,在Clojure中已经有了类似的功能。
到目前为止,我只学了大约3个月,所以这可能是因为缺乏编程/ clojure经验。
clojure.spec和cljs.spec的工作方式与Clojure和Cljs相似,虽然它们不是100%相同,但它们基于相同的基本原则。
发布于 2016-12-11 20:46:04
为了平滑地表达硬规范,您需要Clojure.Spec!
Clojure.spec为您提供了一种统一的方法来记录、指定和自动测试您的程序,以及验证您的实时数据。
它几乎偷走了所有的想法。它能为你自己做任何你不能做的。
但在我看来--几乎不知情--它改变了规范的经济性,使它在正确的情况下是值得的。改变游戏规则的人?-很有可能。
发布于 2016-12-12 19:54:57
在上周的clojure/conj会议上,可能有一半的演讲都以某种方式展示了规范,而且它甚至还没有超过alpha。spec是clojure的主要特性;它将继续存在,并且功能强大。
作为其功能的一个例子,以静态类型检查为例,它被许多人誉为一种安全网,也是众多编程语言的一个定义特征。它非常有限,因为它只在编译时很好,并且只检查类型。另一方面,spec验证并符合args的任何谓词(而不仅仅是类型),即返回,还可以验证两者之间的关系。所有这些都是函数代码的外部,将函数的逻辑与有关代码的验证和文档混合在一起。
关于工作流程:
关系检查相对于仅类型检查的好处的一个典型例子是计算字符串子字符串的函数。类型检查确保在(subs s start end)中s是字符串,start和end是整数。但是,必须在函数中进行额外的检查,以确保start和end是正整数,end大于start,并且得到的子字符串不大于原始字符串。例如,所有这些事情都可以说明(请原谅我,如果其中有些是多余的,甚至可能是不准确的):
(s/fdef clojure.core/subs
:args (s/and (s/cat :s string? :start nat-int? :end (s/? nat-int?))
(fn [{:keys [s start end]}]
(if end
(<= 0 start end (count s))
(<= 0 start (count s)))))
:ret string?
:fn (fn [{{:keys [s start end]} :args, substring :ret}]
(and (if end
(= (- end start) (count substring))
(= (- (count s) start) (count substring)))
(<= (count substring) (count s)))))使用符合上述args规范的示例数据调用函数:
(s/exercise-fn `subs)或者运行1000个测试(这可能会失败几次,但是继续运行,这是因为内置生成器无法满足:args谓词的第二部分;如果需要,可以编写自定义生成器):
(stest/check `subs)或者,想知道您的应用程序是否在实时运行时调用无效的subs?只需运行这个程序,如果函数被调用,而规范没有得到满足,您就会得到一个规范异常:
(stest/instrument `subs)我们还没有将它集成到我们的工作流程中,也无法在生产中实现,因为它仍然是alpha的,但是第一个目标是编写规范。我将它们放在相同的名称空间中,但目前放在单独的文件中。
我预见到我们的工作流程是使用以下方法运行规范函数的测试(见clojure规范指南):
(-> (stest/enumerate-namespace 'user) stest/check)然后,它将有利于打开所有功能的仪器,并在加载下运行应用程序,我们通常会测试它,并确保“真实世界”的数据工作。
您还可以使用s/conform来分解函数本身中的复杂数据,或者使用s/valid作为运行函数的前后条件。我对此不太感兴趣,因为这是生产系统中的开销,但这是一种可能性。
天空是极限,我们只是擦破了表面!酷的东西在未来的几个月和几年与规格!
https://stackoverflow.com/questions/41088402
复制相似问题