Menu
CoddyTech

Bilgi Gizleme

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 65.

Bilgi gizleme, özel değişkenlerden bir adım daha ileri gider: bir sınıfı kullanan kod, yalnızca sınıfın genel yöntemlerinin ne yaptığına bağlıdır; sınıfın verilerini nasıl sakladığına asla bağlı değildir. Böylece, bu koda dokunmadan depolama yöntemini değiştirebilirsin.

# 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, add(), count() ve remove() işlevlerini çağırır ve Dictionary'yi hiç görmez. Inventory daha sonra bunun yerine yuvalardan oluşan bir Array tutarsa yalnızca inventory.gd değişir.

Dizi veya Sözlük döndüren alıcı yöntemlere dikkat edin. GDScript bu değerleri başvuru yoluyla verir: çağıran, nesnenin kendi Dizisini alır; bir kopyasını değil ve sınıfın yöntemlerini kullanmadan onu değiştirebilir:

# 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"]

Bunun yerine bir kopyasını döndür. duplicate(), aynı öğelere sahip yeni bir Array oluşturur; böylece yapılan değişiklikler nesnenin dışında kalır:

func get_quests() -> Array[String]:
	return _quests.duplicate()

Bir Dictionary veya başka Array’ler içeren bir Array için duplicate(true) kullan: iç içe geçmiş Array’leri ve Dictionary’leri de kopyalar.

challenge icon

Görev

Kolay

Playlist sınıfını playlist.gd dosyasında yazın. Şarkı başlıklarını özel Array _songs içinde tutar ve diğer kod yalnızca şu yöntemleri kullanır:

  • add(title) başlığı ekler ve true döndürür. Başlık çalma listesinde zaten varsa hiçbir şeyi değiştirmez ve false döndürür.
  • remove(title) başlığı kaldırır ve true döndürür; başlık listede yoksa false döndürür.
  • count() şarkı sayısını döndürür.
  • get_titles() eklenme sırasına göre başlıkların bir kopyasını döndürür.

Sağlanan kod, komut sayısını ve ardından her satırda bir komutu (add Blue Sky veya remove Blue Sky) okur ve sonucu yazdırır. Sonunda get_titles() yönteminden Array'i alır, Intruder ekler ve sırasını tersine çevirir; ardından şarkı sayısını ve başlıkları yazdırır. Çalma listeniz bu değişikliklerden etkilenmemelidir. add Blue Sky, add Rain ve add Blue Sky komutları için şunları yazdırır:

Added: Blue Sky
Added: Rain
Already in the playlist: Blue Sky
Songs: 2
Blue Sky, Rain

Kodunuzu playlist.gd dosyasına yazın. main.gd, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
	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)
	# Geri aldığı listeyi değiştirmeye çalışan kod
	var titles := playlist.get_titles()
	titles.append("Intruder")
	titles.reverse()
	print("Songs: %d" % playlist.count())
	print(", ".join(playlist.get_titles()))
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi