اهلا بكم في درس جديد وهو الأصناف `classes` وترجمتها الحرفية هي فئات او أصناف.
الأصناف هي بداية او مدخل البرمجة الشيئية او برمجة كائنية التوجه, اختصارها هو OOP
في الحقيقة لن نتعمق بها حاليًا في سلسلة الأساسيات هذه، لكننا قد نتعمق بها في سلاسل متقدمة بإذن الله, كل ما اريده منك هو ان تفهم الـ class كمفهوم عام فقط لانه في السلاسل القادمة ستتعمق فيها هي والـ class_name
- ملحوظة: في godot لا نستخدم الـ class بشكل مباشر لكن نستخدم مفهومه
نحن نستخدم أمورًا كثيرا بديلة عنه ومثل مفهومة
وهم الـ Nodes, Script, Scene, class_name
عناصر المقال
ما هو الـ OOP
الـ oop او البرمجة كائنية التوجه, كمفهوم فهو يسمح لك بتصنيف الأشياء الجديدة في البرمجة, على سبيل المثال البرنامج لا يفهم ما هو العدو, البرمجة بشكل عام لا تعرف شيء يدعى “عدو”, انه مصطلح نستعمله نحن البشر، لكن البرنامج لن يعرفه الأمر مماثل للسيارات, البرنامج لا يعرف شيء يدعى سيارة, بمعنى اخر, أي شيء نفهمه نحن البشر, البرنامج لن يفهمه.
فلذلك نحتاج لشيء لوصفه للبرنامج ليعرف كيف يتعامل معاه, هنا يأتي دور (الأصناف) هو الذي من خلاله نصف للبرنامج الشيء الغريب عليه ونبدأ في وصفه, نصفه أي نعطيه خواص وافعال وهي المتغيرات التي تمثل خواصه الدوال التي ستمثل الأفعال.
لنأخذ مثال، نحن نريد أن نصف للبرنامج ما هو العدو
class Enemy:
var name : string
الـ class هو كحاوية يحتوي على المتغيرات والدوال التي تصف الشيء, هنا انشأت تصنيف جديد يدعى Enemy وكتبت بداخله متغير وحيد يعبر عن خواصه كالإسم name وطبعا نوعه نص
فالتصنيف هو يمثل خواص العدو, يمكنك ان تكتب بداخله أي متغيرات تعبر عنه كما تشاء, مثل قوته ونوع ذلك العدو ومقدار الصحة خاصته, او حتى سرعة حركته
كيف نستخدم الكلاس
class Enemy:
var name : string
func _ready():
var e = Enemy.new()
e.name = "zombie"
هنا في دالة الـ _ready()
كتبنا var e = Enemy.new()
هذا معناه انك قمت بعمل متغير e من نوع Enemy, والمتغير name الذي داخل التصنيف نستطيع الوصول اليه عن طريق النقطة مثل السطر الاخير
فهنا اسندت قيمة للمتغير name الذي بداخل e, وعندما تنشئ متغير من تصنيف, هنا المتغير يسمى كائن, مثال اخر
class Enemy:
var name : string
var heartPoint : int
func _ready():
var e1 = Enemy.new()
e1.name = "zombie"
e1.heartPoint = 20
# كائن اخر
var e2 = Enemy.new()
e2.name = "samurai"
e2.heartPoint = 15
كما تلاحظ لقد انشأت كائنين ــ تم حفظهم في متغيرين ــ من النوع Enemy وكل كائن أعطيناه خواص مختلفة, بالتالي يمكنك إنشاء أي عدد تريده من الكائنات
الدوال داخل الكلاس
class Enemy:
var name : string
var heartPoint : int
func printData():
print(name +' '+ heartPoint)
func _ready():
var e = Enemy.new()
e.name = "zombie"
e.heartPoint = 20
e.printData() # it will print: zombie 20
كما ترى فيمكنك إنشاء دوال داخل التصنيف فالأمر لا يختصر على المتغيرات فقط بل يمكنك إنشاء عدة دوال.
في الحقيقة لا اريد ان اتعمق كثيرا فيه لاننا لن نستخدمه بشكل مباشر لكن نحن نستخدم أمورًا بديلة عنه كما قلت سابقا ــ منها النصوص ــ مع انه نوع بيانات الا انه تصنيف.
في الحقيقة الـ class كأنك تنشيء نوع بيانات جديد خاص لك
func _ready():
var name : string = "Ahmed"
print(name.size()) # it will print 5
var arr := [1, 2, 3, 4]
var n := arr.size()
var first := arr.back()
var last := arr.front()
لقد عرفت أن المصفوفة لها دوال داخلها ــ مثل الـ size ــ هل لاحظت اننا نستخدم dot للوصول للدوال التي بداخلها؟
الأمر مثله مع المصفوفات, فمن أين جاءت الدوال size, front, back, append ؟
المصفوفات تم تصميمها من الـ class, في الحقيقة أغلب الأمور التي سنتعامل معها ستكون عبارة عن أصناف تم برمجتها مسبقا أي أصناف جاهزة built-in class
لذلك أقول إن مفهومه مهم جدا، أي هو جهاز متكامل تبرمجه كما تشاء وتضيف فيه المتغيرات والدوال وما تريده لوصف وانشاء ما تريده
خاتمة
هكذا تكون دورة أساسيات لغة GDscript انتهيت, مازال يوجد الكثير والكثير الذي يمكن ان يقال حول اللغة, ومازال هناك الكثير من الاشياء التي يوفرها محرك Godot نفسه ووضعها في لغة GDscript, ولكن تلك لن تدخل في تفصيلها الا في دورة خاصة بمحرك غودو.