Mixins بسيطة
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 51 من 70.
يتيح لك التركيب وضع الكائنات داخل كائنات أخرى. لكن ماذا لو أردت مشاركة السلوك بين الفئات غير المرتبطة؟
قد يحتاج كلٌّ من Player وMenuItem إلى method باسم :describe()، لكنهما لا يشتركان في parent class. وهنا يأتي دور mixins.
mixin هو ببساطة جدول يحتوي على دوال. أنت «تخلط» هذه الدوال في class من خلال نسخها إليه:
local Printable = {}
function Printable:describe()
print("Object: " .. tostring(self))
end
function Printable:log(message)
print("[LOG] " .. message)
endلتطبيق mixin على class، تنسخ كل function من جدول mixin إلى جدول class:
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()بعد تطبيق mixin، يمكن لأي مثيل من Player استدعاء تلك الأساليب كما لو كانت معرّفة مباشرةً على class:
local p = setmetatable({}, Player)
p:log("Player created") -- [LOG] تم إنشاء Playerعلى عكس الوراثة، لا تنشئ mixins علاقة بين الوالد والطفل. أنت ببساطة تنسخ الدوال من جدول إلى آخر.
وهذا يجعل mixins مثالية لمشاركة السلوكيات المساعدة، مثل التسجيل أو التسلسل أو methods الوصف، بين الفئات التي لا تشترك في أي شيء آخر.
التحدي
سهللنبنِ نظامًا للوسوم باستخدام mixins! ستنشئ mixin باسم Taggable يمكن تطبيقه على أي class، مما يمنح الكائنات القدرة على إدارة مجموعة من الوسوم، وهو أمر مفيد لتصنيف العناصر أو المنشورات أو أي كيان يحتاج إلى تسميات.
ستنظّم code الخاص بك عبر ثلاثة ملفات:
Taggable.lua: أنشئ جدول mixin يحتوي على طريقتين::addTag(tag): تضيف وسمًا إلىself.tags(بافتراض أن الجدول موجود):listTags(): تطبع جميع الوسوم بالتنسيقTags: tag1, tag2, tag3(أوTags: noneإذا كان فارغًا)
Article.lua: أنشئ class باسم Article مع constructor هو:new(title)يخزّن العنوان ويهيّئ جدولtagsفارغًا. طبّق mixin Taggable لمنح كائنات Article إمكانات التعامل مع الوسوم. أدرج طريقة:getTitle()التي تعيد عنوان المقالة.main.lua: اكتب دالة المساعدةapplyMixinهنا (ستستخدمها في Article.lua عبر require). ثم اقرأ المدخلات الخاصة بعنوان مقالة ووسمين. أنشئ Article، وأضف الوسمين إليه، واطبع العنوان، ثم اعرض جميع الوسوم.
ستتلقى ثلاث مدخلات:
- عنوان المقالة (سلسلة نصية)
- الوسم الأول المراد إضافته (سلسلة نصية)
- الوسم الثاني المراد إضافته (سلسلة نصية)
يجب أن يعرض الناتج عنوان المقالة متبوعًا بوسومها:
Title: {title}
Tags: {tag1}, {tag2}على سبيل المثال، إذا كانت المدخلات هي Lua Basics وprogramming وtutorial، فيجب أن يكون الناتج:
Title: Lua Basics
Tags: programming, tutorialتذكّر: تعمل طرق mixin لأن كائنات Article تحتوي على جدول tags الذي يمكن لطرق mixin العمل عليه. لا ينشئ mixin هذا الجدول. بل ينشئه Article constructor. يوفّر mixin فقط السلوك المشترك!
جرّب بنفسك
-- الملف الرئيسي لنظام الوسوم
local Taggable = require('Taggable')
local Article = require('Article')
-- TODO: نفّذ الدالة applyMixin
-- يجب أن تنسخ هذه الدالة جميع الطرق من جدول mixin إلى جدول target
function applyMixin(target, mixin)
-- TODO: مر عبر الـ mixin وانسخ كل طريقة إلى target
end
-- اقرأ المدخلات
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 عبر الإنترنت