Plataforma de Ensino Online
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 62 de 65.
Desafio
DifícilCrie as classes de uma plataforma de e-learning: cursos, estudantes e instrutores. Estudantes e instrutores são pessoas, portanto compartilham uma classe pai.
Os objetos não devem apontar uns para os outros: um curso armazena os e-mails de seus estudantes e o nome de seu instrutor, e estudantes e instrutores armazenam os títulos dos cursos. Um método que precisa de um curso o recebe como argumento.
Person em person.gd: o construtor recebe person_name e email e os armazena. _to_string() retorna NAME (EMAIL).
Course em course.gd:
- Propriedades:
title,max_capacity,instructor_name(começa como"") e osArray[String]student_emailsecompleted_emails. - O construtor recebe o título e a capacidade, que tem como padrão
30. - Um sinal
course_full(title: String), emitido poradd_student()quando ocupa a última vaga disponível. add_student(email) -> bool: retornafalsequando o curso está cheio ou o e-mail já pertence a um estudante; caso contrário, adiciona o e-mail e retornatrue.remove_student(email) -> bool: remove um estudante atual; retornafalsese o e-mail não pertencer a um.mark_completed(email) -> bool: move um estudante atual paracompleted_emails; retornafalsese o e-mail não pertencer a um estudante atual.assign_instructor(instructor) -> bool: armazena o nome do instrutor ou retornafalsequando o curso já tem um._to_string()retornaTITLE: N/CAPACITY students, M completed, instructor: NAME, usandononequando não há instrutor.
Student em student.gd estende Person e mantém seu construtor. Tem dois Array[String] de títulos, enrolled e completed:
enroll(course: Course) -> bool: retornafalsequando o curso já está emenrolledoucompleted, ou quandocourse.add_student()recusa; caso contrário, adiciona o título e retornatrue.unenroll(course: Course) -> bool: apenas para um curso em que esteja matriculado; remove o estudante do curso e o título deenrolled.complete_course(course: Course) -> bool: apenas para um curso em que esteja matriculado; chamacourse.mark_completed()e move o título deenrolledparacompleted._to_string()retornaStudent, o texto dePersone, em seguida,: N enrolled, M completed.
Instructor em instructor.gd estende Person. Seu construtor recebe person_name, email e expertise, e ele mantém um Array[String] course_titles:
assign_to_course(course: Course) -> bool: chamacourse.assign_instructor()com seu nome; em caso de sucesso, adiciona o título e retornatrue._to_string()retornaInstructor, o texto dePerson,, EXPERTISE:e os títulos unidos com,, ouno courses.
O código fornecido lê comandos com campos separados por | e 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
reporta saída é:
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 101Seu código deve ficar em person.gd, course.gd, student.gd e instructor.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
extends Node
func _ready():
# Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação orientada a objetos
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy12Desafios Finais
Plataforma de Ensino OnlineSistema BancárioDesenvolvimento de Personagens de JogosServiço de Aluguel de VeículosPratique por conta própria: Compilador de GDScript online