Приватность по соглашению
Часть раздела Объектно-ориентированное программирование путешествия по 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() вызываются движком, а не вашим собственным кодом.
Задание
ЛегкоЗаверши класс 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")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript