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
endAgora 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.
Desafio
FácilVamos 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 classeThermostatcom o padrão de protótipo. Cada termostato deve acompanhar suatemperatureatual. Inclua:- Um construtor
:new()que inicializa a temperatura como20(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 de10e máximo de30
- Um construtor
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 como10 - Se a nova temperatura estiver acima de
30, defina-a como30 - Caso contrário, defina-a com o valor solicitado
Você receberá duas entradas:
- Primeira temperatura a definir
- Segunda temperatura a definir
No seu arquivo principal, crie um termostato e, em seguida:
- Imprima a temperatura inicial
- Defina a temperatura como o primeiro valor de entrada e imprima o resultado
- 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
30Observe 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
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
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ânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrã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 FormasPratique por conta própria: Compilador de Lua online