Los patrones de arquitectura resuelven los problemas relacionados con el estilo arquitectónico, representan la relación entre los componentes de todo el sistema y cada uno de ellos está compuesto por pequeños módulos. Proveen un conjunto de subsistemas predefinidos donde se especifican sus responsabilidades e incluyen reglas y guías para organizar las relaciones entre ellos. Los patrones arquitectónicos tienen un gran impacto en la base del código, con mayor frecuencia afectando toda la aplicación (Global), ya sea horizontal (es decir, cómo estructurar el código dentro de una capa) o verticalmente (es decir, cómo se procesa una solicitud desde las capas externas hacia las capas internas), ya que expresan un esquema organizativo estructural para sistemas de software.
Arquitectura de software orientada a patrones (POSA)
Existen una gran variedad de patrones de arquitectura, por ejemplo, presentados en el clásico libro Pattern-Oriented Software Architecture (POSA) Volumen 1, en este libro se presenta patrones de arquitectura divididos en cuatro categorías.
De mar a estructura: Los patrones de esta categoría nos ayuda a tener de un mar de componentes y objetos a tener una estructura organizada de componentes u objetos colaborando entre sí, en esta categoría tenemos el patrón:
- Capas
- Tubería y filtros
- Pizarra
Sistemas distribuidos: En esta categoría solo se presenta un patrón, que se encarga de la comunicación entre aplicaciones validando el grado de conocimiento mutuo para poder intercambiar mensajes.
- Broker
Sistemas interactivos: El objetivo es mejorar la usabilidad de una aplicación, permiten producir resultados rápidamente al especificar la arquitectura de tales sistemas. El desafío es mantener el núcleo funcional independiente de la interfaz de usuario, en esta categoría tenemos al patrón:
- Modelo-Vista-Controlador (MVC)
- Presentación-Abstracción-Control
Sistemas adaptables: Esta categoría apoya la extensión de aplicaciones y su adaptación a la tecnología en evolución.
- Microkernel
- Reflexión
Patrones de arquitectura de aplicaciones empresariales (PEAA)
Por otra parte, también están los patrones arquitectónicos que se presentan en el libro Patterns of Enterprise Application Architecture (PEAA- 2002) escrita por Martin.
Desde mi punto de vista este es el mejor libro, el autor tiene una visión más abierta, se enfoca directamente a la práctica, la ejecución y no a la teoría clásica, por ejemplo, cómo funciona cuando aplicar que problemas resuelve y ejemplos de cada patrón. También que mencionar que Martin se apoya en los libros clásicos Design patterns, Elements of Reusable Object- Oriented Software, escrita por los Gang of Four (Patrones Base) y Pattern-Oriented Software Architecture (POSA).
Bueno el ingeniero de software Martín Fowler presenta siete categorías de patrón.
1.- Layering: La primera categoría más importante y del nivel más alto de granularidad. El punto es descomponer una aplicación empresarial en capas y como estas capas trabajan. La arquitectura en capas es la más útil en comparación de otros patrones arquitectónicos, la mayoría de las aplicaciones empresariales utilizan esta arquitectura.
- Capas
2.- Lógica del dominio o negocio: Los patrones de esta categoría ayuda a organizar los objetos del dominio.
- Transaction script
- Domain Model
- Table Module
- Service Layer
3.- Mapeo de datos relacionales: Esta categoría tiene cuatro subcategorías:
A) Patrones arquitectónicos orientados a fuente de datos
- Table Data Gateway
- Row Data Gateway
- Active Record
- Data Mapper
B) Patrones orientados al comportamiento de objetos relacionales
- Unit of work
- Identity Map
- Lazy load
C) Patrones orientados a la estructura de objetos relacionales
- Identity field
- Foreign key mapping
- Association table
- Mapping
- Dependent mapping
- Embedded value
- Serialized LOB
- Single table
- Inheritance
- Table enheritance
- Class table
- Concrete inheritance
- Enheritance mappers
D) Patrones de mapeo de metadatos de objetos relacionales
- Metadata mapping
- Query object
- Repository
4.- Patrones orientados a la presentación web: Estos patrones ayudan en la parte Front-End de la aplicación, con la interacción de la interfaz gráfica y el usuario.
- Modelo-Vista-Controlador (MVC)
- Page controller
- Front controller
- Template view
- Transform view
- Application controller
5.- Patrones orientados a la distribución de objetos:
- Remove fake
- Objeto de transferencia de datos (DTO)
6.- Patrones orientados al manejo de la concurrencia:
- Optimistic Offline lock
- Pesimistic Offline lock
- Coarse-Grained lock
- Implicit lock
7.- Patrones de estado de sesión:
- Client session state
- Server session state
- Database session state
En toda esta lista de patrones no se especifica si son patrones de arquitectura o patrones de diseño, el autor simplemente lo muestra como un patrón, Martín Fowler comenta lo siguiente:
Algunos de los patrones de este libro se pueden llamar arquitectónicos ya que representan decisiones importantes sobre los componentes del sistema; otros son más sobre diseño y te ayudan a comprender esa arquitectura. No hago ningún esfuerzo por separar los dos, ya que lo arquitectónico o no, es solo subjetivo.
Del mismo modo ocurre con los patrones de arquitectura y los estilos de arquitectura, estos términos no son claros y diferentes personas le dan un significado diferente. Microsoft Developer Network (MSDN) dice que los estilos arquitectónicos y los patrones arquitectónicos son las mismas cosas, otros desarrolladores reconocidos separan los dos con la diferencia clave de alcance o depende del nivel de granularidad.
Estilos arquitectónicos
Los estilos arquitectónicos nos dicen, a grandes rasgos, cómo organizar nuestro código. Es el nivel más alto de granularidad y especifica capas, módulos de alto nivel de la aplicación, y cómo esos módulos y capas interactúan entre sí, las relaciones entre ellos. Por lo tanto el patrón:
- Capas
- Tubería y filtros
- Pizarra
Serian estilos arquitectónicos.
También es importante reforzar la idea de que los estilos arquitectónicos, los patrones arquitectónicos y los patrones de diseño no son mutuamente excluyentes, son complementarios. Además, un patrón puede ser utilizado tanto como un Patrón Arquitectónico o un Patrón de Diseño, nuevamente dependiendo del alcance (Nivel de granularidad) en el que lo usemos.
Tampoco hay una definición definitiva sobre arquitectura. Hay dos elementos comunes: Uno, la arquitectura es el desglose del más alto nivel de un sistema en sus partes. El otro, decisiones que son difíciles de cambiar. No hay una sola manera de establecer la arquitectura de un sistema, más bien hay múltiples arquitecturas en un sistema.
Al final, creo que la frontera está bastante borrosa y no debemos caer en la trampa de pasar demasiado tiempo debatiendo semántica con nosotros mismos. Entonces no nos hagamos mucho lío de que si un patrón arquitectónico o un estilo arquitectónico, o que si es patrón arquitectónico o patrón de diseño, y como dice el autor Martin Fowler: establecer si es arquitectónico o no, es algo subjetivo, es decir, que cada persona se basa en su punto de vista, depende de qué forma lo ve y aplica cada patrón, entonces simplemente llamémoslo patrón o estilo dependiendo el caso/criterio.
Lo que realmente importa es saber los elementos del patrón, es decir: Saber el nombre, para una comunicación fluida y técnica entre el grupo de desarrollo. Saber qué problemas soluciona, cómo funciona y cómo se usa.