Diseño de Programas
Objetivos

Se introduce al alumno en el paradigma de programación orientada a objetos, OO. Los  objetivos de la asignatura son:

 
i) Describir los conceptos que caracterizan al modelo OO
ii) Valorar en que medida las técnicas OO favorecen la calidad del software, analizando sobre todo cómo facilitan la reutilización y extensibilidad,
iii) Contrastar cómo diferentes lenguajes de programación OO (Eiffel, C++, Java y Smalltalk) reflejan los conceptos del paradigma.
iv) Enseñar un lenguaje OO, junto a un entorno de programación.
v) Introducir técnicas de diseño y programación OO



Justificación

La asignatura introduce los conceptos básicos de la programación orientada a objetos: clases, objetos y herencia, mostrando el contraste en la forma en que los cuatro lenguajes de programación OO más extendidos reflejan estos conceptos. Es importante que el alumno no adquiera la visión de la orientación a objetos ofrecida por un determinado lenguaje, sino que comprenda los conceptos de una forma independiente del lenguaje. También se introduce al alumno en el terreno de la construcción de software OO, presentando algunas técnicas de diseño y programación OO que se completarán en cuarto curso en la asignatura de Arquitectura del Software.

 

 
 
 
 
 
 
 
 
 

En las clases prácticas se presentará un lenguaje de programación OO concreto y se discutirán ejercicios para aplicar los conocimientos adquiridos en teoría. El lenguaje de programación elegido es Java por los motivos que se exponen abajo. Además de estudiar cómo incorpora Java los conceptos que caracterizan la OO, se abordarán los aspectos básicos del lenguaje como: entrada/salida, manejo de cadenas, etc. y otras características avanzadas como son la programación con hilos y el diseño de interfaces gráficas.

Como trabajo práctico el alumno deberá resolver un conjunto de ejercicios de programación y un proyecto de desarrollo de una pequeña aplicación, con el objetivo de llevar al terreno práctico los conceptos explicados y adquirir algunas destrezas relacionadas con la programación OO, así como manejar un entorno de desarrollo.

