Quy ước về tính riêng tư
Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 13 trên 65.
GDScript không có từ khóa private: các thuộc tính và phương thức của một đối tượng đều có thể được truy cập từ những script khác. Quy ước của Godot là thêm dấu gạch dưới ở đầu tên. _coins và _is_valid() bên dưới chỉ dành cho code của chính lớp này:
# wallet.gd
class_name Wallet
extends RefCounted
var _coins: int = 0
func add(amount: int) -> void:
if _is_valid(amount):
_coins += amount
func spend(amount: int) -> bool:
if not _is_valid(amount) or amount > _coins:
return false
_coins -= amount
return true
func get_coins() -> int:
return _coins
func _is_valid(amount: int) -> bool:
return amount > 0Các script khác sử dụng những phương thức công khai, và chúng kiểm tra mọi thay đổi: spend() từ chối lấy nhiều xu hơn số xu trong ví, vì vậy số xu không bao giờ giảm xuống dưới không.
var wallet := Wallet.new()
wallet.add(50)
wallet.add(-20)
print(wallet.spend(80)) # false
print(wallet.get_coins()) # 50Dấu gạch dưới là một lời hứa, không phải ổ khóa: wallet._coins = -999 vẫn chạy mà không gây ra lỗi nào. Việc giữ lời hứa tùy thuộc vào người viết các tập lệnh khác, vì vậy đừng đọc hoặc thay đổi các thành viên có dấu gạch dưới từ bên ngoài lớp của chúng.
Bạn đã biết hai tên có dấu gạch dưới của Godot: _ready() và _init(). Bộ máy (engine) gọi chúng, không phải code của bạn.
Thử thách
DễHoàn thành lớp (class) User trong user.gd. Lớp này lưu mật khẩu trong thuộc tính riêng tư _password, và chỉ code của chính lớp mới truy cập thuộc tính đó.
- Hàm khởi tạo lưu mật khẩu ban đầu
check_password(attempt)trả về kết quả cho biếtattemptcó khớp với mật khẩu hay không_is_strong(candidate), một hàm hỗ trợ riêng tư, trả về kết quả cho biếtcandidatecó ít nhất6ký tự hay khôngchange_password(old_password, new_password)đổi mật khẩu và chỉ trả vềtruekhiold_passwordchính xác vànew_passwordđủ mạnh. Nếu không, hàm không thay đổi gì và trả vềfalse
Code được cung cấp đọc mật khẩu ban đầu, số lệnh tiếp theo và các lệnh check PASSWORD và change OLD NEW. Với mật khẩu godot4 và các lệnh change godot4 abc, change wrong longenough và check godot4, chương trình in ra:
Password not changed
Password not changed
Access grantedViết code của bạn trong user.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
extends Node
func _ready():
# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên nhé
var user := User.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "check":
print("Access granted" if user.check_password(parts[1]) else "Access denied")
elif user.change_password(parts[1], parts[2]):
print("Password changed")
else:
print("Password not changed")
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
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớpTự luyện tập: Trình biên dịch GDScript online