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