我正在研究一些Clojure代码,它在不同名称空间之间有一些循环依赖关系,我试图找出解决它们的最佳方法。解决Clojure循环依赖关系
- 基本问题是,我得到一个“没有这样的变种:命名空间/ functionname”在
- 我试图“申报”功能中的一个文件的错误,但然后将它与抱怨:“不能指到一个不存在的合格变量“
- 我当然可以重构整个代码库,但这样做似乎不切实际,每次你有一个依赖关系来解决.....并且可能会对某些特定的圆形网络变得非常难看依赖关系
- 我可以分离出一堆接口/协议/声明到一个单独的文件,并让所有的东西都指向那个....但是这似乎很糟糕d最终变得凌乱,并破坏当前很好的模块化结构,我与相关的功能组合在一起
有什么想法?在Clojure中处理这种循环依赖的最好方法是什么?
感谢米哈尔的洞察力和有用的背景!我仍然不相信总是避免循环依赖必然是项目结构的最佳设计选择。请看看Clojure小组,看看它是否能说服我,否则:-) – mikera 2010-06-22 16:12:51
一个小小的更新 - 将协议放在他们自己的命名空间中运行良好,解决了大部分问题,我通常最终添加了一个(:use [协议])到大多数其他ns申报和一切“只是工作”。唯一我仍然觉得难以解决的地方是你声明一个你想在声明之前引用的类(例如deftype)(例如作为协议定义中的类型提示!!) – mikera 2010-07-06 12:42:50
感谢更新,很高兴听到!我认为用实际实现类的名字暗示协议/接口函数可能不是一个好主意,但实际上我的印象是协议方法根本不能被暗示,但接口方法可以和参数是相同):改为使用接口的名称。如果你正在处理一个'deftype'创建的类,它的所有方法无论如何都是'Object'/interface/protocol方法。我唯一使用提示指向类的时候是互操作所需要的。 – 2010-07-06 22:47:33