Menu
Coddy logo textTech

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
end

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

challenge icon

Desafío

Fácil

Construyamos 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 clase Thermostat con el patrón de prototipo estándar. Cada termostato debe realizar un seguimiento de su temperature actual. Incluye:
    • Un constructor :new() que inicialice la temperatura en 20 (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ínimo 10 y máximo 30
  • 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 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 que se establecerá
  2. Segunda temperatura que se establecerá

En tu archivo principal, crea un termostato y después:

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

Observa 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
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 Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online