Ringkasan: Sistem Catatan Siswa
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 30 dari 65.
Tantangan
SedangBuat sistem kecil untuk mencatat data siswa menggunakan dua class.
Student di student.gd menyimpan datanya secara privat:
_init(id, new_name)menyimpan ID dalam variabel privat dan menetapkan nama melalui setterstudent_name.student_idhanya bisa dibaca dan mengembalikan ID.student_namememiliki setter: nama yang lebih pendek dari2karakter akan ditolak (nama lama tetap) danlast_errormenjadiName must be at least 2 characters. Nama yang valid akan mengosongkanlast_error.add_grade(course, grade)menyimpan nilai untuk course dalam Dictionary privat (nilai baru untuk course yang sama akan menggantikan nilai lama) dan mengembalikantrue. Nilai di bawah0atau di atas100tidak disimpan dan mengembalikanfalse.averageadalah property hasil perhitungan yang hanya bisa dibaca: rata-rata nilai dalam bentukfloat, atau0.0jika tidak ada nilai.course_count()mengembalikan jumlah course yang memiliki nilai.
StudentRegistry di student_registry.gd menyimpan siswa dalam Dictionary privat, dengan ID sebagai key:
add_student(student)mengembalikanfalsedan tidak mengubah apa pun jika ID sudah digunakan. Jika tidak, fungsi ini menyimpan siswa dan mengembalikantrue.remove_student(id)mengembalikan apakah seorang siswa berhasil dihapus.get_student(id)mengembalikan siswa, ataunull.top_student()mengembalikan siswa dengan rata-rata tertinggi (siswa yang ditambahkan lebih dahulu jika nilainya sama), ataunulljika registry kosong.get_ids()mengembalikan ID sesuai urutan siswa ditambahkan.
Kode yang disediakan membaca jumlah perintah, lalu menjalankan satu perintah untuk setiap baris: add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (mencoba menimpa student_id dan average, yang nilainya tidak boleh berubah), top dan list. Untuk input ini:
10
add 1001 Alice Smith
add 1002 Bob
grade 1001 Math 90
grade 1001 Art 85
grade 1002 Math 95
grade 1002 Art 120
rename 1002 B
show 1002
top
listhasilnya:
Added Alice Smith (1001)
Added Bob (1002)
Alice Smith: Math = 90
Alice Smith: Art = 85
Bob: Math = 95
Invalid grade: 120
Rejected: Name must be at least 2 characters
ID: 1002, Name: Bob, Courses: 1, Average: 95.00
Top: Bob (95.00)
ID: 1001, Name: Alice Smith, Courses: 2, Average: 87.50
ID: 1002, Name: Bob, Courses: 1, Average: 95.00Letakkan kodemu di student.gd dan student_registry.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 apa adanya
var registry := StudentRegistry.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ", true, 2)
var command := parts[0]
if command == "top":
var best := registry.top_student()
if best == null:
print("Top: none")
else:
print("Top: %s (%.2f)" % [best.student_name, best.average])
continue
if command == "list":
for listed_id in registry.get_ids():
print_student(registry.get_student(listed_id))
continue
var id := int(parts[1])
if command == "add":
var student := Student.new(id, parts[2])
if student.last_error != "":
print("Rejected: " + student.last_error)
elif registry.add_student(student):
print("Added %s (%d)" % [student.student_name, id])
else:
print("Duplicate ID: %d" % id)
continue
if command == "remove":
print(("Removed %d" if registry.remove_student(id) else "No student %d") % id)
continue
var student := registry.get_student(id)
if student == null:
print("No student %d" % id)
elif command == "grade":
var grade_parts := parts[2].split(" ")
if student.add_grade(grade_parts[0], int(grade_parts[1])):
print("%s: %s = %s" % [student.student_name, grade_parts[0], grade_parts[1]])
else:
print("Invalid grade: " + grade_parts[1])
elif command == "rename":
student.student_name = parts[2]
if student.last_error != "":
print("Rejected: " + student.last_error)
else:
print("Renamed to " + student.student_name)
elif command == "tamper":
# Mencoba menimpa property yang hanya bisa dibaca
student.student_id = 0
student.average = 100.0
print_student(student)
else:
print_student(student)
func print_student(student: Student) -> void:
print("ID: %d, Name: %s, Courses: %d, Average: %.2f" % [student.student_id, student.student_name, student.course_count(), student.average])
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 PenggunaLatihan sendiri: Compiler GDScript online