clojure2024状态调查中分享您的想法!

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

+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流程,如果出现新的反射警告,将导致构建失败,我宁愿保证没有反射警告,并在本地立即看到该错误,而不是错失详后由变更带来的问题。

by
如果有人这样说:“但实际上,如果你依赖于A和B,它们都依赖于Java库C,并且你更新了A,它使用了C的新版本,这可能会导致B崩溃!”——如果你不更改依赖项,它仍然会继续工作。

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