Menu
Coddy logo textTech

Métodos Setter

Parte da seção Object Oriented Programming 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!

Folha de consulta

Métodos setter fornecem uma maneira controlada de modificar o estado interno, permitindo que você adicione regras de validação e restrições.

Sintaxe básica de um método setter:

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

Setters com validação impõem regras quando os dados mudam:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

Combinar getters e setters cria um acesso controlado às propriedades do 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

Setters criam um ponto único de controle para a modificação de dados, tornando os objetos mais seguros e fáceis de manter. Qualquer código que utilize o setter beneficia-se automaticamente da lógica de validação sem necessidade de modificação.

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 Object Oriented Programming