כללי מתן שמות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 43 מתוך 70.
ב-Lua, כל שדות הטבלה נגישים לציבור כברירת מחדל. כל אחד יכול לקרוא או לשנות ישירות את self.health. אף ש-Lua אינה אוכפת פרטיות, מתכנתים משתמשים במוסכמות שמות כדי להעביר את כוונתם: לסמן אילו שדות יש להתייחס אליהם כאל פרטי מימוש פנימיים.
המוסכמה המקובלת היא להוסיף קו תחתון בתחילת שמות של שדות פרטיים:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- ציבורי: אפשר לגשת אליו ישירות
_health = 100, -- פרטי: יש להשתמש במתודות במקום זאת
_score = 0 -- פרטי: מעקב פנימי
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endהקו התחתון אינו משנה את אופן הפעולה של Lua: עדיין אפשר טכנית לגשת אל player._health. עם זאת, הוא משמש כאזהרה ברורה למתכנתים אחרים (ולך בעתיד): "השדה הזה מיועד להיות פרטי. יש לגשת אליו דרך מתודות במקום זאת."
המוסכמה הזו חשובה משום שהיא מפרידה בין הממשק (במה אחרים אמורים להשתמש) לבין המימוש (איך הוא פועל באופן פנימי). אם בהמשך תצטרך להוסיף אימות או לשנות את אופן אחסון הבריאות, תשנה רק את המתודות: קוד שמשתמש ב־:getHealth() ימשיך לפעול ללא שינוי.
אתגר
קלבואו נבנה מחלקה BankAccount שמציינת כראוי אילו שדות מיועדים להיות פרטיים באמצעות מוסכמת השמות עם קו תחתון!
תארגנו את הקוד שלכם בשני קבצים:
BankAccount.lua: צרו מחלקה שמנהלת פרטי חשבון. הבנאי:new(ownerName, initialBalance)צריך לשמור את שם הבעלים כשדה ציבורי (owner) ואת היתרה כשדה פרטי (_balance). כללו שלוש מתודות::getBalance(): מחזירה את היתרה הנוכחית:deposit(amount): מוסיפה את הסכום אל_balance:getOwner(): מחזירה את שם הבעלים
main.lua: טענו את המודול BankAccount שלכם, קראו מהקלט את שם הבעלים, את היתרה הראשונית ואת סכום ההפקדה. צרו חשבון, בצעו הפקדה, ואז הדפיסו את שם הבעלים ואת היתרה הסופית.
תקבלו שלושה נתוני קלט:
- שם הבעלים
- היתרה הראשונית (מספר)
- סכום ההפקדה (מספר)
הפלט שלכם צריך להיות שתי שורות המציגות את שם הבעלים ואת היתרה הסופית לאחר ההפקדה:
Owner: {ownerName}
Balance: {finalBalance}לדוגמה, אם נתוני הקלט הם Maria, 500 ו-150, הפלט צריך להיות:
Owner: Maria
Balance: 650זכרו: הקידומת של קו תחתון ב-_balance מסמנת למתכנתים אחרים שיש לגשת לשדה הזה דרך מתודות כמו :getBalance() ו-:deposit(), ולא ישירות. השדה owner ללא קו תחתון מציין שאין בעיה לגשת אליו באופן ציבורי.
נסו בעצמכם
-- טענו את המודול BankAccount באמצעות require
local BankAccount = require('BankAccount')
-- קראו את הקלטים
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO: צרו BankAccount חדש עם ownerName ו־initialBalance
-- TODO: בצעו הפקדה באמצעות depositAmount
-- TODO: הדפיסו את הבעלים ואת היתרה הסופית בפורמט הנדרש
-- פורמט:
-- Owner: {ownerName}
-- Balance: {finalBalance}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין