Menu
Coddy logo textTech

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
end

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

challenge icon

Sfida

Facile

Creiamo 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:

  1. Il nome del titolare
  2. Il saldo iniziale (un numero)
  3. 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: 650

Ricorda: 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}
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 Lua online