Esta asignatura pretende explicar conceptos de programación que profundizan en el uso de determinadas construcciones y estructuras ligadas a paradigmas de programación que los estudiantes deberían conocer. Este año se explica programación funcional: funciones como objetos de primera clase, closures y modelo de entornos, programación utilizando funciones de orden superior (composición, pipelining, tail call optimization, continuation passing style, etc), inmutabilidad en estructuras de datos, evaluación perezosa y macros.
Profesorado
Responsable
Gerard Escudero Bakx (
)
Jordi Delgado Pin (
)
Horas semanales
Teoría
2
Problemas
0
Laboratorio
2
Aprendizaje dirigido
0
Aprendizaje autónomo
6
Competencias
Competencias Transversales
Trabajo en equipo
G5 [Avaluable] - Ser capaz de trabajar como miembro de un equipo, ya sea como un miembro más, o realizando tareas de dirección con la finalidad de contribuir a desarrollar proyectos con pragmatismo y sentido de la responsabilidad, asumiendo compromisos teniendo en cuenta los recursos disponibles.
G5.2
- Planificar y acordar los objetivos, las reglas de funcionamiento, las responsabilidades, la agenda y el procedimiento de revisión del trabajo. Identificar conflictos, negociarlos y resolverlos de forma efectiva. Adaptarse a diferentes tipos de grupo (grande-pequeño, técnico-mixto, presencial-a distancia). Interactuar con eficacia y promover la participación de todos los miembros del grupo.
Competencias Técnicas
Competencias técnicas comunes
CT1 - Demostrar conocimiento y comprensión de hechos esenciales, conceptos, principios y teorías relativas a la informática y a sus disciplinas de referencia.
CT1.2C
- Interpretar, seleccionar y valorar conceptos, teorías, usos y desarrollos tecnológicos relacionados con la informática y su aplicación a partir de los fundamentos matemáticos, estadísticos y físicos necesarios. CEFB1: Capacidad para la resolución de los problemas matemáticos que puedan plantarse en la ingeniería. Aptitud para aplicar los conocimientos sobre: algebra, cálculo diferencial e integral i métodos numéricos; estadística y optimización.
CT4 - Demostrar conocimiento y capacidad de aplicación de los procedimientos algorítmicos básicos de las tecnologías informáticas para diseñar soluciones a problemas, analizando la idoneidad y la complejidad de los algoritmos
CT4.1
- Identificar las soluciones algorítmicas más adecuadas para resolver problemas de dificultad mediana.
CT4.2
- Razonar sobre la corrección y la eficiencia de una solución algorítmica.
CT5 - Analizar, diseñar, construir y mantener aplicaciones de forma robusta, segura y eficiente, escogiendo el paradigma y los lenguajes de programación más adecuados.
CT5.1
- Escoger, combinar y explotar diferentes paradigmas de programación, en el momento de construir software, atendiendo a criterios como la facilidad de desarrollo, la eficiencia, la portabilidad y la mantenibilidad.
CT5.2
- Conocer, diseñar y utilizar de forma eficiente los tipos y las estructuras de datos más adecuados para la resolución de un problema.
CT5.3
- Diseñar, escribir, probar, depurar, documentar y mantener código en un lenguaje de alto nivel para resolver problemas de programación aplicando esquemas algorítmicos y usando estructuras de datos.
Competencias Técnicas de cada especialidad
Especialidad ingeniería del software
CES1 - Desarrollar, mantener y evaluar servicios y sistemas software que satisfagan todos los requisitos del usuario, que se comporten de forma fiable y eficiente, que tengan un desarrollo y mantenimiento asequible y que cumplan normas de calidad, aplicando las teorías, los principios, los métodos y las prácticas de Ingeniería del Software.
CES1.1
- Desarrollar mantener y evaluar sistemas y servicios software complejos y/o críticos.
CES1.3
- Identificar, evaluar y gestionar los riesgos potenciales asociados a la construcción de software que pudiesen presentarse.
CES1.7
- Controlar la calidad y diseñar pruebas en la producción de software.
Especialidad de computación
CCO2 - Desarrollar de forma efectiva y eficiente los algoritmos y el software apropiados para resolver problemas complejos de computación.
CCO2.2
- Capacidad para adquirir, obtener, formalizar y representar el conocimiento humano de una forma computable para la resolución de problemas mediante un sistema informático en cualquier ámbito de aplicación, particularmente los relacionados con aspectos de computación, percepción y actuación en ambientes o entornos inteligentes.
Objetivos
Conocer las capacidades que proporciona a un lenguaje de programación disponer de funciones de orden superior
Competencias relacionadas:
CT1.2C,
CES1.1,
CT4.2,
CCO2.2,
CES1.3,
CES1.7,
CT5.1,
Trabajar las técnicas asociadas a funciones de orden superior en el lenguaje de programación Clojure
Competencias relacionadas:
CES1.1,
CT4.1,
CT4.2,
CT5.2,
CES1.3,
CT5.3,
Conocer qué es un cierre (closure) y algunas técnicas asociadas a su utilización.
Competencias relacionadas:
CT1.2C,
CES1.1,
CT4.2,
CT5.2,
CES1.3,
CT5.1,
Conocer un lenguaje de programación dinámico y funcional (híbrido) como Clojure.
Competencias relacionadas:
CES1.1,
CES1.3,
CES1.7,
CT5.3,
Conocer estructuras de datos inmutables y qué consecuencias tiene disponer de ellas en un lenguaje de programación.
Competencias relacionadas:
CES1.1,
CT4.1,
CT5.2,
CCO2.2,
CES1.3,
CES1.7,
CT5.1,
CT5.3,
Conocer el concepto de evaluación perezosa y las consecuencias de poder elegir entre distintos tipos de evaluación
Competencias relacionadas:
CES1.1,
CT4.2,
CES1.3,
CES1.7,
CT5.1,
CT5.3,
Ser capaz de desarrollar en equipo ejercicios de laboratorio que utilicen parte de lo que se enseña en el curso
Competencias relacionadas:
CES1.1,
G5.2,
CES1.7,
Contenidos
Introducción a Clojure
Expresiones, condicionales, variables locales (let), definición de funciones, secuencias (listas, vectores, strings), recursividad e iteración.
Funcions de primera-classe
Funciones como parámetro, guardar funciones en estructuras de datos. Maneras de iterar sobre colecciones: reduce, map, filtro, foldr, etc. Retornar funciones
Closures: El modelo de entornos
Contexto léxico (lexical scope), Las funciones no son tales: Capturan el contexto léxico, Si tenemos closures no se necesitan objetos: Ejemplos. Explicar el funcionamiento basado en el modelo de entornos.
Programación con funciones de orden superior: Técnicas
Composición, Pipelining, CPS, TCO & Trampolining
Estructuras de datos inmutables
Ventajas e inconvenientes. El caso de Clojure: Separar la gestión del estado y hacerla explícita (inmutabilidad por defecto)
Evaluación perezosa
Estructuras de datos "infinitas": Aplicaciones.
Macros
El concepto de 'Macro' en el mundo de los lenguajes Lisp. Reflexión.
Actividades
ActividadActo evaluativo
Introducción a Clojure
El estudiante debería estar atento en clase y trabajar los ejercicios propuestos por el profesor. Objetivos:4 Contenidos:
Fecha de entrega: A lo largo del curso Objetivos:7 Semana:
15 (Fuera de horario lectivo)
Teoría
0h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
0h
Control final
Objetivos:456123 Semana:
15 (Fuera de horario lectivo)
Teoría
2h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
10h
Metodología docente
La docencia de la asignatura está estructurada en clases de teoría y clases de laboratorio.
En las clases de teoría los profesores presentan los contenidos esenciales de la asignatura. En las clases de laboratorio se practican los contenidos de la asignatura (los presentados en clase y los adquiridos autónomamente) mediante la realización de problemas prácticos. Las clases de laboratorio serán una continuación de las clases teóricas, donde los conceptos nuevos se implementarán a medida que vayan apareciendo.
Método de evaluación
El método de evaluación de la asignatura consistirá en dos pruebas de carácter teórico (P y F), una a mediados de curso y otra al final y ejercicios de laboratorio que se entregaran en grupos de dos personas (L). La evaluación del laboratorio se realizará de la siguiente manera: Los estudiantes harán entrega de entre 5 y 7 ejercicios a lo largo del curso en grupos de dos personas, siendo la nota de laboratorio la media de estas notas.
Entonces, el método de evaluación sería:
= Teoría*0.5 + L*0.5 si la nota de Teoría és >= 3.5
= Teoría si la nota de Teoría és < 3.5
donde:
Teoría: MAX(F,(P+F)/2)
Competencia transversal "Trabajo en equipo":
Se evalúa usando una rúbrica simple en que el tutor de cada grupo puntúa los
diferentes aspectos del trabajo en equipo de cada miembro de los grupos.