当您不需要将某些内容定义为动态来 with-redefs 时,将某些内容定义为动态的意义何在?

2024-03-30

在我看来,这with-redefs可以做一切binding动态符号可以做到,只是它没有需要的限制^:dynamic元数据。那么我什么时候应该使用其中一种而不是另一种呢?


除了要求^:dynamic元数据,binding还创建仅在当前线程中可见的绑定,而由with-redefs在所有线程中都可见。所以,with-redefs是一个非常生硬的工具,有可能影响同一虚拟机中运行的其他代码。我从未见过with-redefs在测试代​​码之外使用,也不应该(至少在我看来)。

我将两者之间的区别总结如下:

  • binding with ^:动态允许您以受控的方式引入一些动态行为。这是在 API 中定义扩展点的好方法,可以让调用链上游的调用者更改代码的行为,而无需在调用堆栈中一路显式传递参数(其中一些甚至可能不是他们的代码)。
  • 带重定义是一场免费的比赛。它在测试中很有用,例如当被测试的函数有很多依赖项时,用于模拟整个子系统。

将 var 声明为^:dynamic,以及使用耳罩命名动态变量的约定(例如*my-dynamic-var*),还有一个额外的好处,那就是它是一种自我记录的方式,向调用者宣传您的那部分代码可以动态修改。

总结一下:更喜欢^:动态 and binding编写 API 和生产代码时。使用带重定义在测试中,作为动态改变未声明的超出您控制范围的变量行为的最后手段^:dynamic(然后谨慎使用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当您不需要将某些内容定义为动态来 with-redefs 时,将某些内容定义为动态的意义何在? 的相关文章

随机推荐