miércoles, 28 de agosto de 2019

PATRONES SOFTWARE


El desarrollo de software es una tarea complicada, la cual depende en gran medida de la experiencia de las personas involucradas, en particular de los desarrolladores.

1. El 80% de los aportes vienen del 20% del personal.

La comprensión del software es uno de los problemas más complicados en la tarea de mantenimiento y evolución.

El hombre durante su historia ha dominado cierta técnica pasando por un proceso:

 Se realizan las operaciones de una manera artesanal. Los expertos aprenden por un proceso de ensayo y error y por transmisión de otros expertos.
 Se crea una ciencia alrededor de la tarea.
 Se desarrollan las técnicas generalmente aceptadas en el área.
 Se logra un conocimiento común sobre cómo aplicar las técnicas. Hay un metalenguaje común ente los expertos.

La sociedad requiere sistemas más complejos y más grandes. Los recursos para desarrollarlos cada vez son más escasos. Debe existir un mecanismo de reutilización.

2. El 80% del esfuerzo está en el 20% del código desarrollado.

Las Tecnologías Orientadas a Objetos son las más utilizadas en los últimos años para el desarrollo de aplicaciones software. Se ha comprobado como este paradigma de programación presenta muchas ventajas.

Uno de los objetivos que se buscan al utilizar esta técnica es conseguir la reutilización. Entre los beneficios que se consiguen con la reutilización están:

1.      Reducción de tiempos.
2.      Disminución del esfuerzo de mantenimiento.
3.      Eficiencia.
4.      Consistencia.
5.      Fiabilidad.
6.      Protección de la inversión en desarrollos.

Este mecanismo de reutilización, según el modelo de Objetos, debe afectar tanto al personal (con una formación constante a lo largo del tiempo) como a los diseños y especificaciones, así como al código fuente (mediante herencia, genericidad...).


Entre los diferentes mecanismos de reutilización están:

 Componentes: elemento de software suficientemente pequeño para crearse y mantenerse, pero suficientemente grande para poder utilizarse.
 Frameworks: bibliotecas de clases preparadas para la reutilización que pueden utilizar a su vez componentes.
 Objetos distribuidos: paradigma que distribuye los objetos de cooperación a través de una red heterogénea y permite que los objetos interoperen como un todo unificado.  
Patrones de diseño

Sin embargo, los mecanismos de reutilización también presentan algunos obstáculos:

1.      El síndrome No Inventado Aquí: los desarrolladores de software no se suelen             fiar de lo que no está supervisado por ellos mismos.
2.      Acceso a las fuentes de componentes y Frameworks.
3.      Impedimentos legales, comerciales o estratégicos.
4.      Formato de distribución de componentes (CORBA, ActiveX, ...).
5.      Dilema entre reutilizar y rehacer.
6.      Existe una inercia personal a los cambios.

Basándonos en la regla de reutilización (“se debe ser consumidor de reutilización antes de ser un productor de reutilización”), este proyecto trata de ser una guía didáctica de la utilización de patrones de diseño en el desarrollo de aplicaciones. Como veremos en los siguientes puntos los patrones de diseño son un mecanismo de reutilización utilizado en la fase de diseño. Para poder comprender la utilización de los patrones se deben tener unos conocimientos fundamentales del modelo de Objetos. Por esta causa se dan por supuestos ciertos conceptos fundamentales de las Tecnologías Orientadas a Objetos (clase, objeto, encapsulación, herencia, polimorfismo, agregación, ...) que se van a utilizar en los siguientes puntos del tutorial de patrones de diseño.

INTRODUCCIÓN A LOS PATRONES

Los patrones como elemento de la reutilización, comenzaron a utilizarse en la arquitectura con el objetivo de reutilizar diseños que se habían aplicado en otras construcciones y que se catalogaron como completos.

Chistopher Alexander fue el primero en intentar crear un formato específico para patrones en la arquitectura. Alexander argumenta que los métodos comunes aplicados en la arquitectura dan lugar a productos que no satisfacen las demandas y requerimientos de los usuarios y son ineficientes a la hora de conseguir el propósito de todo diseño y esfuerzo de la ingeniería: mejorar la condición humana. Alexander describe algunos diseños eternos para tratar de conseguir sus metas. Propone, así, un paradigma para la arquitectura basado en tres conceptos: la calidad, la puerta y el camino.

La Calidad (la Calidad Sin Nombre): la esencia de todas las cosas vivas y útiles que nos hacen sentir vivos, nos da satisfacción y mejora la condición humana.

La Puerta: el mecanismo que nos permite alcanzar la calidad. Se manifiesta como un lenguaje común de patrones. La puerta es el conducto hacia la calidad. 

El Camino (El Camino Eterno): siguiendo el camino, se puede atravesar la puerta para llegar a la calidad.

