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

欢迎!请查阅 关于 页面以了解更多关于如何使用本网站的信息。

+3
Clojure

复制自这个 reddit 评论

所以,如果一个有歧义的方法是一个语法错误(实际上是语法错误?),那么当更新一个提供新重载的 Java 库时,我的代码就会出错吗?更糟糕的是,如果我有一个在类路径上的 Clojure 库使用 Java 库,然后更新 Java 库并且它现在提供了另一个重载,Clojure 库就会破裂。这将是非常糟糕的,也可能导致各种更新问题。

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

我的理解

Clojure 的一个优势是代码的弹性,一些多年前的代码仍然可以工作到今天。这在历史上也适用于提供围绕 Java 库的惯用包装器的库。然而,使用语法错误而不是回退到反射意味着,如果这些库(如果它们使用新的方法值语法)将比其他交互代码脆弱,限制其在长期代码中的有用性。

我理解使用硬错误(性能、清晰度、简单性)的原因,但我同意,考虑到 Clojure 否则令人难以置信的灵活性和愿意支持各种用法,这确实是一个奇怪的选择。

在歧义情况下回退到反射(和一个反射警告)会失去或降低什么?”

3 个答案

+1

已选择
 
最佳回答

这个问题在其他reddi和slack的线程中已广泛讨论,所以我将简短地说明,但在此我们旨在创建高质量的方法值(具体、明确、无反思、适当的提示/转换),通常我们不想创建反射方法值。这与之前的外部功能不同,并将引导我们未来(我预计会演变)的选择。

+2

我们感谢这里的问题,它给了我们一些新想法,并将在下一迭代中加以吸收,谢谢。

哇,很有趣。感谢您的跟进。
0

Clojure的一个优点是代码的弹性,即多年前编写的代码至今仍在使用。

如果您不更改依赖项,它将会继续工作。

我认为人们需要考虑为什么你需要更新依赖于现有依赖项的Java库?如果你让它保持原样,它会继续工作。只有在你在自己的项目中明确更改版本时,它才会出现故障,这种更改总是存在风险,可能会破坏还使用该版本的依赖项。

是的,有时有很好的理由要覆盖Java库的版本——例如解决CVE,或者你可能有两个依赖项都依赖于那个Java库,你想更新其中一个依赖项。但这些改变总是带有风险——即使是Java库的补丁版本更新也可能(并且确实!)以各种方式引入断裂。

作为一个CI管道,如果出现新的反射警告,构建会失败的人,我更希望有一个保证没有反射,并且立即在本地看到那个错误,而不是在下一条线索中错过由更改引入的问题。

如果有人说“好吧,实际上……如果你依赖A和B,它们都依赖于Java库C,更新A并使用C的新版本,它可能会破坏B!”——如果你不更改依赖项,它将继续工作。

如果你更新了更改你传递性依赖项版本的库,你始终面临断裂的风险。
...