Riepilogo - Cassaforte sicura
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 48 di 70.
Sfida
FacileCostruiamo 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 avault.contentse stampando ciò che ottieni.
Riceverai tre input:
- I dati segreti da memorizzare nel vault
- La password per proteggere il vault
- 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: nilSe gli input sono Diamond, mypass e wrongpass, l'output dovrebbe essere:
Result: Access Denied
Direct access: nilL'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
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle formeEsercitati da solo: Compilatore Lua online