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