Platform E-learning
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 62 dari 65.
Tantangan
SulitBuat class untuk platform e-learning: kursus, siswa, dan instruktur. Siswa dan instruktur sama-sama merupakan orang, jadi keduanya berbagi class induk.
object tidak boleh saling menunjuk: kursus menyimpan email siswanya dan nama instrukturnya, sementara siswa dan instruktur menyimpan judul kursus. Method yang memerlukan kursus menerima kursus tersebut sebagai argumen.
Person di person.gd: konstruktornya menerima person_name dan email, lalu menyimpannya. _to_string() mengembalikan NAME (EMAIL).
Course di course.gd:
- Property:
title,max_capacity,instructor_name(dimulai dengan""), sertaArray[String]student_emailsdancompleted_emails. - Konstruktor menerima judul dan kapasitas, dengan nilai default
30. - Sebuah signal
course_full(title: String), yang dipancarkan olehadd_student()saat kursus menerima siswa terakhir yang mengisi kursi kosong. add_student(email) -> bool: mengembalikanfalsejika kursus penuh atau email tersebut sudah menjadi siswa; jika tidak, menambahkan email dan mengembalikantrue.remove_student(email) -> bool: menghapus siswa yang terdaftar saat ini, mengembalikanfalsejika email tersebut bukan milik siswa yang terdaftar.mark_completed(email) -> bool: memindahkan siswa yang terdaftar saat ini kecompleted_emails, mengembalikanfalsejika email tersebut bukan milik siswa yang terdaftar.assign_instructor(instructor) -> bool: menyimpan nama instruktur, atau mengembalikanfalsejika kursus sudah memiliki instruktur._to_string()mengembalikanTITLE: N/CAPACITY students, M completed, instructor: NAME, dengannonejika tidak ada instruktur.
Student di student.gd mewarisi Person dan mempertahankan konstruktornya. Class ini memiliki dua Array[String] berisi judul, yaitu enrolled dan completed:
enroll(course: Course) -> bool: mengembalikanfalsejika kursus sudah ada dienrolledataucompleted, atau jikacourse.add_student()menolak; jika tidak, menambahkan judul dan mengembalikantrue.unenroll(course: Course) -> bool: hanya untuk kursus yang sudah diikuti; menghapus siswa dari kursus dan judul darienrolled.complete_course(course: Course) -> bool: hanya untuk kursus yang sudah diikuti; memanggilcourse.mark_completed()dan memindahkan judul darienrolledkecompleted._to_string()mengembalikanStudent, teks dariPerson, lalu: N enrolled, M completed.
Instructor di instructor.gd mewarisi Person. Konstruktor class ini menerima person_name, email, dan expertise, serta class ini menyimpan Array[String] course_titles:
assign_to_course(course: Course) -> bool: memanggilcourse.assign_instructor()dengan namanya; jika berhasil, menambahkan judul dan mengembalikantrue._to_string()mengembalikanInstructor, teks dariPerson,, EXPERTISE:, lalu judul-judul yang digabungkan dengan,, atauno courses.
Kode yang disediakan membaca perintah dengan field yang dipisahkan oleh | dan menghubungkan signal ke course_full untuk mencetak Course full: TITLE. Untuk input ini:
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
reportoutput-nya adalah:
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 101Tulis kodemu di person.gd, course.gd, student.gd, dan instructor.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan tetap seperti semula
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()
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan Pengguna3Pewarisan
Pewarisan DasarKata Kunci superPenimpaan MethodRantai PewarisanPemeriksaan Tipe dengan isUlasan: Hierarki Karyawan12Tantangan Akhir
Platform E-learningSistem PerbankanPengembangan Karakter GameLayanan Penyewaan KendaraanLatihan sendiri: Compiler GDScript online