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

欢迎!请参阅关于页面获取更多关于该功能的信息。

+3 投票
Clojure

从以下Reddit评论复制

如果一个歧义的方法是一个语法错误(实际上是语法?),那么这意味着当更新一个提供新重载的Java库时,我的代码会出错吗?更糟糕的是,如果classpath上有使用Java库的Clojure库,我更新了Java库,它现在提供了一个新的重载,Clojure库会出错。这会很糟糕,可能导致各种更新混乱。

在Java代码中添加重载是一个非常常见的向后兼容的更改,应该可以预料到。请不要让它创建Clojure包装器的"语法"错误。

我的话

Clojure的一个优点是代码的弹性,过去写的东西今天仍然可以使用。这在历史上也适用于提供Java库习惯用法包装器的库。然而,使用语法错误而不是回退到反射意味着,如果此类库(如果它们使用新的方法值语法),将比其他互操作代码更脆弱,限制其在长寿代码中的用途。

我理解使用硬错误的原因(性能、清晰度和简单性),但我同意,考虑到Clojure在其他方面的非凡灵活性和愿意支持各种用法,这确实是一个奇怪的选择。

在模糊的情况下回退到反射(以及反射警告)会损失或降低什么?

3 个答案

+1 投票
 
最佳答案

这一点在其他地方的红迪和Slack线程中被广泛讨论,所以我会简要介绍,但这里的意图是创建一个高质量的方法值(具体、明确、无反射、适当的提示/强制转换),而创建反射式方法值通常是我们不想做的事情。这种意图与之前的互操作特性不同,应驱动未来选择(我预计这将继续发展)。

我们感谢这个问题,这使我们获得了一些新想法,并将其纳入下一次迭代,谢谢。

哇,很有趣。感谢追问。

Clojure的优势之一是代码的健壮性,即使几年前编写的代码今天依然有效。

如果你不更改依赖项,它将继续正常运行。

我认为人们需要考虑为什么要更新一个现有依赖项所依赖的Java库?如果你让它保持原样,它将继续正常工作。只有当你明确在自己的项目中更改版本时,它才会出现问题,而这种改变总是存在中断使用该库的其他依赖项的风险。

是的,有时有必要覆盖Java库的版本,比如为了解决CVE,或者可能你有两个同时依赖于该Java库的依赖项,你想更新其中的一个。但这些类型的更改总是伴随着风险——甚至Java库的修补版本更新也可能(并且确实!)以各种方式引入中断。

作为一个如果出现新的反射警告就会使CI构建失败的人,我更希望有保证没有反射,并立即看到本地错误,而不是在更深层次的地方抓住由变更引起的问题。

by
当然,也可能有人会说:“实际上如果你依赖于A和B,它们都依赖于Java库C,你更新了A,并使用了一个更新的C版本,它可能会破坏B!”——如果你不更改依赖关系,它将继续正常工作。

如果你更新了一个更改你的传递依赖项版本的库,你总是面临中断的风险。
...