functional-programming - languages - functional programming python
¿Hay algún principio de Clojure? (6)
¿Hay algún principio para Clojure?
a. ¿Te gustan los principios de diseño orientado a objetos SÓLIDOS para lenguajes OO como Java?
segundo. u otros más heurísticos, como "Dile no preguntar", "Favorecer composición vs herencia", "Hablar con interfaces"
¿Hay algún patrón de diseño (para código flexible)?
¿Cuál es la parte contraria de lo básico de la programación funcional como la encapsulación para orientado a objetos?
¿Conoces algún recurso para estos?
1a) No conozco algo así, pero cada libro sobre FP hará algo así.
1b)
"Favorecer Composición vs Herencia" -> ya está a cargo de que comenzó con FP
"Hablar con abstracciones" -> más general
"se perezoso cuando puedas"
"evitar el estado"
"Usa FUNCIONES PURAS"
Elemento de lista
....
2.) Puede usar algunos de los mismos patrones de diseño que son mucho más fáciles de implementar. Algunos de ellos tienen menos sentido pero normalmente. La gente de FP no hace gran cosa de esto. (Esto es sobre los patrones de GoF, solo los conozco)
Mira el patrón observador, por ejemplo. En Clojure, puede utilizar la función añadir-watcher que hace que el patrón de observador quede obsoleto.
3.) Puede usar la encapsulación en los espacios de nombres (defn) o puede ocultar su función en otras funciones. En la Alegría de Clojure hay algunos ejemplos. Puedes empujarlo tan lejos como quieras.
A tu primera pregunta: no. †
Clojure está aquí para ayudarlo a hacer las cosas de manera correcta, rápida y agradable. Todo después de eso es salsa.
Y hay mucha salsa. No presumo conocer el método Clojure , incluso si existe, pero aquí hay algunas pautas que me han dicho y descubierto al escribir en Clojure:
Primero, consigue algo trabajando. Luego puede examinar, probar y optimizar si es necesario. Hay una razón por la que la macro de
time
está en el lenguaje central. Corrección ante la rapidez , para ser lindo.Resumen. Si te estás repitiendo, probablemente no lo estés haciendo bien . Componer, curry y combinar funciones.
Separa los efectos secundarios de tu lógica . por ejemplo, si desea formatear y guardar una cadena, formatéela en una función, luego use otra función para guardarla, como lo necesite.
3a. No te vuelvas demasiado loco con esto. A veces es mejor tener algunas funciones anónimas que un montón de definiciones de una línea que ensucian tu código.
Prueba. Rich te dio un REPL por una razón; usar el infierno fuera de ese REPL.
No desordenes tu espacio de nombres . Estamos limpios en Clojure-land. Califique su
use
o uso:only
lo que necesita. Haga su código legible.Conozca la biblioteca central . No solo
clojure.core
, sinoclojure.java.io
,clojure.string
,clojure.set
y todo lo que esté en el medio. Si crees que Clojure debería tener una función para hacer X, probablemente lo tenga. Puede usarapropos
(desde, sí, otra biblioteca central:clojure.repl
).Documente su código . Docstrings son una cosa hermosa Si tiene una tendencia a ser verboso, el documento es el lugar para desahogarse. Pero, sepa también que el buen código a menudo se "documenta". Si el código se explica por sí mismo, no es necesario ser pedante.
Este es un lenguaje funcional. Cuando puedas, usa una función . Los protocolos, las macros y los registros son geniales, pero cuando pueda salirse con la suya, use una función. Puede componer, combinar, mapear, reducir, iterar (la lista continúa, y sigue y sigue ...) las funciones. Eso es muy agradable.
Por encima de todo, rompa las reglas anteriores si tiene sentido . Pero prepárate para repensar y refactorizar. Si ha mantenido su código lo suficientemente modular, la refactorización de su código debería ser una cuestión de reorganización y recombinación.
Algunos otros consejos: leer el código de otras personas. Si comienzas a leer el código y te vuelves bueno leyendo el código, serás mejor escribiendo el tuyo, y es probable que también aprendas cosas nuevas: hay más de una manera de hacer casi todo.
Finalmente, lea los Estándares de codificación de la biblioteca Clojure para tener una idea de lo que se espera en el código de producción de Clojure.
† Al menos no todavía.
El director de Don''t Repeat Yourself (DRY) se aplica muy bien a clojure. El lenguaje es muy flexible y realmente promueve la composición de abstracciones de manera que realmente puede reducir la cantidad de código de lugar de la caldera muy cerca de cero.
Algunos ejemplos de formas de eliminar el código duplicado son:
- solo use lazy-cons cuando genere datos originales donde no funcionará ninguna variante del mapa. Si encuentra su auto-escritura
(lazy-seq (cons (do-something data) (call-myself (rest data)))
, verifique si elmap
o laiterate
harán lo que desea. - Usa pequeñas funciones y compónelas generosamente. Si una función necesita formatear algunos datos, envuélvalos en XML y envíelos a través de una red. escríbalas en tres funciones pequeñas y luego use
(def send-formated-xml (comp send xml format))
esta manera, puede asignar la función de formato a algunos datos más adelante, etc. - Cuando el idioma no pueda expresar tu patrón repetido, usa una macro. Es mejor * usar una macro que repetirte a ti mismo. y siempre recuerde que la primera regla de macro club es no usar una macro.
Pregunta difícil.
Clojure es muy flexible. Por lo tanto, son las mejores prácticas, pero no son tan importantes como para Java.
Escribo aquí algunos ejemplos de consejos de las familias más generales a las más particulares.
Hay consejos para la programación en general: escribir muchas pruebas, escribir algo correcto y agradable, perfilar y optimizar cuando sea necesario
Hay consejos para la programación funcional: escriba funciones pequeñas, escriba funciones puras, componga las funciones pequeñas, factorice su código a través de las funciones, intente usar combinadores cuando sea posible ...
Hay consejos para LISP: use la macro para eliminar patrones repetitivos, construya su programa de abajo hacia arriba. (Vea "en LISP" de Paul Graham para una mejor explicación que la mía)
También hay algunos consejos específicos para Clojure: siga el análisis cuidadoso del estado y la identidad ( http://clojure.org/state , para una muy buena explicación), intente usar seqs y sus funciones cuando sea posible, escriba cadenas de documentos para las funciones
Una buena fuente para obtener más consejos es el estándar de codificación de bibliotecas de Clojure http://www.assembla.com/wiki/show/clojure/Clojure_Library_Coding_Standards
Pero todos estos consejos son solo consejos, y Clojure puede ser usado por alguien que no quiere seguir estos consejos, ya que, como Lisp, es muy flexible.
En lo que respecta al patrón de diseño, el programador funcional rara vez piensa en estos términos, ya que la mayoría de ellos ha sido diseñado para lenguajes OO y no se aplica en un lenguaje funcional.
Peter Norvig tiene diapositivas interesantes sobre Design Pattern y LISP / Dylan: http://norvig.com/design-patterns/
Espero que ayude.
hay una publicación en un blog que menciona "pensando en clojure" here y le da algunos consejos sobre el libro The Joy Of Clojure, y algunos otros libros (e incluso enlaces a algunos videos)
Ahora, recibí el libro The Joy Of Clojure, leí un poco y promete enseñarme "The Way Of Clojure". Espero que resulte decirme lo que estoy buscando, algunos principios ...
Este libro es un trabajo que progresa, pero puede comprar una "edición de acceso temprano" de la sección de personal here y obtener el 40% del código "s140". ver información here
Este video presenta los principios de SOLID y cómo aplicarlos en Clojure.
Muestra cómo se mantienen estos principios en el mundo funcional tanto como en la programación orientada a objetos, ya que todavía tenemos que resolver los mismos problemas subyacentes. En general, me hizo pensar que la Programación Funcional es más adecuada para el diseño SOLID.