Protocols - clarify access to parameters
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 45/100
- Tipo de issue
- Documentación
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- clojure
- Área
- documentation
Línea de trabajo
Comienza localizando las guías Protocols and Data Types en la documentación de clojure-site y revisa cómo se explican actualmente los métodos de protocolo, defrecord y extend-protocol. Usa los ejemplos de Clojure del issue como referencia para la aclaración propuesta; se considerará terminado cuando las guías expliquen claramente el acceso a propiedades y la nomenclatura de parámetros en estos casos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
There are various ways to define and access properties defined with protocols and data types which are non-obvious and not explained or clarified in the Protocols or Data Types guides
I propose updating the Protocol guide with this examples:
Names and values when using defrecord directly
(defprotocol DeviceRegistration
"Protocol to register various IOT devices"
(register [device])
(ping [device]))
(defrecord RaspberryPi [device-id location registry-id]
DeviceRegistration
(register [_]
(->RaspberryPi device-id location 789))
(ping [_]
(= 789 registry-id)))
register and ping ignore the method parameters. Instead they uses the properties directly from the record.
Sample Usage
(def rasp-pi (map->RaspberryPi {:device-id 123 :location {:x 123.4 :y 432.1}}))
;=> #'practice1.core/rasp-pi
(def registered-pi (register rasp-pi))
;=> #'practice1.core/registered-pi
(println (type registered-pi))
;practice1.core.RaspberryPi
(def pinged? (ping registered-pi))
;=> #'practice1.core/pinged?
(println pinged?)
; true
Note: Diligent readers will have observed that we can only ever register or ping one RaspberryPi using this code. It's good enough for the example but maybe not production quality.
Names and values when using extend-protocol
(defrecord Arduino [device-id location registry-id])
(extend-protocol DeviceRegistration
Arduino
(register [device]
(assoc device :registry-id 890))
(ping [device]
(= 890 (:registry-id device))))
register and ping do not have access to the record directly. They access record properties from the method parameter, which is the Arduino record.
register creates a new Arduino record via assoc. In this case it is simpler than creating a new Arduino record using either ->Arduino or map->Arduino functions supplied by defrecord.
Sample Usage
(def arduino (map->Arduino {:device-id 345 :location {:x 432.1 :y 987.6}}))
;=> #'practice1.core/arduino
(def registered-arduino (register arduino))
;=> #'practice1.core/registered-arduino
(println (type registered-arduino))
;practice1.core.Arduino
(def pinged? (ping registered-arduino))
;=> #'practice1.core/pinged?
(println pinged?)
;true
Code in the wild uses this
Most code I see reads more like, ahem, this:
(extend-protocol DeviceRegistration
Arduino
(register [this]
(assoc this :registry-id 890))
(ping [this]
(= 890 (:registry-id this))))
In some languages there is a keyword this or self and it has a special meaning. It kind of does in these cases too - even though the symbol itself is not special in Clojure. Rather than use conventionally privileged words, I prefer the more descriptive option.
Obligatory Clojure documentation rant
Following on from the this mini-rant, I am not a fan of x y z and foo and bar as example parameters or method calls.
Documentation comes to life when it is illustrated with simple and easily understood examples rather than abstract characters and meaningless phrases.
I know 'real things' come and go but these guides are not written to see the heat death of the universe. Are they?
- Lenguaje dominante
- HTML
- Estrellas
- 259
- Forks
- 275
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de clojure/clojure-site
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
clojure/clojure-site#723 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
clojure/clojure-site#538 · 3 comentarios ·
-
help wanted
Dificultad 1/5 Menos de una hora Aptitud para principiantes 62/100
clojure/clojure-site#386 · 1 comentario ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 55/100
clojure/clojure-site#715 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
clojure/clojure-site#713 ·
Todos los issues de clojure/clojure-site
Issues similares
-
Area: Excel support
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
orbeon/orbeon-forms#7893 ·
-
Theme loads third-party resources on every page (jsdelivr web font, cdnjs Font Awesome) – GDPR Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
docToolchain/docToolchain#1705 ·
-
kb-infra-drift
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
OCHA-DAP/ds-knowledge-base#653 · 1 comentario ·
-
area/dev-productivity area/disaster-recovery area/ipcei kind/enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Claiming namespace: rasy007 Abiertonamespace operations
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
EclipseFdn/open-vsx.org#13419 ·