دالات التعيين (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) - فهي تنشئ نقطة واحدة تتحكم من خلالها في كيفية تغيير البيانات، مما يجعل كائناتك أكثر أماناً وأسهل في الصيانة.
التحدي
سهللنقم ببناء فئة Thermostat تستخدم طرق التعيين (setter methods) للتحكم في درجة الحرارة بطريقة ذكية. بدلاً من السماح بأي قيمة لدرجة الحرارة، سيقوم منظم الحرارة الخاص بك بفرض حدود معقولة — مما يحافظ على درجة الحرارة ضمن نطاق مريح.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Thermostat.lua: قم بتعريف فئةThermostatالخاصة بك باستخدام نمط النموذج الأولي القياسي (prototype pattern). يجب على كل منظم حرارة تتبعtemperatureالحالية الخاصة به. قم بتضمين:- منشئ
:new()يقوم بتهيئة درجة الحرارة إلى20(قيمة افتراضية مريحة) - طريقة جلب
:getTemperature()تعيد درجة الحرارة الحالية - طريقة تعيين
:setTemperature(newTemp)تقوم بتحديث درجة الحرارة، ولكن تبقيها ضمن الحدود: الحد الأدنى10والحد الأقصى30
- منشئ
main.lua: قم باستدعاء وحدة Thermostat الخاصة بك وإنشاء مثيل لمنظم الحرارة. استخدم طريقة التعيين لمحاولة تغييرات مختلفة في درجات الحرارة وملاحظة كيفية فرض الحدود.
يجب أن تفرض طريقة :setTemperature() الخاصة بك هذه القواعد:
- إذا كانت درجة الحرارة الجديدة أقل من
10، فقم بضبطها على10 - إذا كانت درجة الحرارة الجديدة أعلى من
30، فقم بضبطها على30 - خلاف ذلك، قم بضبطها على القيمة المطلوبة
ستتلقى مدخلين:
- درجة الحرارة الأولى المراد ضبطها
- درجة الحرارة الثانية المراد ضبطها
في ملفك الرئيسي، قم بإنشاء منظم حرارة، ثم:
- اطبع درجة الحرارة الأولية
- اضبط درجة الحرارة على قيمة المدخل الأول واطبع النتيجة
- اضبط درجة الحرارة على قيمة المدخل الثاني واطبع النتيجة
اطبع كل درجة حرارة في سطر خاص بها (الرقم فقط).
على سبيل المثال، إذا كانت المدخلات هي 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 وطباعة النتيجة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال