Mixins بسيطة
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 51 من 70.
يتيح لك التركيب وضع كائنات داخل كائنات أخرى. ولكن ماذا لو أردت مشاركة السلوك بين فئات غير مترابطة؟
قد يحتاج كلٌّ من Player وMenuItem إلى طريقة :describe()، لكنهما لا يشتركان في فئة أب. وهنا يأتي دور المزيجات.
المزيج هو ببساطة جدول يحتوي على دوال. أنت «تمزج» هذه الدوال في فئة بنسخها إليها:
local Printable = {}
function Printable:describe()
print("Object: " .. tostring(self))
end
function Printable:log(message)
print("[LOG] " .. message)
endلتطبيق هذا المزيج على صنف، انسخ كل دالة من جدول المزيج إلى جدول الصنف:
local function applyMixin(class, mixin)
for key, value in pairs(mixin) do
class[key] = value
end
end
local Player = {}
Player.__index = Player
applyMixin(Player, Printable) -- الآن يمتلك Player الدالتين :describe() و :log()بعد تطبيق المزيج، يمكن لأي مثيل من Player استدعاء تلك الأساليب كما لو كانت معرّفة مباشرةً في الصنف:
local p = setmetatable({}, Player)
p:log("Player created") -- [LOG] تم إنشاء Playerعلى عكس الوراثة، لا تُنشئ المزائج علاقة بين أب وطفل. فأنت ببساطة تنسخ الدوال من جدول إلى آخر.
وهذا يجعل المزيجات مثالية لمشاركة السلوكيات المساعدة، مثل التسجيل أو التسلسل أو أساليب الوصف، بين الفئات التي لا يجمعها شيء آخر.
التحدي
سهللننشئ نظامًا للوسوم باستخدام المزيجات! ستنشئ مزيجًا باسم Taggable يمكن تطبيقه على أي صنف، ما يمنح الكائنات القدرة على إدارة مجموعة من الوسوم، وهو أمر مفيد لتصنيف العناصر أو المنشورات أو أي كيان يحتاج إلى تسميات.
ستنظّم شيفرتك في ثلاثة ملفات:
Taggable.lua: أنشئ جدول مزيج يحتوي على طريقتين::addTag(tag): تضيف وسمًا إلىself.tags(مع افتراض وجود الجدول):listTags(): تطبع جميع الوسوم بالتنسيقTags: tag1, tag2, tag3(أوTags: noneإذا كان فارغًا)
Article.lua: أنشئ صنفًا باسم Article مع مُنشئ:new(title)يخزّن العنوان ويهيّئ جدولtagsفارغًا. أضف الطريقة:getTitle()التي تُعيد عنوان المقالة.main.lua: اكتب الدالة المساعدةapplyMixinهنا، ثم طبّق المزيج باستخدامapplyMixin(Article, Taggable)لمنح مثيلات Article إمكانات إضافة الوسوم. بعد ذلك، اقرأ مدخلات عنوان المقالة ووسمين. أنشئ مقالة، وأضف إليها الوسمين، واطبع العنوان، ثم اعرض جميع الوسوم.
ستتلقى ثلاثة مدخلات:
- عنوان المقالة (نص)
- الوسم الأول المراد إضافته (نص)
- الوسم الثاني المراد إضافته (نص)
ينبغي أن يعرض ناتجك عنوان المقالة متبوعًا بوسومها:
Title: {title}
Tags: {tag1}, {tag2}على سبيل المثال، إذا كانت المدخلات هي Lua Basics وprogramming وtutorial، فينبغي أن يكون الناتج:
Title: Lua Basics
Tags: programming, tutorialتذكّر: تعمل طرق المزيج لأن مثيلات Article تحتوي على جدول tags يمكن لطرق المزيج التعامل معه. لا ينشئ المزيج هذا الجدول؛ بل ينشئه مُنشئ Article. يوفّر المزيج السلوك المشترك فحسب!
جرّب بنفسك
-- الملف الرئيسي لنظام الوسوم
local Taggable = require('Taggable')
local Article = require('Article')
-- TODO: نفّذ الدالة applyMixin
-- يجب أن تنسخ هذه الدالة جميع التوابع من جدول mixin إلى جدول target
function applyMixin(target, mixin)
-- TODO: مرّ على عناصر mixin وانسخ كل تابع إلى target
end
-- TODO: طبّق المكوّن Taggable على Article باستخدام applyMixin
-- اقرأ المدخلات
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()
-- TODO: أنشئ كائن Article بالعنوان المُعطى
-- TODO: أضف كلا الوسمين إلى المقالة
-- TODO: اطبع العنوان بالتنسيق: Title: {title}
-- TODO: اعرض جميع الوسوم باستخدام التابع listTags
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال9التركيب و Mixins
علاقة "يحتوي على" (Has-A)التفويض (Delegation)Mixins بسيطةتطبيق Mixins متعددةMixins مقابل الوراثةملخص - تجميع الروبوتتدرّب بنفسك: مترجم Lua عبر الإنترنت