Repaso: sistema de registros de estudiantes
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 30 de 65.
Desafío
IntermedioConstruye un pequeño sistema de registro de estudiantes a partir de dos clases.
Student en student.gd mantiene sus datos privados:
_init(id, new_name)almacena el ID en una variable privada y asigna el nombre mediante el setter destudent_name.student_ides de solo lectura y devuelve el ID.student_nametiene un setter: se rechaza un nombre de menos de2caracteres (se conserva el nombre anterior) ylast_errorpasa a serName must be at least 2 characters. Un nombre válido borralast_error.add_grade(course, grade)almacena la calificación del curso en un Dictionary privado (una nueva calificación para el mismo curso reemplaza la anterior) y devuelvetrue. Una calificación inferior a0o superior a100no se almacena y devuelvefalse.averagees una propiedad calculada de solo lectura: el promedio de las calificaciones comofloat, o0.0si no hay calificaciones.course_count()devuelve el número de cursos que tienen una calificación.
StudentRegistry en student_registry.gd mantiene a los estudiantes en un Dictionary privado, usando el ID como clave:
add_student(student)devuelvefalsey no cambia nada cuando el ID ya está ocupado; de lo contrario, almacena al estudiante y devuelvetrue.remove_student(id)devuelve si se eliminó un estudiante.get_student(id)devuelve al estudiante onull.top_student()devuelve al estudiante con el promedio más alto (en caso de empate, al que se añadió primero) onullcuando el registro está vacío.get_ids()devuelve los IDs en el orden en que se añadieron los estudiantes.
El código proporcionado lee el número de comandos y luego ejecuta un comando por línea: add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (intenta sobrescribir student_id y average, que no deben cambiar), top y list. Para esta entrada:
10
add 1001 Alice Smith
add 1002 Bob
grade 1001 Math 90
grade 1001 Art 85
grade 1002 Math 95
grade 1002 Art 120
rename 1002 B
show 1002
top
listimprime:
Added Alice Smith (1001)
Added Bob (1002)
Alice Smith: Math = 90
Alice Smith: Art = 85
Bob: Math = 95
Invalid grade: 120
Rejected: Name must be at least 2 characters
ID: 1002, Name: Bob, Courses: 1, Average: 95.00
Top: Bob (95.00)
ID: 1001, Name: Alice Smith, Courses: 2, Average: 87.50
ID: 1002, Name: Bob, Courses: 1, Average: 95.00Tu código va en student.gd y student_registry.gd. main.gd contiene el código de entrada y salida proporcionado y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: mantenlo tal como está
var registry := StudentRegistry.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ", true, 2)
var command := parts[0]
if command == "top":
var best := registry.top_student()
if best == null:
print("Top: none")
else:
print("Top: %s (%.2f)" % [best.student_name, best.average])
continue
if command == "list":
for listed_id in registry.get_ids():
print_student(registry.get_student(listed_id))
continue
var id := int(parts[1])
if command == "add":
var student := Student.new(id, parts[2])
if student.last_error != "":
print("Rejected: " + student.last_error)
elif registry.add_student(student):
print("Added %s (%d)" % [student.student_name, id])
else:
print("Duplicate ID: %d" % id)
continue
if command == "remove":
print(("Removed %d" if registry.remove_student(id) else "No student %d") % id)
continue
var student := registry.get_student(id)
if student == null:
print("No student %d" % id)
elif command == "grade":
var grade_parts := parts[2].split(" ")
if student.add_grade(grade_parts[0], int(grade_parts[1])):
print("%s: %s = %s" % [student.student_name, grade_parts[0], grade_parts[1]])
else:
print("Invalid grade: " + grade_parts[1])
elif command == "rename":
student.student_name = parts[2]
if student.last_error != "":
print("Rejected: " + student.last_error)
else:
print("Renamed to " + student.student_name)
elif command == "tamper":
# Intenta sobrescribir las propiedades de solo lectura
student.student_id = 0
student.average = 100.0
print_student(student)
else:
print_student(student)
func print_student(student: Student) -> void:
print("ID: %d, Name: %s, Courses: %d, Average: %.2f" % [student.student_id, student.student_name, student.course_count(), student.average])
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online