Menu
Coddy logo textTech

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
end

A 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
end

Ahora 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.

challenge icon

Desafío

Fácil

Vamos 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 clase Thermostat con el patrón de prototipo estándar. Cada termostato debe rastrear su temperature actual. Incluye:
    • Un constructor :new() que inicializa la temperatura en 20 (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ínimo 10 y máximo 30
  • 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 en 10
  • Si la nueva temperatura es superior a 30, establécela en 30
  • De lo contrario, establécela en el valor solicitado

Recibirás dos entradas:

  1. Primera temperatura a establecer
  2. Segunda temperatura a establecer

En tu archivo principal, crea un termostato, luego:

  1. Imprime la temperatura inicial
  2. Establece la temperatura al primer valor de entrada e imprime el resultado
  3. 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
end

Los 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
end

La 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
end

Los 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
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming