Платформа электронного обучения
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 62 из 65.
Задание
СложноСоздай классы для платформы электронного обучения: курсов, студентов и преподавателей. Студенты и преподаватели — люди, поэтому у них есть общий родительский класс.
Объекты не должны ссылаться друг на друга: курс хранит адреса электронной почты своих студентов и имя своего преподавателя, а студенты и преподаватели хранят названия курсов. Метод, которому нужен курс, получает его в качестве аргумента.
Person в person.gd: конструктор принимает person_name и email и сохраняет их. _to_string() возвращает NAME (EMAIL).
Course в course.gd:
- Свойства:
title,max_capacity,instructor_name(изначально равно""), а также массивыArray[String]student_emailsиcompleted_emails. - Конструктор принимает название курса и вместимость, значение по умолчанию —
30. - Сигнал
course_full(title: String), который испускается методомadd_student(), когда занято последнее свободное место. add_student(email) -> bool: возвращаетfalse, если курс заполнен или этот адрес электронной почты уже принадлежит студенту курса; иначе добавляет адрес электронной почты и возвращаетtrue.remove_student(email) -> bool: удаляет текущего студента; возвращаетfalse, если такого адреса электронной почты нет.mark_completed(email) -> bool: перемещает текущего студента вcompleted_emails; возвращаетfalse, если адрес электронной почты не принадлежит текущему студенту.assign_instructor(instructor) -> bool: сохраняет имя преподавателя или возвращаетfalse, если у курса уже есть преподаватель._to_string()возвращаетTITLE: N/CAPACITY students, M completed, instructor: NAME, а если преподавателя нет —none.
Student в student.gd наследуется от Person и сохраняет его конструктор. У него есть два массива названий типа Array[String]: enrolled и completed:
enroll(course: Course) -> bool: возвращаетfalse, если курс уже есть вenrolledилиcompleted, либо еслиcourse.add_student()отказывает; иначе добавляет название курса и возвращаетtrue.unenroll(course: Course) -> bool: действует только для записанного курса; удаляет студента из курса и название изenrolled.complete_course(course: Course) -> bool: действует только для записанного курса; вызываетcourse.mark_completed()и перемещает название изenrolledвcompleted._to_string()возвращаетStudent, текстPerson, затем: N enrolled, M completed.
Instructor в instructor.gd наследуется от Person. Его конструктор принимает person_name, email и expertise; он хранит массив Array[String] course_titles:
assign_to_course(course: Course) -> bool: вызываетcourse.assign_instructor(), передавая своё имя; в случае успеха добавляет название курса и возвращаетtrue._to_string()возвращаетInstructor, текстPerson,, EXPERTISE:и названия курсов, соединённые с помощью,, либоno courses.
Предоставленный код считывает команды с полями, разделёнными символом |, и подключается к сигналу course_full, чтобы вывести Course full: TITLE. Для следующих входных данных:
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
reportвывод будет таким:
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 101Твой код размести в файлах person.gd, course.gd, student.gd и instructor.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
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()
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»12Итоговые задания
Платформа электронного обученияБанковская системаРазработка игрового персонажаСервис аренды автомобилейПотренируйтесь самостоятельно: Онлайн-компилятор GDScript