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
endDấ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ũ.
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:
- Tên chủ tài khoản
- Số dư ban đầu (một số)
- 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: 650Hã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}
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
1Khái niệm “self”
Bảng với hàm“self” tường minhCú pháp dấu hai chấmDấu chấm và dấu hai chấmÔn tập: Điểm chuyển động4Dự án: Ngân hàng số
Thiết lập dự ánPhương thức nạp tiền2Mẫu Prototype cho lớp
Khái niệm PrototypeLiên kết bằng __indexHàm khởi tạo :new()Khởi tạo thuộc tínhCác instance độc lậpÔn tập: Nhà máy ô tô5Nạp chồng toán tử trong OOP
Cộng các đối tượngTrừ các đối tượngNối các đối tượngSo sánh các đối tượng (<, >)Ôn tập: phép tính với ví tiền8Đóng gói
Quy ước đặt tênClosure để bảo mậtTruy cập qua closureBảng chỉ đọcLogic kiểm tra hợp lệTổng kết: Két an toàn11Mẫu thiết kế (cơ bản)
Hàm tạo đối tượngBảng SingletonMẫu IteratorObserver (Listener)Ôn tập: Factory Logger3Trạng thái và hành vi của đối tượng
Biến instancePhương thức getterPhương thức setterThuộc tính tính toánĐịnh dạng chuỗiKiểm tra tính bằng nhauÔn tập: điểm số học sinh6Cơ bản về kế thừa
Thiết lập kế thừaKế thừa phương thứcMở rộng hàm khởi tạoThêm phương thức cho lớp conDùng chung và riêngÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch Lua online