Menu
Coddy logo textTech

Recapitulação - Cofre Seguro

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 48 de 70.

challenge icon

Desafio

Fácil

Vamos 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 acessar vault.contents diretamente e imprimindo o que você obtém.

Você receberá três entradas:

  1. O conteúdo secreto para armazenar no cofre
  2. A senha para proteger o cofre
  3. 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: nil

Se as entradas forem Diamond, mypass e wrongpass, a saída deve ser:

Result: Access Denied
Direct access: nil

A 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

Pratique por conta própria: Compilador de Lua online