Menu
Coddy logo textTech

Сеттеры

Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 14 из 70.

Методы-геттеры позволяют считывать внутренние данные через контролируемую точку доступа. Методы-сеттеры (также называемые методами-мутаторами) делают обратное — они предоставляют контролируемый способ изменения внутреннего состояния.

Вместо того чтобы напрямую присваивать car.speed = 50, вы вызываете car:setSpeed(50):

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

На первый взгляд это кажется лишней работой для достижения того же результата. Но сеттеры становятся мощным инструментом, когда вам нужно добавить правила позже. Представьте, что вы хотите гарантировать, что скорость никогда не станет отрицательной или не превысит максимум:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

Теперь каждое изменение скорости проходит через вашу логику валидации. Любой код, использующий :setSpeed(), автоматически получает преимущества этих проверок без необходимости внесения изменений. В этом и заключается истинная ценность сеттеров — они создают единую точку, в которой вы контролируете изменение данных, делая ваши объекты более безопасными и простыми в обслуживании.

challenge icon

Задание

Легко

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

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

  • Thermostat.lua: Определите класс Thermostat, используя стандартный паттерн прототипа. Каждый термостат должен отслеживать свою текущую temperature. Включите:
    • Конструктор :new(), который инициализирует температуру значением 20 (комфортное значение по умолчанию)
    • Геттер :getTemperature(), который возвращает текущую температуру
    • Сеттер :setTemperature(newTemp), который обновляет температуру, но удерживает ее в заданных пределах: минимум 10 и максимум 30
  • main.lua: Подключите модуль Thermostat и создайте экземпляр термостата. Используйте сеттер, чтобы попытаться изменить температуру на разные значения, и посмотрите, как соблюдаются ограничения.

Ваш метод :setTemperature() должен соблюдать следующие правила:

  • Если новая температура ниже 10, установите ее равной 10
  • Если новая температура выше 30, установите ее равной 30
  • В противном случае установите ее равной запрошенному значению

Вы получите два входных значения:

  1. Первая температура для установки
  2. Вторая температура для установки

В вашем основном файле создайте термостат, затем:

  1. Выведите начальную температуру
  2. Установите температуру в соответствии с первым входным значением и выведите результат
  3. Установите температуру в соответствии со вторым входным значением и выведите результат

Выводите каждую температуру на отдельной строке (только число).

Например, если входные данные — 25 и 50, вывод должен быть следующим:

20
25
30

Обратите внимание, как вторая попытка установить 50 приводит к 30 — сеттер автоматически применяет максимальный предел!

Шпаргалка

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

Базовый синтаксис метода-сеттера:

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

Сеттеры с валидацией применяют правила при изменении данных:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

Сочетание геттеров и сеттеров создает контролируемый доступ к свойствам объекта:

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

function Car:getSpeed()
    return self.speed
end

Сеттеры создают единую точку контроля для модификации данных, делая объекты более безопасными и простыми в обслуживании. Любой код, использующий сеттер, автоматически получает преимущества логики валидации без необходимости внесения изменений.

Попробуйте сами

-- Подключить модуль Thermostat
local Thermostat = require('Thermostat')

-- Прочитать ввод
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: Создать экземпляр термостата

-- TODO: Вывести начальную температуру

-- TODO: Установить температуру на temp1 и вывести результат

-- TODO: Установить температуру на temp2 и вывести результат
quiz iconПроверьте себя

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

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