Итоги — Защищенное хранилище
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 48 из 70.
Задание
ЛегкоДавайте создадим класс Vault, который использует приватность на основе замыканий для создания по-настоящему безопасной системы хранения! Хранилище будет содержать секретное содержимое, доступ к которому можно получить только при вводе правильного пароля.
Вы организуете свой код в двух файлах:
Vault.lua: Создайте класс, в котором и содержимое, и пароль хранятся в локальных переменных внутри конструктора — полностью скрытых от внешнего доступа. Конструктор:new(contents, password)должен сохранять эти значения в локальных переменных, а затем определять метод непосредственно в экземпляре объекта::open(attemptedPassword)— проверяет, совпадает ли введенный пароль с сохраненным. Если пароль верный, возвращает секретное содержимое. Если неверный, возвращает"Access Denied".
main.lua: Подключите модуль Vault и прочитайте три входных значения: секретное содержимое для хранения, пароль для установки и попытку ввода пароля. Создайте хранилище с содержимым и паролем, затем попробуйте открыть его с помощью введенного пароля и выведите результат. Также продемонстрируйте, что содержимое действительно является приватным, попытавшись получить доступ кvault.contentsнапрямую и выведя то, что вы получите.
Вы получите три входных значения:
- Секретное содержимое для хранения в хранилище
- Пароль для защиты хранилища
- Попытка ввода пароля для открытия хранилища
Ваш вывод должен состоять из двух строк:
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
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур