Сеттеры
Часть раздела Объектно-ориентированное программирование путешествия по 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. Они создают единую точку, в которой вы контролируете изменение данных, делая ваши объекты безопаснее и облегчая их обслуживание.
Задание
ЛегкоДавайте создадим класс 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 - В противном случае установите запрошенное значение
Вы получите два входных значения:
- Первая температура для установки
- Вторая температура для установки
В вашем основном файле создайте термостат, затем:
- Выведите начальную температуру
- Установите температуру равной первому входному значению и выведите result
- Установите температуру равной второму входному значению и выведите result
Выводите каждую температуру в отдельной строке (только число).
Например, если входные значения — 25 и 50, вывод должен быть таким:
20
25
30Обратите внимание, как вторая попытка установить 50 приводит к значению 30: Setter автоматически обеспечивает соблюдение максимального ограничения!
Попробуйте сами
-- Подключить модуль Thermostat
local Thermostat = require('Thermostat')
-- Прочитать ввод
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: Создать экземпляр Thermostat
-- TODO: Вывести начальную температуру
-- TODO: Установить температуру в temp1 и вывести результат
-- TODO: Установить температуру в temp2 и вывести результат
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua