Convenzioni di denominazione
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 43 di 70.
In Lua, tutti i campi delle tabelle sono accessibili pubblicamente per impostazione predefinita. Chiunque può leggere o modificare direttamente self.health. Sebbene Lua non imponga la privacy, i programmatori usano convenzioni di denominazione per comunicare le proprie intenzioni: segnalando quali campi dovrebbero essere trattati come dettagli interni dell’implementazione.
La convenzione standard consiste nel prefissare i campi privati con un trattino basso:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Pubblico: si può accedere direttamente
_health = 100, -- Privato: usa invece i metodi
_score = 0 -- Privato: monitoraggio interno
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endIl trattino basso non cambia il funzionamento di Lua: player._health è comunque tecnicamente accessibile. Tuttavia, serve da chiaro avvertimento per gli altri programmatori (e per te stesso in futuro): "Questo campo dovrebbe essere privato. Accedici invece tramite i metodi."
Questa convenzione è importante perché separa l’interfaccia (ciò che gli altri dovrebbero usare) dall’implementazione (come funziona internamente). Se in seguito devi aggiungere una convalida o modificare il modo in cui viene memorizzata la salute, modifichi solo i metodi: il codice che usa :getHealth() continua a funzionare senza modifiche.
Sfida
FacileCreiamo una classe BankAccount che segnali correttamente quali campi sono destinati a essere privati usando la convenzione di denominazione con il trattino basso!
Organizzerai il codice in due file:
BankAccount.lua: crea una classe che gestisce le informazioni del conto. Il costruttore:new(ownerName, initialBalance)dovrebbe memorizzare il nome del titolare come campo pubblico (owner) e il saldo come campo privato (_balance). Includi tre metodi::getBalance(): restituisce il saldo corrente:deposit(amount): aggiunge l'importo a_balance:getOwner(): restituisce il nome del titolare
main.lua: richiedi il modulo BankAccount, leggi dall'input il nome del titolare, il saldo iniziale e l'importo del deposito. Crea un conto, effettua un deposito, quindi stampa il nome del titolare e il saldo finale.
Riceverai tre input:
- Il nome del titolare
- Il saldo iniziale (un numero)
- L'importo del deposito (un numero)
L'output dovrebbe essere composto da due righe che mostrano il titolare e il saldo finale dopo il deposito:
Owner: {ownerName}
Balance: {finalBalance}Ad esempio, se gli input sono Maria, 500 e 150, l'output dovrebbe essere:
Owner: Maria
Balance: 650Ricorda: il prefisso con il trattino basso in _balance segnala agli altri programmatori che questo campo dovrebbe essere accessibile tramite metodi come :getBalance() e :deposit(), non direttamente. Il campo owner senza trattino basso indica che è possibile accedervi pubblicamente.
Provalo tu
-- Importa il modulo BankAccount
local BankAccount = require('BankAccount')
-- Leggi i dati di input
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO: Crea un nuovo BankAccount con ownerName e initialBalance
-- TODO: Effettua un deposito usando depositAmount
-- TODO: Stampa il proprietario e il saldo finale nel formato richiesto
-- Formato:
-- Owner: {ownerName}
-- Balance: {finalBalance}
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
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle formeEsercitati da solo: Compilatore Lua online