De este modo el patrón trata de extraer la esencia de ese diseño (lo que se puede llamar “la calidad sin nombre”) para que pueda ser utilizada por otros arquitectos cuando se enfrentan a problemas parecidos a los que resolvió dicho diseño.

Alexander intenta resolver problemas arquitectónicos utilizando estos patrones. Para ello trata de extraer la parte común de los buenos diseños (que pueden ser dispares), con el objetivo de volver a utilizarse en otros diseños.

Christopher 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”.

Si nos fijamos en las construcciones de una determinada zona rural observaremos que todas ellas poseen apariencias parejas (tejados de pizarra con gran pendiente, etc.), pese a que los requisitos personales por fuerza han debido ser distintos. De alguna manera la esencia del diseño se ha copiado de una construcción a otra, y a esta esencia se pliegan de forma natural los diversos requisitos. Diríase aquí que existe un patrón que soluciona de forma simple y efectiva los problemas de construcción en tal zona.

Se puede utilizar una metáfora textil para explicar lo que es un patrón: es como la pieza que utiliza el sastre a la hora de confeccionar vestidos y trajes. De esta forma este patrón además de contener las especificaciones de corte y confección del producto final, representa a la vez, una parte de ese producto.

En definitiva, se puede definir un patrón como “una solución a un problema en un determinado contexto”.



Patrones de software


Los patrones para el desarrollo de software son uno de los últimos avances de la Tecnología Orientada a Objetos. Los patrones son una forma literaria para resolver problemas de ingeniería del software, que tienen sus raíces en los patrones de la arquitectura. 

Los diseñadores y analistas de software más experimentados aplican de forma intuitiva algunos criterios que solucionan los problemas de manera elegante y efectiva. La ingeniería del software se enfrenta a problemas variados que hay que identificar para poder utilizar la misma solución (aunque matizada) con problemas similares.

Por otra parte, las metodologías Orientadas a Objetos tienen como uno de sus principios “no reinventar la rueda” para la resolución de diferentes problemas. Por lo tanto, los patrones se convierten en una parte muy importante en las Tecnologías Orientadas a Objetos para poder conseguir la reutilización.

La ingeniería del software, tomando conceptos aplicados por primera vez en arquitectura, intenta construir patrones software para la resolución de problemas en dicho campo. Para conseguir esto debe existir una comunicación entre los distintos ingenieros para compartir los resultados obtenidos. Por tanto, debe existir también un esquema de documentación con el objetivo de que la comunicación pueda entenderse de forma correcta. Esta comunicación no se debe reducir a la implementación, ya que únicamente fomenta el uso del “cortar y pegar”. Pueden referirse a distintos niveles de abstracción, desde un proceso de desarrollo hasta la utilización eficiente de un lenguaje de programación.

El objetivo de los patrones es crear un lenguaje común a una comunidad de desarrolladores para comunicar experiencia sobre los problemas y sus soluciones.

Definiciones


Los diferentes autores han dado diversas definiciones de lo que es un patrón software. Veamos a continuación alguna de ellas:

1.      Dirk Riehle y Heinz Zullighoven:
Un patrón es la abstracción de una forma concreta que puede repetirse en contextos específicos.
2.      Otras definiciones más aceptadas por la comunidad software son:
Un patrón es una información que captura la estructura esencial y la perspicacia de una familia de soluciones probadas con éxito para un problema repetitivo que surge en un cierto contexto y sistema.
Un patrón es una unidad de información nombrada, instructiva e intuitiva que captura la esencia de una familia exitosa de soluciones probadas a un problema recurrente dentro de un cierto contexto.
3.      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 si mismas.
Esta definición es similar a la dada por Alexander: Cada patrón es una relación entre un cierto contexto, un problema y una solución. El patrón es, resumiendo, al mismo tiempo una cosa que tiene su lugar en el mundo, y la regla que nos dice cómo crear esa cosa y cuándo debemos crearla. Es al mismo tiempo una cosa y un proceso; al mismo tiempo una descripción que tiene vida y una descripción del proceso que la generó.

Características de los patrones software


Hay que tener en cuenta que no todas las soluciones que tengan, en principio, las características de un patrón son un patrón, sino que debe probarse que es una solución a un problema que se repite. Para que se pueda considerar un patrón, éste debe pasar por unas pruebas que reciben el nombre de test de patrones. Mientras tanto esa solución recibe el nombre de proto-patrón.

