Menu
Coddy logo textTech

Convenciones de nomenclatura

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 43 de 70.

En Lua, todos los campos de las tablas son accesibles públicamente de forma predeterminada. Cualquiera puede leer o modificar self.health directamente. Aunque Lua no impone la privacidad, los programadores utilizan convenciones de nomenclatura para comunicar la intención: indicar qué campos deben tratarse como detalles internos de implementación.

La convención estándar es anteponer un guion bajo a los campos privados:

local Player = {}
Player.__index = Player

function Player:new(name)
    local obj = {
        name = name,      -- Público: está bien acceder directamente
        _health = 100,    -- Privado: usa métodos en su lugar
        _score = 0        -- Privado: seguimiento interno
    }
    setmetatable(obj, Player)
    return obj
end

function Player:getHealth()
    return self._health
end

function Player:takeDamage(amount)
    self._health = self._health - amount
end

El guion bajo no cambia la forma en que funciona Lua: player._health sigue siendo técnicamente accesible. Sin embargo, sirve como una advertencia clara para otros programadores (y para tu yo del futuro): «Este campo está destinado a ser privado. Accede a él mediante métodos en su lugar.»

Esta convención es importante porque separa la interfaz (lo que otros deberían usar) de la implementación (cómo funciona internamente). Si más adelante necesitas añadir validación o cambiar cómo se almacena la salud, solo modificas los métodos: el código que usa :getHealth() continúa funcionando sin cambios.

challenge icon

Desafío

Fácil

¡Construyamos una clase BankAccount que indique correctamente qué campos deben ser privados mediante la convención de nombres con guion bajo!

Organizarás tu código en dos archivos:

  • BankAccount.lua: Crea una clase que administre la información de la cuenta. El constructor :new(ownerName, initialBalance) debe almacenar el nombre del propietario como un campo público (owner) y el saldo como un campo privado (_balance). Incluye tres métodos:
    • :getBalance(): devuelve el saldo actual
    • :deposit(amount): suma la cantidad a _balance
    • :getOwner(): devuelve el nombre del propietario
  • main.lua: Requiere tu módulo BankAccount, lee el nombre del propietario, el saldo inicial y la cantidad del depósito desde la entrada. Crea una cuenta, realiza un depósito y después imprime el propietario y el saldo final.

Recibirás tres entradas:

  1. El nombre del propietario
  2. El saldo inicial (un número)
  3. La cantidad del depósito (un número)

Tu salida debe tener dos líneas que muestren el propietario y el saldo final después del depósito:

Owner: {ownerName}
Balance: {finalBalance}

Por ejemplo, si las entradas son Maria, 500 y 150, la salida debe ser:

Owner: Maria
Balance: 650

Recuerda: el prefijo de guion bajo en _balance indica a otros programadores que se debe acceder a este campo mediante métodos como :getBalance() y :deposit(), no directamente. El campo owner, sin guion bajo, indica que se puede acceder a él públicamente.

Pruébalo tú mismo

-- Requiere el módulo BankAccount
local BankAccount = require('BankAccount')

-- Lee las entradas
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())

-- TODO: Crea un nuevo BankAccount con ownerName e initialBalance

-- TODO: Realiza un depósito usando el depositAmount

-- TODO: Imprime el propietario y el saldo final en el formato requerido
-- Formato:
-- Owner: {ownerName}
-- Balance: {finalBalance}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online