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:

  1. Objetos y clases — de la programación imperativa a los objetos; clases, referencias, encapsulamiento (encapsulation) e invariantes.
  2. Herencia, polimorfismo e interfaces — jerarquías de tipos, dynamic dispatch, clases abstractas, interfaces y composición.
  3. Programar con tipos — excepciones, genéricos (generics), colecciones, lambdas y streams.
  4. 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:

  1. Modelar un problema con clases y objetos: identificar responsabilidades, estado e invariantes, y protegerlos con encapsulamiento.
  2. Explicar cómo se representan los objetos en memoria (referencias, heap, garbage collector) y la diferencia entre identidad e igualdad.
  3. 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).
  4. Escribir código robusto y reutilizable con excepciones, genéricos, el Collections Framework, lambdas y streams.
  5. 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.
  6. 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:

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.