+ Especificaciones formales.

Un sistema de software necesita ser especificado.
La notacion UML sirve para aplicar dicha especificacion, donde 
un conjunto de casos de uso se van convirtiendo en diagramas de clase
e interaccion.

Existe otra manera de especificar el software, y se basa en describir las
propiedades del sistema utilizando un lenguaje formal y matematico.

Existen dos maneras de especificar matematicamente el software:
   + Algebraica. Se basa en la teoria de tipos abstractos de datos.
Consiste en generar especificaciones sobre las cuales se genera un
"algebra" y a partir de un cojunto de operaciones, se puede descubrir
e identificar propiedades del sistema de informacion.
   Un tipo abstracto de dato tiene un tipo o clase asociada, un conjunto
de operaciones, expresadas como funciones y axiomas que gobiernan el
comportamiento de cada funcion.
   En las operaciones se especifican un conjunto de funciones, que
pueden ser de  tipos: creacion , consulta y orden. 
   En los axiomas se enuncian aseveraciones logicas sobre las operaciones,
relaciones entre ellas y su funcion es definir de una manera semantica
las reglas para que el uso de las operaciones sean correctas.

   + Basadas en modelos. Se basa en definir el modelo de comportamiento
del sistema usando entidades matematicas como conjuntos y funciones. Las
operaciones sobre el sistema son especificadas indicando como afectan
a todo el sistema. Una propuesta para analizar los sistemas de informacion
de esta manera es un lenguaje de especificacion denominado Z.

La ventaja de utilizar una especificacion matematica son:
 + Permite crear un software basado en una especificacion formal y
por tanto bien fundamentada.
 + Para probar que el software es correcto se pueden utilizar tecnicas
matematicas, ya que se reduce a demostrar matematicamente la propiedad
de correcion, siguiendo un conjunto de axiomas.
 + Las especificaciones formales se pueden procesar automaticamente.

La desventaja es:
 + No todos entienden claramente una especificacion matematica.
 + Es dificil de adoptar esta metodologia, y se puede caer en la tentacion
de usarlo como un lenguaje de programacion.
 + No existen tecnicas estandares ni soportadas por software, de hecho
mucha de ellas son experimentales.

Dadas las ventajas y desventajas surge la pregunta, Tiene caso utilizar
especificaciones de software en el proceso de construccion de un producto ?
La respuesta es si, dado que permite aterrizar formalmente los conceptos
PERO se debe aterrizar en la practica el entendimiento de dichas especificaciones.

Hasta ahora no se ha visto un esfuerzo para unificar la teoria con la practica. A 
continuacion se describe.

+ Disenno por contrato y programacion literaria.

Los tipos abstractos de datos son descripciones algebraicas de lo que es un modulo de
software. En dicha especificacion no se indica COMO se realiza cada operacion.
En lenguajes orientados a objetos existen un concepto conocido como clases diferidas,
que son clases que no tienen codigo asociado, solo la declaracion de sus metodos y 
los axiomas de uso. 
Un lenguaje que hizo uso excelente de esta idea es Eiffel. Dicho lenguaje proporciona clases
diferidas y ademas soporte a un conjunto de aseveraciones.
Java es otro lenguaje, no tan completo como Eiffel, que tiene un equivalente a tipos abstractos
de datos, por medio del concepto de interfases. Carece de una herramienta de aseveraciones, pero
proporcionar un mecanismo de manejo de excepciones que puede utilizarse para lograr especificar
el software como un tipo abstracto de dato.

A esta manera de especificar el software se le conoce disenno por contrato. Una interfase establece un
conjunto de reglas sobre los servicios dados por un modulo de software. Por tanto, una interfase es un contrato
entre un proveedor y un cliente.  De ahi que se obtenga el concepto de disenno por contrato.

Esta etapa esta entre la fase final del analisis, que es cuando se encontraron los conceptos (expresados en un
diagrama conceptual de UML) y las interacciones basicas (expresadas como diagramas de colaboracion o secuencia).

El paso a seguir es acordar un conjunto de interfaces que sirvan como comunicacion entre los distintos modulos
de software que componen al sistema. De ahi es posible construir los algoritmos basicos que implanten las
reglas del negocio y empezar la construccion del sistema guiada por distintos equipos de desarrolladores.


En esta etapa se debe generar una documentacion completa de lo que es el sistema, para evitar que los programadores
se pierdan en la codificacion y siempre tengan presente la imagen de lo que se quiere obtener. 
Para lograr una documentacion que este fuertemente acoplada con el disenno por contrato, es posible utilizar 
una tecnica denominada programacion literaria.

La programacion literaria o alfabetizada es un enfoque que propone una manera de autodocumentar las decisiones
de disenno. Consiste en combinar tecnicas de programacion, escritura y procesamiento de texto para integrar
un programa, toda su documentacion de disenno y su historia de disenno en un documento. El metodo se basa en
la idea clasica de que el desarrollo o refinamiento del modulo es progresivo.

Entonces, si se propone un esquema en el cual se aplique el disenno por contrato utilizando programacion literaria,
debe ofrecer una manera elegante de especificar el software formalmente, y muy parecida a las tecnicas matematicas
descritas anteriormente.

+ Disenno por contrato en Java.

+ Programacion Literaria, Java y XML.

    Source: geocities.com/gusdelact/cib5132001/programacionliteraria

               ( geocities.com/gusdelact/cib5132001)                   ( geocities.com/gusdelact)