Según Jim Coplien los buenos patrones deben tener las siguientes características:

 Solucionar un problema: los patrones capturan soluciones, no sólo principios o estrategias abstractas.
 Ser un concepto probado: los patrones capturan soluciones demostradas, no teorías o especulaciones.
 La solución no es obvia: muchas técnicas de solución de problemas tratan de hallar soluciones por medio de principios básicos. Los mejores patrones generan una solución a un problema de forma indirecta.
 Describe participantes y relaciones entre ellos: los patrones no sólo describen módulos sino estructuras del sistema y mecanismos más complejos.
 El patrón tiene un componente humano significativo: todo software proporciona a los seres humanos confort o calidad de vida (estética y utilidad).

Los patrones indican repetición, si algo no se repite, no es posible que sea un patrón. Pero la repetición no es la única característica importante. También necesitamos mostrar que un patrón se adapta para poder usarlo, y que es útil. La repetición es una característica cuantitativa pura, la adaptabilidad y utilidad son características cualitativas. Podemos mostrar la repetición simplemente aplicando la regla de tres (en al menos tres sistemas existentes); mostrar la adaptabilidad explicando como el patrón es exitoso; y mostrar la utilidad explicando porque es exitoso y beneficioso.

Así que aparte de la repetición, un patrón debe describir como la solución salda o resuelve sus objetivos, y porque está es una buena solución. Se puede decir que un patrón es donde la teoría y la práctica se juntan para fortalecerse y complementarse, para mostrar que la estructura que describe es útil, utilizable y usada.

Un patrón debe ser útil porque enseña como el patrón que tenemos en nuestra mente puede ser transformado en una instancia del patrón en el mundo real, como una cosa que añade valor a nuestra vida como diseñadores. Un patrón debe ser también utilizable porque muestra como un patrón descrito de una  forma literaria puede ser transformado en un patrón que tenemos en nuestra mente. Y un patrón debe ser usado porque es como los patrones que existen en el mundo real llegan a ser documentados como patrones de una forma literaria.  

Esto potencia una continua repetición del ciclo desde los escritores de patrones, a los lectores de patrones, y a los usuarios de patrones: los escritores documentan los patrones de forma literaria haciéndolos utilizables para los lectores de patrones, quienes pueden recordarlos en sus mentes, lo cual los  hace ser útiles para los diseñadores, quienes pueden  usarlos en el mundo real, y mejorar la calidad de vida de los usuarios.

Clases de patrones software


Existen diferentes ámbitos dentro de la ingeniería del software donde se pueden aplicar los patrones:

1.      Patrones de arquitectura: expresa una organización o esquema estructural fundamental para sistemas software. Proporciona un conjunto de subsistemas predefinidos, especifica sus responsabilidades, e incluye una guía para organizar las relaciones entre ellos.
2.      Patrones de diseño: proporciona un esquema para refinar los subsistemas o componentes de un sistema software, o las relaciones entre ellos. Describe estructuras repetitivas de comunicar componentes que resuelven un problema de diseño en un contexto particular.
3.      Patrones de programación (Idioms patterns): un idioma es un patrón de bajo nivel de un lenguaje de programación específico. Describe cómo implementar aspectos de componentes o de las relaciones entre ellos utilizando las facilidades del lenguaje de programación dado.
4.      Patrones de análisis: describen un conjunto de prácticas que aseguran la obtención de un buen modelo de un problema y su solución.
5.      Patrones organizacionales: describen la estructura y prácticas de las organizaciones humanas, especialmente en las que producen, usan o administran software.

La diferencia entre estas clases de patrones está en los diferentes niveles de abstracción y detalle, y del contexto particular en el cual se aplican o de la etapa en el proceso de desarrollo. Así, los patrones de arquitectura son estrategias de alto nivel que involucran a los componentes, las propiedades y mecanismos globales de un sistema. Los patrones de diseño son tácticas de media escala relacionados con la estructura y el comportamiento de entidades y sus relaciones. No influyen sobre toda la estructura del sistema, pero define micro arquitecturas de subsistemas y componentes. Los patrones de programación son específicos de las técnicas de un lenguaje de programación que afectan a partes pequeñas del comportamiento de los componentes de un sistema. Los patrones de análisis se refieren a la etapa de análisis del ciclo de vida de construcción de software. Los patrones organizacionales describen la estructuración del personal en el desarrollo de software.

También se puede hablar de otros tipos de patrones software, como pueden ser:

1.      Patrones de programación concurrente.
2.      Patrones de interfaz gráfica.
3.      Patrones de organización del código. 
4.      Patrones de optimización de código.
5.      Patrones de robustez de código.
6.      Patrones de la fase de prueba.

Entre las ventajas que se pueden citar de la utilización de patrones están:

1.      Facilitan la comunicación interna.
2.      Ahorran tiempo y experimentos inútiles.
3.      Mejoran la calidad del diseño y la implementación.
4.      Son como “normas de productividad”.
5.      Facilitan el aprendizaje de los paquetes Java.

No hay comentarios.:

Publicar un comentario