Los ejercicios consistirán en construir y realizar la implementación de cuatro ejemplos, un ejemplo de cada uno de los bloques siguientes:
- Objetos
- Dependencias
- Calidad
- Funciones
De cada bloque se elegirá un solo tema sobre el que construir el ejemplo. La implementación se realizará en un lenguaje también a elegir. Los ejemplos serán similares a los estudiados en teoría, o propuestos por cada alumno. La elección de un tema para implementar un ejemplo no excluye utilizar elementos de otros temas, aunque se intentará centrar el ejemplo sobre todo en la implementación de elementos del tema elegido.
- Elegir un tema de cada bloque, según la lista de temas.
- Notificar por correo en el campus al profesor los temas elegidos y esperar su confirmación.
- Estudiar los ejemplos del tema estudiados en clases de teoría, o bien proponer un ejemplo alternativo.
- Elegir al menos un lenguaje de implementación de entre los siguientes:
- Scala
- Python
- TypeScript y JavaScript
- C#
- Ruby
- Cualquier otro lenguaje que tenga un mecanismo útil de implementación del tema elegido y el ejemplo propuesto
- Implementar los ejemplos empleando los mecanismos del lenguaje elegido.
- Incluir una breve explicación escrita en markdown, que incluya instrucciones sobre cómo construir, compilar y ejecutar el ejemplo.
- Incluir en el código un programa principal breve de demostración del ejercicio.
- Ubicar los ficheros markdown y el código fuente del ejemplo en la carpeta con el nombre del tema situada bajo la carpeta
temas. - Los nombres permitidos para las carpetas a situar bajo
temas/son:encapsulacion,herencia,delegacion,uniones,inyeccion,anotaciones,aspectos,contratos,undefined,lambdas,promesasofuturos,observables.
- Publicar los ejemplos en un repositorio github
- Todos los ficheros deben estar realizados sobre carpetas cuyos nombres coincidan con los nombres de los temas elegidos.
- El repositorio debe incluir un fichero
README.mdcon las instrucciones, el código implementado y los ficheros de configuración y makefiles necesarios para compilar y probar el ejemplo.
- Hacer la presentación del ejercicio realizado de alguna de estas dos formas:
- Pedir fecha al profesor para presentar el ejemplo en clase, o bien...
- Grabar un video explicativo de menos de 8' y entregarlo a través del campus.
Implementar el ejemplo final de Recorrido de listas usando los mecanismos del lenguaje para definición de tipos de datos, ocultación de la implementación, aplicación del principio de acceso uniforme y especificación de la inmutabilidad del estado de un objeto. Por ejemplo:
- En Ruby, se podrían usar
:symbols,module,@variablesde instancia,attr_accessor,attr_reader,attr_writer, etc. - En Scala, se podrían usar modificadores de visibilidad (
private,protected),var,val,type,abstract,sealed, etc. - En C#, se podrían usar modificadores de visibilidad y properties
get,seteinit, etc.
Implementar el ejemplo de Aventura usando los mecanismos de herencia y polimorfismo de inclusión que proporcione el lenguaje. Por ejemplo:
- En Scala, podría usarse el mecanismo básico de herencia (
extends), mixins (traits),with, etc. - En C#, se podrían usar el mecanismo básico de herencia,
interface,base,override,virtual,new, etc.
Implementar el ejemplo final de Orquesta usando los mecanismos del lenguaje para la delegación/composición. Intentará evitarse el uso de lambdas, que están destinadas a otro bloque. Por ejemplo:
- En C# podrían usarse
delegates. - En Scala, podrían usarse first-class functions.
- En Ruby, podrían usarse bloques,
proc,moduleydelegate.
Implementar un ejemplo de uso de uniones type-safe empleando los mecanismos disponibles en el lenguaje. Por ejemplo:
- En C++17, usar
std::variant. - En Scala, usar unions y tagged unions de Scala 3.
Implementar el ejemplo de la identificación de BankAccount y que se puedan definir diversos atributos para comparar cuentas, usando los mecanismos del lenguage para inyectar como dependencia el criterio de comparación. Por ejemplo:
- En Java, puede usarse el framework Guice o Weld CDI
- En Scala, puede usarse el framework Play que implementa la inyección de dependencias en tiempo de compilación.
Implementar el ejemplo de BankAccount con diversos atributos comparables, usando los mecanismos de anotaciones que el lenguaje proporcione para inyectar como dependencia el comparador a usar. Por ejemplo:
- En Java, podrían definirse anotaciones a medida para inyección de dependencias en runtime, según el JSR 330. Ejemplo: Creating a Custom Annotation in Java de Baeldung
- En TypeScript, podrían usarse decorators.
- En Scala, puede usarse el framework Play que implementa el JSR 330.
Implementar usando aspectos el ejemplo del caso Editor de Figuras. Por ejemplo:
- En Java, usar intercepción de métodos con Guice
- En Python, usar Spring Python
Implementar ejemplos de contratos, usando una librería disponible en el lenguaje de elección para programar contratos. Por ejemplo:
-
En Java, podría usarse bibliotecas específicas para programar contratos como Contracts for Java, Oval o Valid4J.
-
En Scala, podrían usarse los mecanismos del lenguaje disponibles en Predef.scala, como por ejemplo:
assert,assume,require,ensuring, etc. -
En Kotlin, podría usarse el mecanismo experimental
contract
Implementar el ejemplo del caso "MobileTester" del apartado Optionals usando los mecanismos del lenguaje para resolver el problema de los valores undefined y el mal uso de null. Por ejemplo:
- En C++, podría usarse
std::optional - En Scala, podrían usarse los mecanismos de la biblioteca del lenguaje como
Option,Some,None,Either,Left,Right, etc.
Implementar ejemplos del uso de funciones anónimas (expresiones lambda) empleando los mecanismos disponibles en el lenguaje elegido. Por ejemplo:
- En C++, usar lambdas genéricas de C++11, lambdas variádicas de C++14/C++17 y lambdas mutables.
- En Scala, usar funciones anónimas de Scala 3
- En Ruby, usar
lambdas.
Implementar un ejemplo de programación asíncrona, similar a los mostrados en Promesas y futuros, que emplee los mecanismos disponibles en el lenguaje. Por ejemplo:
- En C++, usar
std::asyncystd::promiseystd::future - En Scala, usar
FutureoPromisedescala.concurrent.
Implementar un ejemplo de procesamiento de streams de eventos asíncronos empleando una biblioteca ReactiveX para el lenguaje elegido. Por ejemplo:
- En C++, usar los elementos observable de la biblioteca RxCpp.
- En Scala, usar el framework Akka o el trait
Observablede las extensiones RxScala.