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ácilConstruyamos un sistema de registros de estudiantes que reúna todas las técnicas de encapsulación que has aprendido en este capítulo. Crearás un sistema seguro en el que los datos de los estudiantes estén debidamente protegidos, las calificaciones se validen 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 privado
readonlypara el ID del estudiante (string); este nunca debe ser accesible directamente desde fuera - Una lista privada para almacenar las calificaciones (enteros)
- Una propiedad pública de solo lectura
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 no vá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 con el formato"{Name} (ID: {last 4 characters of student ID})"; ¡observa cómo solo expones 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 las calificaciones válidas se aceptan, las no válidas se rechazan y el promedio se calcula correctamente.
Recibirás cinco entradas:
- Nombre del estudiante
- ID del estudiante (al menos 4 caracteres)
- Primera calificación que se añadirá (entero)
- Segunda calificación que se añadirá (entero, podría ser no válida, como -5 o 150)
- Tercera calificación que se añadirá (entero)
Imprime la salida con 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 no válida de 150 se rechazó 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 mediante GetStudentInfo(). El nombre se puede leer, pero es inmutable. ¡Así funciona la encapsulación en conjunto para crear una clase sólida 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()}
// Grades recorded: {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 estudiantesPractica por tu cuenta: Compilador de C# online