Menu
Coddy logo textTech

Podsumowanie — bezpieczny sejf

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 48 z 70.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Vault, która wykorzystuje prywatność opartą na domknięciach, aby stworzyć naprawdę bezpieczny system przechowywania! Sejf będzie przechowywać poufną zawartość, do której można uzyskać dostęp tylko po podaniu prawidłowego hasła.

Rozmieścisz swój kod w dwóch plikach:

  • Vault.lua: Utwórz klasę, w której zarówno zawartość, jak i hasło są przechowywane w zmiennych lokalnych wewnątrz konstruktora — całkowicie ukryte przed dostępem z zewnątrz. Konstruktor :new(contents, password) powinien zapisać te wartości w zmiennych lokalnych, a następnie zdefiniować metodę bezpośrednio w instancji obiektu:
    • :open(attemptedPassword): sprawdza, czy podane hasło jest zgodne z zapisanym hasłem. Jeśli jest prawidłowe, zwraca poufną zawartość. Jeśli jest nieprawidłowe, zwraca "Access Denied".
  • main.lua: Załaduj moduł Vault i wczytaj trzy dane wejściowe: poufną zawartość do przechowania, hasło do ustawienia i próbę podania hasła. Utwórz sejf z zawartością i hasłem, a następnie spróbuj go otworzyć, podając hasło, i wypisz wynik. Pokaż też, że zawartość jest naprawdę prywatna, próbując uzyskać do niej bezpośredni dostęp przez vault.contents i wypisując to, co otrzymasz.

Otrzymasz trzy dane wejściowe:

  1. Poufną zawartość do przechowania w sejfie
  2. Hasło chroniące sejf
  3. Próbę podania hasła, aby otworzyć sejf

Wynik powinien składać się z dwóch wierszy:

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

Na przykład, jeśli dane wejściowe to Gold Coins, secret123 i secret123, wynikiem powinno być:

Result: Gold Coins
Direct access: nil

Jeśli dane wejściowe to Diamond, mypass i wrongpass, wynikiem powinno być:

Result: Access Denied
Direct access: nil

Kluczowe jest to, że zarówno contents, jak i password istnieją wyłącznie jako zmienne lokalne wewnątrz konstruktora. Metoda :open() może uzyskać do nich dostęp za pośrednictwem domknięcia, ale nic innego nie może tego zrobić — nawet vault.contents, vault._contents ani vault.password. To prawdziwa enkapsulacja!

Spróbuj swoich sił

-- Załaduj moduł Vault
local Vault = require('Vault')

-- Odczytaj dane wejściowe
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: Utwórz sejf z podaną zawartością i hasłem

-- TODO: Spróbuj otworzyć sejf za pomocą podanego hasła

-- TODO: Wypisz wynik w formacie: "Result: {resultFromOpen}"

-- TODO: Spróbuj uzyskać bezpośredni dostęp do vault.contents i wypisz otrzymaną wartość
-- Wypisz w formacie: "Direct access: {whatYouGetFromVaultContents}"

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online