E-Learning-Plattform
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 62 von 65.
Aufgabe
SchwerErstelle die Klassen einer E-Learning-Plattform: Kurse, Studierende und Dozenten. Studierende und Dozenten sind beide Personen und haben daher eine gemeinsame übergeordnete Klasse.
Die Objekte dürfen nicht aufeinander verweisen: Ein Kurs speichert die E-Mail-Adressen seiner Studierenden und den Namen seines Dozenten, und Studierende sowie Dozenten speichern Kurstitel. Eine Methode, die einen Kurs benötigt, erhält ihn als Argument.
Person in person.gd: Der Konstruktor nimmt person_name und email entgegen und speichert sie. _to_string() gibt NAME (EMAIL) zurück.
Course in course.gd:
- Eigenschaften:
title,max_capacity,instructor_name(beginnt mit"") sowie dieArray[String]-Arraysstudent_emailsundcompleted_emails. - Der Konstruktor nimmt den Titel und die Kapazität entgegen, die standardmäßig
30beträgt. - Ein Signal
course_full(title: String), das vonadd_student()ausgelöst wird, wenn der letzte freie Platz belegt wird. add_student(email) -> bool: Gibtfalsezurück, wenn der Kurs voll ist oder die E-Mail-Adresse bereits einem Studierenden zugeordnet ist; andernfalls wird die E-Mail-Adresse hinzugefügt undtruezurückgegeben.remove_student(email) -> bool: Entfernt einen aktuellen Studierenden; gibtfalsezurück, wenn die E-Mail-Adresse nicht zu einem Studierenden gehört.mark_completed(email) -> bool: Verschiebt einen aktuellen Studierenden nachcompleted_emails; gibtfalsezurück, wenn die E-Mail-Adresse nicht zu einem aktuellen Studierenden gehört.assign_instructor(instructor) -> bool: Speichert den Namen des Dozenten oder gibtfalsezurück, wenn der Kurs bereits einen Dozenten hat._to_string()gibtTITLE: N/CAPACITY students, M completed, instructor: NAMEzurück; wenn es keinen Dozenten gibt, wirdnoneverwendet.
Student in student.gd erweitert Person und behält seinen Konstruktor bei. Die Klasse hat zwei Array[String]-Arrays mit Titeln: enrolled und completed:
enroll(course: Course) -> bool: Gibtfalsezurück, wenn sich der Kurs bereits inenrolledodercompletedbefindet oder wenncourse.add_student()die Aufnahme ablehnt; andernfalls wird der Titel hinzugefügt undtruezurückgegeben.unenroll(course: Course) -> bool: Nur für einen belegten Kurs; entfernt den Studierenden aus dem Kurs und den Titel ausenrolled.complete_course(course: Course) -> bool: Nur für einen belegten Kurs; ruftcourse.mark_completed()auf und verschiebt den Titel vonenrollednachcompleted._to_string()gibtStudent, den Text vonPersonund anschließend: N enrolled, M completedzurück.
Instructor in instructor.gd erweitert Person. Der Konstruktor nimmt person_name, email und expertise entgegen. Die Klasse enthält außerdem ein Array[String]-Array course_titles:
assign_to_course(course: Course) -> bool: Ruftcourse.assign_instructor()mit dem Namen des Dozenten auf; bei Erfolg wird der Titel hinzugefügt undtruezurückgegeben._to_string()gibtInstructor, den Text vonPerson,, EXPERTISE:und die mit,verbundenen Titel oderno courseszurück.
Der bereitgestellte Code liest Befehle mit durch | getrennten Feldern ein und verbindet das Signal course_full, um Course full: TITLE auszugeben. Für diese Eingabe:
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
reportlautet die Ausgabe:
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 101Dein Code gehört in person.gd, course.gd, student.gd und instructor.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Bereitgestellter Eingabe-/Ausgabecode: unverändert lassen
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()
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler