Patrones de Software – Introducción (Cap 1)

Hola, en esta ocasión hablaremos sobre patrones de software,  pero antes, debemos tener un claro concepto deun patrón.

¿Qué es un patrón? Concepto General – Introducción

Un patrón es un elemento, modelo o plantilla que se repite (Recurrencia) de una manera predecible, es decir, una serie de variables constantes en un entorno, que puede usarse para generar objetos o partes de ello, especialmente si los objetos que se crean tienen algo en común, de tal manera infiere una estructura de patrón fundamental. Entonces se dice que los objetos exhiben un único patrón. Un claro ejemplo, es la greca azteca:

Como podemos observar, el elemento recurrente es la Forma L, que representa el modelo, la recurrencia de este modelo, forma la estructura mediante un patrón único (L).

Otro ejemplo es el patrón de desbloqueo de nuestro celular:

En el desarrollo de software, sucede de la misma manera. Para la construcción de una aplicación se suele usar muchos patrones, por ejemplo:

  • Arquitectura en Capas
  • MVC (Modelo-Vista-Controlador).
  • DTO (Objeto de Transferencia de Datos)
  • Repositorio
  • Etc

Bueno, el gráfico es un concepto superficial, de hecho no es fácil establecer una definición definitiva de un patrón.

Patrones de software

Los patrones de software tienen raíces en muchas áreas, principalmente en la Arquitectura Civil, basada en el libro, The Timeless Way of Building (1979), escrita por Christopher Alexander.

¿Qué es un patrón? Según Christopher Alexander

El Arquitecto Christopher Alexander define patrón de la siguiente manera:

Cada patrón es una regla de 3 partes, que expresa una relación entre un contexto, un problema y una solución, Como un elemento en el mundo, cada patrón es una relación entre un contexto, un sistema de fuerzas que ocurren repetidamente en ese contexto y una configuración espacial que permite que esas fuerzas se resuelvan entre sí.

¿Qué es un patrón? Según Gang of Four

En el libro Design Patterns, escrita por Gang of Four en el año 1995, definen al patrón de la siguiente manera:

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.

¿Qué es un patrón? Según Microsoft

Otra definición más enfocada en el ámbito técnico, es la que se da en el libro Enterprise Development Reference architecture, escrita por Microsoft en el año 2004.

Un patrón es una descripción de un problema recurrente que ocurre en un contexto determinado, basada en un conjunto de fuerzas y recomienda una solución. La solución es usualmente un mecanismo simple: una colaboración entre dos o más clases, objetos, servicios, procesos, hilos, componentes o nodos que trabajan juntos para resolver el problema identificado por el patrón.

¿Qué es un patrón de software?

Los patrones de software son una disciplina, modelos o plantillas de resolución de problemas en la ingeniería de software, facilitan la reutilización del diseño y de la arquitectura, capturando las estructuras estáticas y dinámicas de colaboración de soluciones exitosas a problemas que surgen al construir aplicaciones.

Tener en cuenta que un patrón o patrones, proveen soluciones generales para resolver problemas de programación o desarrollo de software, sin embargo, no resuelven un problema en específico, pero proporcionan una especie de esquema arquitectónico que puede ser reutilizado con el fin de acelerar el proceso de construcción de software.

Para entender mejor, veamos el siguiente ejemplo:

En muchas ocasiones, un problema recurrente son las instancias múltiples, principalmente en abrir algún formulario, dicho formulario se puede abrir tantas veces presionemos el botón de abrir formulario. Generalmente, un formulario solo se debe abrir una vez (una instancia).

La solución que podemos aplicar es el patrón singleton, que básicamente permite crear una instancia única. Entonces podemos usar este patrón para crear instancias únicas de cada formulario que deseemos.

Recuerden que un patrón es un modelo que podemos reutilizarlo tantas veces sea necesario para resolver un problema.

Características

Un buen patrón debe tener las siguientes características.

  • Resuelve un problema: Los patrones capturan soluciones, no principios o estrategias abstractas.
  • Es un concepto probado: Capturan soluciones, no teorías o especulaciones. El criterio para decidir si es un patrón, es que éste debía tener al menos 3 implementaciones reales.
  • La solución no es obvia: Muchas técnicas de resolución de problemas como los paradigmas o métodos de diseño de software, intentan derivar soluciones desde principios básicos, los mejores patrones generan una solución a un problema indirectamente.
  • Describe una relación: Los patrones describen estructuras y mecanismos.

Categorías

Los patrones de software se dividen en varias categorías:

  • Patrones de arquitectura: Son Aquellos que expresan un esquema organizativo estructural para sistemas de software, es decir, afecta a la estructura global del sistema.
  • Patrones de diseño: Son Aquellos que expresan esquemas para definir estructuras de diseño o sus relaciones en los componentes, es decir, definen micro-arquitecturas de subsistemas (Componentes) mediante la colaboración entre dos o más clases, objetos o servicios que trabajan juntos para resolver el problema identificado por el patrón.
  • Patrones de lenguaje: Son específicos de los lenguajes de programación que describen cómo implementar ciertos aspectos de un problema, utilizando las características del lenguaje de programación, se podría decir que son guías de cómo usar o implementar ciertos criterios de un lenguaje. Por ejemplo: Guías de C#, Java, Php, entre otras.

Estas tres categorías de patrones son lo principal y fundamental para el desarrollo de software,  representando gráficamente de manera superficial tendríamos el siguiente gráfico:

Los cuadrados representan a los patrones de arquitectura, los círculos representa a los patrones de diseño y los triángulos a los patrones de lenguaje, un sistema de software puede estar construida por diferentes patrones de arquitectura, diseño y lenguaje, también cabe decir, que un patrón de arquitectura puede tener varios patrones de diseño dentro de ella, como también podemos usar varios lenguaje de programación, como se hizo en el tutorial de interoperabilidad de lenguajes C#, F# y Visual Basic.

Por otro lado, existen otras categorías de patrones de software importantes en el desarrollo de software (Ciclo de vida de software).

  • Patrones de análisis: Orientado al dominio de áreas.
  • Patrones de integración de aplicaciones: Conexión de varios sistemas en un punto.
  • Patrones de interfaz de usuario: Técnicas para crear interfaces de usuario.
  • Patrones de pruebas: Orientado para realizar pruebas.

Recomendación final

Tener muy en cuenta que no es obligatorio utilizar los patrones, a menos que tengas el mismo problema o similar que soluciona el patrón, siempre teniendo en cuenta que, en un caso particular puede no ser aplicable. Abusar o forzar el uso de los patrones puede ser un grave error, provocando Antipatrones o Patterns Happy.