Menu
Coddy logo textTech

Metodi setter

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

I metodi getter ti permettono di leggere i dati interni attraverso un punto di accesso controllato. I metodi setter (chiamati anche metodi mutator) fanno l'opposto. Forniscono un modo controllato per modificare lo stato interno.

Invece di assegnare direttamente car.speed = 50, chiami car:setSpeed(50):

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

A prima vista, sembra un lavoro in più per ottenere lo stesso risultato. Ma i setter diventano potenti quando devi aggiungere delle regole in seguito. Immagina di voler garantire che la velocità non diventi mai negativa né superi un valore massimo:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

Ora ogni modifica della velocità passa attraverso la tua logica di convalida. Qualsiasi codice che usa :setSpeed() beneficia automaticamente di questi controlli senza modifiche. Questo è il vero valore dei setter. Creano un unico punto in cui controllare come cambiano i dati, rendendo i tuoi oggetti più sicuri e più facili da mantenere.

challenge icon

Sfida

Facile

Costruiamo una classe Thermostat che usa metodi setter per controllare la temperatura in modo intelligente. Invece di consentire qualsiasi valore di temperatura, il termostato imporrà limiti ragionevoli, mantenendo la temperatura entro un intervallo confortevole.

Organizzerai il codice in due file:

  • Thermostat.lua: definisci la classe Thermostat usando il consueto schema prototipale. Ogni termostato dovrebbe tenere traccia della propria temperature attuale. Includi:
    • Un costruttore :new() che inizializza la temperatura a 20 (un valore predefinito confortevole)
    • Un getter :getTemperature() che restituisce la temperatura attuale
    • Un setter :setTemperature(newTemp) che aggiorna la temperatura, mantenendola però entro i limiti: minimo 10 e massimo 30
  • main.lua: richiedi il modulo Thermostat e crea un'istanza del termostato. Usa il setter per provare diverse modifiche della temperatura e osserva come vengono applicati i limiti.

Il metodo :setTemperature() dovrebbe applicare queste regole:

  • Se la nuova temperatura è inferiore a 10, impostala a 10
  • Se la nuova temperatura è superiore a 30, impostala a 30
  • Altrimenti, impostala al valore richiesto

Riceverai due input:

  1. Prima temperatura da impostare
  2. Seconda temperatura da impostare

Nel file principale, crea un termostato, quindi:

  1. Stampa la temperatura iniziale
  2. Imposta la temperatura al valore del primo input e stampa il risultato
  3. Imposta la temperatura al valore del secondo input e stampa il risultato

Stampa ogni temperatura su una riga separata (solo il numero).

Per esempio, se gli input sono 25 e 50, l'output dovrebbe essere:

20
25
30

Nota come il secondo tentativo di impostare 50 produce 30: il setter applica automaticamente il limite massimo!

Provalo tu

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

-- Leggi l'input
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: Crea un'istanza di termostato

-- TODO: Stampa la temperatura iniziale

-- TODO: Imposta la temperatura su temp1 e stampa il risultato

-- TODO: Imposta la temperatura su temp2 e stampa il risultato
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