פרטיים לפי מוסכמה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין