gpt4 book ai didi

clojure - 重构时是否有检查返回类型的好方法?

转载 作者:行者123 更新时间:2023-12-04 19:02:20 24 4
gpt4 key购买 nike

目前,当我在 Clojure 中重构时,我倾向于使用以下模式:

(defn my-func [arg1 arg2]
(assert (= demo.core.Record1 (class arg1) "Incorrect class for arg1: " (class arg1))
(assert (= demo.core.Record1 (class arg2) "Incorrect class for arg2: " (class arg2))
...

也就是说,我发现自己手动检查返回类型,以防系统的下游部分将它们修改为我不期望的东西。 (例如,如果我重构并获得我不期望的堆栈跟踪,那么我将我的假设表示为不变量,并从那里向前迈进)。

在某种意义上,这正是 Bertrand Meyer 的那种不变性检查。预期。 ( Object Oriented Software Construction 的作者,以及 Design by Contract 的想法的支持者)。

挑战在于我直到运行时才发现这些。我会很高兴在编译时找到这些 - 通过简单地说明函数的期望。

现在我知道 Clojure 本质上是一种动态语言。 (虽然 Clojure 有各种各样的“编译器”,但我们应该期望将值应用于函数只会在运行时实现。)

我只是想要一个好的模式来使重构更容易。 (即查看将参数更改为函数的所有连续影响,而不会看到它在第一次调用时中断,然后移动到下一个,然后移动到下一个中​​断。)

我的问题是: 重构时是否有检查返回类型的好方法?

最佳答案

如果我理解正确,棱镜/模式应该是你的选择。
https://github.com/plumatic/schema

(s/defn ^:always-validate my-func :- SomeResultClass
[arg1 :- demo.core.Record1
arg2 :- demo.core.Record1]
...)

您应该在发布前关闭所有验证,以免影响性能。

core.typed 很好,但据我所知,它强制您注释所有代码,而模式只允许您注释关键部分。

关于clojure - 重构时是否有检查返回类型的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34920334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com