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 truemain.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.
Sfida
FacileScrivi 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 restituiscetrue. Se il titolo è già nella playlist, non modifica nulla e restituiscefalse.remove(title)rimuove il titolo e restituiscetrue, oppure restituiscefalsese 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, RainIl 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()))
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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online