Programación Orientada a Objetos
Coordinador de la asignatura
Francisco Ortín Soler
Objetivos, Capacidades, Destrezas y Competencias
Al finalizar la asignatura, el alumno deberá:
- Saber utilizar adecuadamente las tecnologías del paradigma orientado a objetos
- Conocer las diferencias y similitudes existentes entre la plataforma Java y .Net así como entre los lenguajes Java 1.6 y C# 2.0
- Ser capaz de seleccionar la estructura de datos predefinida más acorde a un problema dado
- Ser capaz de valorar las ventajas e inconvenientes existentes entre las abstracciones genéricas y polimórficas, eligiendo la más apropiada en cada caso
- Ser competente en la utilización de precondiciones, poscondiciones e invariantes, aplicadas a los distintas fases del desarrollo software y utilizadas en el diseño por contratos
- Tener competencia de traducción de diseños detallados a cualquier lenguaje orientado a objetos, tanto basado en clases como basado en prototipos
- Conocer las técnicas elementales de refactorización de código y saber aplicarlas automáticamente con herramientas software
- Ser competente en el desarrollo de pruebas unitarias y regresión de las distintas clases de un proyecto software, así como ser capaz de automatizar éstas con alguna herramienta
- Conocer las características de los lenguajes dinámicos que los distinguen de Java y C#, en especial para el desarrollo de aplicaciones Web
- Ser competente en la toma de decisiones de selección de un lenguaje dinámico o estático en el desarrollo de (parte de) un proyecto
Temario
- Tema 1. Introducción
-
- Objetivos de la Orientación a Objetos
- Elementos de la Orientación a Objetos
- Tema 2. Implementación de los elementos básicos del paradigma orientado a Objetos
-
- Plataformas Java
- JVM, J2SE, J2ME, J2EE, JRE, JSDK, WebStart
- Plataforma .Net
- .Net Framework
- CLR
- Librería de clases
- Interoperabilidad entre lenguajes
- Gestión automática de memoria
- Assemblies, módulos y versioneado
- Componentes .Net y el GAC
- Limitación de acceso a recursos
- Interoperabilidad con COM
- Abstracción, Encapsulamiento y Ocultación de la Información
- Implementación en Java y C#
- Modularidad
- Cohesión y Acoplamiento
- Cinco criterios, cinco reglas y cinco principios (Bertrand Meyer)
- Implementación en Java y C#
- Sobrecarga de métodos y operadores
- Implementación en Java y C#
- Herencia, polimorfismo y enlace dinámico
- Implementación en Java y C#
- Clases abstractas e interfaces
- Implementación en Java y C#
- Asertos y excepciones
- Implementación en Java y C#
- Delegados en C#
- Genericidad
- Implementación en Java y C#
- Programación Orientada a Atributos (anotaciones)
- Implementación en Java y C#
- Tema 3. Estructuras de Datos comunes ofrecidas por los lenguajes de Programación
-
- Colecciones en Java 5
- Arrays
- Colecciones
- Maps
- Wrappers de Colecciones
- Extensión de JCF
- Algoritmos
- Eligiendo el Contenedor Apropiado
- Criterios de traducción a código
- Colecciones en C# 2.0
- System.Collections.Generic
- System.Collections
- Comparativa entre las implementaciones polimórficas y genéricas
- Comparativa entre plataformas e implementaciones
- Tema 4. Programación por Contratos
-
- Clases Proveedor y Cliente
- Precondición, Postcondición e Invariante
- Asertos y Excepciones
- Habilitación y deshabilitación de asertos (Java y C#)
- Contratos y Herencia
- iContract2 y Spec#
- Tema 5. Criterios de traducción de Diseño a Implementación (Java y C#)
-
- Asociación, Agregación y Composición
- Herencia frente a composición
- Sobre el uso de switch (frente al polimorfismo)
- Sobre el uso de instanteof
- Clases de utilidad
- Polimorfismo frente a genericidad
- Liberación de recursos
- Clonación de objetos
- Criterios de creación de clases
- Tema 6. Refactoring
-
- Definición de refactoring
- Usos de refactoring
- Beneficios del refactoring
- Inconvenientes del refactoring
- Heurísticos de una mala refactorización
- Refactoring y Testing
- Refactorizaciones con Eclipse
- Tema 7. Testing
-
- Tipos de pruebas de software
- Pruebas de las distintas capas de una aplicación
- Pruebas en el proceso de desarrollo software
- Introducción a las pruebas de las distintas capas de una aplicación Web, tales como la vista (httpunit) o de acceso a datos (DBUnit)
- JUnit 4.0
- NUnit 2.2
- Tema 8. Lenguajes Orientados a Objetos basados en Prototipos
-
- El modelo de orientación a objetos basado en prototipos
- El modelo basado en prototipos frente al basado en clases
- Ventajas e Inconvenientes
- Lenguajes OO basados en prototipos
- Escenarios donde estos lenguajes son más apropiados
- Breve introducción a Zero
- El modelo computacional de JScript
- Introducción a Python
- Conceptos básicos de reflexión
- Modelo computacional de Python
- Duck Typing
- Traducción de diagramas basados en clases a Python
- Introducción a Ruby
- Modelo computacional de Ruby
- Comparación con Python
- Ruby2
- Caso práctico de utilización de lenguajes dinámicos en Ingeniería Web: Pequeño ejemplo con Ruby on Rails
Metodología
- El desarrollo de las clases, será de 3 horas con profesor y 5 horas con ejercicios prácticos de lo impartido y/o lectura de documentos (relacionados con lo impartido o a impartir).
- La parte teórica será expuesta mediante método dialogado.
- La parte práctica será estableciendo una puesta en común del problema, utilizando un aprendizaje por descubrimiento para su resolución.
- La evaluación estará basada prioritariamente en el método basado en proyecto.
- Se realizará una evaluación continua en la que se tendrá en cuenta la participación en clase, la resolución de problemas y la calidad en la entrega de trabajos en el tiempo estimado para ello.
Bibliografía
- Orientación a Objetos
-
- Object Solutions: Managing the Object-Oriented Project. Grady Booch. Addison-Wesley Professional, 1995.
- Object-Oriented Analysis and Design with Applications, 2nd Edition. Grady Booch. Addison-Wesley Professional, 1993.
- C# y .Net
-
- Introducing Microsoft .Net, 3rd Edition. David S. Platt. McGraw-Hill, 2001.
- Programming C#, 4th edition. Jesse Liberty. O'Reilly, 2005.
- Inside Microsoft .NET IL Assembler. Serge Lidin. Microsoft Press, 2002.
- Lenguaje de Programación Java
-
- Java Programming Language, 4th Edition. Ken Arnold James Gosling, David Holmes. Addison-Wesley Professional, 2005.
- Colecciones
-
- Java Generics and Collections. Maurice Naftalin, Philip Wadler. O'Reilly, 2006.
- Professional .NET Framework 2.0. Joe Duffy. Wrox, 2006.
- Professional C#, 3rd Edition. Simon Robinson, Christian Nagel, Karli Watson, Jay Glynn, Morgan Skinner, Bill Evjen. Wrox, 2004.
- Programación por Contratos
-
- Construcción de software orientado a objetos, 2ª edición. Bertrand Meyer. Prentice-Hall, 1999.
- Design by Contract by Example. Richard Mitchell, Jim McKim. Addison-Wesley Professional, 2001.
- Testing
-
- A Practical Guide to Testing Object-Oriented Software. John D. McGregor, David A. Sykes. Addison Wesley Professional, 2001.
- Software Testing, Ron Patton. Sams Publishing, 2005.
- JUnit in Action. Ted Husted, Vincent Massol. Manning Publications, 2003.
- JUnit Recipes: Practical Methods for Programmer Testing. J. B. Rainsberger. Manning Publications, 2004.
- Criterios de Traducción de Diseños a Implementación
-
- Effective Java Programming Language Guide. Joshua Bloch. Addison-Wesley Professional, 2001.
- Thinking in Java, 4th Edition. Bruce Eckel. Prentice Hall, 2006.
- Refactoring
-
- Refactoring: Improving the Design of Existing Code. Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts. Addison Wesley, 1999.
- Refactoring to Patterns. Joshua Kerievsky. Addison Wesley, 2004.
- Lenguajes Orientados a Objetos basados en Prototipos
-
- Learning Python, 2nd Edition. Mark Lutz, David Ascher. O'Reilly Media, 2003.
- Python Cookbook. Alex Martelli, David Ascher,Anna Ravenscroft. O'Reilly Media, 2002.
- Programming Ruby: The Pragmatic Programmers' Guide, 2nd Edition. Dave Thomas, Chad Fowler, Andy Hunt. Pragmatic Bookshelf, 2004.
- Agile Web Development with Rails: A Pragmatic Guide. Dave Thomas, David Heinemeier Hansson, Andreas Schwarz, Thomas Fuchs, Leon Breedt, Mike Clark. Pragmatic Bookshelf, 2005.