Métodos Setter
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 14 de 70.
Los métodos getter le permiten leer datos internos a través de un punto de acceso controlado. Los métodos setter (también llamados métodos mutadores) hacen lo contrario: proporcionan una forma controlada de modificar el estado interno.
En lugar de asignar directamente car.speed = 50, llamas a 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 primera vista, esto parece un trabajo extra para obtener el mismo resultado. Pero los setters se vuelven poderosos cuando necesitas añadir reglas más adelante. Imagina que quieres asegurarte de que la velocidad nunca sea negativa o exceda un máximo:
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
endAhora cada cambio de velocidad pasa por tu lógica de validación. Cualquier código que use :setSpeed() se beneficia automáticamente de estas comprobaciones sin modificaciones. Este es el valor real de los setters: crean un punto único donde controlas cómo cambian los datos, haciendo que tus objetos sean más seguros y fáciles de mantener.
Desafío
FácilVamos a construir una clase Thermostat que utilice métodos setter para controlar la temperatura de manera inteligente. En lugar de permitir cualquier valor de temperatura, tu termostato impondrá límites razonables, manteniendo la temperatura dentro de un rango cómodo.
Organizarás tu código en dos archivos:
Thermostat.lua: Define tu claseThermostatcon el patrón de prototipo estándar. Cada termostato debe rastrear sutemperatureactual. Incluye:- Un constructor
:new()que inicializa la temperatura en20(un valor predeterminado cómodo) - Un getter
:getTemperature()que devuelve la temperatura actual - Un setter
:setTemperature(newTemp)que actualiza la temperatura, pero la mantiene dentro de los límites: mínimo10y máximo30
- Un constructor
main.lua: Requiere tu módulo Thermostat y crea una instancia de termostato. Usa el setter para intentar diferentes cambios de temperatura y observa cómo se aplican los límites.
Tu método :setTemperature() debe aplicar estas reglas:
- Si la nueva temperatura es inferior a
10, establécela en10 - Si la nueva temperatura es superior a
30, establécela en30 - De lo contrario, establécela en el valor solicitado
Recibirás dos entradas:
- Primera temperatura a establecer
- Segunda temperatura a establecer
En tu archivo principal, crea un termostato, luego:
- Imprime la temperatura inicial
- Establece la temperatura al primer valor de entrada e imprime el resultado
- Establece la temperatura al segundo valor de entrada e imprime el resultado
Imprime cada temperatura en su propia línea (solo el número).
Por ejemplo, si las entradas son 25 y 50, la salida debería ser:
20
25
30¡Observa cómo el segundo intento de establecer 50 resulta en 30; el setter aplica el límite máximo automáticamente!
Hoja de referencia
Los métodos setter proporcionan una forma controlada de modificar el estado interno, lo que le permite agregar reglas de validación y restricciones.
Sintaxis básica de un método setter:
function Car:setSpeed(newSpeed)
self.speed = newSpeed
endLos setters con validación imponen reglas cuando los datos cambian:
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
endLa combinación de getters y setters crea un acceso controlado a las propiedades del objeto:
local Car = {}
Car.__index = Car
function Car:new()
local instance = {}
setmetatable(instance, self)
instance.speed = 0
return instance
end
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
end
function Car:getSpeed()
return self.speed
endLos setters crean un único punto de control para la modificación de datos, lo que hace que los objetos sean más seguros y fáciles de mantener. Cualquier código que utilice el setter se beneficia automáticamente de la lógica de validación sin necesidad de modificaciones.
Pruébalo tú mismo
-- Requerir el módulo Thermostat
local Thermostat = require('Thermostat')
-- Leer la entrada
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: Crear una instancia del termostato
-- TODO: Imprimir la temperatura inicial
-- TODO: Establecer la temperatura a temp1 e imprimir el resultado
-- TODO: Establecer la temperatura a temp2 e imprimir el resultado
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formas