Patrones de software y refactorización de código
Introducción y antecedentes de los patrones de software Los patrones permiten construir sobre la experiencia colectiva de ingenieros de software habilidosos. Los expertos que trabajan en un problema específico, rara vez atacan dicho problema inventando una solución que sea novedosa y completamente distinta a las soluciones existentes. Lo usual es que recuerden algún problema similar que ya resolvieron y que reutilicen lo esencial de esa solución para el nuevo problema. El método problema-solución es utilizado en varias áreas como la arquitectura, economía e ingeniería de software. Es una forma natural para atacar un problema.
Introducción y antecedentes de los patrones de software 2 El primer intento por documentar soluciones a problemas comunes lo realizó el arquitecto Christopher Alexander en 1977, quien desarrolló una teoría para la arquitectura, construcción y planeación basada en la construcción y uso de patrones. Alexander dijo: Cada patrón describe un problema que ocurre una y otra vez en nuestro ambiente y después describe la parte más importante de la solución a ese problema, de tal manera que se puede utilizar esta solución un millón de veces, sin hacerlo de la misma manera dos veces. Aún cuando Alexander estaba hablando de patrones para arquitectura, lo que dijo también puede aplicarse a patrones de software.
Introducción y antecedentes de los patrones de software 3 Nuestras soluciones son expresadas en términos de objetos e interfaces en vez de paredes y puertas, pero en el corazón de ambos tipos de patrones se encuentra una solución a un problema dentro de un contexto particular. En 1994 aparece el libro Design Patterns - Elements of Reusable Object-Oriented Software de Erich Gamma et al., el cual es considerado como la referencia obligada al tratar el tema de patrones de software. Aun cuando la idea de patrones de diseño que maneja Gamma en su libro no era algo novedoso, Gamma presenta el primer catálogo de patrones de diseño para los sistemas orientados a objetos.
Definición de patrón de software Un patrón de software describe un problema de diseño particular recurrente que aparece en contextos de diseño específicos y presenta un esquema bien probado para su solución. El esquema de solución se especifica describiendo sus componentes esenciales, sus responsabilidades y relaciones, así como la manera en que estos colaboran.
Definición de patrón de software 2 Los aspectos más importantes que se pueden destacar de los patrones de software son: Un patrón refiere un problema de diseño recurrente que aparece en una situación de diseño particular y presenta una solución para el problema. Los patrones documentan la experiencia de diseño existente y que ha sido bien probada. Los patrones identifican y especifican abstracciones que están por encima del nivel de las clases y las instancias o los componentes.
Definición de patrón de software 3 Los patrones proveen un vocabulario común y entendimiento para los principios de diseño. Los patrones son un medio para documentar las arquitecturas de software. Los patrones apoyan la construcción de software con propiedades definidas.
Descripción de un patrón de software Existen varios formatos para la documentación de un patrón de software, pero en esencia todos los autores hacen referencia a los mismos elementos. Según Buschmann un patrón se compone de tres partes: el contexto, el problema y la solución.
Descripción de un patrón de software 2 El contexto describe situaciones en las cuales ocurre el problema. El contexto de un patrón puede ser bastante general, como desarrollar software que tenga una interfaz de usuario o demasiado específico, como implementar el mecanismo de manejo de eventos para las interfaces de usuario colaborativas. El problema describe lo que ocurre repetidamente en el contexto dado.
Descripción de un patrón de software 3 Se inicia con una especificación general que capture la esencia y se complementa con un conjunto de aspectos que deben ser considerados al resolver el problema, tales como: Requisitos que la solución debe cumplir Restricciones que se deben considerar Propiedades deseadas que la solución debe tener La solución muestra como resolver el problema recurrente, o aun mejor, como balancear los aspectos importantes asociados a éste.
Descripción de un patrón de software 4 La solución debe incluir dos partes: Estructura Comportamiento en ejecución La estructura se refiere a la configuración espacial de los elementos, describe los aspectos estáticos de la solución. La estructura se describe usualmente a través de distintos tipos de diagramas que pueden ser dibujados apegándose a alguna notación específica, por ejemplo UML.
Descripción de un patrón de software 5 El comportamiento en ejecución se refiere a los aspectos dinámicos de la solución: Como colaboran los elementos involucrados? Como se organiza el trabajo entre ellos? Como se comunican?
Descripción de un patrón de software 6 Patrón ------- Contexto ------- Situación de diseño que da origen al problema ------- Problema ------- Conjunto de aspectos recurrentes en el contexto ------- Solución ------- Configuración para balancear los distintos aspectos ------- Estructura incluyendo componentes y relaciones ------- Comportamiento en ejecución
Categorías de patrones Los patrones cubren varios rangos en escala y abstracción. Algunos patrones ayudan a estructurar un sistema de software en subsistemas. Otros patrones apoyan el refinamiento de subsistemas y componentes o de las relaciones entre estos. También existen patrones que apoyan en la implementación de aspectos de diseño particulares en un lenguaje de programación específico. Los patrones se pueden clasificar en tres categorías: patrones arquitectónicos, patrones de diseño e idiomas.
Categorías de patrones 2
Categorías de patrones 3 Patrones arquitectónicos Un patrón arquitectónico expresa un esquema de organización estructural para los sistemas de software. Estos patrones proveen un conjunto de subsistemas predefinidos, especifican sus responsabilidades e incluyen reglas y guías para organizar las relaciones entre ellos.
Categorías de patrones 4 Patrones de diseño Un patrón de diseño provee un esquema para refinar los subsistemas o componentes de un sistema de software o las relaciones entre ellos. Estos patrones describen una estructura recursiva de componentes en comunicación que solucionan un problema de diseño general dentro de un contexto particular.
Categorías de patrones 5 Idiomas Un idioma es un patrón de bajo nivel, específico a un lenguaje de programación. Un idioma describe como implementar aspectos particulares de componentes o las relaciones entre estos utilizando las características del lenguaje dado.
Sistema de patrones Un patrón soluciona un problema particular, pero su aplicación trae consigo otros problemas. Algunos de estos pueden ser solucionados por otros patrones. Los componentes simples o relaciones dentro de un patrón particular pueden ser descritos por patrones más pequeños, todos ellos integrados por el patrón en el cual están contenidos. Así es como nace la idea de sistema de patrones. Un sistema de patrones es una colección de patrones para arquitectura de software, junto con guías para su implementación, combinación y uso práctico en el desarrollo de software.
Sistema de patrones 2 Sistema de patrones Patrón arquitectónico define la organización Patrón de diseño documenta Marco de clases
Sistema de patrones 3 Un sistema de patrones es una forma muy poderosa para expresar y construir arquitecturas de software. Un sistema de patrones reúne varios patrones individuales. Describe como es que están conectados sus patrones constituyentes con otros patrones dentro del mismo sistema, como pueden ser implementados los patrones y como es apoyado el desarrollo de software por medio de estos patrones. El objetivo principal de un sistema de patrones para arquitecturas es el apoyar el desarrollo de sistemas de software de alta calidad.
Sistema de patrones 4 Por alta calidad, se quiere decir, sistemas que cumplan tanto sus requerimientos funcionales como no funcionales. Para llevar a cabo este objetivo, un sistema de patrones debe satisfacer los siguientes requisitos: Contener una base con suficientes patrones. Describir todos sus patrones de manera uniforme. Explicar las distintas relaciones entre los patrones. Organizar los patrones que lo constituyen. Apoyar la construcción de sistemas de software. Apoyar su propia evolución.