Соглашения об именовании
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 43 из 70.
В Lua все поля таблицы по умолчанию общедоступны. Любой может напрямую прочитать или изменить self.health. Хотя Lua не обеспечивает принудительную приватность, программисты используют соглашения об именовании, чтобы выразить намерение: показать, какие поля следует рассматривать как внутренние детали реализации.
Стандартное соглашение заключается в том, чтобы добавлять символ подчёркивания перед private полями:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Публичный: можно обращаться напрямую
_health = 100, -- Приватный: используйте методы вместо этого
_score = 0 -- Приватный: внутреннее отслеживание
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endПодчёркивание не меняет принцип работы Lua: player._health технически всё ещё доступно. Однако оно служит чётким предупреждением для других программистов (и для тебя в будущем): «Это field предназначено быть private. Получай доступ к нему через methods instead».
Это соглашение важно, потому что оно отделяет интерфейс (то, что должны использовать другие) от реализации (того, как это работает внутри). Если позже понадобится добавить проверку или изменить способ хранения здоровья, ты изменишь только методы: код, использующий :getHealth(), продолжит работать без изменений.
Задание
ЛегкоДавайте создадим класс BankAccount, который правильно обозначает, какие поля должны быть private, используя соглашение об именовании с подчёркиванием!
Вы организуете код в двух файлах:
BankAccount.lua: Создайте класс, управляющий информацией об account. Constructor:new(ownerName, initialBalance)должен сохранять имя владельца как public field (owner), а баланс — как private field (_balance). Включите три methods::getBalance(): возвращает текущий баланс:deposit(amount): добавляет amount к_balance:getOwner(): возвращает имя владельца
main.lua: Подключите свой модуль BankAccount, считайте из ввода имя владельца, начальный баланс и сумму deposit. Создайте account, выполните deposit, затем выведите владельца и итоговый баланс.
Вы получите три входных значения:
- Имя владельца
- Начальный баланс (number)
- Сумма deposit (number)
Ваш вывод должен состоять из двух строк, показывающих владельца и итоговый баланс после deposit:
Owner: {ownerName}
Balance: {finalBalance}Например, если входными значениями являются Maria, 500 и 150, вывод должен быть таким:
Owner: Maria
Balance: 650Помните: префикс подчёркивания у _balance сообщает другим программистам, что к этому field следует обращаться через methods, такие как :getBalance() и :deposit(), а не directly. Поле owner без подчёркивания означает, что к нему можно обращаться public.
Попробуйте сами
-- Подключить модуль BankAccount
local BankAccount = require('BankAccount')
-- Прочитать входные данные
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO: Создать новый BankAccount с ownerName и initialBalance
-- TODO: Сделать депозит, используя depositAmount
-- TODO: Вывести владельца и итоговый баланс в требуемом формате
-- Формат:
-- Owner: {ownerName}
-- Balance: {finalBalance}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua