我很难决定何时使用 defrecord
如果我在我的记录中使用的协议(protocol)是语义 clojure 和功能性的,那么它是正确的选择,并且更广泛地说。
在我目前的项目中,我正在构建一个游戏,它具有不同类型的敌人,它们都具有相同的一组 Action ,而这些 Action 可能会以不同的方式实现。
来自 OOP 背景,我很想做类似的事情:
(defprotocol Enemy
"Defines base function of an Enemy"
(attack [this] "attack function"))
(extend-protocol Enemy
Orc
(attack [_] "Handles an orc attack")
Troll
(attack [_] "Handles a Troll attack"))
(defrecord Orc [health attackPower defense])
(defrecord Troll [health attackPower defense])
(def enemy (Orc. 1 20 3))
(def enemy2 (Troll. 1 20 3))
(println (attack enemy))
; handles an orc attack
(println (attack enemy2))
;handles a troll attack
从表面上看,这似乎是有道理的。我希望每个敌人总是有一个攻击方法,但实际的实现应该能够根据特定的敌人而有所不同。使用 extend-protocol
我能够创建对我的敌人不同的方法的有效调度,并且我可以轻松地添加新的敌人类型以及更改这些类型的功能。我遇到的问题是为什么我应该在通用 map 上使用记录?以上对我来说有点 OOP 的感觉,并且似乎我正在反对一种更实用的风格。所以,我的问题分为两个:
最佳答案
九年后,这个流程图仍然是个好建议:https://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/ -- 似乎已移至 https://cemerick.com/blog/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form.html
我的经验法则是:始终使用普通的哈希映射,直到你真的需要多态性,然后决定你是想要多方法(对一个或多个参数/属性进行调度)还是协议(protocol)(仅对类型进行调度)。
关于Clojure - 在 map 上使用记录有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62684264/