Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دالات الجلب (Getter Methods)

جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 13 من 70.

لقد تعلمت كيفية تخزين البيانات في متغيرات النسخة (instance variables) مثل self.health أو self.items. بينما يمكنك الوصول إلى هذه الحقول مباشرة من خارج الكائن، هناك نهج أكثر تنظيماً: استخدام طرق الجلب (getter methods).

المُحضر (يُسمى أيضاً طريقة الوصول) هو طريقة بسيطة تُرجع قيمة داخلية. بدلاً من الوصول إلى player.health مباشرةً، يمكنك استدعاء player:getHealth():

local Player = {}
Player.__index = Player

function Player:new(name)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.health = 100
    return instance
end

function Player:getHealth()
    return self.health
end

function Player:getName()
    return self.name
end

لماذا نكلف أنفسنا عناء استخدام طريقة (method) إضافية؟ توفر دوال الجلب (Getters) نقطة وصول محكومة لبياناتك.

في الوقت الحالي، يقوم :getHealth() ببساطة بإرجاع القيمة. ولكن لاحقًا، قد ترغب في إضافة منطق—ربما إرجاع "Critical" إذا انخفضت الصحة إلى أقل من 10، أو تسجيل كل مرة يتم فيها فحص الصحة.

مع وجود الـ getter، يمكنك إجراء هذه التغييرات دون تعديل أي كود يستخدم الكائن (object).

local hero = Player:new("Luna")
print(hero:getHealth())  -- الناتج: 100
print(hero:getName())    -- الناتج: Luna

يخلق هذا النمط حدوداً واضحة بين الهيكل الداخلي للكائن وكيفية تفاعل الأكواد الأخرى معه. يطلب العالم الخارجي البيانات من خلال الأساليب (methods) بدلاً من الوصول مباشرة إلى حقول الكائن.

challenge icon

التحدي

سهل

لنقم ببناء فئة Player تستخدم طرق الجلب (getter methods) للوصول إلى بياناتها الداخلية. بدلاً من الوصول مباشرة إلى حقول اللاعب، ستقوم بإنشاء طرق توفر وصولاً متحكماً فيه لمعلومات اللاعب.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Player.lua: قم بتعريف فئة Player باستخدام نمط النموذج الأولي (prototype pattern) القياسي. يجب أن يقبل المنشئ (constructor) اسماً ويقوم بتهيئة الصحة (health) إلى 100. أضف ثلاث طرق جلب:

    • :getName() تعيد اسم اللاعب
    • :getHealth() تعيد صحة اللاعب الحالية
    • :getStatus() تعيد سلسلة نصية منسقة تجمع بين كلتا المعلومتين
  • main.lua: قم باستدعاء وحدة Player الخاصة بك وأنشئ مثيلاً (instance) للاعب. استخدم طرق الجلب لعرض معلومات اللاعب — قم بالوصول إلى كل شيء من خلال الطرق بدلاً من قراءة الحقول مباشرة.

يجب أن تعيد طريقة :getStatus() سلسلة نصية بهذا التنسيق الدقيق:

[name] has [health] HP

ستتلقى مدخلاً واحداً: اسم اللاعب.

في ملفك الرئيسي، أنشئ لاعباً بالاسم المعطى، ثم اطبع ثلاثة أسطر باستخدام طرق الجلب الخاصة بك:

  1. اسم اللاعب (باستخدام :getName())
  2. صحة اللاعب (باستخدام :getHealth())
  3. حالة اللاعب الكاملة (باستخدام :getStatus())

على سبيل المثال، إذا كان المدخل هو Luna، يجب أن يكون المخرج:

Luna
100
Luna has 100 HP

ورقة مرجعية

تُعد طريقة الجلب (getter method) (أو طريقة الوصول) طريقة تُرجع قيمة داخلية من كائن ما. فبدلاً من الوصول إلى الحقول مباشرةً، تقوم باستدعاء طريقة لاسترداد البيانات.

طرق الجلب الأساسية:

function Player:getHealth()
    return self.health
end

function Player:getName()
    return self.name
end

استخدام طرق الجلب:

local hero = Player:new("Luna")
print(hero:getHealth())  -- Output: 100
print(hero:getName())    -- Output: Luna

توفر طرق الجلب نقطة وصول محكومة لبياناتك. فهي تضع حدوداً واضحة بين الهيكل الداخلي للكائن وكيفية تفاعل الأكواد الأخرى معه. يتيح لك هذا إضافة منطق برمجياً لاحقاً (مثل التحقق من الصحة أو التسجيل) دون تعديل الكود الذي يستخدم الكائن.

جرّب بنفسك

-- استدعاء وحدة Player
local Player = require('Player')

-- قراءة المدخلات
local name = io.read()

-- TODO: إنشاء كائن لاعب بالاسم المعطى

-- TODO: طباعة اسم اللاعب باستخدام :getName()

-- TODO: طباعة صحة اللاعب باستخدام :getHealth()

-- TODO: طباعة حالة اللاعب باستخدام :getStatus()
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming