Métodos Getter
Parte da seção Programação Orientada a Objetos 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 organizada: usando 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 dar ao trabalho de usar um método extra? Getters fornecem um ponto de acesso controlado aos seus dados.
Por enquanto, :getHealth() simplesmente retorna o valor. Mas, mais tarde, talvez você queira adicionar lógica: talvez retornar "Crítico" se a saúde cair abaixo de 10 ou registrar cada vez que a saúde for verificada.
Com um getter implementado, você pode fazer essas alterações sem modificar nenhum código que use o objeto.
local hero = Player:new("Luna")
print(hero:getHealth()) -- Saída: 100
print(hero:getName()) -- Saída: LunaEste padrão cria um limite claro entre a estrutura interna de um objeto e a forma 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 criar uma classe Player que usa 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 convencional. O construtor deve aceitar um nome e inicializar a saúde com100. 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 as duas informações
main.lua: exija 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 exatamente neste formato:
[name] has [health] HPVocê receberá uma entrada: o nome do jogador.
Em 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 deverá ser:
Luna
100
Luna has 100 HPExperimente você mesmo
-- Requer o módulo Player
local Player = require('Player')
-- Lê a entrada
local name = io.read()
-- TODO: Crie uma instância de player com o nome fornecido
-- TODO: Imprima o nome do jogador usando :getName()
-- TODO: Imprima a vida do jogador usando :getHealth()
-- TODO: Imprima 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 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