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 אונליין