Геттеры
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 13 из 70.
Вы научились хранить данные в переменных экземпляра, таких как self.health или self.items. Хотя вы можете обращаться к этим полям непосредственно извне объекта, существует более чистый подход: using методы-геттеры.
Геттер (также называемый методом-аксессором) — это простой method, который возвращает внутреннее значение. Вместо прямого обращения к player.health вы вызываете player:getHealth():
local Player = {}
Player.__index = Player
function Player:new(name)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.health = 100
return instance
end
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endЗачем нужен дополнительный method? Геттеры обеспечивают контролируемую точку доступа к вашим данным.
Сейчас :getHealth() просто возвращает значение. Но позже ты можешь захотеть добавить логику: например, возвращать "Critical", если health падает ниже 10, или записывать в журнал каждый раз, когда проверяется health.
Имея getter, вы можете вносить эти изменения, не изменяя код, который использует объект.
local hero = Player:new("Luna")
print(hero:getHealth()) -- Вывод: 100
print(hero:getName()) -- Вывод: LunaЭтот pattern создаёт чёткую границу между внутренней структурой объекта и тем, как другой код взаимодействует с ним. Внешний мир запрашивает data через method, а не обращается напрямую к полям объекта.
Задание
ЛегкоДавайте создадим Player class, который использует getter method для доступа к своим внутренним данным. Вместо прямого обращения к полям player вы создадите method, которые обеспечивают контролируемый доступ к информации о player.
Вы организуете свой код в двух файлах:
Player.lua: Define свойPlayerclass, используя стандартный prototype pattern. Constructor должен принимать имя и Initialize health значением100. Добавьте три getter method::getName()returns имя player:getHealth()returns текущий health player:getStatus()returns форматированную строку, объединяющую обе части информации
main.lua: Require свой Player module и создайте instance player. Используйте getter method для отображения информации о player: получайте всё через method, а не читая поля напрямую.
Ваш :getStatus() method должен return строку в этом точном формате:
[name] has [health] HPВы получите один input: имя player.
В своём главном файле создайте player с given именем, затем выведите три строки, используя свои getter method:
- Имя player (с использованием
:getName()) - Health player (с использованием
:getHealth()) - Полный status player (с использованием
:getStatus())
Например, если input — Luna, Output должен быть таким:
Luna
100
Luna has 100 HPПопробуйте сами
-- Подключить модуль Player
local Player = require('Player')
-- Прочитать ввод
local name = io.read()
-- TODO: Создать экземпляр игрока с заданным именем
-- TODO: Вывести имя игрока, используя :getName()
-- TODO: Вывести здоровье игрока, используя :getHealth()
-- TODO: Вывести статус игрока, используя :getStatus()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua