我在我们的代码库中发现了关于一些标记字面量似乎违反最小惊讶原则的有趣问题。
我们创建了一些包括一些来自在 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
诱导的依赖吗?或者那可能太过于越界?