data-structures clojure encapsulation abstraction

data structures - Abstracción de los detalles de implementación de la estructura de datos en Clojure



data-structures encapsulation (1)

Creo que el deftype podría ser el camino a seguir, sin embargo, deftype los métodos de acceso. En cambio, busque en clojure.lang.ILookup y clojure.lang.Associative ; Estas son interfaces que, si las implementa para su tipo, le permitirán usar get / get-in y assoc / assoc-in , lo que lo convierte en una solución mucho más versátil (no solo podrá cambiar la implementación subyacente, sino quizás también para usar funciones construidas sobre la biblioteca de colecciones estándar de Clojure para manipular sus estructuras).

Un par de cosas a anotar:

  1. Probablemente deberías comenzar con defrecord , usando get , assoc & Co. con las implementaciones defrecord estándar de ILookup , Associative , IPersistentMap y java.util.Map . Es posible que puedas recorrer un largo camino con esto.

    Si / cuando estos ya no son suficientes, eche un vistazo a las fuentes para emit-defrecord (una función privada definida en core_deftype.clj en las fuentes de Clojure). Es bastante complejo, pero le dará una idea de lo que puede necesitar implementar.

  2. Ni deftype ni defrecord actualmente definen ninguna función de fábrica para usted, pero probablemente debería hacerlo usted mismo. La comprobación de integridad va dentro de esas funciones (y / o las pruebas correspondientes).

  3. Las operaciones conceptualmente más complejas son, por supuesto, un ajuste perfecto para las funciones de protocolo construidas sobre la base de get & Co.

Ah, y eche un vistazo a gvec.clj en las fuentes de Clojure para ver un ejemplo de cómo podría verse un código de estructura de datos serio escrito usando deftype . La complejidad aquí es de un tipo diferente de lo que describe en la pregunta, pero aún así, es uno de los pocos ejemplos de programación de estructura de datos personalizada en Clojure actualmente disponible para el consumo público (y por supuesto es un código de excelente calidad).

Por supuesto, esto es justo lo que mi intuición me dice en este momento. No estoy seguro de que haya mucho en el camino de los modismos establecidos en esta etapa, lo que con el deftype no se ha liberado realmente y todo. :-)

Estoy desarrollando una estructura de datos compleja en Clojure con múltiples subestructuras.

Sé que querré extender esta estructura a lo largo del tiempo, y en ocasiones podría querer cambiar la estructura interna sin romper diferentes usuarios de la estructura de datos (por ejemplo, puede querer cambiar un vector en un hashmap, agregar algún tipo de indexación estructura por razones de rendimiento, o incorporar un tipo de Java)

Mi pensamiento actual es:

  • Definir un protocolo para la estructura general con varios métodos de acceso
  • Cree una mini biblioteca de funciones que naveguen por la estructura de datos, p. Ej. (Query-substructure-abc param1 param2)
  • Implementar la estructura de datos usando defrecord o deftype, con los métodos de protocolo definidos para usar la mini-biblioteca

Creo que esto funcionará, aunque me preocupa que esté comenzando a parecerse a una gran cantidad de código de "pegamento". También probablemente también refleja mi mayor familiaridad con los enfoques orientados a objetos.

¿Cuál es la forma recomendada de hacer esto en Clojure?