J'utilise beaucoup de cartes et de structures dans mes programmes de clojure. Quels sont les avantages (en dehors des performances) de la conversion de ceux-ci en défrécords?
Réponses
Trop de publicités?Je considère que les structures puissent être effectivement obsolète, donc je ne pas les utiliser du tout.
Quand j'ai un ensemble fixe de bien-connu clés utilisées dans de nombreux map cas, j'ai l'habitude de créer un enregistrement. Les gros avantages sont les suivants:
- Performance
- Classe générée a un type que je peux passer dans multimethods ou d'autres situations
- Avec d'autres macro machines autour de defrecord, je peux obtenir la validation de champ, les valeurs par défaut, et toutes les autres choses que je veux
- Les enregistrements peuvent mettre en œuvre des interfaces arbitraires ou protocoles (les cartes ne peuvent pas)
- Loi sur le casier que des cartes pour la plupart des besoins
- des clés et des vals de retourner des résultats stables (par création) afin
Quelques inconvénients de dossiers:
- Car les enregistrements sont Java des instances de classe (pas Clojure cartes), il n'est pas structurelle partage donc la même structure de l'enregistrement sera probablement utiliser plus de mémoire que l'équivalent de la carte de la structure qui a été changé. Il est également plus d'un objet de création/destruction que vous "changer" un record bien que la JVM est conçu spécifiquement pour manger ce genre de courte durée ordures sans casser une sueur.
- Si vous modifiez des enregistrements au cours du développement, vous aurez probablement besoin de redémarrer votre REPL plus fréquemment à la cueillette de ces changements. C'est typiquement un problème uniquement pendant étroit bits de développement.
- De nombreuses bibliothèques existantes n'ont pas été mis à jour pour supporter les enregistrements (postwalk, zip, matchjure, etc etc). Nous avons ajouté cette du soutien, au besoin.
Stuart Sierra a récemment écrit un article intéressant sur «La résolution du 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'ensemble de l'article est un bon point de départ pour comprendre les protocoles et les enregistrements.