+ 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.