Recapitulação - Cofre Seguro
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 48 de 70.
Desafio
FácilVamos construir uma classe Vault que utiliza privacidade baseada em fechamento (closure) para criar um sistema de armazenamento verdadeiramente seguro! O cofre guardará conteúdos secretos que só podem ser acessados fornecendo a senha correta.
Você organizará seu código em dois arquivos:
Vault.lua: Crie uma classe onde tanto o conteúdo quanto a senha sejam armazenados em variáveis locais dentro do construtor — completamente ocultos do acesso externo. O construtor:new(contents, password)deve armazenar esses valores em variáveis locais e, em seguida, definir um método diretamente na instância do objeto::open(attemptedPassword)— verifica se a senha tentada corresponde à senha armazenada. Se estiver correta, retorna o conteúdo secreto. Se estiver incorreta, retorna"Access Denied".
main.lua: Importe seu módulo Vault e leia três entradas: o conteúdo secreto a ser armazenado, a senha a ser definida e uma tentativa de senha. Crie um cofre com o conteúdo e a senha, depois tente abri-lo com a tentativa de senha e imprima o resultado. Além disso, demonstre que o conteúdo é verdadeiramente privado tentando acessarvault.contentsdiretamente e imprimindo o que você obtém.
Você receberá três entradas:
- O conteúdo secreto para armazenar no cofre
- A senha para proteger o cofre
- Uma tentativa de senha para tentar abrir o cofre
Sua saída deve ter duas linhas:
Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}Por exemplo, se as entradas forem Gold Coins, secret123 e secret123, a saída deve ser:
Result: Gold Coins
Direct access: nilSe as entradas forem Diamond, mypass e wrongpass, a saída deve ser:
Result: Access Denied
Direct access: nilA ideia principal aqui é que tanto contents quanto password existem apenas como variáveis locais dentro do construtor. O método :open() pode acessá-los através de closure, mas nada mais pode — nem mesmo vault.contents, vault._contents ou vault.password. Isso é encapsulamento verdadeiro!
Experimente você mesmo
-- Requer o módulo Vault
local Vault = require('Vault')
-- Lê as entradas
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()
-- TODO: Criar um vault com o conteúdo e a senha
-- TODO: Tentar abrir o vault com a senha tentada
-- TODO: Imprimir o resultado no formato: "Result: {resultFromOpen}"
-- TODO: Tentar acessar vault.contents diretamente e imprimir o que você obtém
-- Imprimir no formato: "Direct access: {whatYouGetFromVaultContents}"
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