Parece que hay varias maneras de implementar modelos de datos en Clojure:La implementación de un modelo de datos para evitar errores comunes
- ordinarios tipos de datos internos (mapas/listas/sistemas/vectores)
- Built-in tipos de datos + meta-datos - por ejemplo:
(type ^{:type ::mytype} {:fieldname 1})
- tipos de datos incorporados + funciones especiales de descriptor de acceso (por ejemplo,
get
ting una clave inexistente de un mapa se produce una excepción, en lugar de regresar en silencionil
) - DEFTYPE
- defstruct
- defrecord
- defprotocol
Hemos llegado al punto en mapas/listas ya funcionando bien para nosotros no son - nos encontramos con un montón de errores que precondiciones/post- las condiciones podrían atrapar fácilmente, pero tomarse un tiempo muy largo para cazar de otra manera (y es difícil escribir condiciones pre/post efectivas para las funciones que aceptan mapas/listas/vectores anidados) - pero no estamos seguros de cuál de las anteriores Para escoger de.
Tenemos tres objetivos principales:
- escritura idiomática código Clojure
- evitar gastar grandes cantidades de tiempo la caza de errores de tipo estúpidos
- tener confianza en nuestra capacidad para cambiar el código/refactor con silenciosamente rompiendo cualquier cosa
¿Cómo podemos aprovechar el poder de Clojure para h elp nosotros?
Está bien, entonces necesito averiguar 'defrecord' y' defprotocol', puedo ignorar 'defstruct', y no tengo que preocuparme demasiado por' deftype'. ¿Importa a un programa clojure, que 'defrecord' crea código java, en el sentido de que no quiero preocuparme por tener una clase java, pero si clojure quiere usar uno en privado, está bien? Gran respuesta, muy atento. –
Bueno, un mapa simple es una clase Java también, como se puede ver en https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/APersistentMap.java –
Así que no es realmente una gran oferta que defrecord crea una clase java. Desde nuestro punto de vista usando el registro, no hará mucha diferencia, a excepción de la construcción, se sentirá como datos de clojure. –