El lenguaje elegido para la realización de las prácticas debería tener las siguientes buenas propiedades: orientado a objetos puro, reflejar con claridad los conceptos OO, legibilidad, expresividad, pequeño, tipado estáticamente, soporte para la corrección. Además, sería ideal que estuviese muy extendido su uso en las empresas, debería existir un entorno de programación adecuado para la docencia (fácil de aprender y manejar, robusto, requisitos software y hardware mínimos), debería disponerse de abundante y buena documentación y ser de libre distribución. Existen varios lenguajes candidatos, con los cuales se desarrolla la mayor parte de aplicaciones OO: C++, Java, Smalltalk, Eiffel y Delphi (ahora también debemos considerar C#).

En años anteriores hemos usado Smalltalk por acercarse más a ese lenguaje ideal, no optando por Eiffel (muy buenas propiedades, pero entornos que necesitan muchos recursos, no hay versiones de libre distribución y poco extendido), ni C++ (híbrido, muy complicado, poco legible). Al aparecer Java, y a pesar de su rápido éxito, no apostamos por él ya que todavía no era un lenguaje estable, no se disponían de buenos entornos y por la inercia al cambio, ya que entendíamos que Smalltalk permitía cumplir los objetivos y disponíamos de mucha experiencia y documentación. Sin embargo, hace tres cursos nos decidimos por el cambio ya que Java reúne la mayoría de las propiedades del lenguaje ideal, siendo importante la demanda de las empresas de programadores con conocimientos en Java. Además Java es sin duda el lenguaje más utilizado para el desarrollo de aplicaciones web.
La asignatura proporcionará al alumno conocimientos suficientes para abordar el estudio de cualquier lenguaje OO, método de análisis y diseño OO, de los sistemas gestores de bases de datos OO, y en general de cualquier materia basada en el paradigma orientado a objetos.

Creemos que se trata de una asignatura básica en la formación del alumno ya que desde hace años existe un consenso al reconocer que el paradigma OO es el más adecuado para producir software de calidad, de modo que las empresas de desarrollo de software han adoptado la tecnología OO.
 


Programa Teoría

TEMA 1.  ORIENTACION A OBJETOS, UNA TECNICA PARA MEJORAR LA CALIDAD DEL SOFTWARE.

 1.1. Definición de paradigma de programación. Clasificación
 1.2. Algunos comentarios sobre la crisis del software.
 1.3. Factores Internos y Externos en la Calidad del Software
 1.4. Modularidad.
 1.5. Evolución  del concepto de módulo en los lenguajes de programación.
 1.6. Reutilización del Software: Requisitos para obtener módulos reutilizables.
 1.7. Rutinas, Módulos, Sobrecarga y Genericidad como mecanismos de reutilización.
 1.8. Problemas con el diseño descendente.
 1.9. Diseño orientado a objetos

Referencias: [Meyer98; Parte A y B]

TEMA 2. CLASES Y OBJETOS
 2.1. Clases
               - Estructura
               - Dualidad módulo-tipo
               - Ocultación de la información.
               - Relaciones entre clases: Cliente-Servidor y Herencia
               - Visibilidad
 2.2. Objetos
 2.3. Mensajes
              - Sintaxis. Notación Punto
              - Semántica
 2.4. Semántica referencia versus Semántica almacenamiento
 2.5. Creación de Objetos
 2.6. Modelo de Ejecución Orientado a Objetos
 2.7. Semántica de la Asignación e Igualdad entre objetos
 2.8. Genericidad
 2.9. Clases y Objetos en Eiffel, C++ y Smalltalk
 2.10. Ejemplo: Definición de una clase "Lista Lineal"

Referencias: [Meyer98; Parte C: cap. 7, 8 y 10]

TEMA 3.  DISEÑO POR CONTRATO: ASERTOS Y EXCEPCIONES
 3.1. Clases y Corrección del software: Asertos.
 3.2. Asertos en rutinas: Precondiciones y Postcondiciones. Notación especial
 3.3. Contrato software.
 3.4. Invariante de clase.
 3.5. Utilidad de las aserciones.
 3.6. Excepciones en Eiffel.
 3.7. Asertos en Java
 3.8. Excepciones en Java

Referencias: [Meyer98; Parte C: cap. 11 y 12] y [Arnold01, cap. 8]

TEMA  4. HERENCIA

        4.1. Introducción
        4.2. Doble aspecto de la herencia.
        4.3. Polimorfismo.
                  - Tipo estático vs. Tipo Dinámico
                  - Regla de aplicación de propiedades
                  - Compatibilidad de asignación
                  - Estructuras de datos polimórficas
          4.4. Ligadura Dinámica.
        4.5. Clases Diferidas.
                  - Clases Parcialmente Diferida
                  - Código Genérico
                  - Herencia, Reutilización y Extensibilidad del software
        4.6. Herencia  múltiple
                  - Problemas: Colisión de nombres y herencia repetida
                  - Ejemplos de utilidad
                  - Resolución de la herencia repetida

  4.7. Genericidad Restringida
  4.8. Intento de Asignación
  4.9. Herencia en Eiffel, C++ y Smalltalk: Estudio Comparativo
          - Mecanismos para la adaptación de propiedades
          - Herencia múltiple en Eiffel y C++
          - Herencia repetida en Eiffel y C++
  4.10. Implementación de la herencia
          - Herencia Simple en Smalltalk
          - Herencia Simple en C++
          - Herencia Múltiple en C++
   4.11. Herencia y Ocultación de la Información
 
Referencias: [Meyer98; Parte C: cap. 14, 15, 16 y 24]

Programa de Prácticas
 
Lección 1. El lenguaje Java.
Lección 2. Entorno de programación.
Lección 3. Clases y objetos
Lección 4. Paquetes.
Lección 5. Documentación del código.
Lección 6. Cadenas.
Lección 7. Entrada/Salida.
Lección 8. Clases envolventes.
Lección 9. Herencia.
Lección 10. Genericidad.
Lección 11. Identidad e igualdad.
Lección 12. Asignación y copia.
Lección 13. Excepciones.
Lección 14. Clases abstractas.
Lección 15. Interfaces.
Lección 16. Colecciones.
Lección 17. Serialización.
Lección 18. Hilos.
Lección 19. Clases anidadas.
Lección 20. Modelo de delegación de eventos.
Lección 21. Desarrollo de aplicaciones con interfaces gráficas



    Bibliogafía Teoría

    Básica

1. Arnold, K. y Gosling, J., “El lenguaje de programación Java”, Addison-Wesley,  3ª  Ed., 2001.
2. Meyer, B., "Construcción de Software Orientado a Objetos", 2ª edición, Prentice-Hall, 1998.
3. Stroustrup, B., "El Lenguaje de Programación C++", 3ª Edición, Addison-Wesley/Diaz de Santos, 2000.

   Bibliografía Complementaria

1. Budd, T., "Introducción a la Programación Orientada a Objetos", Addison-Wesley, 1994.
2. Budd, T.,“An Introduction to Object-Oriented Programming”, 3ª ed., Addison-Wesley, 2002.
3. B. Liskov y J. Guttag, “Program Development in Java: Abstraction, Specification, and Object-Oriented Design”,  Addison-Wesley, 2001
4. Goldberg, A. y Robson, D., "Smalltalk-80. The Language". Addison- Wesley, 1989.
5. Joyner,  I., Objects Unencapsulated. Java, Eiffel y C++??, Prentice-Hall, 1999
6. Meyer, B., "Eiffel: The Language", Prentice-Hall, 1992.
7. Riel, A.,  Object-Oriented Design Heuristics, Addison-Wesley, 1996.

Bibliogafía Prácticas

    Básica

1. Arnow, D. y Weiss, G. “Introducción a la programación con Java”, Addison-Wesley, 2000.
2. Arnold, K., Gosling, J. y Jomes, D. “El lenguaje de Programación Java”, 3ª Edición, Addison-Wesley, 2001.
3. Eckel, B. “Piensa en Java”, 2ª Edición, Prentice-Hall, 2002.
 

   Bibliografía Complementaria

1. Jaworski, J. “Java 1.2 al descubierto”, Prentice-Hall,1998.
2. Deitel, H. M. y Deitel, P.J., “Cómo programar en Java”, Prentice-Hall , 1998.
3. Froufe, A., “Java 2 : manual de usuario y tutorial”, RA-MA, 1999.
4. Flanagan, David, “Java en pocas palabras: referencia al instante”, 2ª Edición, O'Reilly, 1999.
 

Direcciones web de interés

1. Java en Sun: http://java.sun.com.
2. Versión electrónica del libro “Thinking in Java”: http://www.mindview.net/Books/TIJ/
3. Documentación del JDK.
 


    Evaluación
 

Se realizará un examen teórico de cuestiones teórico-prácticas del mismo tipo que en años anteriores. El alumno dispondrá de una colección de preguntas de otros años. Si un alumno supera el examen teórico (Nota *5) se mantiene el aprobado en las siguientes convocatorias del curso académico.

 
No podrán presentar el proyecto de programación los alumnos que no hayan aprobado los ejercicios. Se mantendrá el aprobado en los         ejercicios hasta la convocatoria de diciembre. Para la evaluación del proyecto se realizará una entrevista individual con el alumno. Durante esa entrevista también serán evaluados los conceptos del programa de prácticas. Si un alumno supera las prácticas se mantiene el aprobado en las siguientes convocatorias del curso académico.
Para aprobar la asignatura el alumno debe haber superado las prácticas y la teoría. La nota final de la asignatura se calculará como la media ponderada entre la nota de teoría (60%) y la nota de prácticas (40%).


Material Didáctico

            Presentación      Tema 2          Tema 3         Tema 4