我在我们的代码库中找到一个有趣的 issue,一些带有标签的字面量似乎违反了最小惊讶原则。
我们创建了一些纯数据过程描述,包括来自在 data_readers.cljc
中声明的自定义标签字面量读取器的 defrecord
对象,并让这些 defrecord
对象参与到协议中。一切一直工作得很顺利,直到我遇到了这个问题。
有人将这些标签字面量之一放入了 def
(一开始这似乎是合理的)
(def foo #ctx/event-path [:blah])
这没有问题...直到 c.t.n.r/refresh
被调用,在此之后一切开始出现问题
结果发现,defrecord
对象 foo
中的类已经过时(很可能是由于在 data_readers.cljc
中声明的标签字面量解析器引起的命名空间依赖不被 tools.namespace
所识别,因此命名空间被重新编译且顺序混乱),因此不再参与协议。
tools.namespace
应该能够识别由 data_readers.cljc
诱导的依赖吗?或者这超出了它的能力范围?