J'utilise de nombreuses cartes et structures dans mes programmes clojure. Quels sont les avantages (en dehors des performances) de la conversion de ces enregistrements en défrégistrements?
Je considère que les structures sont obsolètes, donc je ne les utilise pas du tout.
Lorsque j'ai un ensemble fixe de clés bien connues utilisées dans de nombreuses instances de carte, je crée généralement un enregistrement. Les gros avantages sont:
Quelques inconvénients des enregistrements:
Stuart Sierra a récemment écrit un article intéressant sur "Résoudre le problème d'expression avec Clojure 1.2", qui contient également une section sur defrecord
:
http://www.ibm.com/developerworks/Java/library/j-clojure-protocols/index.html#datatypes
Je pense que l'article entier est un bon point de départ pour comprendre les protocoles et les enregistrements.
Un autre avantage majeur est que le disque a un type (sa classe) que vous pouvez expédier.
Un exemple qui utilise cette fonctionnalité mais n'est pas représentatif de toutes les utilisations possibles est le suivant:
(defprotocol communicate
(verbalize [this]))
(defrecord Cat [hunger-level]
communicate
(verbalize [this]
(apply str (interpose " " (repeat hunger-level "meow")))))
(defrecord Dog [mood]
communicate
(verbalize [this]
(case mood
:happy "woof"
"arf")))
(verbalize (->Cat 3))
; => "meow meow meow"
(verbalize (->Dog :happy))
; => "woof"
Utilisez des cartes dans la plupart des cas et des enregistrements uniquement lorsque vous avez besoin de polymorphisme. Avec les cartes seules, vous pouvez toujours utiliser plusieurs méthodes; cependant, vous avez besoin d'enregistrements si vous voulez des protocoles. Compte tenu de cela, attendez d'avoir besoin de protocoles avant de recourir aux enregistrements. Jusque-là, évitez-les en faveur d'un code plus centré sur les données et plus simple.
En plus de ce qui a été noté précédemment, en plus d'être généralement au pair ou supérieur en termes de performances, et en exposant la même interface de programmation qu'une carte, les enregistrements appliquent une structure légère: les noms de clés et le nombre de clés sont appliqués au moment de définition. Cela peut être utile pour éviter des erreurs stupides où la même structure est attendue de nombreuses valeurs (ou simplement artificiellement rigide autrement).
Quelles que soient les motivations d'origine, cette propriété la distingue également des cartes.