Menu
CoddyTech

Quy ước đặt tên

Thuộc phần Lập trình hướng đối tượng trong hành trình Lua của Coddy. Bài học 43 trên 70.

Trong Lua, theo mặc định, mọi trường trong bảng đều có thể được truy cập công khai. Bất kỳ ai cũng có thể đọc hoặc sửa đổi trực tiếp self.health. Lua không áp đặt tính riêng tư, nhưng lập trình viên dùng quy ước đặt tên để thể hiện ý định: cho biết trường nào nên được xem là chi tiết triển khai nội bộ.

Theo quy ước thông thường, tên các trường riêng tư bắt đầu bằng dấu gạch dưới:

local Player = {}
Player.__index = Player

function Player:new(name)
    local obj = {
        name = name,      -- Công khai: có thể truy cập trực tiếp
        _health = 100,    -- Riêng tư: thay vào đó, dùng phương thức
        _score = 0        -- Riêng tư: theo dõi nội bộ
    }
    setmetatable(obj, Player)
    return obj
end

function Player:getHealth()
    return self._health
end

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

Dấu gạch dưới không làm thay đổi cách Lua hoạt động: player._health vẫn có thể truy cập về mặt kỹ thuật. Tuy nhiên, nó là lời cảnh báo rõ ràng cho những lập trình viên khác (và chính bạn trong tương lai): “Thuộc tính này được dùng riêng tư. Thay vào đó, hãy truy cập thuộc tính này thông qua các phương thức.”

Quy ước này rất quan trọng vì nó tách biệt giao diện (những gì người khác nên dùng) với phần triển khai (cách hoạt động bên trong). Nếu sau này bạn cần thêm bước kiểm tra tính hợp lệ hoặc thay đổi cách lưu trữ sức khỏe, bạn chỉ cần sửa các phương thức: code sử dụng :getHealth() vẫn hoạt động như cũ.

challenge icon

Thử thách

Dễ

Hãy tạo một lớp BankAccount dùng quy ước đặt tên với dấu gạch dưới để báo hiệu rõ những trường nào nên là riêng tư!

Bạn sẽ sắp xếp code trong hai tệp:

  • BankAccount.lua: Tạo một lớp quản lý thông tin tài khoản. Hàm khởi tạo :new(ownerName, initialBalance) sẽ lưu tên chủ tài khoản vào trường công khai (owner) và số dư vào trường riêng tư (_balance). Thêm ba phương thức:
    • :getBalance(): trả về số dư hiện tại
    • :deposit(amount): cộng số tiền đó vào _balance
    • :getOwner(): trả về tên chủ tài khoản
  • main.lua: Nạp module BankAccount, đọc tên chủ tài khoản, số dư ban đầu và số tiền gửi từ đầu vào. Tạo một tài khoản, gửi tiền, sau đó in ra tên chủ tài khoản và số dư cuối cùng.

Bạn sẽ nhận ba đầu vào:

  1. Tên chủ tài khoản
  2. Số dư ban đầu (một số)
  3. Số tiền gửi (một số)

Đầu ra gồm hai dòng, hiển thị tên chủ tài khoản và số dư cuối cùng sau khi gửi tiền:

Owner: {ownerName}
Balance: {finalBalance}

Ví dụ, nếu đầu vào là Maria, 500 và 150, đầu ra sẽ là:

Owner: Maria
Balance: 650

Hãy nhớ: tiền tố dấu gạch dưới trong _balance báo hiệu cho các lập trình viên khác rằng nên truy cập trường này thông qua các phương thức như :getBalance() và :deposit(), thay vì truy cập trực tiếp. Trường owner không có dấu gạch dưới cho biết bạn có thể truy cập công khai.

Tự làm thử

-- Nạp module BankAccount bằng require
local BankAccount = require('BankAccount')

-- Đọc các giá trị đầu vào
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())

-- TODO: Tạo BankAccount mới với ownerName và initialBalance

-- TODO: Gửi tiền bằng depositAmount

-- TODO: In ra chủ tài khoản và số dư cuối cùng theo định dạng yêu cầu
-- Định dạng:
-- Owner: {ownerName}
-- Balance: {finalBalance}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Lua online