来自RDF背景,我倾向于在定义属性时大量使用限定关键词。然而,在研究了Reitit HTTP路由器之后,我发现defrecord
对性能非常有帮助。这通常使我在设计软件时面临性能与数据清晰表达之间的选择。
为了避免这种困境,我认为如果defrecord
可以支持类似于为map解构已经实现的功能会很好。
(def m {:domain/id 14 :other/id "UV"})
(let [{:keys [domain/id]} m] id)
;;; ⤷ 14
我们可以这样
(defrecord Employee [domain/id domain/full-name]
Object
(toString [_]
(str "<< id: " id ", name: " full-name " >>")))
(def alyssa (->Employee 14 "Alyssa P. Hacker"))
(.toString alyssa)
;;; ⤷ "<< id: 14, name: Alyssa P. Hacker >>"
(:domain/id alyssa)
;;; ⤷ 14
其中
- 名称部分绑定在记录定义中,并用作Java内部类字段
- 当通过类似的映射接口访问/操作记录对象时,使用全限定标识符。
- 字段名称的冲突将抛出
我已经实现了一个原型来展示如何在实践中做到这一点。我想知道这种扩展是否已考虑用于clojure.core/defrecord
,以及是否有我未注意到的设计/实现问题。