Menu
Coddy logo textTech

Métodos Setter

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 14 de 70.

Métodos getter permitem que você leia dados internos através de um ponto de acesso controlado. Métodos setter (também chamados de métodos mutadores) fazem o oposto — eles fornecem uma maneira controlada de modificar o estado interno.

Em vez de atribuir diretamente car.speed = 50, você chama 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

À primeira vista, isso parece um trabalho extra para o mesmo resultado. Mas os setters tornam-se poderosos quando você precisa adicionar regras mais tarde. Imagine que você queira garantir que a velocidade nunca seja negativa ou exceda um 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

Agora, cada mudança de velocidade passa pela sua lógica de validação. Qualquer código que utilize :setSpeed() se beneficia automaticamente dessas verificações sem modificação. Este é o real valor dos setters—eles criam um ponto único onde você controla como os dados mudam, tornando seus objetos mais seguros e fáceis de manter.

challenge icon

Desafio

Fácil

Vamos construir uma classe Thermostat que utiliza métodos setter para controlar a temperatura de forma inteligente. Em vez de permitir qualquer valor de temperatura, seu termostato aplicará limites razoáveis — mantendo a temperatura dentro de uma faixa confortável.

Você organizará seu código em dois arquivos:

  • Thermostat.lua: Defina sua classe Thermostat com o padrão de protótipo padrão. Cada termostato deve rastrear sua temperature atual. Inclua:
    • Um construtor :new() que inicializa a temperatura em 20 (um padrão confortável)
    • Um getter :getTemperature() que retorna a temperatura atual
    • Um setter :setTemperature(newTemp) que atualiza a temperatura, mas a mantém dentro dos limites: mínimo 10 e máximo 30
  • main.lua: Importe seu módulo Thermostat e crie uma instância de termostato. Use o setter para tentar diferentes mudanças de temperatura e observe como os limites são aplicados.

Seu método :setTemperature() deve aplicar estas regras:

  • Se a nova temperatura for inferior a 10, defina-a como 10
  • Se a nova temperatura for superior a 30, defina-a como 30
  • Caso contrário, defina-a para o valor solicitado

Você receberá duas entradas:

  1. Primeira temperatura a ser definida
  2. Segunda temperatura a ser definida

No seu arquivo principal, crie um termostato e, em seguida:

  1. Imprima a temperatura inicial
  2. Defina a temperatura para o primeiro valor de entrada e imprima o resultado
  3. Defina a temperatura para o segundo valor de entrada e imprima o resultado

Imprima cada temperatura em sua própria linha (apenas o número).

Por exemplo, se as entradas forem 25 e 50, a saída deve ser:

20
25
30

Observe como a segunda tentativa de definir 50 resulta em 30 — o setter aplica o limite máximo automaticamente!

Experimente você mesmo

-- Requer o módulo Thermostat
local Thermostat = require('Thermostat')

-- Lê a entrada
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: Criar uma instância do termostato

-- TODO: Imprimir a temperatura inicial

-- TODO: Definir a temperatura para temp1 e imprimir o resultado

-- TODO: Definir a temperatura para temp2 e imprimir o resultado
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online