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 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 acessar vault.contents diretamente e imprimindo o que você obtiver.

Você receberá três entradas:

  1. Os dados secretos a serem armazenados no cofre
  2. A senha para proteger o cofre
  3. 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: nil

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

Result: Access Denied
Direct access: nil

A 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

Pratique por conta própria: Compilador de Lua online