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

欢迎!请参阅 关于 页面了解更多关于这个平台的信息。

+3
Clojure

来自这个 Reddit评论

如果一个歧义的方法是语法错误(真的是语法错误?),这意味着当您更新一个提供新重载的Java库时,我的代码会中断吗?更糟糕的是,如果我有一个存在于类路径上的Clojure库使用Java库,然后我更新Java库并现在提供另一个重载,Clojure库将崩溃。这会很糟糕,可能会引起各种更新地狱。

添加重载是在Java代码中常见的向后兼容性更改之一,我们应该期待它。请不要再让Clojure包装器创建“语法”错误。

我自己的话

Clojure的一个优点是代码的弹性,即几年前编写的代码今天仍然可以工作。这历来适用于提供Java库语法的库。然而,使用语法错误而不是回退到反射意味着,如果它们使用新的方法值语法,这些库将比其他交互式代码更加脆弱,限制了其在长寿代码中的实用性。

我理解使用硬错误(性能、清晰、简单)的原因,但我认为这给了Clojure的惊人灵活性和支持各种用法的意愿一个奇怪的选择。

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

3 个答案

+1

已选择
 
最佳答案

这个话题已在reddit和slack上的多个线程中广泛讨论,所以我将简短地总结,但此处的目的是制定一个高质量的方法值(具体、明确、无反思、合适的提示/强制转换),通常我们不想创建一个有反思的方法值。这种意图与之前的互操作性特征不同,应指导未来(我预计将会发展)的选择。

+2

我们感谢在这里提出的问题,这给了我们一些新想法,并将将其纳入下一次迭代中,谢谢。

哦,很有趣。感谢跟进。
0

Clojure的一个优点是代码的弹性,即多年前的代码仍然适用于今天。

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

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

是的,有时有很好的理由要覆盖Java库的版本——例如为了解决CVE漏洞——或者你可能有两个都依赖于那个Java库的依赖项,你想要更新其中的一个。但这类变更总是伴随着风险——甚至Java库的修补版本更新也可能(确实也会!)以各种方式引入破坏。

作为一个如果CI流水线出现新的反射警告就会失败的构建者,我更希望有保证没有反射并立即在本地看到那个错误,而不希望错过变更在下线路上引入的问题。

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

如果你更新了一个更改了你的传递依赖项版本的库,你总是有被破坏的风险。
...