Platforma e-learningowa
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 62 z 65.
Wyzwanie
TrudnyZbuduj klasy platformy e-learningowej: kursy, uczniów i instruktorów. Uczniowie i instruktorzy to osoby, dlatego mają wspólną klasę nadrzędną.
Obiekty nie mogą wskazywać na siebie nawzajem: kurs przechowuje adresy e-mail swoich uczniów i imię i nazwisko instruktora, a uczniowie i instruktorzy przechowują tytuły kursów. Metoda, która potrzebuje kursu, otrzymuje go jako argument.
Person w person.gd: konstruktor przyjmuje person_name i email oraz je przechowuje. _to_string() zwraca NAME (EMAIL).
Course w course.gd:
- Właściwości:
title,max_capacity,instructor_name(początkowo"") oraz tabliceArray[String]student_emailsicompleted_emails. - Konstruktor przyjmuje tytuł i pojemność, która domyślnie wynosi
30. - Sygnał
course_full(title: String), emitowany przezadd_student(), gdy zajęte zostaje ostatnie wolne miejsce. add_student(email) -> bool: zwracafalse, gdy kurs jest pełny lub dany adres e-mail należy już do ucznia; w przeciwnym razie dodaje adres e-mail i zwracatrue.remove_student(email) -> bool: usuwa obecnego ucznia; zwracafalse, jeśli dany adres e-mail do niego nie należy.mark_completed(email) -> bool: przenosi obecnego ucznia docompleted_emails; zwracafalse, jeśli dany adres e-mail nie należy do obecnego ucznia.assign_instructor(instructor) -> bool: zapisuje imię i nazwisko instruktora lub zwracafalse, jeśli kurs ma już instruktora._to_string()zwracaTITLE: N/CAPACITY students, M completed, instructor: NAME, a gdy nie ma instruktora, używanone.
Student w student.gd dziedziczy po Person i zachowuje swój konstruktor. Ma dwie tablice tytułów typu Array[String]: enrolled i completed:
enroll(course: Course) -> bool: zwracafalse, gdy kurs znajduje się już wenrolledlubcompletedalbo gdycourse.add_student()odmówi; w przeciwnym razie dodaje tytuł i zwracatrue.unenroll(course: Course) -> bool: działa tylko dla zapisanego kursu; usuwa ucznia z kursu i tytuł zenrolled.complete_course(course: Course) -> bool: działa tylko dla zapisanego kursu; wywołujecourse.mark_completed()i przenosi tytuł zenrolleddocompleted._to_string()zwracaStudent, tekst zPerson, a następnie: N enrolled, M completed.
Instructor w instructor.gd dziedziczy po Person. Jego konstruktor przyjmuje person_name, email i expertise, a klasa przechowuje tablicę typu Array[String] course_titles:
assign_to_course(course: Course) -> bool: wywołujecourse.assign_instructor(), przekazując swoje imię i nazwisko; w przypadku powodzenia dodaje tytuł i zwracatrue._to_string()zwracaInstructor, tekst zPerson,, EXPERTISE:oraz połączone tytuły z użyciem,albono courses.
Dostarczony kod odczytuje polecenia, których pola są rozdzielone znakiem |, i łączy się z sygnałem course_full, aby wypisać Course full: TITLE. Dla tych danych wejściowych:
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
reportwynik to:
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 101Twój kod umieść w plikach person.gd, course.gd, student.gd i instructor.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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()
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy12Wyzwania końcowe
Platforma e-learningowaSystem bankowyTworzenie postaci do gryWypożyczalnia pojazdówPoćwicz samodzielnie: Kompilator GDScript online