Menu
CoddyTech

命名约定

本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 43 课,共 70 课。

在 Lua 中,默认情况下,所有表字段都可以公开访问。任何人都可以直接读取或修改 self.health。虽然 Lua 不强制执行隐私限制,但程序员会使用命名约定来表达意图:指出哪些字段应被视为内部实现细节。

标准约定是在私有字段前加上下划线:

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 在技术上仍然可以访问。不过,它会明确提醒其他程序员(也提醒未来的你):“这个字段应该是私有的。请改用方法访问它。”

这个约定很重要,因为它将接口(其他人应该使用的内容)与实现(内部的工作方式)分开。如果你之后需要添加验证或更改健康值的存储方式,只需修改方法:使用 :getHealth() 的代码仍然可以照常运行。

challenge icon

挑战

简单

让我们来构建一个 BankAccount 类,使用下划线命名约定,明确标示哪些字段应为私有字段!

你要把代码分成两个文件:

  • BankAccount.lua:创建一个用于管理账户信息的类。构造函数 :new(ownerName, initialBalance) 应将账户所有者的姓名存储为公有字段(owner),并将余额存储为私有字段(_balance)。添加三个方法:
    • :getBalance():返回当前余额
    • :deposit(amount):将金额加到 _balance
    • :getOwner():返回账户所有者的姓名
  • main.lua:引入你的 BankAccount 模块,从输入中读取账户所有者的姓名、初始余额和存款金额。创建账户,存入一笔款项,然后打印账户所有者和最终余额。

你会收到三个输入:

  1. 账户所有者的姓名
  2. 初始余额(一个数字)
  3. 存款金额(一个数字)

输出应为两行,显示账户所有者以及存款后的最终余额:

Owner: {ownerName}
Balance: {finalBalance}

例如,如果输入是 Maria、500 和 150,输出应为:

Owner: Maria
Balance: 650

请记住:_balance 前面的下划线表示应通过 :getBalance() 和 :deposit() 这样的方法访问该字段,而不是直接访问,这是在提醒其他程序员。没有下划线的 owner 字段则表示可以公开访问。

亲手试试

-- 加载 BankAccount 模块
local BankAccount = require('BankAccount')

-- 读取输入
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())

-- TODO: 使用 ownerName 和 initialBalance 创建一个新的 BankAccount 对象

-- TODO: 使用 depositAmount 存款

-- TODO: 按要求的格式输出账户所有者和最终余额
-- 格式:
-- Owner: {ownerName}
-- Balance: {finalBalance}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Lua 在线编译器