Menu
CoddyTech

Приватность по соглашению

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 13 из 65.

В GDScript нет ключевого слова private: к каждому свойству и методу объекта можно обратиться из других скриптов. В Godot принято использовать подчёркивание в начале имени. Приведённые ниже _coins и _is_valid() предназначены только для кода самого класса:

# 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

Другие скрипты используют общедоступные методы, и те проверяют каждое изменение: spend() отказывается снимать больше монет, чем есть в кошельке, поэтому количество монет никогда не становится меньше нуля.

var wallet := Wallet.new()
wallet.add(50)
wallet.add(-20)
print(wallet.spend(80)) # false
print(wallet.get_coins()) # 50

Подчёркивание — это обещание, а не блокировка: wallet._coins = -999 выполняется без ошибок. Соблюдение обещания зависит от тех, кто пишет остальные скрипты, поэтому не читай и не изменяй члены с подчёркиванием за пределами их класса.

Вы уже знаете два имени с подчёркиванием из самого Godot: _ready() и _init() вызываются движком, а не вашим собственным кодом.

challenge icon

Задание

Легко

Заверши класс User в user.gd. Он хранит пароль в закрытом свойстве _password, и обращаться к нему может только его собственный код.

  • Конструктор сохраняет начальный пароль
  • check_password(attempt) возвращает, совпадает ли attempt с паролем
  • _is_strong(candidate), закрытый вспомогательный метод, возвращает, содержит ли candidate не менее 6 символов
  • change_password(old_password, new_password) меняет пароль и возвращает true только в том случае, если old_password верен, а new_password достаточно надёжен. В противном случае метод ничего не меняет и возвращает false

Предоставленный код считывает начальный пароль, количество последующих команд и команды check PASSWORD и change OLD NEW. Для пароля godot4 и команд change godot4 abc, change wrong longenough и check godot4 он выводит:

Password not changed
Password not changed
Access granted

Твой код нужно поместить в user.gd. В main.gd находится предоставленный код ввода/вывода, его нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода/вывода: оставьте его без изменений
	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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript