Menu
CoddyTech
flag Ar iconالعربيةdown icon

خاص وفقًا للاتفاقية

جزء من قسم البرمجة كائنية التوجّه في رحلة 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()، وليس كودك الخاص.

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 عبر الإنترنت