Plataforma de e-learning
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 68 de 70.
Desafío
Fácil¡Vamos a construir una plataforma de e-learning que gestione cursos, estudiantes e inscripciones! Este desafío reúne todo lo que has aprendido sobre OOP: clases, herencia, interfaces, encapsulación y servicios trabajando juntos en una arquitectura limpia.
Organizarás tu código en cinco archivos:
Lesson.cs: Crea una claseLessonen el espacio de nombresELearning.Models. Cada lección tiene unTitle(string) yDurationMinutes(int) como propiedades de solo lectura establecidas a través del constructor.Course.cs: Crea una claseCourseen el espacio de nombresELearning.Models. Un curso tiene propiedades de solo lecturaId(string),Title(string) eInstructor(string), además de una listaLessons. Incluye un métodoAddLesson(Lesson lesson)y una propiedad de solo lecturaTotalDurationque calcula la suma de todas las duraciones de las lecciones.Student.cs: Crea una claseStudenten el espacio de nombresELearning.Modelscon propiedades de solo lecturaId(int) yName(string). Los estudiantes rastrean su progreso a través de un diccionario privado que mapea los IDs de los cursos con el número de lecciones completadas. Incluye los métodosCompleteLesson(string courseId)para incrementar el progreso yGetProgress(string courseId)para devolver el recuento de lecciones completadas (o 0 si no está inscrito).EnrollmentService.cs: Crea una claseEnrollmentServiceen el espacio de nombresELearning.Services. Este servicio gestiona cursos e inscripciones utilizando colecciones privadas. Implementa:AddCourse(Course course)- añade un curso a la plataformaEnroll(Student student, string courseId)- devuelvetruesi la inscripción tiene éxito,falsesi el curso no existe o el estudiante ya está inscritoGetEnrolledCourses(Student student)- devuelve una lista de IDs de cursos en los que el estudiante está inscritoGetCourse(string courseId)- devuelve el curso onullsi no se encuentra
Program.cs: Une todo creando cursos con lecciones, inscribiendo estudiantes, rastreando el progreso y mostrando resultados basados en la entrada.
Recibirás las siguientes entradas:
- Número de cursos a crear
- Para cada curso: ID, título, instructor, número de lecciones, luego para cada lección: título y duración (minutos)
- ID y nombre del estudiante
- Número de operaciones a realizar
- Para cada operación: la acción (
enroll,complete,progressoinfo) seguida del ID del curso
Formatos de salida:
enroll: ImprimeEnrolled in: {CourseTitle}oEnrollment failed: {courseId}complete: ImprimeCompleted lesson in {CourseTitle}(incrementa el progreso en 1)progress: Imprime{CourseTitle}: {completed}/{total} lessonsinfo: Imprime{CourseTitle} by {Instructor} - {TotalDuration} minutes
Por ejemplo, si las entradas son:
2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999La salida debería ser:
Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999Observa cómo el servicio gestiona la relación entre estudiantes y cursos, mientras que cada clase maneja sus propias responsabilidades. El estudiante rastrea su propio progreso, los cursos calculan su duración total y el servicio de inscripción coordina todo: ¡una clara separación de responsabilidades!
Pruébalo tú mismo
using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;
class Program
{
public static void Main(string[] args)
{
// Leer el número de cursos
int numCourses = Convert.ToInt32(Console.ReadLine());
// TODO: Crear una instancia de EnrollmentService
// TODO: Leer y crear cada curso con sus lecciones
// Para cada curso: leer ID, título, instructor, número de lecciones
// Para cada lección: leer título y duración
// Agregar lecciones al curso, luego agregar el curso al servicio
// Leer la información del estudiante
int studentId = Convert.ToInt32(Console.ReadLine());
string studentName = Console.ReadLine();
// TODO: Crear una instancia de Student
// Leer el número de operaciones
int numOperations = Convert.ToInt32(Console.ReadLine());
// TODO: Procesar cada operación
// Para cada operación: leer acción y courseId
// Manejar: enroll, complete, progress, info
// Mostrar el mensaje apropiado basado en la acción
}
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy13Desafíos finales
Plataforma de e-learningComponente de personaje de juegoServicio de alquiler de vehículos2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes