Menu
Coddy logo textTech

Proprietà calcolate

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 15 di 70.

I getter e i setter consentono di accedere ai valori memorizzati, ma a volte servono dati che non esistono come campi memorizzati. Devono essere calcolati a partire da altri attributi. Si chiamano proprietà calcolate.

Considera un rettangolo. Memorizzi la sua larghezza e la sua altezza, ma l’area non è memorizzata da nessuna parte: viene calcolata moltiplicando tra loro questi due valori. Invece di memorizzare dati ridondanti, crei un metodo che calcola e restituisce il risultato:

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle:new(width, height)
    local instance = {}
    setmetatable(instance, self)
    instance.width = width
    instance.height = height
    return instance
end

function Rectangle:getArea()
    return self.width * self.height
end

Il metodo :getArea() non restituisce un valore memorizzato. Calcola l'area da zero ogni volta che lo chiami. Questo approccio ha un vantaggio fondamentale: se la larghezza o l'altezza cambiano, l'area riflette automaticamente le nuove dimensioni senza che tu debba aggiornare nulla.

local box = Rectangle:new(5, 3)
print(box:getArea())  -- Output: 15

box.width = 10
print(box:getArea())  -- Output: 30

Le proprietà calcolate mantengono coerenti i tuoi oggetti. Invece di memorizzare valori che dipendono da altri campi (e rischiare che diventino obsoleti), li calcoli al momento del bisogno. Questo schema si applica a qualsiasi dato derivato: perimetri, medie, stringhe formattate o qualsiasi valore che può essere determinato a partire dagli attributi esistenti.

challenge icon

Sfida

Facile

Costruiamo una classe Box che calcola il proprio volume su richiesta! Invece di memorizzare il volume come campo, creerai una proprietà calcolata che lo ricava dalle dimensioni della scatola ogni volta che serve.

Organizzerai il codice in due file:

  • Box.lua: definisci la classe Box con il modello standard basato su prototipi. Ogni scatola memorizza tre dimensioni: width, height e depth. Includi:
    • Un costruttore :new(width, height, depth) che memorizza tutte e tre le dimensioni
    • Un metodo :getVolume() che calcola e restituisce il volume (width × height × depth)
    • Un metodo :getSurfaceArea() che calcola e restituisce l'area totale della superficie
  • main.lua: importa il modulo Box, crea un'istanza della scatola e mostra come le proprietà calcolate riflettano automaticamente le dimensioni attuali.

L'area della superficie di una scatola si calcola così: 2 × (width×height + height×depth + width×depth)

Riceverai tre input che rappresentano le dimensioni della scatola:

  1. Larghezza
  2. Altezza
  3. Profondità

Nel file principale, crea una scatola con le dimensioni indicate, quindi stampa due righe:

  1. Il volume usando :getVolume()
  2. L'area della superficie usando :getSurfaceArea()

Per esempio, se gli input sono 3, 4 e 5, l'output dovrebbe essere:

60
94

Il bello delle proprietà calcolate è che rimangono sempre precise. Se in seguito modificassi una delle dimensioni della scatola, chiamando di nuovo :getVolume() otterresti automaticamente il nuovo valore corretto: non servono aggiornamenti manuali!

Provalo tu

-- Carica il modulo Box
local Box = require('Box')

-- Leggi le dimensioni in input
local width = tonumber(io.read())
local height = tonumber(io.read())
local depth = tonumber(io.read())

-- TODO: Crea un'istanza di Box con le dimensioni indicate

-- TODO: Stampa il volume usando :getVolume()

-- TODO: Stampa l'area superficiale usando :getSurfaceArea()
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