Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 48 из 70.

challenge icon

Задание

Легко

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

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

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

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

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

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

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() может получить к ним доступ через closure, но больше никто не может, даже через vault.contents, vault._contents или vault.password. Это и есть настоящая инкапсуляция!

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

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

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

-- TODO: Создать vault с contents и password

-- TODO: Попытаться открыть vault с attempted password

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

-- TODO: Попытаться получить доступ к vault.contents напрямую и вывести то, что получите
-- Print in the format: "Direct access: {whatYouGetFromVaultContents}"

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua