Menu
Coddy logo textTech

Resumen - Bóveda segura

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 48 de 70.

challenge icon

Desafío

Fácil

¡Construyamos una clase Vault que use la privacidad basada en clausuras para crear un sistema de almacenamiento verdaderamente seguro! La bóveda contendrá información secreta a la que solo se podrá acceder proporcionando la contraseña correcta.

Organizarás tu código en dos archivos:

  • Vault.lua: Crea una clase en la que tanto el contenido como la contraseña se almacenen en variables locales dentro del constructor: completamente ocultos del acceso externo. El constructor :new(contents, password) debe almacenar estos valores en variables locales y, después, definir un método directamente en la instancia del objeto:
    • :open(attemptedPassword): comprueba si la contraseña introducida coincide con la contraseña almacenada. Si es correcta, devuelve el contenido secreto. Si es incorrecta, devuelve "Access Denied".
  • main.lua: Requiere tu módulo Vault y lee tres entradas: el contenido secreto que se almacenará, la contraseña que se establecerá y un intento de contraseña. Crea una bóveda con el contenido y la contraseña, después intenta abrirla con la contraseña introducida e imprime el resultado. También demuestra que el contenido es realmente privado intentando acceder directamente a vault.contents e imprimiendo lo que obtengas.

Recibirás tres entradas:

  1. El contenido secreto que se almacenará en la bóveda
  2. La contraseña que protegerá la bóveda
  3. Un intento de contraseña para tratar de abrir la bóveda

Tu salida debe constar de dos líneas:

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

Por ejemplo, si las entradas son Gold Coins, secret123 y secret123, la salida debería ser:

Result: Gold Coins
Direct access: nil

Si las entradas son Diamond, mypass y wrongpass, la salida debería ser:

Result: Access Denied
Direct access: nil

La idea clave aquí es que tanto contents como password existen únicamente como variables locales dentro del constructor. El método :open() puede acceder a ellas mediante una clausura, pero ninguna otra cosa puede hacerlo, ni siquiera vault.contents, vault._contents o vault.password. ¡Esto es encapsulación verdadera!

Pruébalo tú mismo

-- Requiere el módulo Vault
local Vault = require('Vault')

-- Lee las entradas
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: Crea un vault con los contents y password

-- TODO: Intenta abrir el vault con la attempted password

-- TODO: Imprime el resultado en el formato: "Result: {resultFromOpen}"

-- TODO: Intenta acceder a vault.contents directamente e imprime lo que obtienes
-- Print in the format: "Direct access: {whatYouGetFromVaultContents}"

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online