Grado en Engineering in Technology Management

Fórmate en un Grado Universitario único en España y con un 100% de empleabilidad

Diseño y programación orientados a objetos

Descripción
El paradigma de programación orientado a objetos es, actualmente, uno de los paradigmas más importantes en el mundo de la programación. Partiendo de esta idea, la asignatura tiene como objetivo que los alumnos aprendan a diseñar y programar en este paradigma, utilizando un lenguaje actual empleado en entornos reales. La asignatura hará énfasis en la fase de diseño de software, y da por supuesto que los alumnos presentan unos conocimientos y dominio suficiente del paradigma imperativo y procedimental, para entender el funcionamiento imperativo de un nuevo lenguaje de programación. Dado que la mayoría de los proyectos de software se desarrollan por equipos de programadores, la asignatura también quiere dotar a los alumnos de las competencias necesarias para afrontar estos entornos de trabajo.
Tipo asignatura
Tercer - Obligatoria
Semestre
Anual
Curso
2
Créditos
6.00

Profesores Titulares

Conocimientos previos

Metodología y tecnología de la programación (recomendación)

Objetivos

Los Resultados de Aprendizaje de esta asignatura son:
RA.01 - Diseño de soluciones informáticas a problemas concretos.
RA.02 - Estructuración y modularización del código.
RA.03 - Conocimientos de un lenguaje imperativo real.
RA.04 - Conocimientos de un lenguaje orientado a objetos real.
RA.05 - Uso de un entorno real de programación.
RA.06 - Utilización de patrones de diseño y diagramas de clases.
RA.07 - Trabajo en equipo en el análisis, diseño e implementación de software.
RA.08 - Dominar metodologías de diseño, implementación y validación del software.
RA.09 - Conocimiento de las técnicas y lenguajes de programación en tiempo real, basada en eventos, y cooperativa.

La asignatura, a partir de estos resultados de aprendizaje, se plantea como objetivos asegurar que el alumno, al acabar la asignatura:

Objetivo.1 ? Demuestra conocer el paradigma orientado a objetos y todas sus características.
Objetivo.2 ? Demuestra conocer un lenguaje orientado a objetos real y actual.
Objetivo.3 ? Demuestra saber emplear un entorno a desarrollo real.
Objetivo.4 ? Demuestra tener la capacidad de diseñar software a partir de unas especificaciones concretas.
Objetivo.5 ? Demuestra saber usar patrones de diseño software.
Objetivo.6 ? Demuestra saber trabajar en equipo.

Contenidos

Los contenidos detallados de la asignatura son (este contenido no se da necesariamente de manera cronológica):

Conocimiento del paradigma orientado a objetos.
Concepto de Clase o Prototipo
Concepto de Objeto o Instancia
Variables
Variables de Clase
Variables de Instancia
Concepto de Mensaje o Método
Métodos de Clase
Métodos de Instancia
Concepto de Encapsulación y Abstracción
Concepto de Herencia
Concepto de Polimorfismo
Concepto de Interfaz

Conocimiento de un lenguaje orientado a objetos real.
Introducción en Java
¿Qué es Java?
Características principales de Java
Introducción al lenguaje
Variables
Variables de instancia / clase / locales / parámetros
Tipos de datos primitivos y referencias
Arrays
Operadores
Asignación / Aritméticos / Comparaciones
Instanceof
Sentencias, Expresiones y Bloques
Sentencias de control de flujo
If / Switch / While & do-While / For
Break / Continue / Return
Gestión de Excepciones
Introducción al mecanismo
Como lanzar excepciones (throw /throws)
Try-catch-finally
Introducción a la OO
Declaración de una clase
Visibilidad (private / protected / package / public)
Declaración de métodos
Constructores
Paso de parámetros
La referencia ?this?
Instanciación y uso de objetos
Static y Final
Enumerations
Herencia en Java
Interfaces
Jerarquía de clases en Java
La clase Object
Herencia múltiple
Override de métodos
Polimorfismo
La referencia ?super?
Constructores de subclases
Métodos y clases abstractas
Números, Caracteres y Strings
Introducción a Genéricos
Packages
Basic I/O
Collections
AWT / Swing
Concurrencia

