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
endAgora, 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.
Desafio
FácilVamos 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 classeThermostatcom o padrão de protótipo padrão. Cada termostato deve rastrear suatemperatureatual. Inclua:- Um construtor
:new()que inicializa a temperatura em20(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ínimo10e máximo30
- Um construtor
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 como10 - Se a nova temperatura for superior a
30, defina-a como30 - Caso contrário, defina-a para o valor solicitado
Você receberá duas entradas:
- Primeira temperatura a ser definida
- Segunda temperatura a ser definida
No seu arquivo principal, crie um termostato e, em seguida:
- Imprima a temperatura inicial
- Defina a temperatura para o primeiro valor de entrada e imprima o resultado
- 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
30Observe 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
endSetters 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
endCombinar 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
endSetters 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
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
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse Retângulo2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas