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
endA 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
endOra 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.
Sfida
FacileCostruiamo 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 classeThermostatusando il consueto schema prototipale. Ogni termostato dovrebbe tenere traccia della propriatemperatureattuale. Includi:- Un costruttore
:new()che inizializza la temperatura a20(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: minimo10e massimo30
- Un costruttore
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 a10 - Se la nuova temperatura è superiore a
30, impostala a30 - Altrimenti, impostala al valore richiesto
Riceverai due input:
- Prima temperatura da impostare
- Seconda temperatura da impostare
Nel file principale, crea un termostato, quindi:
- Stampa la temperatura iniziale
- Imposta la temperatura al valore del primo input e stampa il risultato
- 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
30Nota 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
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