מיקסינים פשוטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 נוצרבניגוד לירושה, מיקסינים אינם יוצרים קשר של הורה וילד. פשוט מעתיקים פונקציות מטבלה אחת לאחרת.
הדבר הופך מיקסים למושלמים לשיתוף של התנהגויות שימושיות, כמו רישום ביומן, סריאליזציה או שיטות לתיאור, בין מחלקות שאין להן שום דבר משותף אחרת.
אתגר
קלבואו נבנה מערכת תיוג באמצעות מיקסינים! תיצרו מיקסין 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, הוסיפו אליו את שתי התגיות, הדפיסו את הכותרת והציגו את כל התגיות.
תקבלו שלושה קלטים:
- כותרת המאמר (מחרוזת)
- התגית הראשונה להוספה (מחרוזת)
- התגית השנייה להוספה (מחרוזת)
הפלט שלכם צריך להציג את כותרת המאמר ולאחריה את התגיות שלו:
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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורות9קומפוזיציה ומיקסינים
קשר מסוג יש-לוהאצלהמיקסינים פשוטיםהחלת כמה מיקסיניםמיקסינים לעומת ירושהסיכום – הרכבת רובוטתרגלו בעצמכם: קומפיילר Lua אונליין