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 usa privacidade baseada em closures para criar um sistema de armazenamento realmente seguro! O cofre conterá dados secretos que só poderão ser acessados fornecendo a senha correta.
Você organizará seu código em dois arquivos:
Vault.lua: crie uma classe em que tanto os dados 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 fornecida corresponde à senha armazenada. Se estiver correta, retorna os dados secretos. Se estiver incorreta, retorna"Access Denied".
main.lua: exija seu módulo Vault e leia três entradas: os dados secretos a serem armazenados, a senha a ser definida e uma tentativa de senha. Crie um cofre com os dados e a senha, depois tente abri-lo com a senha fornecida e imprima o resultado. Demonstre também que os dados são realmente privados tentando acessarvault.contentsdiretamente e imprimindo o que você obtiver.
Você receberá três entradas:
- Os dados secretos a serem armazenados no cofre
- A senha para proteger o cofre
- Uma tentativa de senha para tentar abrir o cofre
Sua saída deve conter duas linhas:
Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}Por exemplo, se as entradas forem Gold Coins, secret123 e secret123, a saída deverá ser:
Result: Gold Coins
Direct access: nilSe as entradas forem Diamond, mypass e wrongpass, a saída deverá ser:
Result: Access Denied
Direct access: nilA ideia principal aqui é que tanto contents quanto password existam apenas como variáveis locais dentro do construtor. O método :open() pode acessá-las por meio de uma closure, mas nada mais pode, nem mesmo vault.contents, vault._contents ou vault.password. Isso é encapsulamento de verdade!
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: Crie um vault com o conteúdo e a senha
-- TODO: Tente abrir o vault com a senha tentada
-- TODO: Imprima o resultado no formato: "Result: {resultFromOpen}"
-- TODO: Tente acessar vault.contents diretamente e imprima o que você obtém
-- Print in the format: "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