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

دالات التعيين (Setter Methods)

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

تتيح لك دوال الجلب (Getter methods) قراءة البيانات الداخلية من خلال نقطة وصول خاضعة للتحكم. أما دوال التعيين (Setter methods) (والتي تُسمى أيضاً دوال التعديل أو mutator methods) فهي تقوم بالعكس—حيث توفر طريقة خاضعة للتحكم لتعديل الحالة الداخلية.

بدلاً من تعيين car.speed = 50 بشكل مباشر، يمكنك استدعاء car:setSpeed(50):

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

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

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

الآن، تمر كل عملية تغيير للسرعة عبر منطق التحقق الخاص بك. أي كود يستخدم :setSpeed() يستفيد تلقائياً من هذه الفحوصات دون تعديل. هذه هي القيمة الحقيقية للمُعينات (setters) - فهي تنشئ نقطة واحدة تتحكم من خلالها في كيفية تغيير البيانات، مما يجعل كائناتك أكثر أماناً وأسهل في الصيانة.

challenge icon

التحدي

سهل

لنقم ببناء فئة Thermostat تستخدم طرق التعيين (setter methods) للتحكم في درجة الحرارة بطريقة ذكية. بدلاً من السماح بأي قيمة لدرجة الحرارة، سيقوم منظم الحرارة الخاص بك بفرض حدود معقولة — مما يحافظ على درجة الحرارة ضمن نطاق مريح.

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

  • Thermostat.lua: قم بتعريف فئة Thermostat الخاصة بك باستخدام نمط النموذج الأولي القياسي (prototype pattern). يجب على كل منظم حرارة تتبع temperature الحالية الخاصة به. قم بتضمين:
    • منشئ :new() يقوم بتهيئة درجة الحرارة إلى 20 (قيمة افتراضية مريحة)
    • طريقة جلب :getTemperature() تعيد درجة الحرارة الحالية
    • طريقة تعيين :setTemperature(newTemp) تقوم بتحديث درجة الحرارة، ولكن تبقيها ضمن الحدود: الحد الأدنى 10 والحد الأقصى 30
  • main.lua: قم باستدعاء وحدة Thermostat الخاصة بك وإنشاء مثيل لمنظم الحرارة. استخدم طريقة التعيين لمحاولة تغييرات مختلفة في درجات الحرارة وملاحظة كيفية فرض الحدود.

يجب أن تفرض طريقة :setTemperature() الخاصة بك هذه القواعد:

  • إذا كانت درجة الحرارة الجديدة أقل من 10، فقم بضبطها على 10
  • إذا كانت درجة الحرارة الجديدة أعلى من 30، فقم بضبطها على 30
  • خلاف ذلك، قم بضبطها على القيمة المطلوبة

ستتلقى مدخلين:

  1. درجة الحرارة الأولى المراد ضبطها
  2. درجة الحرارة الثانية المراد ضبطها

في ملفك الرئيسي، قم بإنشاء منظم حرارة، ثم:

  1. اطبع درجة الحرارة الأولية
  2. اضبط درجة الحرارة على قيمة المدخل الأول واطبع النتيجة
  3. اضبط درجة الحرارة على قيمة المدخل الثاني واطبع النتيجة

اطبع كل درجة حرارة في سطر خاص بها (الرقم فقط).

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

20
25
30

لاحظ كيف أدت المحاولة الثانية لضبط 50 إلى النتيجة 30 — حيث تفرض طريقة التعيين الحد الأقصى تلقائيًا!

ورقة مرجعية

توفر دوال التعيين (Setter methods) طريقة محكومة لتعديل الحالة الداخلية، مما يسمح لك بإضافة قواعد التحقق من الصحة والقيود.

بنية دالة التعيين الأساسية:

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

تفرض دوال التعيين مع التحقق من الصحة (Validation) قواعد معينة عند تغيير البيانات:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

يؤدي الجمع بين دوال الجلب (Getters) ودوال التعيين (Setters) إلى إنشاء وصول محكوم لخصائص الكائن:

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

function Car:getSpeed()
    return self.speed
end

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

جرّب بنفسك

-- استدعاء وحدة منظم الحرارة (Thermostat)
local Thermostat = require('Thermostat')

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

-- TODO: إنشاء مثيل لمنظم الحرارة

-- TODO: طباعة درجة الحرارة الأولية

-- TODO: ضبط درجة الحرارة على temp1 وطباعة النتيجة

-- TODO: ضبط درجة الحرارة على temp2 وطباعة النتيجة
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming