Penyembunyian Informasi
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 28 dari 65.
Penyembunyian informasi melangkah lebih jauh daripada variabel privat: kode yang menggunakan class hanya bergantung pada fungsi method publiknya, bukan pada cara class menyimpan datanya. Jadi, kamu bisa mengubah penyimpanannya tanpa menyentuh kode tersebut.
# inventory.gd
class_name Inventory
extends RefCounted
var _counts: Dictionary = {}
func add(item: String, amount: int) -> void:
_counts[item] = _counts.get(item, 0) + amount
func count(item: String) -> int:
return _counts.get(item, 0)
func remove(item: String, amount: int) -> bool:
if count(item) < amount:
return false
_counts[item] -= amount
return truemain.gd memanggil add(), count(), dan remove(), serta tidak pernah melihat Dictionary. Jika Inventory nantinya menyimpan Array slot, hanya inventory.gd yang berubah.
Berhati-hatilah dengan getter yang mengembalikan Array atau Dictionary. GDScript memberikan nilai-nilai ini secara referensi: pemanggil mendapatkan Array milik object itu sendiri, bukan salinannya, dan dapat mengubahnya tanpa menggunakan method milik class:
# quest_log.gd
var _quests: Array[String] = ["Find the key"]
func get_quests() -> Array[String]:
return _quests# main.gd
var journal := QuestLog.new()
var quests := journal.get_quests()
quests.append("Skip the boss")
print(journal.get_quests()) # ["Find the key", "Skip the boss"]Kembalikan salinannya saja. duplicate() membuat Array baru dengan elemen yang sama, jadi perubahan padanya tidak memengaruhi object:
func get_quests() -> Array[String]:
return _quests.duplicate()Untuk dictionary, atau array yang menyimpan array lain, gunakan duplicate(true): fungsi ini juga menyalin array dan dictionary bagian dalam.
Tantangan
MudahTulis class Playlist di playlist.gd. Class ini menyimpan judul lagu di array privat _songs, dan kode lain hanya menggunakan method berikut:
add(title)menambahkan judul dan mengembalikantrue. Jika judul sudah ada di playlist, method ini tidak mengubah apa pun dan mengembalikanfalse.remove(title)menghapus judul dan mengembalikantrue, atau mengembalikanfalsejika judul itu tidak ada.count()mengembalikan jumlah lagu.get_titles()mengembalikan salinan judul, sesuai urutan penambahannya.
Kode yang disediakan membaca jumlah perintah, lalu satu perintah per baris (add Blue Sky atau remove Blue Sky) dan mencetak hasilnya. Pada akhirnya, kode mengambil array dari get_titles(), menambahkan Intruder dan membalik urutannya, lalu mencetak jumlah lagu dan judulnya. Playlist-mu tidak boleh terpengaruh oleh perubahan tersebut. Untuk perintah add Blue Sky, add Rain, dan add Blue Sky, kode mencetak:
Added: Blue Sky
Added: Rain
Already in the playlist: Blue Sky
Songs: 2
Blue Sky, RainTulis kodemu di playlist.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 playlist := Playlist.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ", true, 1)
var title := parts[1]
if parts[0] == "add":
if playlist.add(title):
print("Added: " + title)
else:
print("Already in the playlist: " + title)
elif playlist.remove(title):
print("Removed: " + title)
else:
print("Not found: " + title)
# Kode yang mencoba mengubah list yang diterimanya kembali
var titles := playlist.get_titles()
titles.append("Intruder")
titles.reverse()
print("Songs: %d" % playlist.count())
print(", ".join(playlist.get_titles()))
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
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