Menu
CoddyTech

Nascondimento delle informazioni

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 28 di 65.

Nascondere le informazioni va un passo oltre le variabili private: il codice che usa una classe dipende solo da ciò che fanno i suoi metodi pubblici, mai da come la classe memorizza i propri dati. In questo modo puoi modificare la modalità di memorizzazione senza toccare quel codice.

# 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 chiama add(), count() e remove() e non vede mai il Dictionary. Se in seguito Inventory conserva invece un Array di slot, cambia solo inventory.gd.

Fai attenzione ai getter che restituiscono un Array o un Dictionary. GDScript restituisce questi valori per riferimento: chi chiama ottiene l'Array dell'oggetto stesso, non una copia, e può modificarlo senza passare per i metodi della classe:

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

Restituisci invece una copia. duplicate() crea un nuovo Array con gli stessi elementi, quindi le modifiche apportate a esso restano esterne all'oggetto:

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

Per un Dizionario o un Array che contiene altri Array, usa duplicate(true): copia anche gli Array e i Dizionari interni.

challenge icon

Sfida

Facile

Scrivi la classe Playlist in playlist.gd. Mantiene i titoli dei brani nell’Array privata _songs e altro codice usa solo questi metodi:

  • add(title) aggiunge il titolo e restituisce true. Se il titolo è già nella playlist, non modifica nulla e restituisce false.
  • remove(title) rimuove il titolo e restituisce true, oppure restituisce false se il titolo non è presente.
  • count() restituisce il numero di brani.
  • get_titles() restituisce una copia dei titoli, nell’ordine in cui sono stati aggiunti.

Il codice fornito legge il numero di comandi, poi un comando per riga (add Blue Sky o remove Blue Sky) e stampa il risultato. Alla fine prende l’Array da get_titles(), aggiunge Intruder e ne inverte l’ordine, poi stampa il numero di brani e i titoli. La tua playlist non deve essere influenzata da queste modifiche. Per i comandi add Blue Sky, add Rain e add Blue Sky stampa:

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

Il tuo codice va in playlist.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è
	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)
	# Codice che tenta di modificare la lista che riceve
	var titles := playlist.get_titles()
	titles.append("Intruder")
	titles.reverse()
	print("Songs: %d" % playlist.count())
	print(", ".join(playlist.get_titles()))
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online