Uso de uno en torno a desarrollo real.
Herramientas de modelado de diagramas
IntelliJ IDEA como en torno a desarrollo
Git como Sistema de Control de Versiones
Jira como gestor de proyectos

Capacitado de diseñar software a partir de unas especificaciones.
UML
Clase / Objeto / Mensaje
Encapsulamiento y Abstracción
Encapsulamiento vs Visibilidad
Relaciones entre clases
Herencia
Polimorfismo

Uso de patrones de diseño software.
GRASP guidelines
Layered Architecture
Patrón Model-View-Controller
Responsibility-driven design
Object-Orientation and Databases
DAO design pattern

Trabajo en equipo en un proyecto de desarrollo de software.
Herramientas de comunicación
Sistemas de Control de versiones
Herramientas de gestión de proyectos

Los contenidos de la asignatura se ven distribuidos durante todo el curso, la orden de impartición no se corresponde exactamente con la orden del temario anterior. Durante el curso se van presentando los conceptos y se van reforzando a medida que se avanza. Los temas de análisis, diseño e implementación y patrones se verán de forma iterativa durante todo el curso, introduciendo las diferentes estructuras de datos.

Metodología

La asignatura se orienta para que el alumno tome parte activa en su propio aprendizaje. La metodología docente está pensada para que la asignatura sea dinámica y participativa. Las clases magistrales se combinan con clases de ejercicios y actividades en clase, así como prácticas guiadas por el profesorado de la asignatura.

La metodología docente de la asignatura está claramente diferenciada en dos semestres. En el primero, se alcanzan los fundamentos del paradigma de la orientación a objetos y de la programación en Java. La orientación docente de este semestre es con clases magistrales, ejercicios de evaluación continua y prácticas. En el segundo semestre, la asignatura se enfoca con la metodología de aprendizaje basada en proyectos. Los conocimientos adquiridos durante el primer semestre se consolidan mediante la realización de un proyecto casi real de desarrollo de software.

Los contenidos de la asignatura están planificados para ser impartidos en tres niveles. En primer lugar, se realizará una introducción teórica del concepto. Seguidamente, se introducirán los conceptos de diseño de software relacionados con este concepto. Finalmente, se explicará la implementación de estos conceptos en un lenguaje de programación.

Evaluación

Para aprobar la asignatura, es necesario aprobar ambos semestres por separado.

Nota_final = Nota_S1 * 0.5 + Nota_S2 * 0.5

Primer semestre
El primer semestre se evaluará mediante la realización de un conjunto de ejercicios individuales (moderadamente significativos) y un proyecto (altamente significativo).

Los ejercicios tienen un objetivo formativo para que el estudiante practique de forma individual los conocimientos, antes de ponerlos en práctica en el proyecto. La nota de los ejercicios solo se tendrá en cuenta si el proyecto está aprobado y favorece al estudiante.

El proyecto del primer semestre evaluará los conocimientos de diseño y programación de los estudiantes. Este está dividido en 2 fases de diseño y 2 fases de implementación. Los conceptos evaluados durante cada una de las cuatro fases serán independientes entre sí, de modo que será necesario aprobar cada fase por separado para poder aprobar el proyecto. Si alguna de las fases del proyecto no está aprobada, la nota máxima a la que podrá optar el estudiante será un cuatro (4).

Ejercicios = Media (Ejercicio_1, Ejercicio_2, Ejercicio_3)
Proyecto = Media (Fase_1, Fase_2, Fase_3, Fase_4) * 0.8 + Memoria * 0.2

Nota_S1 = Proyecto * 0.6 + Ejercicios * 0.4 (si Ejercicios > Proyecto)
Nota_S1 = Proyecto (si Ejercicios <= Proyecto)

