האצלה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 50 מתוך 70.
אחסון אובייקט בתוך אובייקט אחר הוא רק הצעד הראשון. העוצמה האמיתית של הרכבה נובעת מהאצלה, כשהאובייקט החיצוני מעביר קריאות למתודות לרכיבים הפנימיים שלו.
חשוב על התנעת מכונית. אתה לא מגיע אל מתחת למכסה המנוע ומסובב את המנוע ידנית. במקום זאת, אתה מסובב את המפתח, והמכונית מטפלת בשאר באופן פנימי.
בקוד, פירוש הדבר הוא שהמחלקה Car מספקת מתודה פשוטה :start() שמעבירה את העבודה בפועל למנוע:
function Car:start()
print("Turning the key...")
self.engine:run() -- האצל את הפעולה לאובייקט הפנימי
endהמכונית לא צריכה לדעת איך המנוע פועל. היא רק אומרת למנוע לבצע את תפקידו. כך תחומי האחריות נשארים מופרדים. המחלקה Engine מטפלת בלוגיקה של המנוע, ואילו Car מתאמת בין החלקים:
function Engine:run()
print("Engine running at " .. self.horsepower .. " HP")
end
local engine = Engine:new(250)
local car = Car:new("Coupe", engine)
car:start()
-- פלט:
-- מסובבים את המפתח...
-- המנוע פועל בהספק של 250 HPהאצלה יוצרת ממשק נקי למשתמשים במחלקה שלך. הם מתקשרים עם המכונית, ולא עם החלקים הפנימיים שלה. אם בהמשך תחליף למימוש אחר של המנוע, הממשק הציבורי של המכונית יישאר זהה: רק ההאצלה הפנימית תשתנה.
אתגר
קלבואו נבנה מערכת נגן מוזיקה שמדגימה האצלה! תיצרו רכיב Speaker ו־MusicPlayer שמכיל אותו. הנגן לא יטפל ישירות בפלט הצליל, אלא יאציל את האחריות הזאת לרמקול הפנימי שלו.
תארגנו את הקוד שלכם בשלושה קבצים:
Speaker.lua: צרו מחלקת Speaker עם בנאי:new(volume)ששומר את עוצמת הקול. הוסיפו מתודת:playSound(trackName)שמדפיסה:Playing "{trackName}" at volume {volume}MusicPlayer.lua: צרו מחלקת MusicPlayer שהבנאי שלה:new(brand, speaker)מקבל שם מותג ואובייקט Speaker. הנגן שומר את הרמקול בתוכו. הוסיפו את המתודות הבאות::play(trackName): מדפיסה{brand} player starting...ואז מאצילה את הפעולה למתודת:playSound()של הרמקול:stop(): מדפיסה{brand} player stopped
main.lua: חברו את הכול יחד! קראו את הקלטים של עוצמת הקול של הרמקול, מותג הנגן ושם של רצועה. צרו קודם Speaker, ואז העבירו אותו לבנאי של MusicPlayer. קראו למתודת:play()של הנגן עם שם הרצועה, ואז קראו ל־:stop().
תקבלו שלושה קלטים:
- עוצמת הקול של הרמקול (מספר)
- מותג נגן המוזיקה (מחרוזת)
- שם הרצועה להשמעה (מחרוזת)
הפלט שלכם אמור להראות את הנגן מתאם את פעולתו עם הרמקול:
{brand} player starting...
Playing "{trackName}" at volume {volume}
{brand} player stoppedלדוגמה, אם הקלטים הם 75, SoundMax ו־Summer Vibes, הפלט אמור להיות:
SoundMax player starting...
Playing "Summer Vibes" at volume 75
SoundMax player stoppedשימו לב ש־MusicPlayer לא יודע איך להפיק צליל. הוא פשוט אומר לרמקול שלו לטפל בזה. זו האצלה בפעולה: האובייקט החיצוני מספק ממשק נקי, בעוד שהרכיב הפנימי מבצע את העבודה המיוחדת!
נסו בעצמכם
-- main.lua
-- חברו את הכול יחד!
local Speaker = require('Speaker')
local MusicPlayer = require('MusicPlayer')
-- קראו את הקלטים
local volume = tonumber(io.read())
local brand = io.read()
local trackName = io.read()
-- TODO: צרו Speaker עם עוצמת הקול הנתונה
-- TODO: צרו MusicPlayer עם המותג והרמקול
-- TODO: קראו למתודה play של הנגן עם שם הרצועה
-- TODO: קראו למתודה stop של הנגן
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורות9קומפוזיציה ומיקסינים
קשר מסוג יש-לוהאצלהמיקסינים פשוטיםהחלת כמה מיקסיניםמיקסינים לעומת ירושהסיכום – הרכבת רובוטתרגלו בעצמכם: קומפיילר Lua אונליין