Menu
Coddy logo textTech

Сеттеры

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 14 из 70.

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

Вместо прямого присваивания 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

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

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

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

challenge icon

Задание

Легко

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

Вы распределите код по двум файлам:

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

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

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

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

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

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

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

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

Например, если входные значения — 25 и 50, вывод должен быть таким:

20
25
30

Обратите внимание, как вторая попытка установить 50 приводит к значению 30: Setter автоматически обеспечивает соблюдение максимального ограничения!

REQUIRED OUTPUT FORMAT: [Your translated content here]

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

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

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

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

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

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

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

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua