Menu
Coddy logo textTech

Соглашения об именовании

Часть раздела Объектно-ориентированное программирование путешествия по 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(), продолжит работать без изменений.

challenge icon

Задание

Легко

Давайте создадим класс 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, затем выведите владельца и итоговый баланс.

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

  1. Имя владельца
  2. Начальный баланс (number)
  3. Сумма 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}
quiz iconПроверьте себя

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

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

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