作为一名来自 RDF 背景的开发者,我在定义属性时经常使用 qualified 关键词。然而,在研究了 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
,以及是否还有我忽略的设计/实现问题。