Métodos Setter
Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 14 de 70.
Los métodos Getter te permiten leer datos internos mediante 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 trabajo adicional para obtener el mismo resultado. Pero los setters se vuelven potentes cuando necesitas añadir reglas más adelante. Imagina que quieres asegurarte de que la velocidad nunca sea negativa ni supere 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 verdadero valor de los setters. Crean un único punto desde el que controlas cómo cambian los datos, lo que hace que tus objetos sean más seguros y fáciles de mantener.
Desafío
FácilConstruyamos una clase Thermostat que use métodos setter para controlar la temperatura de forma inteligente. En lugar de permitir cualquier valor de temperatura, tu termostato impondrá límites razonables y mantendrá 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 realizar un seguimiento de sutemperatureactual. Incluye:- Un constructor
:new()que inicialice la temperatura en20(un valor predeterminado cómodo) - Un getter
:getTemperature()que devuelva la temperatura actual - Un setter
:setTemperature(newTemp)que actualice la temperatura, pero la mantenga 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 distintos 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 que se establecerá
- Segunda temperatura que se establecerá
En tu archivo principal, crea un termostato y después:
- Imprime la temperatura inicial
- Establece la temperatura en el primer valor de entrada e imprime el resultado
- Establece la temperatura en el 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
30Observa cómo el segundo intento de establecer 50 da como resultado 30: ¡el setter aplica automáticamente el límite máximo!
Pruébalo tú mismo
-- Requiere el módulo Thermostat
local Thermostat = require('Thermostat')
-- Lee la entrada
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: Crea una instancia de thermostat
-- TODO: Imprime la temperatura inicial
-- TODO: Establece la temperatura a temp1 e imprime el resultado
-- TODO: Establece la temperatura a temp2 e imprime el resultado
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
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 formasPractica por tu cuenta: Compilador de Lua online