E-öğrenme Platformu
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 62 / 65.
Görev
ZorBir e-öğrenme platformunun sınıflarını oluştur: kurslar, öğrenciler ve eğitmenler. Öğrenciler ve eğitmenler insan olduğundan bir üst sınıfı paylaşırlar.
Nesneler birbirlerini işaret etmemelidir: bir kurs, öğrencilerinin e-postalarını ve eğitmeninin adını saklar; öğrenciler ve eğitmenler ise kurs başlıklarını saklar. Bir kursa ihtiyaç duyan yöntem, kursu bağımsız değişken olarak alır.
person.gd içindeki Person: yapıcı person_name ve email değerlerini alıp saklar. _to_string(), NAME (EMAIL) döndürür.
course.gd içindeki Course:
- Özellikler:
title,max_capacity,instructor_name(başlangıç değeri"") veArray[String]türündekistudent_emailsilecompleted_emails. - Yapıcı, başlığı ve varsayılan değeri
30olan kapasiteyi alır. add_student()son boş yeri aldığında yayımlanancourse_full(title: String)sinyali.add_student(email) -> bool: kurs doluysa veya e-posta zaten bir öğrenciye aitsefalsedöndürür; aksi hâlde e-postayı ekler vetruedöndürür.remove_student(email) -> bool: mevcut bir öğrenciyi kaldırır; e-posta mevcut bir öğrenciye ait değilsefalsedöndürür.mark_completed(email) -> bool: mevcut bir öğrenciyicompleted_emailslistesine taşır; e-posta mevcut bir öğrenciye ait değilsefalsedöndürür.assign_instructor(instructor) -> bool: eğitmenin adını saklar veya kursta zaten bir eğitmen varsafalsedöndürür._to_string(), eğitmen yoksanonekullanarakTITLE: N/CAPACITY students, M completed, instructor: NAMEdöndürür.
student.gd içindeki Student, Person sınıfını genişletir ve yapıcısını korur. Başlıklardan oluşan iki Array[String] listesi vardır: enrolled ve completed:
enroll(course: Course) -> bool: kurs zatenenrolledveyacompletedlistesindeyse ya dacourse.add_student()işlemi reddedersefalsedöndürür; aksi hâlde başlığı ekler vetruedöndürür.unenroll(course: Course) -> bool: yalnızca kayıtlı olunan bir kurs için geçerlidir; öğrenciyi kurstan, başlığı daenrolledlistesinden kaldırır.complete_course(course: Course) -> bool: yalnızca kayıtlı olunan bir kurs için geçerlidir;course.mark_completed()çağrısını yapar ve başlığıenrolledlistesindencompletedlistesine taşır._to_string(),Studentmetnini, ardındanPersonmetnini ve sonra: N enrolled, M completedmetnini döndürür.
instructor.gd içindeki Instructor, Person sınıfını genişletir. Yapıcısı person_name, email ve expertise değerlerini alır ve Array[String] türündeki course_titles listesini tutar:
assign_to_course(course: Course) -> bool: adıylacourse.assign_instructor()çağrısını yapar; başarılı olursa başlığı ekler vetruedöndürür._to_string(),Instructormetnini,Personmetnini,, EXPERTISE:ifadesini ve,ile birleştirilmiş başlıkları ya dano coursesmetnini döndürür.
Sağlanan kod, alanları | ile ayrılmış komutları okur ve course_full sinyalini bağlayarak Course full: TITLE yazdırır. Bu girdi için:
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çıktı şöyledir:
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 101Kodunuzu person.gd, course.gd, student.gd ve instructor.gd dosyalarına yazın. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
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()
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt SistemiKendi başına pratik yap: Online GDScript derleyicisi