可以使用spec / valid吗?在运行时进行功能输入验证?

时间:2019-12-22 18:18:19

标签: clojure clojure.spec

我正在编写clojure库,并且正在考虑使用clojure.spec。使用spec / valid是一种好习惯吗?在运行时输入函数?还是应该使用分散注意力以及类型提示?我担心的是,是否会有性能损失,是否被认为是对规范的错误使用,以及通常的不当行为。

1 个答案:

答案 0 :(得分:0)

总是在“适当的地方”检查有效的输入总是合适的。这意味着什么?这是一个悬而未决的问题。

通常,最“危险”的输入将来自程序边界的外界。这意味着来自Web /浏览器或其他服务的输入。

“最安全”的输入位于程序的内部,在这里(大概)您具有更多的控制权和信心。例如,您(可能)永远不会检查+函数的输入以确保每个arg是一个数字。而且,即使无效的arg漏了(也许是一个字符串),JVM也会立即抛出异常。

可以肯定的是,在运行单元测试时应该进行最大程度的检查,因此至少您知道您的代码在“正常”路径中可以正常工作。我喜欢使用Plumatic Schema,因为很容易在单元测试期间始终运行验证,但是在“生产”运行期间默认情况下处于禁用状态。

话虽如此,我经常将assert语句放在函数的开头,这些错误的输入将很难识别或稍后确实会导致难以诊断的问题。

这两种技术都救了我很多次!

请注意,即使像Java这样的强类型语言也无法将您保存在这里。类型化的变量可以确保输入是数字,但它可能无效,例如向sqrt函数发送负值。其他功能可能具有更加严格的输入,例如仅对质数有效,等等。类型无法捕获这些详细要求。只有良好的设计和良好的测试才能防止这些问题。

类型和断言不能阻止所有问题,但它们就像公路上的护栏(或安全带和安全气囊)。他们可能无法防止事故发生,但可以提供早期警告并降低后果的严重性。


P.S。您可以看到我喜欢如何在安全性和检入成本a libary I wrote之间进行权衡。确保使用see the file _bootstrap.clj,这是一个仅在单元测试期间打开Plumatic Sc​​hema测试的技巧。