خاص وفقًا للاتفاقية
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 13 من 65.
لا تحتوي GDScript على الكلمة المفتاحية private: إذ يمكن الوصول إلى كل خاصية وطريقة في الكائن من نصوص برمجية أخرى. convention في 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)ما إذا كان طولcandidate6 أحرف على الأقل - تغيّر
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تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت