# Lenguaje de patrón

En diseño, un lenguaje de patrón es un método estructurado para describir una serie de buenas prácticas de diseño en un área particular. Se caracteriza por:
* Descubrir y nombrar los problemas más comunes en el campo de interés.
* Describir las características principales de las soluciones efectivas para llegar al objetivo marcado.
* Ayudar al diseñador a moverse de un problema a otro de una forma lógica.
* Permitir diferentes caminos en un mismo proceso de diseño.
Los lenguajes de patrón se utilizan para formalizar los valores de decisiones cuya efectividad resulta obvia a través de la experiencia, pero que es difícil de documentar y pasar a los aprendices. También son herramientas útiles a la hora de estructurar el conocimiento y comprender sistemas complejos sin caer en la simplificación extrema. Estos procesos incluyen la organización de personas o grupos que tienen que tomar decisiones complejas, y revelan cómo interactúan las diferentes funciones como parte del total.

## Origen

Christopher Alexander acuñó el término lenguaje de patrón. Lo usó para referirse a los problemas normales del diseño arquitectónico y civil. Su uso iba desde la forma de estructurar una ciudad a como debían disponerse las ventanas en una habitación. La idea se popularizó gracias a su libro A Pattern Language.
El libro de Alexander The Timeless Way of Building describe qué significa para él lenguaje de patrón y cómo se aplica al diseño de edificios y ciudades. Sin embargo, este sistema es aplicable a cualquier otro campo del diseño.
Alexander da la siguiente definición de patrón: "Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno, para describir después el núcleo de la solución a ese problema, de tal manera que esa solución pueda ser usada más de un millón de veces sin hacerlo ni siquiera dos veces de la misma forma."
Según Richard Gabriel: "Cada patrón es una regla de tres partes, la cual expresa una relación entre un cierto contexto, un conjunto de fuerzas que ocurren repetidamente en ese contexto y una cierta configuración software que permite a estas fuerzas resolverse por sí mismas."

## Muchos patrones forman un lenguaje

Así como las palabras deben tener una relación gramática y semántica entre ellas para crear un lenguaje oral útil, los patrones de diseño deben estar relacionados los unos con los otros para poder formar un lenguaje de patrones. En el trabajo de Alexander está implícita la idea de que los patrones deben estar organizados en estructuras lógicas o estructuras intuitivas. La estructura (jerárquica, iterativa, etc) puede variar, dependiendo del tema. Cada patrón debe indicar su relación con otros patrones y con el lenguaje en sí.

## Uso

Alexander animó a la gente que usaba su sistema a expandirlo con patrones que los usuarios creasen. Para hacer esto posible, sus libros no se centran de forma estricta en arquitectura o en ingeniería civil. En los libros también habla del método general de los lenguajes de patrón. De esta forma, sus métodos se han usado para documentar el conocimiento experimental en diversos campos, como los patrones informáticos que se usan en ingeniería de software, patrones de diseño de interacción en Interacción del hombre con la computadora y patrones pedagógicos en educación. Sin embargo, las especificaciones de Alexander sobre como usar un lenguaje de patrón así como cómo crear uno nuevo siguen ejerciendo su autoridad, y sus libros son la referencia para expertos en campos muy diversos.
Es importante señalar que notaciones como UML o la colección de símbolos de los diagramas de flujo no son lenguajes de patrón (aunque podrían utilizarse para expresar un lenguaje de patrón). Una receta o cualquier otro conjunto de secuencias a seguir, con sólo un posible camino desde el inicio hasta el final, tampoco es un lenguaje de patrón. Sin embargo, el proceso de diseño de una nueva receta puede beneficiarse del uso de los lenguajes de patrón.

## Cómo documentar un patrón

Siguiendo las enseñanzas de Alexander, un patrón individual debe describirse en 3 partes:
* "Contexto" - ¿Bajo qué condiciones resolverá esta solución el problema?
* "Sistema de fuerzas" - Se puede considerar como el problema o el objetivo
* "Solución" - Una configuración que pone las fuerzas en equilibrio o resuelve el problema presentado
Contexto -> Sistema de fuerzas -> Solución
Así, una entrada en un lenguaje de patrón debería tener un nombre sencillo, una descripción concisa del problema, una solución clara, y suficiente información para ayudar al lector a entender cuando aplicar esta solución. También debería mostrar que patrones deben tenerse en consideración de ante mano, y que patrones se deberían considerar más adelante.

## Ejemplo sencillo de un patrón

Nombre: GalletaChocolateRelación
Contexto: Cocinando galletas de chocolate para tu familia y amigos
Considera estos patrones anteriormente: AzucarRelación, HarinaRelación, HuevoRelación
Problema: Determinar la relación óptima entre trozos de chocolate y masa de galleta
Solución: Observe que la mayoría de la gente considera los trozos de chocolate como lo mejor de la galleta. También observe que demasiado chocolate haría que la galleta no se mantuviese junta, disminuyendo su atractivo. Como se están cocinando pocas galletas, el coste no es un gran problema. Así, utilice tanto chocolate como pueda manteniendo la galleta compacta.
A considerar ahora: NuecesRelación o TiempoCocción o MetodoCongelación.

## Lenguajes de patrón y wikis

Ward Cunningham creó la Wiki original, el Portland Pattern Repository, como una forma de expresar los lenguajes de patrón de forma efectiva. En la actualidad tiene cientos de patrones de diferentes campos, incluyendo muchos sobre programación extrema.

## Trucos para crear un lenguaje de patrón

Los siguientes pasos asumen el uso de una aplicación informática de hipertexto, como una wiki.
* Piense sobre la situación como una jerarquía de ideas, como un fractal, desde lo general al detalle.
* Ponga cada idea en una página diferente, nombrándola con el título que describe la idea en pocas palabras.
* En un índice, ordena las ideas desde las más grandes a los detalles. Esto permitirá al lenguaje de patrón ser lineal y fácilmente imprimible, si es necesario. Este paso incrementa de forma amplia la usabilidad del sistema si (casi) todas las páginas se mencionan en la gran lista.
* Para cada patrón, escriba una descripción del problema, la solución y un ejemplo. Mientras lo escribe, conéctelo con los patrones con los que se relacione
* Los gráficos son de gran ayuda.
* Si hay varias personas editando el lenguaje de patrón, firme su trabajo. Además de la razón más obvia, permite conseguir un lista de las páginas usando enlace recíprocos en cada página.
* Muestra referencias donde sea apropiado
* Ponga un enlace al índice al final de cada patrón
* Probablemente necesita una ventana para escribir su página, y al menos una más para saltar atrás y adelante con las referencias.