Menu
Coddy logo textTech

Итоги — Защищенное хранилище

Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 48 из 70.

challenge icon

Задание

Легко

Давайте создадим класс Vault, который использует приватность на основе замыканий для создания по-настоящему безопасной системы хранения! Хранилище будет содержать секретное содержимое, доступ к которому можно получить только при вводе правильного пароля.

Вы организуете свой код в двух файлах:

  • Vault.lua: Создайте класс, в котором и содержимое, и пароль хранятся в локальных переменных внутри конструктора — полностью скрытых от внешнего доступа. Конструктор :new(contents, password) должен сохранять эти значения в локальных переменных, а затем определять метод непосредственно в экземпляре объекта:
    • :open(attemptedPassword) — проверяет, совпадает ли введенный пароль с сохраненным. Если пароль верный, возвращает секретное содержимое. Если неверный, возвращает "Access Denied".
  • main.lua: Подключите модуль Vault и прочитайте три входных значения: секретное содержимое для хранения, пароль для установки и попытку ввода пароля. Создайте хранилище с содержимым и паролем, затем попробуйте открыть его с помощью введенного пароля и выведите результат. Также продемонстрируйте, что содержимое действительно является приватным, попытавшись получить доступ к vault.contents напрямую и выведя то, что вы получите.

Вы получите три входных значения:

  1. Секретное содержимое для хранения в хранилище
  2. Пароль для защиты хранилища
  3. Попытка ввода пароля для открытия хранилища

Ваш вывод должен состоять из двух строк:

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

Например, если входные данные — Gold Coins, secret123 и secret123, вывод должен быть следующим:

Result: Gold Coins
Direct access: nil

Если входные данные — Diamond, mypass и wrongpass, вывод должен быть следующим:

Result: Access Denied
Direct access: nil

Ключевая идея здесь заключается в том, что и contents, и password существуют только как локальные переменные внутри конструктора. Метод :open() может получить к ним доступ через замыкание, но ничто другое не может — даже vault.contents, vault._contents или vault.password. Это и есть настоящая инкапсуляция!

Попробуйте сами

-- Подключить модуль Vault
local Vault = require('Vault')

-- Прочитать входные данные
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: Создать хранилище с содержимым и паролем

-- TODO: Попробовать открыть хранилище с помощью введенного пароля

-- TODO: Вывести результат в формате: "Result: {resultFromOpen}"

-- TODO: Попробовать получить доступ к vault.contents напрямую и вывести результат
-- Вывести в формате: "Direct access: {whatYouGetFromVaultContents}"

Все уроки раздела Object Oriented Programming