Métodos Getter
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 13 de 70.
Você aprendeu a armazenar dados em variáveis de instância como self.health ou self.items. Embora você possa acessar esses campos diretamente de fora do objeto, existe uma abordagem mais limpa: usar métodos getter.
Um getter (também chamado de método acessor) é um método simples que retorna um valor interno. Em vez de acessar player.health diretamente, você chama player:getHealth():
local Player = {}
Player.__index = Player
function Player:new(name)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.health = 100
return instance
end
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endPor que se preocupar com um método extra? Getters fornecem um ponto de acesso controlado aos seus dados.
No momento, :getHealth() simplesmente retorna o valor. Mas depois, você pode querer adicionar lógica — talvez retornando "Critical" se a vida cair abaixo de 10, ou registrando toda vez que a vida for verificada.
Com um getter implementado, você pode fazer essas alterações sem modificar nenhum código que utilize o objeto.
local hero = Player:new("Luna")
print(hero:getHealth()) -- Saída: 100
print(hero:getName()) -- Saída: LunaEste padrão cria uma fronteira clara entre a estrutura interna de um objeto e como outros códigos interagem com ele. O mundo externo solicita dados por meio de métodos, em vez de acessar diretamente os campos do objeto.
Desafio
FácilVamos construir uma classe Player que utiliza métodos getter para acessar seus dados internos. Em vez de acessar diretamente os campos do jogador, você criará métodos que fornecem acesso controlado às informações do jogador.
Você organizará seu código em dois arquivos:
Player.lua: Defina sua classePlayercom o padrão de protótipo padrão. O construtor deve aceitar um nome e inicializar a saúde em100. Adicione três métodos getter::getName()retorna o nome do jogador:getHealth()retorna a saúde atual do jogador:getStatus()retorna uma string formatada combinando ambas as informações
main.lua: Importe seu módulo Player e crie uma instância de jogador. Use os métodos getter para exibir as informações do jogador — acesse tudo por meio de métodos em vez de ler os campos diretamente.
Seu método :getStatus() deve retornar uma string neste formato exato:
[name] has [health] HPVocê receberá uma entrada: o nome do jogador.
No seu arquivo principal, crie um jogador com o nome fornecido e, em seguida, imprima três linhas usando seus métodos getter:
- O nome do jogador (usando
:getName()) - A saúde do jogador (usando
:getHealth()) - O status completo do jogador (usando
:getStatus())
Por exemplo, se a entrada for Luna, a saída deve ser:
Luna
100
Luna has 100 HPFolha de consulta
Um método getter (ou método de acesso) é um método que retorna um valor interno de um objeto. Em vez de acessar os campos diretamente, você chama um método para recuperar os dados.
Métodos getter básicos:
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endUsando métodos getter:
local hero = Player:new("Luna")
print(hero:getHealth()) -- Saída: 100
print(hero:getName()) -- Saída: LunaGetters fornecem um ponto de acesso controlado aos seus dados. Eles criam uma fronteira clara entre a estrutura interna de um objeto e como outros códigos interagem com ele. Isso permite que você adicione lógica posteriormente (como validação ou registro de logs) sem modificar o código que utiliza o objeto.
Experimente você mesmo
-- Requer o módulo Player
local Player = require('Player')
-- Ler entrada
local name = io.read()
-- TODO: Criar uma instância de jogador com o nome fornecido
-- TODO: Imprimir o nome do jogador usando :getName()
-- TODO: Imprimir a vida do jogador usando :getHealth()
-- TODO: Imprimir o status do jogador usando :getStatus()
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