Menu
Coddy logo textTech

Riepilogo - Cassaforte sicura

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 48 di 70.

challenge icon

Sfida

Facile

Costruiamo una classe Vault che usa la privacy basata sulle closure per creare un sistema di archiviazione davvero sicuro! Il vault conterrà dati segreti a cui si potrà accedere solo fornendo la password corretta.

Organizzerai il codice in due file:

  • Vault.lua: crea una classe in cui sia i dati sia la password vengono memorizzati in variabili locali all'interno del costruttore, completamente nascosti dall'accesso esterno. Il costruttore :new(contents, password) dovrebbe memorizzare questi valori in variabili locali, quindi definire un metodo direttamente sull'istanza dell'oggetto:
    • :open(attemptedPassword): controlla se la password tentata corrisponde a quella memorizzata. Se è corretta, restituisce i dati segreti. Se è errata, restituisce "Access Denied".
  • main.lua: importa il modulo Vault e legge tre input: i dati segreti da memorizzare, la password da impostare e un tentativo di inserimento della password. Crea un vault con i dati e la password, quindi prova ad aprirlo con la password tentata e stampa il risultato. Dimostra anche che i dati sono davvero privati provando ad accedere direttamente a vault.contents e stampando ciò che ottieni.

Riceverai tre input:

  1. I dati segreti da memorizzare nel vault
  2. La password per proteggere il vault
  3. Un tentativo di password per provare ad aprire il vault

L'output deve contenere due righe:

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

Per esempio, se gli input sono Gold Coins, secret123 e secret123, l'output dovrebbe essere:

Result: Gold Coins
Direct access: nil

Se gli input sono Diamond, mypass e wrongpass, l'output dovrebbe essere:

Result: Access Denied
Direct access: nil

L'idea fondamentale è che sia contents sia password esistono solo come variabili locali all'interno del costruttore. Il metodo :open() può accedervi tramite una closure, ma nient'altro può farlo, nemmeno vault.contents, vault._contents o vault.password. Questo è vero incapsulamento!

Provalo tu

-- Carica il modulo Vault
local Vault = require('Vault')

-- Leggi gli input
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: Crea una cassaforte con il contenuto e la password

-- TODO: Prova ad aprire la cassaforte con la password inserita

-- TODO: Stampa il risultato nel formato: "Result: {resultFromOpen}"

-- TODO: Prova ad accedere direttamente a vault.contents e stampa ciò che ottieni
-- Stampa nel formato: "Direct access: {whatYouGetFromVaultContents}"

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online