Menu
Coddy logo textTech

Resumen - Bóveda segura

Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 48 de 70.

challenge icon

Desafío

Fácil

¡Vamos a construir una clase Vault que utilice la privacidad basada en cierres (closures) para crear un sistema de almacenamiento verdaderamente seguro! La bóveda guardará contenidos secretos a los que solo se puede acceder proporcionando la contraseña correcta.

Organizarás tu código en dos archivos:

  • Vault.lua: Crea una clase donde 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 luego definir un método directamente en la instancia del objeto:
    • :open(attemptedPassword) — comprueba si la contraseña intentada 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 a almacenar, la contraseña a establecer y un intento de contraseña. Crea una bóveda con el contenido y la contraseña, luego intenta abrirla con el intento de contraseña e imprime el resultado. También demuestra que los contenidos son verdaderamente privados intentando acceder a vault.contents directamente e imprimiendo lo que obtengas.

Recibirás tres entradas:

  1. El contenido secreto para almacenar en la bóveda
  2. La contraseña para 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 debe ser:

Result: Gold Coins
Direct access: nil

Si las entradas son Diamond, mypass y wrongpass, la salida debe ser:

Result: Access Denied
Direct access: nil

La clave aquí es que tanto contents como password existen solo como variables locales dentro del constructor. El método :open() puede acceder a ellos a través del cierre, pero nada más puede hacerlo, ni siquiera vault.contents, vault._contents o vault.password. ¡Esto es verdadera encapsulación!

Pruébalo tú mismo

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

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

-- TODO: Crear una bóveda con el contenido y la contraseña

-- TODO: Intentar abrir la bóveda con la contraseña intentada

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

-- TODO: Intentar acceder a vault.contents directamente e imprimir lo que obtengas
-- Imprimir en el formato: "Direct access: {whatYouGetFromVaultContents}"

Todas las lecciones de Object Oriented Programming