Menu
CoddyTech

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 > 0

Cá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()) # 50

Dấ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.

challenge icon

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ết attempt có 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ết candidate có ít nhất 6 ký tự hay không
  • change_password(old_password, new_password) đổi mật khẩu và chỉ trả về true khi old_password chí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 granted

Viế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")
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 GDScript online