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