El estudiante debe formar parte de un grupo, tanto si presenta el proyecto individualmente como en pareja.
Todas las fases y la memoria deben estar aceptadas para poder aprobar el proyecto. En la rúbrica de evaluación se indicarán los criterios de aceptación.

El estudiante dispondrá de 3 convocatorias para la entrega del proyecto.

Segundo semestre
El segundo semestre se evaluará mediante la realización de un conjunto de ejercicios individuales (moderadamente significativos) y un proyecto grupal (altamente significativo) en grupos de 5 estudiantes.

Los ejercicios tienen un objetivo formativo para que el estudiante practique de forma individual los conocimientos, antes de ponerlos en práctica en el proyecto. La nota de los ejercicios solo se tendrá en cuenta si el proyecto está aprobado y favorece al estudiante.

El proyecto del segundo semestre se evaluará teniendo en cuenta 3 bloques: (1) la nota del proyecto realizado, (2) la nota de mentoría, y (3) la nota de los compañeros de proyecto (P2P). La nota del proyecto se calculará a partir de 3 apartados: 40% ejecución, 40% calidad de software y 20% documentación. Estos tres apartados deben estar aceptados para poder aprobar el proyecto. En la rúbrica de evaluación se indicarán los criterios de aceptación.

La nota de mentoría será un factor multiplicador entre 0,5 y 1,5. Esta la asignará el profesor mentor del proyecto individualmente a cada estudiante. Esta nota se obtendrá a través de la percepción del mentor, durante las reuniones semanales de seguimiento, sobre el conocimiento demostrado por cada estudiante.

La nota P2P será un factor multiplicador entre 0 y 1,5. Esta la asignarán los estudiantes a todos los miembros de su grupo. Se utilizarán 4 cuestionarios que todos los estudiantes deberán responder. En caso de que un estudiante no responda dos o más de los cuestionarios, su nota individual del proyecto será un NP.

Ejercicios = Media (Ejercicio_4, Ejercicio_5, Ejercicio_6)
Proyecto = (Ejecución * 0.4 + Calidad_software * 0.4 + Documentación * 0.2) * Mentoría * P2P

Nota_S2 = Proyecto * 0.6 + Ejercicios * 0.4 (si Ejercicios > Proyecto)
Nota_S2 = Proyecto (si Ejercicios <= Proyecto)

Los estudiantes solo podrán entregar el proyecto durante la convocatoria ordinaria.

Criterios evaluación
Bibliografía básica

[1] C.S.Horstman and G.Cornell, Core Java 2, Vol I. Fundamentos, Septima edición, Prentice Hall, 2006.
[2] K.Arnold, JGosling and D.Holmes, The Java programming language, Boston : Addison-Wesley, 2000
[3] M.Fowler, UML Distilled Third Edition. A brief guide to the standard object modeling language, Addison-Wesley, 2003.
[4] R.Miles and K.Hamilton, Learning UML 2.0, O'Reilly Media Inc, 2006.
[5] C.Larman, Applying UML and patterns : an introduction to object-oriented analysis and design, Prentice Hall PTR, 1998
[6] E.Gamma, R.Helm, R.Johnson and J.Vlissides, Design patterns: elements of reusable object-oriented software, Addison-Wesley Longman Publishing Co., 1995
[7] J.Cooper, Java Design Patterns, Addison Wesley, 2000
[8] D.Lea, Concurrent programming in Java: design principles and patterns, Addison-Wesley, 2000

Material complementario

[9] M.Fowler, Refactoring: Improving the Design of Existing Code, Addison-Wesley Professional, 2018
[10] R.Martin, Clean Code: A Handbook of Agile Software Craftsmanship, Pearson, 2008
[11] K.Sierra and B.Bates, Head First Java, O'Reilly Media, 2005
[12] E.Freeman, B.Bates, K.Sierra and E.Robson, Head First Design Patterns: A Brain-Friendly Guide, O'Reilly Media, 2004