جداول للقراءة فقط
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 46 من 70.
توفر الإغلاقات خصوصية حقيقية، لكنها تتطلب تعريف الأساليب داخل المُنشئ. هناك نهج آخر لحالة استخدام مختلفة: جعل الكائن للقراءة فقط بعد إنشائه. يكون هذا مفيدًا عندما تريد أن تكون الحقول مرئية ولكن غير قابلة للتغيير، مثل إحداثيات نقطة ثابتة.
تت intercept metamethod __newindex محاولات تعيين قيم جديدة إلى جدول. ومن خلال جعله يحظر all عمليات التعيين، يمكنك تجميد object:
local ImmutablePoint = {}
function ImmutablePoint.new(x, y)
local data = {x = x, y = y}
local proxy = {}
setmetatable(proxy, {
__index = data,
__newindex = function()
error("Cannot modify immutable object")
end
})
return proxy
endالحيلة هي استخدام جدول وكيل. توجد البيانات الفعلية في data، بينما يتفاعل المستخدم مع proxy الفارغ.
عند القراءة، تجلب __index البيانات من data. وعند الكتابة، تُستدعى __newindex بدلًا من ذلك، ونحظرها:
local p = ImmutablePoint.new(10, 20)
print(p.x) -- 10 (القراءة تعمل)
p.x = 50 -- خطأ: لا يمكن تعديل كائن غير قابل للتغييرهذا النمط مفيد لكائنات الإعدادات، أو الثوابت الرياضية، أو أي بيانات ينبغي ألا تتغير أبدًا بعد التهيئة. يظل الكائن قابلًا للقراءة بالكامل. لا يمكنك تغييرَه فحسب.
التحدي
سهللنبنِ فئة ImmutableConfig تنشئ كائنات إعدادات للقراءة فقط! بعد إنشائها، يجب أن تسمح كائنات الإعدادات هذه بقراءة إعداداتها، لكنها تمنع تمامًا أي محاولات لتعديلها.
ستنظّم الشيفرة عبر ملفين:
ImmutableConfig.lua: أنشئ وحدة تنتج كائنات إعدادات مجمّدة. يجب أن تخزّن دالة.new(appName, version, maxUsers)هذه القيم الثلاث داخليًا، ثم تعيد جدولًا وسيطًا يسمح بقراءة جميع الحقول، لكنه يمنع أي تعديلات. عندما يحاول أحدهم تغيير قيمة، يجب أن تطبعError: Config is read-onlyبدلًا من رفع خطأ فعلي.main.lua: فعّل ImmutableConfig! اقرأ ثلاث مدخلات لقيم الإعدادات، وأنشئ كائن إعدادات، ثم أثبت أنه يعمل بشكل صحيح من خلال:- طباعة القيم الأصلية الثلاث
- محاولة تعديل الحقل
maxUsers(وهو ما يجب أن يطلق رسالة الخطأ) - طباعة
maxUsersمرة أخرى لإثبات أنه لم يتغير فعليًا
ستتلقى ثلاث مدخلات:
- اسم التطبيق (سلسلة نصية)
- الإصدار (سلسلة نصية)
- الحد الأقصى للمستخدمين (عدد)
يجب أن يُظهر الناتج قيم الإعدادات، والخطأ عند محاولة التعديل، والتأكيد على أن القيمة بقيت دون تغيير:
App: {appName}
Version: {version}
Max Users: {maxUsers}
Error: Config is read-only
Max Users: {maxUsers}على سبيل المثال، إذا كانت المدخلات هي MyApp و2.0 و100، فيجب أن يكون الناتج:
App: MyApp
Version: 2.0
Max Users: 100
Error: Config is read-only
Max Users: 100تذكّر: يستخدم نمط الجدول الوسيط جدولًا فارغًا يتفاعل معه المستخدم، بينما توجد البيانات الفعلية في جدول داخلي منفصل. تستجلب دالة metamethod __index البيانات من جدول البيانات، وتعترض __newindex أي محاولات كتابة (وتمنعها)!
جرّب بنفسك
-- استيراد وحدة ImmutableConfig
local ImmutableConfig = require('ImmutableConfig')
-- اقرأ المدخلات
local appName = io.read()
local version = io.read()
local maxUsers = tonumber(io.read())
-- TODO: أنشئ كائن config باستخدام ImmutableConfig.new()
-- TODO: اطبع القيم الأصلية الثلاث بالتنسيق:
-- التطبيق: {appName}
-- الإصدار: {version}
-- أقصى المستخدمين: {maxUsers}
-- TODO: حاول تعديل حقل maxUsers (هذا يجب أن يطلق رسالة خطأ)
-- TODO: اطبع maxUsers مرة أخرى لإثبات أنه لم يتغير
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت