Convenções de Nomenclatura
Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 43 de 70.
Em Lua, todos os campos de tabela são acessíveis publicamente por padrão. Qualquer pessoa pode ler ou modificar self.health diretamente. Embora Lua não imponha privacidade, os programadores usam convenções de nomenclatura para comunicar a intenção: sinalizando quais campos devem ser tratados como detalhes internos de implementação.
A convenção padrão é prefixar os campos privados com um sublinhado:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Público: ok acessar diretamente
_health = 100, -- Privado: use métodos em vez disso
_score = 0 -- Privado: rastreamento interno
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endO sublinhado não muda a forma como o Lua funciona: player._health ainda pode ser acessado tecnicamente. No entanto, ele serve como um aviso claro para outros programadores (e para o seu futuro eu): "Este campo deve ser privado. Acesse-o por meio de métodos."
Essa convenção é importante porque separa a interface (o que os outros devem usar) da implementação (como ela funciona internamente). Se mais tarde você precisar adicionar uma validação ou mudar a forma como a saúde é armazenada, basta modificar os methods: o código que usa :getHealth() continua funcionando sem alterações.
Desafio
FácilVamos criar uma classe BankAccount que sinalize corretamente quais campos devem ser privados usando a convenção de nomenclatura com sublinhado!
Você organizará seu código em dois arquivos:
BankAccount.lua: crie uma classe que gerencie as informações da conta. O construtor:new(ownerName, initialBalance)deve armazenar o nome do proprietário como um campo público (owner) e o saldo como um campo privado (_balance). Inclua três métodos::getBalance(): retorna o saldo atual:deposit(amount): adiciona o valor a_balance:getOwner(): retorna o nome do proprietário
main.lua: exija seu módulo BankAccount, leia o nome do proprietário, o saldo inicial e o valor do depósito a partir da entrada. Crie uma conta, faça um depósito e, em seguida, imprima o proprietário e o saldo final.
Você receberá três entradas:
- O nome do proprietário
- O saldo inicial (um número)
- O valor do depósito (um número)
Sua saída deve conter duas linhas mostrando o proprietário e o saldo final após o depósito:
Owner: {ownerName}
Balance: {finalBalance}Por exemplo, se as entradas forem Maria, 500 e 150, a saída deverá ser:
Owner: Maria
Balance: 650Lembre-se: o prefixo de sublinhado em _balance sinaliza para outros programadores que esse campo deve ser acessado por meio de métodos como :getBalance() e :deposit(), e não diretamente. O campo owner sem sublinhado indica que ele pode ser acessado publicamente.
Experimente você mesmo
-- Requer o módulo BankAccount
local BankAccount = require('BankAccount')
-- Lê as entradas
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO: Crie um novo BankAccount com ownerName e initialBalance
-- TODO: Faça um depósito usando o depositAmount
-- TODO: Imprima o proprietário e o saldo final no formato exigido
-- Formato:
-- Owner: {ownerName}
-- Balance: {finalBalance}
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