Piattaforma di e-learning
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 62 di 65.
Sfida
DifficileCrea le classi di una piattaforma di e-learning: corsi, studenti e docenti. Studenti e docenti sono entrambi persone, quindi condividono una classe genitore.
Gli oggetti non devono puntarsi a vicenda: un corso memorizza le email dei suoi studenti e il nome del suo docente, mentre studenti e docenti memorizzano i titoli dei corsi. Un metodo che ha bisogno di un corso lo riceve come argomento.
Person in person.gd: il costruttore accetta person_name e email e li memorizza. _to_string() restituisce NAME (EMAIL).
Course in course.gd:
- Proprietà:
title,max_capacity,instructor_name(inizia come"") e gliArray[String]student_emailsecompleted_emails. - Il costruttore accetta il titolo e la capienza, che per impostazione predefinita è
30. - Un segnale
course_full(title: String), emesso daadd_student()quando viene occupato l'ultimo posto libero. add_student(email) -> bool: restituiscefalsequando il corso è al completo o l'email è già quella di uno studente; altrimenti aggiunge l'email e restituiscetrue.remove_student(email) -> bool: rimuove uno studente attuale; restituiscefalsese l'email non corrisponde a uno studente.mark_completed(email) -> bool: sposta uno studente attuale incompleted_emails; restituiscefalsese l'email non corrisponde a uno studente attuale.assign_instructor(instructor) -> bool: memorizza il nome del docente oppure restituiscefalsese il corso ne ha già uno._to_string()restituisceTITLE: N/CAPACITY students, M completed, instructor: NAME, connonequando non c'è alcun docente.
Student in student.gd estende Person e mantiene il suo costruttore. Ha due Array[String] di titoli, enrolled e completed:
enroll(course: Course) -> bool: restituiscefalsequando il corso è già inenrolledocompleted, oppure quandocourse.add_student()rifiuta; altrimenti aggiunge il titolo e restituiscetrue.unenroll(course: Course) -> bool: solo per un corso a cui è iscritto; rimuove lo studente dal corso e il titolo daenrolled.complete_course(course: Course) -> bool: solo per un corso a cui è iscritto; chiamacourse.mark_completed()e sposta il titolo daenrolledacompleted._to_string()restituisceStudent, il testo diPerson, poi: N enrolled, M completed.
Instructor in instructor.gd estende Person. Il suo costruttore accetta person_name, email e expertise, e mantiene un Array[String] course_titles:
assign_to_course(course: Course) -> bool: chiamacourse.assign_instructor()con il proprio nome; se l'operazione riesce, aggiunge il titolo e restituiscetrue._to_string()restituisceInstructor, il testo diPerson,, EXPERTISE:e i titoli uniti con,, oppureno courses.
Il codice fornito legge i comandi con i campi separati da | e si collega a course_full per stampare Course full: TITLE. Per questo input:
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
reportl'output è:
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 101Il tuo codice va inserito in person.gd, course.gd, student.gd e instructor.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
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()
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern Strategy12Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo di un personaggio di giocoServizio di noleggio veicoliEsercitati da solo: Compilatore GDScript online