2024 年 Clojure 状态调查 中分享您的想法!

欢迎!请查看 关于 页面以获取更多关于此操作的信息。

+4
Clojure
编辑

目前 clojure.core/*assert* 的默认值为 true

这对库创建者和使用者都有一些影响。

作为库创建者,你不能只是到处添加断言以帮助你在开发/测试中,因为这将使大多数用户在生产中付出性能代价,因为他们会运行在 *asserts* 启用状态下。

作为库使用者,由于你不知道哪些库使用了断言,你必须始终记得在必要时禁用它们。

由于 Clojure 中禁用断言并不容易,因为 `assert` 是一个检查 *assert* 的宏,需要在该名称空间加载之前设置变量的值,这使得问题更加严重。

相比之下,Java 默认禁用所有断言,因此库创建者不必担心这个问题,而消费者可以在开发时通过提供 java -ea(启用断言)显式地启用它们。

由于我猜测更改 *assert* 的默认值可能因为向后兼容性问题而变得有疑问,所以可能可以添加一个类似于 Rust 中的 `debug-assert`,默认情况下不会启用。

在我看来,重要的是要有一个简单的符号检查指令,我们知道默认情况下它不会影响性能,这样在测试和开发过程中加固我们的代码库就不会与生产性能绑定。

其他两种选择是更好的 assert 默认值,一个是 false,另一个是 java.lang.Class desiredAssertionStatus() 的值,它似乎根据是否提供了 -ea 标志返回 true/false,这默认也将是 false,但由于大多数 Clojure 用户已经依赖于 assert 默认为 true,这可能不是一个选择。

我将要将https://docs.clojure.org/clojure.spec.alpha/assert 添加到对话中,因为在默认情况下它是关闭的(在运行时,但在测试时可以打开,也可以在编译时完全禁用)。

将此作为库方法推荐的问题在于,你会处于 Spec 失败的无助境地,因为没有自定义消息的选项,就像常规的 assert 一样。
如果我的理解正确,你将只有使用 debug-assert 来进行 dev/test 时间的断言。然后你会使用常规的 assert 来在生产环境中设置你想要的断言。

这开始让我觉得有点像日志记录了。可能为当前 assert 函数添加“级别”,类似于日志级别呢?
我建议 debug-assert,只是为了不破坏 assert 的向后兼容性。我认为 assert 按照当前的实现,不应该用于任何生产相关的用途,因为它们可以被禁用。我认为在我们的代码中检查重要内容时,我们应该使用我们的正常(when-not something (throw ...))。
debug-assert 的整个目的就是让 assert 在 Java 中的效果得以实现,你可以“滥用”它在开发和测试中进行不变性检查,但你又确信它不会意外地进入生产环境,并让你的代码用户承担性能成本。

所以我认为这里没有级别的设置,它只是一种开发工具。

登录注册以回答此问题。

...