Сеттеры
Часть раздела 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(), автоматически получает преимущества этих проверок без необходимости внесения изменений. В этом и заключается истинная ценность сеттеров — они создают единую точку, в которой вы контролируете изменение данных, делая ваши объекты более безопасными и простыми в обслуживании.
Задание
ЛегкоДавайте создадим класс Thermostat, который использует методы-сеттеры для интеллектуального управления температурой. Вместо того чтобы разрешать любое значение температуры, ваш термостат будет обеспечивать соблюдение разумных пределов, поддерживая температуру в комфортном диапазоне.
Вы организуете свой код в двух файлах:
Thermostat.lua: Определите классThermostat, используя стандартный паттерн прототипа. Каждый термостат должен отслеживать свою текущуюtemperature. Включите:- Конструктор
:new(), который инициализирует температуру значением20(комфортное значение по умолчанию) - Геттер
:getTemperature(), который возвращает текущую температуру - Сеттер
:setTemperature(newTemp), который обновляет температуру, но удерживает ее в заданных пределах: минимум10и максимум30
- Конструктор
main.lua: Подключите модуль Thermostat и создайте экземпляр термостата. Используйте сеттер, чтобы попытаться изменить температуру на разные значения, и посмотрите, как соблюдаются ограничения.
Ваш метод :setTemperature() должен соблюдать следующие правила:
- Если новая температура ниже
10, установите ее равной10 - Если новая температура выше
30, установите ее равной30 - В противном случае установите ее равной запрошенному значению
Вы получите два входных значения:
- Первая температура для установки
- Вторая температура для установки
В вашем основном файле создайте термостат, затем:
- Выведите начальную температуру
- Установите температуру в соответствии с первым входным значением и выведите результат
- Установите температуру в соответствии со вторым входным значением и выведите результат
Выводите каждую температуру на отдельной строке (только число).
Например, если входные данные — 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 и вывести результат
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур