Menu
CoddyTech

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 true

main.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.

challenge icon

Tantangan

Mudah

Tulis 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 mengembalikan true. Jika judul sudah ada di playlist, method ini tidak mengubah apa pun dan mengembalikan false.
  • remove(title) menghapus judul dan mengembalikan true, atau mengembalikan false jika 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, Rain

Tulis 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()))
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online