Repaso - Registros de estudiantes
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 35 de 70.
Desafío
FácilVamos a construir un sistema de expedientes estudiantiles que reúna todas las técnicas de encapsulación que has aprendido en este capítulo. Crearás un sistema seguro donde los datos de los estudiantes estén debidamente protegidos, las calificaciones sean validadas y cierta información permanezca inmutable después de su creación.
Organizarás tu código en dos archivos:
Student.cs: Crea una claseStudenten el espacio de nombresRecordsque demuestre una encapsulación adecuada. Tu estudiante debe tener:- Un campo
readonlyName(string) que sea accesible públicamente pero que solo pueda establecerse durante la construcción - Un campo
readonlyprivado para el ID del estudiante (string); este nunca debe ser accesible directamente desde el exterior - Una lista privada para almacenar calificaciones (enteros)
- Una propiedad de solo lectura pública
Averageque calcule y devuelva el promedio de todas las calificaciones, o0si no existen calificaciones - Un método público
AddGrade(int grade)que solo acepte calificaciones entre 0 y 100 (inclusive); las calificaciones inválidas deben ignorarse silenciosamente - Un método público
GetGradeCount()que devuelva cuántas calificaciones válidas se han registrado - Un método público
GetStudentInfo()que devuelva una cadena en el formato"{Name} (ID: {last 4 characters of student ID})"- ¡observa cómo estás exponiendo solo una versión enmascarada del ID!
- Un campo
Program.cs: En tu archivo principal, crea un estudiante y añade varias calificaciones para demostrar cómo funciona la encapsulación. Mostrarás que se aceptan las calificaciones válidas, se rechazan las inválidas y el promedio se calcula correctamente.
Recibirás cinco entradas:
- Nombre del estudiante
- ID del estudiante (al menos 4 caracteres)
- Primera calificación a añadir (entero)
- Segunda calificación a añadir (entero, podría ser inválida como -5 o 150)
- Tercera calificación a añadir (entero)
Imprime la salida en este formato:
{GetStudentInfo() result}
Grades recorded: {GetGradeCount()}
Average: {Average}Por ejemplo, si las entradas son Emma Wilson, STU12345, 85, 150, y 90, la salida debería ser:
Emma Wilson (ID: 2345)
Grades recorded: 2
Average: 87.5Observa cómo la calificación inválida de 150 fue rechazada silenciosamente, por lo que solo se registraron dos calificaciones. El ID del estudiante está protegido: el código externo nunca puede ver el ID completo, solo la versión enmascarada a través de GetStudentInfo(). El nombre es legible pero inmutable. ¡Esto es la encapsulación trabajando en conjunto para crear una clase robusta y bien protegida!
Pruébalo tú mismo
using System;
using Records;
class Program
{
public static void Main(string[] args)
{
// Leer entradas
string name = Console.ReadLine();
string studentId = Console.ReadLine();
int grade1 = Convert.ToInt32(Console.ReadLine());
int grade2 = Convert.ToInt32(Console.ReadLine());
int grade3 = Convert.ToInt32(Console.ReadLine());
// TODO: Crear un objeto Student con el name y studentId
// TODO: Añadir las tres calificaciones usando el método AddGrade
// TODO: Imprimir la salida en el formato requerido:
// {resultado de GetStudentInfo()}
// Calificaciones registradas: {GetGradeCount()}
// Promedio: {Average}
}
}
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 Strategy2Propiedades 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