Programación Orientada a Objetos (Object-Oriented Programming) — Programa del curso
Docente: Gerson Garrido
1. Descripción
Este curso enseña a diseñar programas como conjuntos de objetos que colaboran: cada objeto guarda su estado, protege sus invariantes y ofrece un comportamiento a través de una interfaz. Usamos Java 25 (versión LTS) y seguimos el libro gratuito Introduction to Programming Using Java de David J. Eck. El curso se organiza en cuatro partes:
- Objetos y clases — de la programación imperativa a los objetos; clases, referencias, encapsulamiento (encapsulation) e invariantes.
- Herencia, polimorfismo e interfaces — jerarquías de tipos, dynamic dispatch, clases abstractas, interfaces y composición.
- Programar con tipos — excepciones, genéricos (generics), colecciones, lambdas y streams.
- Diseño — principios SOLID, patrones de diseño (design patterns), refactoring y pruebas.
Los unit tests con JUnit acompañan el curso desde la semana 3: cada clase que escribimos viene con sus pruebas.
Los términos técnicos van en inglés cuando así los dicen los programadores y así aparecen en la documentación (override, garbage collector, unit test, wildcard); los que de verdad se usan en español (clase, herencia, excepción, colección) van en español, con el inglés entre paréntesis la primera vez. El glosario reúne los principales. Las lecturas y la documentación de las herramientas están en inglés.
2. Carga horaria
| Componente | Horas/semana | Formato |
|---|---|---|
| Teoría | 4 h | Dos sesiones de 2 h (Sesión A y Sesión B) |
| Laboratorio | 2 h | Una sesión práctica guiada |
3. Resultados de aprendizaje
Al finalizar el curso, el estudiante será capaz de:
- Modelar un problema con clases y objetos: identificar responsabilidades, estado e invariantes, y protegerlos con encapsulamiento.
- Explicar cómo se representan los objetos en memoria (referencias, heap, garbage collector) y la diferencia entre identidad e igualdad.
- Usar herencia, clases abstractas e interfaces, y explicar el dynamic dispatch; elegir entre herencia y composición con criterio (principio de sustitución de Liskov).
- Escribir código robusto y reutilizable con excepciones, genéricos, el Collections Framework, lambdas y streams.
- Aplicar principios de diseño (SOLID, bajo acoplamiento, alta cohesión) y patrones de diseño clásicos, y reconocer cuándo no hacen falta.
- Escribir unit tests con JUnit y refactorizar con ellos como red de seguridad, en un proyecto que crece durante todo el semestre.
4. Bibliografía
Texto principal (gratuito en línea): David J. Eck. Introduction to Programming Using Java, versión 9 (2022; cubre Java 17). Licencia CC BY-NC-SA 4.0. https://math.hws.edu/javanotes/
El libro cubre Java 17. Lo que agrega Java 25 y usamos en el curso (record,
interfaces sealed, pattern matching en switch, archivos fuente compactos con
void main()) está en los apuntes y en la documentación oficial.
Material de apoyo:
- Tutoriales oficiales de Java: https://dev.java/learn/
- Documentación de la API de Java 25: https://docs.oracle.com/en/java/javase/25/docs/api/
- Especificación del lenguaje (JLS), Java SE 25: https://docs.oracle.com/javase/specs/jls/se25/html/
- Guía de usuario de JUnit: https://docs.junit.org/current/user-guide/
5. Calendario
Este es el calendario oficial del curso. Cada semana enlaza a su guía con lecturas, objetivos y actividades de laboratorio. Las sesiones marcadas con ✂️ se pueden comprimir o pasar a lectura autónoma si se pierden clases por feriados.
| Sem. | Sesión A (2 h) | Sesión B (2 h) | Laboratorio (2 h) | Entregas |
|---|---|---|---|---|
| 1 | Presentación del curso · De C a Java | Objetos como estado + comportamiento | Entorno: Docker, javac, java, jshell, make |
P0 publicado |
| 2 | Clases, campos, métodos y constructores | Referencias, heap, null · Identidad vs. igualdad |
Primeras clases y depuración | |
| 3 | Encapsulamiento e invariantes | static, paquetes, inmutabilidad · record |
Unit tests con JUnit | P0 entrega · P1 publicado |
| 4 | Arreglos y ArrayList |
Diseñar con clases: responsabilidades, UML de clases | Modelar un dominio con pruebas | |
| 5 | Herencia: extends, super, override |
Object: toString, equals, hashCode |
Jerarquías y el contrato de equals |
|
| 6 | Polimorfismo y dynamic dispatch | Clases y métodos abstractos | Polimorfismo en el proyecto | P1 entrega · P2 publicado |
| 7 | Interfaces | Composición vs. herencia · Sustitución de Liskov | Interfaces y test doubles | |
| 8 | Tipos sealed y pattern matching · Repaso |
Examen parcial (partes 1 y 2) | Repaso con ejercicios | |
| 9 | Excepciones: lanzar, capturar, propagar | Robustez: checked vs. unchecked, try-with-resources, contratos |
Manejo de errores y pruebas de excepciones | P2 entrega · P3 publicado |
| 10 | Genéricos: clases y métodos | Wildcards y type erasure | Una colección genérica propia | |
| 11 | Colecciones: List, Set, Map |
Comparable, Comparator, iteradores |
Elegir la colección adecuada | |
| 12 | Lambdas, interfaces funcionales, referencias a métodos | Streams | Reportes con streams | P3 entrega · P4 publicado |
| 13 | Principios de diseño: cohesión, acoplamiento, SOLID | Refactoring guiado por pruebas | Refactorizar el proyecto | |
| 14 | Patrones de diseño I: Strategy, Observer | Patrones de diseño II: Factory, Composite | Patrones en el proyecto | |
| 15 | Archivos y E/S: java.nio.file, streams · Decorator |
Persistencia simple: CSV y serialización | Guardar y cargar el estado | P4 entrega · P5 publicado |
| 16 | Programación orientada a eventos · ✂️ Interfaces gráficas | Cierre: diseño de una aplicación completa · Repaso | Presentación de proyectos | P5 entrega |
| — | Examen final en el período de exámenes |
Sobre el examen final: el calendario asume que la universidad tiene un período de exámenes después de la semana 16. Si no lo tiene, el final se toma en la Sesión B de la semana 16 y los temas ✂️ pasan a lectura autónoma.
6. Proyectos
Un solo proyecto que crece durante el semestre: Bodega, el sistema de
inventario y ventas de una tienda pequeña. Cada entrega agrega lo que se vio en
clase y debe pasar sus pruebas y las de las entregas anteriores. El detalle y las
reglas de entrega están en
projects/README.md.
| # | Entrega | Lo que agrega | Publicado | Entrega |
|---|---|---|---|---|
| P0 | Calentamiento | Programas cortos en Java; Product (el producto) como primera clase |
Sem. 1 | Sem. 3 |
| P1 | Inventario | Clases encapsuladas con invariantes, ArrayList, pruebas JUnit |
Sem. 3 | Sem. 6 |
| P2 | Catálogo | Jerarquía de productos, polimorfismo, interfaces (precios y descuentos) | Sem. 6 | Sem. 9 |
| P3 | Ventas | Excepciones, genéricos y colecciones (Map, Set) |
Sem. 9 | Sem. 12 |
| P4 | Reportes | Lambdas y streams; refactoring con principios SOLID | Sem. 12 | Sem. 15 |
| P5 | Aplicación | Patrones de diseño, persistencia en archivos y una interfaz de línea de comandos | Sem. 15 | Sem. 16 |
7. Políticas
- Trabajo en parejas: P0 es individual. P1–P5 se pueden hacer en parejas, y la pareja se mantiene durante el semestre.
- Integridad académica: se puede discutir ideas, pero el código entregado debe ser propio. Se usarán herramientas de detección de similitud. Copiar soluciones publicadas en internet cuenta como plagio.
- Explicar el propio trabajo: en cualquier entrega, laboratorio o examen se les puede pedir que expliquen de forma oral su código: qué hace, por qué lo escribieron así y cómo lo cambiarían. Cualquier integrante de la pareja debe poder explicar cualquier parte del proyecto.
Uso de herramientas
El objetivo del curso es que ustedes aprendan a diseñar y escribir código orientado a objetos, y eso solo pasa si lo escriben ustedes. Por eso las herramientas que escriben código por ustedes no se permiten; las que ayudan a entender, buscar o revisar, sí.
| Herramienta | En este curso |
|---|---|
Mensajes del compilador (javac -Xlint:all), de la JVM y del depurador; jshell |
Permitidos en el proyecto y los laboratorios. Leerlos es parte del curso. |
| Documentación oficial (API de Java, JLS, dev.java, JUnit) y búsqueda en la web | Permitidas para consultar. Copiar una solución completa encontrada en la web cuenta como plagio. |
Autocompletado del editor que sugiere nombres de métodos, campos o import |
Permitido. No se permite el que completa métodos o clases enteros. |
| Correctores de ortografía, traductores y herramientas de accesibilidad | Permitidos, también para leer el libro y la documentación en inglés. |
| Formateadores de código y linters | Permitidos. |
| IA generativa para pedir explicaciones de conceptos, mensajes de error o código del curso, sin que genere código para ustedes | Permitida para estudiar. No se permite en los exámenes. |
| IA generativa que escribe código (asistentes en el editor, chats que devuelven código) | No se permite en el proyecto, los laboratorios ni los exámenes. Entregar código producido así cuenta como plagio. |
Si usaron una herramienta permitida de forma que influyó en su entrega (una
explicación de IA generativa, una página web que les mostró cómo resolver un
problema), lo dicen en el README.md de la entrega: qué herramienta, para
qué y qué parte del trabajo tocó. Declararlo no es una falta; no declararlo sí
cuenta como falta a la integridad académica.
8. Entorno de trabajo
Todo el trabajo práctico se hace con el JDK 25 y JUnit dentro de un contenedor
Docker que funciona igual en Linux, Windows (WSL2) y macOS (incluido Apple
Silicon). También sirve un JDK 25 instalado localmente con cualquier editor.
Instrucciones en labs/README.md.