我在代码库中发现了围绕一些标记字面量似乎违反了最小意外原则的有趣问题
我们已经创建了一些纯数据描述的过程,包括来自在 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
引起的依赖?或者这超出了它的范畴?