Menu
Coddy logo textTech

Геттеры

Часть раздела 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

Этот паттерн создает четкую границу между внутренней структурой объекта и тем, как другой код взаимодействует с ним. Внешний мир запрашивает данные через методы, а не обращается напрямую к полям объекта.

challenge icon

Задание

Легко

Давайте создадим класс Player, который использует методы-геттеры для доступа к своим внутренним данным. Вместо того чтобы обращаться к полям игрока напрямую, вы создадите методы, обеспечивающие контролируемый доступ к информации об игроке.

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

  • Player.lua: Определите класс Player, используя стандартный паттерн прототипа. Конструктор должен принимать имя и инициализировать здоровье значением 100. Добавьте три метода-геттера:
    • :getName() возвращает имя игрока
    • :getHealth() возвращает текущее здоровье игрока
    • :getStatus() возвращает отформатированную строку, объединяющую обе части информации
  • main.lua: Подключите модуль Player и создайте экземпляр игрока. Используйте методы-геттеры для отображения информации об игроке — обращайтесь ко всему через методы, а не путем прямого чтения полей.

Ваш метод :getStatus() должен возвращать строку именно в таком формате:

[name] has [health] HP

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

В вашем основном файле создайте игрока с заданным именем, затем выведите три строки, используя методы-геттеры:

  1. Имя игрока (используя :getName())
  2. Здоровье игрока (используя :getHealth())
  3. Полный статус игрока (используя :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()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming