Plataforma de aprendizaje en línea
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 62 de 65.
Desafío
DifícilCrea las clases de una plataforma de aprendizaje electrónico: cursos, estudiantes e instructores. Los estudiantes y los instructores son personas, así que comparten una clase padre.
Los objetos no deben apuntarse entre sí: un curso almacena los correos electrónicos de sus estudiantes y el nombre de su instructor, y los estudiantes y los instructores almacenan los títulos de los cursos. Un método que necesita un curso lo recibe como argumento.
Person en person.gd: el constructor recibe person_name y email y los almacena. _to_string() devuelve NAME (EMAIL).
Course en course.gd:
- Propiedades:
title,max_capacity,instructor_name(empieza como"") y losArray[String]student_emailsycompleted_emails. - El constructor recibe el título y la capacidad, cuyo valor predeterminado es
30. - Una señal
course_full(title: String), emitida poradd_student()cuando se ocupa el último puesto libre. add_student(email) -> bool: devuelvefalsecuando el curso está lleno o el correo electrónico ya pertenece a un estudiante; de lo contrario, añade el correo electrónico y devuelvetrue.remove_student(email) -> bool: elimina a un estudiante actual; devuelvefalsesi el correo electrónico no pertenece a uno.mark_completed(email) -> bool: traslada a un estudiante actual acompleted_emails; devuelvefalsesi el correo electrónico no pertenece a un estudiante actual.assign_instructor(instructor) -> bool: almacena el nombre del instructor o devuelvefalsecuando el curso ya tiene uno._to_string()devuelveTITLE: N/CAPACITY students, M completed, instructor: NAME, connonecuando no hay instructor.
Student en student.gd extiende Person y conserva su constructor. Tiene dos Array[String] de títulos, enrolled y completed:
enroll(course: Course) -> bool: devuelvefalsecuando el curso ya está enenrolledocompleted, o cuandocourse.add_student()lo rechaza; de lo contrario, añade el título y devuelvetrue.unenroll(course: Course) -> bool: solo para un curso en el que está matriculado; elimina al estudiante del curso y el título deenrolled.complete_course(course: Course) -> bool: solo para un curso en el que está matriculado; llama acourse.mark_completed()y traslada el título deenrolledacompleted._to_string()devuelveStudent, el texto dePersony luego: N enrolled, M completed.
Instructor en instructor.gd extiende Person. Su constructor recibe person_name, email y expertise, y conserva un Array[String] course_titles:
assign_to_course(course: Course) -> bool: llama acourse.assign_instructor()con su nombre; si tiene éxito, añade el título y devuelvetrue._to_string()devuelveInstructor, el texto dePerson,, EXPERTISE:y los títulos unidos con,, ono courses.
El código proporcionado lee comandos con campos separados por | y se conecta a course_full para imprimir Course full: TITLE. Para esta entrada:
course Python 101|2
course Data Science
student Ana|ana@mail.com
student Ben|ben@mail.com
instructor Grace Hopper|grace@mail.com|Compilers
enroll ana@mail.com|Python 101
enroll ben@mail.com|Python 101
enroll ben@mail.com|Data Science
assign grace@mail.com|Python 101
reportla salida es:
Enroll Ana in Python 101: true
Course full: Python 101
Enroll Ben in Python 101: true
Enroll Ben in Data Science: true
Assign Grace Hopper to Python 101: true
Python 101: 2/2 students, 0 completed, instructor: Grace Hopper
Data Science: 1/30 students, 0 completed, instructor: none
Student Ana (ana@mail.com): 1 enrolled, 0 completed
Student Ben (ben@mail.com): 2 enrolled, 0 completed
Instructor Grace Hopper (grace@mail.com), Compilers: Python 101Tu código va en person.gd, course.gd, student.gd e instructor.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: déjalo tal como está
var courses := {}
var people := {}
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"course":
var course: Course
if f.size() > 1:
course = Course.new(f[0], int(f[1]))
else:
course = Course.new(f[0])
course.course_full.connect(func(title): print("Course full: ", title))
courses[f[0]] = course
"student":
people[f[1]] = Student.new(f[0], f[1])
"instructor":
people[f[1]] = Instructor.new(f[0], f[1], f[2])
"enroll":
var ok: bool = people[f[0]].enroll(courses[f[1]])
print("Enroll ", people[f[0]].person_name, " in ", f[1], ": ", ok)
"unenroll":
var ok: bool = people[f[0]].unenroll(courses[f[1]])
print("Unenroll ", people[f[0]].person_name, " from ", f[1], ": ", ok)
"complete":
var ok: bool = people[f[0]].complete_course(courses[f[1]])
print(people[f[0]].person_name, " completes ", f[1], ": ", ok)
"assign":
var ok: bool = people[f[0]].assign_to_course(courses[f[1]])
print("Assign ", people[f[0]].person_name, " to ", f[1], ": ", ok)
"report":
for title in courses:
print(courses[title])
for email in people:
print(people[email])
line = OS.read_string_from_stdin()
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 Strategy12Desafíos finales
Plataforma de aprendizaje en líneaSistema bancarioDesarrollo de personajes de videojuegosServicio de alquiler de vehículosPractica por tu cuenta: Compilador de GDScript online