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

التحقق من الصحة باستخدام دوال الضبط

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 27 من 65.

يُنفَّذ المُعيِّن في كل مرة تُسنَد فيها قيمة إلى الخاصية، ما يجعله المكان المناسب للتحقق من القيمة الجديدة. تُصدر Python خطأً عند إدخال قيمة غير صالحة. لا تدعم GDScript الاستثناءات، لذا يقوم المُعيِّن بدلًا من ذلك بأحد الأمرين: يحصر القيمة ضمن النطاق، أو يُبقي على القيمة القديمة ويسجل ما حدث من خطأ.

# character.gd
class_name Character
extends RefCounted

var last_error: String = ""
var hp: int = 100:
	set(value):
		hp = clampi(value, 0, 100)
var nickname: String = "Player":
	set(value):
		if value.length() < 3:
			last_error = "Name too short"
			return
		last_error = ""
		nickname = value

تعيد clampi(value, 0, 100) القيمة value بعد حصرها ضمن النطاق من 0 إلى 100. في المُعيِّن nickname، يؤدي return إلى الخروج قبل عملية الإسناد، لذا يبقى الاسم القديم، ويوضح last_error السبب:

# main.gd
var hero := Character.new()
hero.hp = 250
print(hero.hp) # 100
hero.nickname = "Al"
print(hero.nickname) # لاعب
print(hero.last_error) # الاسم قصير جدًا
hero.nickname = "Alice"
print(hero.nickname) # Alice

تُنفَّذ دالة الضبط أيضًا عند إجراء إسنادات داخل الصنف، في _init() وفي كل أسلوب. أسند وسائط المُنشئ عبر الخاصية، وسيتم التحقق منها أيضًا:

func _init(start_hp: int) -> void:
	hp = start_hp # يستدعي دالة الضبط: يبدأ Character.new(500) بالقيمة 100

داخل أداة الضبط نفسها، يؤدي إسناد hp إلى تخزين القيمة دون استدعاء أداة الضبط مرة أخرى. الإسناد الوحيد الذي يتجاوز أداة الضبط هو القيمة الأولية في التصريح (= 100)، لذا يجب أن تكون هذه القيمة صالحة بحد ذاتها.

challenge icon

التحدي

سهل

أضف التحقق من الصحة إلى الصنف Thermostat في الملف thermostat.gd باستخدام دوال الضبط:

  • لا يقبل target (الذي يبدأ عند 20) إلا القيم من 10 إلى 30. لأي قيمة أخرى، يحتفظ بالقيمة القديمة للهدف ويضبط last_error على Target must be between 10 and 30.
  • لا يقبل mode (الذي يبدأ عند off) إلا heat وcool وoff. لأي نص آخر، يحتفظ بالقيمة القديمة للوضع ويضبط last_error على Unknown mode: متبوعًا بالنص.
  • تُعيد أي عملية إسناد صالحة ضبط last_error إلى سلسلة فارغة.
  • تُسند _init(start_target) القيمة start_target إلى target، ليُجري دالة الضبط التحقق منها.

تقرأ الشيفرة المقدمة الهدف الابتدائي، ثم عدد الأوامر، ثم أمرًا واحدًا في كل سطر (target 25 أو mode cool). بعد إنشاء منظم الحرارة وبعد كل أمر، تطبع Rejected: والخطأ عندما لا تكون last_error فارغة، ثم تطبع الحالة. عند البدء بالقيمة 22 وتنفيذ الأمرين target 35 وmode cool، تطبع:

Target 22, mode off
Rejected: Target must be between 10 and 30
Target 22, mode off
Target 22, mode cool

ضع شيفرتك في thermostat.gd. يحتوي main.gd على شيفرة الإدخال والإخراج المقدمة، ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# شيفرة الإدخال/الإخراج المقدَّمة: اتركها كما هي
	var thermostat := Thermostat.new(int(OS.read_string_from_stdin()))
	report(thermostat)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "target":
			thermostat.target = int(parts[1])
		else:
			thermostat.mode = parts[1]
		report(thermostat)

func report(thermostat: Thermostat) -> void:
	if thermostat.last_error != "":
		print("Rejected: " + thermostat.last_error)
	print("Target %d, mode %s" % [thermostat.target, thermostat.mode])
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت