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