מופעים עצמאיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 10 מתוך 70.
היבט מרכזי בתכנות מונחה עצמים הוא שכל מופע שומר על מצב נפרד משלו. כשאתה יוצר שני אובייקטים מאותה מחלקה, הם עצמאיים לחלוטין: שינוי של אחד מהם אינו משפיע על האחר.
נבחן את הדוגמה הזאת:
local Counter = {}
Counter.__index = Counter
function Counter:new(start)
local instance = {}
setmetatable(instance, self)
instance.value = start or 0
return instance
end
function Counter:increment()
self.value = self.value + 1
end
-- צור שני מונים נפרדים
local counterA = Counter:new(10)
local counterB = Counter:new(5)
counterA:increment()
counterA:increment()
print(counterA.value) -- פלט: 12
print(counterB.value) -- פלט: 5אף על פי ששני המונים מגיעים מאותה מחלקת Counter, הגדלת counterA אינה משפיעה על counterB. לכל אובייקט יש שדה value משלו, המאוחסן בטבלת המופע שלו.
העצמאות הזאת היא מה שהופך אובייקטים לשימושיים. אפשר ליצור עשרות שחקנים במשחק, כשכל אחד עוקב אחר הבריאות והניקוד שלו. אפשר לנהל כמה חשבונות בנק, שלכל אחד מהם יתרה שונה.
המחלקה מגדירה את המבנה ואת ההתנהגות, אבל כל מופע מתנהל בדרכו שלו עם הנתונים שלו.
אתגר
קלבואו נוכיח שאובייקטים מאותה מחלקה באמת מתנהלים באופן עצמאי! תבנו מחלקת Wallet ותיצרו שני מופעים נפרדים של ארנק, ואז תשנו אותם באופן עצמאי כדי להדגים ששינויים באחד לא משפיעים על השני.
תארגנו את הקוד שלכם בשני קבצים:
Wallet.lua: הגדירו את מחלקתWalletשלכם באמצעות תבנית הבנאי המקובלת. כל ארנק צריך לעקוב אחר היתרה של עצמו,balance. כללו:- בנאי
:new(startingBalance)שמאתחל את הארנק בסכום הנתון - מתודה
:add(amount)שמגדילה את היתרה - מתודה
:spend(amount)שמקטינה את היתרה
- בנאי
main.lua: יבאו את מודול Wallet וצרו שני מופעים נפרדים של ארנק. בצעו פעולות שונות על כל אחד מהם כדי להראות שהם שומרים על מצב עצמאי.
תקבלו ארבעה קלטים:
- היתרה ההתחלתית של ארנק A
- היתרה ההתחלתית של ארנק B
- הסכום שיש להוסיף לארנק A
- הסכום שיש להוציא מארנק B
בקובץ הראשי:
- צרו את
walletAעם היתרה ההתחלתית הראשונה - צרו את
walletBעם היתרה ההתחלתית השנייה - הוסיפו את הסכום הנתון ל-
walletA - הוציאו את הסכום הנתון מ-
walletB - הדפיסו את שתי היתרות בשורות נפרדות
הדפיסו את היתרות הסופיות בפורמט המדויק הבא:
Wallet A: [balance]
Wallet B: [balance]לדוגמה, אם הקלטים הם 100, 50, 25 ו-10, הפלט צריך להיות:
Wallet A: 125
Wallet B: 40שימו לב שהוספה לארנק A לא משנה את ארנק B, והוצאה מארנק B לא משפיעה על ארנק A: כל מופע שומר על יתרה נפרדת משלו.
נסו בעצמכם
-- טען את המודול Wallet
local Wallet = require('Wallet')
-- קרא את הקלטים
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())
-- TODO: צור את walletA עם היתרה ההתחלתית הראשונה
-- TODO: צור את walletB עם היתרה ההתחלתית השנייה
-- TODO: הוסף את הסכום שצוין ל-walletA
-- TODO: הוצא את הסכום שצוין מ-walletB
-- TODO: הדפס את היתרות הסופיות בפורמט הנדרש
-- פורמט: "Wallet A: [balance]" ו-"Wallet B: [balance]"
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין