Recapitulação - Cofre Seguro
Parte da seção Programação Orientada a Objetos 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 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