Геттеры
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 13 из 70.
Вы научились хранить данные в переменных экземпляра, таких как self.health или self.items. Хотя вы можете обращаться к этим полям напрямую извне объекта, существует более чистый подход: использование методов-геттеров.
Геттер (также называемый методом доступа) — это простой метод, который возвращает внутреннее значение. Вместо того чтобы обращаться к 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Зачем использовать дополнительный метод? Геттеры обеспечивают контролируемую точку доступа к вашим данным.
На данный момент :getHealth() просто возвращает значение. Но позже вы, возможно, захотите добавить логику — например, возвращать "Critical", если уровень здоровья опускается ниже 10, или логировать каждый раз, когда проверяется здоровье.
Благодаря наличию геттера вы можете вносить эти изменения, не модифицируя код, который использует этот объект.
local hero = Player:new("Luna")
print(hero:getHealth()) -- Вывод: 100
print(hero:getName()) -- Вывод: LunaЭтот паттерн создает четкую границу между внутренней структурой объекта и тем, как другой код взаимодействует с ним. Внешний мир запрашивает данные через методы, а не обращается напрямую к полям объекта.
Задание
ЛегкоДавайте создадим класс Player, который использует методы-геттеры для доступа к своим внутренним данным. Вместо того чтобы обращаться к полям игрока напрямую, вы создадите методы, обеспечивающие контролируемый доступ к информации об игроке.
Вы организуете свой код в двух файлах:
Player.lua: Определите классPlayer, используя стандартный паттерн прототипа. Конструктор должен принимать имя и инициализировать здоровье значением100. Добавьте три метода-геттера::getName()возвращает имя игрока:getHealth()возвращает текущее здоровье игрока:getStatus()возвращает отформатированную строку, объединяющую обе части информации
main.lua: Подключите модуль Player и создайте экземпляр игрока. Используйте методы-геттеры для отображения информации об игроке — обращайтесь ко всему через методы, а не путем прямого чтения полей.
Ваш метод :getStatus() должен возвращать строку именно в таком формате:
[name] has [health] HPВы получите на вход одно значение: имя игрока.
В вашем основном файле создайте игрока с заданным именем, затем выведите три строки, используя методы-геттеры:
- Имя игрока (используя
:getName()) - Здоровье игрока (используя
:getHealth()) - Полный статус игрока (используя
:getStatus())
Например, если на вход подано Luna, вывод должен быть следующим:
Luna
100
Luna has 100 HPШпаргалка
Метод-геттер (или метод доступа) — это метод, который возвращает внутреннее значение объекта. Вместо прямого обращения к полям вы вызываете метод для получения данных.
Базовые методы-геттеры:
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endИспользование методов-геттеров:
local hero = Player:new("Luna")
print(hero:getHealth()) -- Вывод: 100
print(hero:getName()) -- Вывод: LunaГеттеры обеспечивают контролируемую точку доступа к вашим данным. Они создают четкую границу между внутренней структурой объекта и тем, как другой код взаимодействует с ним. Это позволяет позже добавить логику (например, валидацию или логирование) без изменения кода, использующего объект.
Попробуйте сами
-- Подключить модуль Player
local Player = require('Player')
-- Прочитать ввод
local name = io.read()
-- TODO: Создать экземпляр игрока с заданным именем
-- TODO: Вывести имя игрока, используя :getName()
-- TODO: Вывести здоровье игрока, используя :getHealth()
-- TODO: Вывести статус игрока, используя :getStatus()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур