Menu
Coddy logo textTech

משתני מופע

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

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

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

הדבר נעשה חשוב במיוחד כשמאחסנים נתונים מורכבים כמו טבלאות. נבחן מערכת מלאי שבה כל דמות נושאת פריטים שונים:

local Inventory = {}
Inventory.__index = Inventory

function Inventory:new()
    local instance = {}
    setmetatable(instance, self)
    instance.items = {}  -- כל מופע מקבל טבלה ריקה משלו
    return instance
end

function Inventory:addItem(item)
    table.insert(self.items, item)
end

השורה המרכזית היא instance.items = {}. כשאתה יוצר טבלה ריקה חדשה בתוך הבנאי, כל אובייקט מלאי מקבל רשימה ייחודית משלו. אם במקום זאת היית מגדיר את items בטבלת המחלקה עצמה, כל המופעים היו חולקים בטעות את אותה הטבלה: הוספת חרב לדמות אחת הייתה מעניקה אותה לכולם!

local bag1 = Inventory:new()
local bag2 = Inventory:new()

bag1:addItem("Sword")
bag2:addItem("Potion")

print(#bag1.items)  -- פלט: 1
print(#bag2.items)  -- פלט: 1

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

challenge icon

אתגר

קל

בואו נבנה מערכת ShoppingCart שבה כל עגלה מנהלת רשימת מוצרים נפרדת משלה. כך נדגים איך משתני מופע שומרים על הפרדת הנתונים בין אובייקטים: הוספת פריטים לעגלה אחת לא תשפיע על עגלה אחרת!

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

  • ShoppingCart.lua: הגדירו את המחלקה ShoppingCart, שבה לכל מופע יש טבלת products משלו. כללו:
    • בנאי :new() שמאתחל רשימת מוצרים ריקה לכל עגלה
    • מתודה :addProduct(productName) שמוסיפה מוצר לרשימה של העגלה הזאת
    • מתודה :listProducts() שמדפיסה כל מוצר בשורה נפרדת
  • main.lua: טענו את המודול ShoppingCart וצרו שתי עגלות נפרדות. הוסיפו מוצרים שונים לכל עגלה כדי להוכיח שהמלאי שלהן נשאר נפרד.

תקבלו ארבעה קלטים:

  1. המוצר הראשון להוספה לעגלה A
  2. המוצר השני להוספה לעגלה A
  3. המוצר הראשון להוספה לעגלה B
  4. המוצר השני להוספה לעגלה B

בקובץ הראשי:

  1. צרו שתי עגלות קניות: cartA ו-cartB
  2. הוסיפו את שני המוצרים הראשונים אל cartA
  3. הוסיפו את שני המוצרים האחרונים אל cartB
  4. הדפיסו Cart A: ואז הציגו את המוצרים של עגלה A
  5. הדפיסו Cart B: ואז הציגו את המוצרים של עגלה B

לדוגמה, אם הקלטים הם Apple, Bread, Milk ו-Eggs, הפלט צריך להיות:

Cart A:
Apple
Bread
Cart B:
Milk
Eggs

זכרו: המפתח הוא לאתחל את products כטבלה ריקה חדשה בתוך הבנאי. כך מובטח שכל מופע של עגלה יקבל רשימה נפרדת משלו, במקום שכל העגלות ישתפו טבלה אחת.

נסו בעצמכם

-- טען את המודול ShoppingCart באמצעות require
local ShoppingCart = require('ShoppingCart')

-- קרא את הקלטים
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()

-- TODO: צור שתי עגלות קניות: cartA ו-cartB

-- TODO: הוסף את product1 ואת product2 ל-cartA

-- TODO: הוסף את product3 ואת product4 ל-cartB

-- TODO: הדפס "Cart A:" ואז הצג את המוצרים של cartA

-- TODO: הדפס "Cart B:" ואז הצג את המוצרים של cartB
quiz iconבחנו את עצמכם

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

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

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