Menu
Coddy logo textTech

Recapitulação - Cofre Seguro

Parte da seção Object Oriented Programming 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 Object Oriented Programming