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.
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 avault.contentse imprimiendo lo que obtengas.
Recibirás tres entradas:
- El contenido secreto que se almacenará en la bóveda
- La contraseña que 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 debería ser:
Result: Gold Coins
Direct access: nilSi las entradas son Diamond, mypass y wrongpass, la salida debería ser:
Result: Access Denied
Direct access: nilLa 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
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 formasPractica por tu cuenta: Compilador de Lua online