Pregunta

Estoy interesado en cómo las personas estructuran su código fuente Clojure.

Al estar acostumbrados a Java, estoy bastante familiarizado con el paradigma de una clase por archivo de código fuente, la agrupación de todas las definiciones de datos y método con los comentarios apropiados y anotaciones, etc.

Sin embargo ofertas Clojure mucha más flexibilidad, y no estoy seguro de cómo debo estructurar mi proyecto (propensos a terminar como una aplicación de tamaño medio, tal vez 5.000 líneas con tres o cuatro subsistemas distintos)

En particular, estoy luchando con:

  • ¿Qué pautas debo utilizar para determinar si el código debe estar en un único espacio de nombres vs. separa en diferentes espacios de nombres?
  • ¿Debería cada protocolo / tipo de datos tiene su propio espacio de nombres de archivos + fuente con juego asociado de funciones?
  • Cuando debería requerir el uso frente a otros espacios de nombres?
¿Fue útil?

Solución

Soy de un fondo de Java, así, junto con un poco de rubí y un poco de Ir. Esto es lo que estoy haciendo en este momento, alrededor de un mes en Clojure:

  • Estoy pensando en un espacio de nombres como una unidad semántica, es de código que va de la mano para un propósito particular, como un tipo de datos y las operaciones sobre el mismo.

Tengo dos convenciones de espacios de nombres vs archivos:

  • Para las unidades más bien pequeñas que caben cómodamente en un solo archivo (estoy usando ~ 1000 líneas que el límite en el que un archivo debe ser dividida) Tengo un espacio de nombres por archivo, con la ruta del directorio, además del nombre del archivo el mismo que el espacio de nombres. Esta es una buena cosa en Java, creo, que hace que encontrar el espacio de nombres del archivo o viceversa una brisa.
  • Para las unidades más grandes que necesitan varios archivos, estoy usando la convención Go: El espacio de nombres coincide con la ruta del directorio, y todos los archivos en el directorio de la misma cuota de espacio de nombres. En estos casos normalmente asignar un archivo primario con un nombre fijo ( 'principal') que las cargas e interactúa con los demás.

Como un ejemplo de espacio de nombres, tengo un analizador que lee un formato y lo convierte en HTML. Tengo un único espacio de nombres para el analizador sintáctico (la unidad semántica) y varios archivos en la fracción de directorio en el sub-funcionalidad:. Lexer, analizador, la conversión de HTML y un archivo principal que contiene la API pública principal para usar el analizador

No utilizaría automáticamente un espacio de nombres por tipo de datos, que depende del alcance del tipo de datos. Si se trata de un grande, tal vez. Sin embargo, para un tipo de datos como punto, con dos campos y un par de funciones, prefiero subsumir en un espacio de nombres más general como la geometría.

Exigir el uso vs.:

  • exigir, con adecuada alias corto en casi todas partes.
  • Esto también permite la reutilización de los nombres fundamentales: Mi tipo de datos para fines especiales árbol tiene la operación "get" para encajar con los mapas; utilizar requieren no hay conflicto: "get" es el núcleo get Clojure, "árbol / get" es la ideal para mi tipo de datos.
  • Estoy usando el "uso" sólo por lo que considero "extensiones básicas", como cuando hago mi propio "mapa-si", que es el mapa y el filtro en uno.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top