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.

Os métodos Getter permitem ler dados internos por meio de um ponto de acesso controlado. Métodos Setter (também chamados de métodos modificadores) 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 trabalho extra para obter o mesmo resultado. Mas os setters se tornam poderosos quando você precisa adicionar regras posteriormente. Imagine que você queira garantir que a velocidade nunca fique negativa nem 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 toda alteração de velocidade passa pela sua lógica de validação. Qualquer código que use :setSpeed() se beneficia automaticamente dessas verificações sem modificações. Esse é o verdadeiro valor dos setters. Eles criam um único ponto em que você controla como os dados mudam, tornando seus objetos mais seguros e fáceis de manter.

challenge icon

Desafio

Fácil

Vamos criar uma classe Thermostat que usa métodos setter para controlar a temperatura de forma inteligente. Em vez de permitir qualquer valor de temperatura, seu termostato imporá 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. Cada termostato deve acompanhar sua temperature atual. Inclua:
    • Um construtor :new() que inicializa a temperatura como 20 (um valor 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 de 10 e máximo de 30
  • main.lua: exija seu módulo Thermostat e crie uma instância do termostato. Use o setter para tentar diferentes alterações de temperatura e observe como os limites são aplicados.

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

  • Se a nova temperatura estiver abaixo de 10, defina-a como 10
  • Se a nova temperatura estiver acima de 30, defina-a como 30
  • Caso contrário, defina-a com o valor solicitado

Você receberá duas entradas:

  1. Primeira temperatura a definir
  2. Segunda temperatura a definir

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

  1. Imprima a temperatura inicial
  2. Defina a temperatura como o primeiro valor de entrada e imprima o resultado
  3. Defina a temperatura como 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 deverá ser:

20
25
30

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

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 de thermostat

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