Menu
Coddy logo textTech

מיקסינים פשוטים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 51 מתוך 70.

הרכבה מאפשרת לך לשים אובייקטים בתוך אובייקטים אחרים. אבל מה אם תרצה לשתף התנהגות בין מחלקות שאינן קשורות?

ייתכן שגם ל־Player וגם ל־MenuItem תידרש מתודת :describe(), אבל אין להם מחלקת אב משותפת. כאן נכנסים לתמונה mixins.

mixin היא פשוט טבלה שמכילה פונקציות. את הפונקציות האלה "מערבבים" לתוך מחלקה באמצעות העתקתן אליה:

local Printable = {}

function Printable:describe()
    print("Object: " .. tostring(self))
end

function Printable:log(message)
    print("[LOG] " .. message)
end

כדי להחיל את ה-mixin הזה על מחלקה, מעתיקים כל פונקציה מטבלת ה-mixin לטבלת המחלקה:

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 נוצר

בניגוד לירושה, מיקסינים אינם יוצרים קשר של הורה וילד. פשוט מעתיקים פונקציות מטבלה אחת לאחרת.

הדבר הופך מיקסים למושלמים לשיתוף של התנהגויות שימושיות, כמו רישום ביומן, סריאליזציה או שיטות לתיאור, בין מחלקות שאין להן שום דבר משותף אחרת.

challenge icon

אתגר

קל

בואו נבנה מערכת תיוג באמצעות מיקסינים! תיצרו מיקסין Taggable שאפשר להחיל על כל מחלקה, וכך להעניק לאובייקטים את היכולת לנהל אוסף של תגיות — שימושי לסיווג פריטים, פוסטים או כל ישות שזקוקה לתוויות.

תארגנו את הקוד שלכם בשלושה קבצים:

  • Taggable.lua: צרו טבלת מיקסין המכילה שתי שיטות:
    • :addTag(tag): מוסיפה תגית אל self.tags (בהנחה שהטבלה קיימת)
    • :listTags(): מדפיסה את כל התגיות בפורמט Tags: tag1, tag2, tag3 (או Tags: none אם אין תגיות)
  • Article.lua: צרו מחלקת Article עם בנאי :new(title) ששומר את הכותרת ומאתחל טבלת tags ריקה. החילו את המיקסין Taggable כדי להעניק למופעים של Article יכולות תיוג. כללו שיטה :getTitle() שמחזירה את כותרת המאמר.
  • main.lua: כתבו כאן את פונקציית העזר applyMixin (תשתמשו בה ב-Article.lua באמצעות require). לאחר מכן קראו קלטים עבור כותרת של מאמר ושתי תגיות. צרו Article, הוסיפו אליו את שתי התגיות, הדפיסו את הכותרת והציגו את כל התגיות.

תקבלו שלושה קלטים:

  1. כותרת המאמר (מחרוזת)
  2. התגית הראשונה להוספה (מחרוזת)
  3. התגית השנייה להוספה (מחרוזת)

הפלט שלכם צריך להציג את כותרת המאמר ולאחריה את התגיות שלו:

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 לטבלת יעד
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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Lua אונליין