¿Cómo refactorizar un singleton de Java a Clojure?

7

Estoy escribiendo un juego simple en Java y quiero aprender Clojure, así que decidí refactorizar mi código Java actual a Clojure. El problema es que he codificado tanto en lenguajes orientados a objetos que no puedo ver cómo hacerlo funcionalmente.

Para ser concreto, tengo un Map<String, Country> dentro de una clase de singleton al que se puede acceder desde cualquier lugar para obtener una instancia de País, actualizarla y volver a colocarla en el mapa. Implementé esto de la misma manera en Clojure. Por ejemplo, para actualizar un país:

(def countries (do-get-countries))

(defn update-country
    [country]
    (def countries (assoc countries (get country :name) country)))

También he creado un defrecord Country , pero en realidad modifico estos registros como

(assoc country :name "New name")

Estos dos ejemplos no parecen idiomáticos en mi opinión. ¿Es esta realmente la manera correcta de hacerlo en Clojure? Si no, ¿cómo sería más idiomático?

Gracias de antemano!

    
pregunta m0skit0 28.11.2013 - 18:40

1 respuesta

12

Aquí hay una guía paso a paso para pasar de su ejemplo de Java a un Clojure decente:

  1. reconoce que tu singleton es solo un estado global y mutable. El singleton puede funcionar bien pero no es necesario. Así que nos hemos movido de Java: singleton - > Java: global, estado mutable
  2. refactorice su ejemplo de Java para utilizar el estado mutable local en lugar del estado global mutable, pasando el mapa a los métodos que lo modifican. Así que vamos a pasar de Java: estado global mutable - > Java: local, estado mutable
  3. * ahora, en lugar de actualizar el mapa de forma destructiva cada vez, busque / escriba una biblioteca Java ( tal como el que utiliza la implementación de Clojure ) que no muta al agregar / eliminar pares clave / valor a / de los mapas. Recuerde devolver los valores que se han "actualizado", de lo contrario, los cambios no serán visibles para otro código. Así que acabamos de pasar de Java: estado local y mutable - > Java: local, estado inmutable
  4. en este punto, tiene una solución de PF, pero está codificada en Java. Su solución inicial de Clojure podría terminar como una traducción de casi 1: 1, pero a medida que aprenda más, descubrirá cómo aprovechar sus fortalezas y mejorar y acortar el código. Además, puede aprender algunos patrones geniales para lidiar con el estado "mutable" de una manera puramente funcional. Así que depende de usted hacer el salto desde Java: local, estado inmutable - > Clojure: local, estado inmutable

Desde el punto 3 anterior: uno de los puntos principales de FP es "lo mismo dentro, lo mismo hacia fuera". El estado mutable destruye totalmente este concepto y, con él, las ventajas del código puro. Clojure no te obliga a ser puro, pero ciertamente hace que sea fácil hacerlo. Por lo tanto, si desea aprender a escribir un buen código de Clojure, tendrá que aprender a evitar (la mayoría) del estado mutable en algún momento.

    
respondido por el user39685 03.12.2013 - 12:14

Lea otras preguntas en las etiquetas