Máster y Doctorado en Ingeniería Web

Universidad de Oviedo

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.