Resumen - Bóveda segura
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 48 de 70.
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 avault.contentsdirectamente e imprimiendo lo que obtengas.
Recibirás tres entradas:
- El contenido secreto para almacenar en la bóveda
- La contraseña para proteger la bóveda
- 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: nilSi las entradas son Diamond, mypass y wrongpass, la salida debe ser:
Result: Access Denied
Direct access: nilLa 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
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formas