Menu
Coddy logo textTech

Plataforma de E-Learning

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 84 de 87.

¡Bienvenido al capítulo de desafíos finales! Estos desafíos están diseñados para poner a prueba tu dominio de todos los conceptos de POO que has aprendido a lo largo de este curso.

En este desafío, construirás un sistema de Plataforma de aprendizaje electrónico que combina herencia, interfaces, polimorfismo, encapsulación y patrones de diseño en una aplicación cohesiva.

Tu plataforma debe modelar las relaciones entre cursos, estudiantes e instructores. Piensa en cómo una clase base User puede ser extendida por las clases Student e Instructor, cómo los cursos contienen lecciones y cómo funciona el seguimiento de las inscripciones entre estudiantes y cursos.

Considera qué principios de OOP se aplican: utiliza la encapsulación para proteger los datos de los usuarios, la herencia para compartir comportamientos comunes, las interfaces para definir contratos como Enrollable o Completable, y el polimorfismo para manejar distintos tipos de usuarios de manera uniforme.

¡Buena suerte aplicando todo lo que has aprendido!

challenge icon

Desafío

Fácil

¡Construyamos una plataforma de aprendizaje electrónico que reúna todos los conceptos de OOP que has aprendido a lo largo de este curso! Crearás un sistema que modele las relaciones entre cursos, estudiantes e instructores mediante herencia, interfaces, polimorfismo y encapsulación.

Organizarás tu código en seis archivos:

  • Enrollable.java: Crea una interfaz que defina el contrato para las operaciones de inscripción. Debe declarar los métodos enroll(Student student), que devuelve un booleano, y getEnrolledCount(), que devuelve un int.
  • User.java: Crea una clase base abstracta que represente a cualquier usuario de la plataforma. Incluye campos privados para id (String) y name (String), un constructor que inicialice ambos, getters apropiados y un método abstracto getRole() que devuelva un String describiendo el rol del usuario.
  • Student.java: Crea una clase que extienda User. Añade un ArrayList privado para realizar un seguimiento de los ID de los cursos en los que está inscrito el estudiante. Incluye un constructor que llame al constructor de la clase padre, implementa getRole() para que devuelva "Student" y añade los métodos addCourse(String courseId) y getEnrolledCourseCount(). Sobrescribe toString() para que devuelva "Student: [name] ([enrolledCount] courses)".
  • Instructor.java: Crea una clase que extienda User. Añade un campo privado para specialty (String). Incluye un constructor que reciba id, name y specialty, implementa getRole() para que devuelva "Instructor", añade un getter para specialty y sobrescribe toString() para que devuelva "Instructor: [name] - [specialty]".
  • Course.java: Crea una clase que implemente Enrollable. Incluye campos privados para courseId (String), title (String), instructor (Instructor) y un ArrayList de estudiantes inscritos. El constructor recibe courseId, title e instructor. Implementa enroll(Student student) para añadir el estudiante a la lista, llamar al método addCourse() del estudiante con el ID de este curso y devolver true. Implementa getEnrolledCount(). Añade un método getDetails() que devuelva el ID del curso entre corchetes literales, seguido del título y del nombre del instructor, construido como "[" + courseId + "] " + title + " by " + instructorName.
  • Main.java: ¡Construye tu plataforma! Recibirás un string de comandos separados por comas:
    • ADD_INSTRUCTOR:id:name:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO:userId

    Mantén colecciones de instructores, estudiantes y cursos. Procesa cada comando e imprime:

    • ADD_INSTRUCTOR: Instructor added: [name]
    • ADD_STUDENT: Student added: [name]
    • ADD_COURSE: Course added: [title]
    • ENROLL: [studentName] enrolled in [courseTitle]
    • INFO: Imprime el resultado de toString() del usuario

    Después de todos los comandos, imprime --- Platform Summary ---, seguido de los detalles de cada curso y la cantidad de inscripciones con el formato [courseDetails] - [count] student(s).

Recibirás una entrada: el string de comandos separados por comas.

Por ejemplo, con la entrada ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001, tu salida sería:

Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)

¡Este desafío combina herencia (jerarquía de User), interfaces (Enrollable), polimorfismo (diferentes tipos de usuario con sus propias implementaciones de toString) y encapsulación (campos privados con acceso controlado) en un sistema cohesivo!

Pruébalo tú mismo

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Crear colecciones para almacenar instructores, estudiantes y cursos
        // Hint: Usa HashMap con id como clave para una búsqueda fácil
        
        // TODO: Divide la entrada por comas para obtener los comandos individuales
        
        // TODO: Procesa cada comando:
        // - ADD_INSTRUCTOR:id:name:specialty -> Create instructor, add to collection, print "Instructor added: [name]"
        // - ADD_STUDENT:id:name -> Create student, add to collection, print "Student added: [name]"
        // - ADD_COURSE:courseId:title:instructorId -> Create course with instructor, add to collection, print "Course added: [title]"
        // - ENROLL:studentId:courseId -> Inscribe al estudiante en el curso, imprime "[studentName] enrolled in [courseTitle]"
        // - INFO:userId -> Encuentra el usuario (estudiante o instructor) e imprime su toString()
        
        // TODO: After processing all commands, print "--- Platform Summary ---"
        
        // TODO: Para cada curso, imprime "[courseDetails] - [count] student(s)"
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online